Transformer 架构—Encoder-Decoder

news2024/11/25 12:51:49

文章目录

前言

一、Encoder 家族

1. BERT

2. DistilBERT

3. RoBERTa

4. XML

5. XML-RoBERTa

6. ALBERT

7. ELECTRA

8. DeBERTa

二、Decoder 家族

1. GPT

2. GPT-2

3. CTRL

4. GPT-3

5. GPT-Neo / GPT-J-6B

三、Encoder-Decoder 家族

1. T5

2. BART

3. M2M-100

4. BigBird


前言

最初的Transformer是基于广泛应用在机器翻译领域的Encoder-Decoder架构:

Encoder:

将由 token 组成的输入序列转成由称为隐藏状态(hidden state)或者上下文(context)的embedding向量组成的序列。

Decoder:

根据 Encoder 的隐藏状态迭代生成组成输出序列的 token。

从上图我们可以看到:

  • 输入文本被 tokenized 成 token embedding。由于注意力机制不知道 token 的相对位置,因此我们需要一种方法将一些有关 token 位置的信息注入到输入中,以对文本的顺序性质进行建模。因此,token embedding 与包含每个 token  的位置信息的 position embedding 相组合。
  • encoder 由一堆 encoder 层组成,类似于计算机视觉中堆叠的卷积层。decoder也是如此,它有自己的 decoder 层块。
  • encoder 的输出被馈送到每隔 decoder 层,然后 decoder 生成序列中最可能的下一个 token 的预测。然后,此步骤的输出被反馈到 decoder 以生成下一个 token,依次类推,直到到达特殊的序列结束(End of Sequence,EOS)token。以上图为例,想象一下 decoder 已经预测了“Die”和“Zeit”。现在,它将根据这两个预测 token 以及所有 encoder 的输出来预测下一个 token “fliegt”。在下一步中,decoder 继续将“fliegt”作为附加输入。我们重复这个过程,直到 decoder 预测出 EOS token 或者达到最大输出长度限制。

Transformer 架构最初是为机器翻译等序列到序列任务而设计的,但 encoder 和 decoder 块很快就被改编为独立模型。尽管现在有数千种不同的 Transformer 模型,但大多数属于以下三种类型之一:

(1)Encoder-only

这些模型将文本输入序列转换为丰富的数字表示,非常适合文本分类或命名实体识别等任务。BERT(Bidirectional Encoder Representation Transformers)及其变体,例如 RoBERTaDistilBERT,都属于此类架构。在该架构中为给定 token 计算的表示取决于左侧(token之前)和右侧(token之后)的上下文。所以通常称为双向注意力(bidirectional attention)。

(2)Decoder-only

用户给定一段文本提示,这些模型将通过迭代预测最可能出现的下一个单词来自动补充余下的文本。GPT(Generative Pretrained Transformer)模型系列属于此类。在该架构中为给定 token 计算的表示仅取决于左侧上下文。所以通常称为因果注意力(causal attention)或自回归注意力(autoregression attention)。

(3)Encoder-Decoder

它们用于对从一个文本序列到另一个文本序列的复杂映射进行建模,比如机器翻译和文本摘要。除了我们所看到的结合了 encoder 和 decoder 的Transformer 架构之外,BART(Bidirectional Auto-Regressive Transformers)和 T5(Text-To-Text Transfer Transformer)模型也属于此类。

实际上,decoder-only 架构和 encoder-only 架构的应用程序之间的区别有点模糊。例如,GPT 系列中的纯 decoder 模型可以为翻译等任务做好准备,这些任务通常被认为是序列到序列的任务。类似地,像 BERT 这样的纯 encoder 模型可以应用于通常与 encoder-decoder 或纯 decoder 模型相关的摘要任务。

随着时间的推移,三种主要架构都经历了自己的演变。

上图这个家谱只是突出显示了一些架构里程碑。


一、Encoder 家族

第一个基于 Transformer 架构的 encoder-only 模型是 BERT。encoder-only 模型仍然主导着 NLU(Natural Language Understanding)任务(例如文本分类、命名实体识别和问题解答)的研究和行业。接下来简单介绍一下 BERT 模型及其变体:

1. BERT

BERT 的预训练目标有两个:预测文本中的 mask token;确定一个文本段落是否紧跟着另一个文本段落。前一个任务称为 Masked Language Modeling(MLM),后一个称为 Next Sentence Prediction(NSP)。

2. DistilBERT

尽管BERT的预测能力很强,但是由于其庞大的尺寸,我们无法在低延迟要求的生产环境中部署。通过在预训练过程中使用知识蒸馏(knowledge distillation)技术,DistilBERT 可以达到BERT 97% 的性能,但是体积仅有BERT的 40%,速度比BERT快60%。

3. RoBERTa

BERT 发布后的一项研究表明,通过修改预训练方案可以进一步提高其性能。RoBERTa 的训练时间更长、批次更大、训练数据更多,并且它放弃了 NSP 任务。总之,与原始 BERT 模型相比,这些变化显著提高了其性能。

4. XML

在跨语言语言模型 (cross-lingual language model,XLM) 的工作中,探索了构建多语言模型的几个预训练目标,包括来自类 GPT 模型的自回归语言建模和来自 BERT 的 MLM。此外,XLM 预训练论文的作者介绍了翻译语言模型(translation language modeling,TLM),它是 MLM 对多语言输入的扩展。通过对这些预训练任务进行实验,他们在多个多语言 NLU 基准测试以及翻译任务上取得了领先成绩。

5. XML-RoBERTa

继 XLM 和 RoBERTa 的工作之后,XLM-RoBERTa 或 XLM-R 模型通过大规模升级训练数据,使多语言预训练更进一步。使用 Common Crawl 语料库,其开发人员创建了一个包含 2.5TB 文本的数据集;然后他们在这个数据集上用 MLM 训练了一个 encoder。由于数据集仅包含没有并行文本(即翻译)的数据,因此 XLM 的 TLM 目标被删除。这种方法大幅击败了 XLM 和多语言 BERT 变体,尤其是在缺乏足够语料的语言上。

6. ALBERT

ALBERT模型引入了三个变化,使encoder 架构更加高效。首先,它将 token embedding 维度与隐藏维度解耦,从而允许 embedding 维度较小,从而节省参数,尤其是当词汇量变大时。其次,所有层共享相同的参数,这进一步减少了有效参数的数量。最后,NSP目标被句子排序预测取代:模型需要预测两个连续句子的顺序是否交换,而不是预测它们是否属于在一起。这些变化使得用更少的参数训练更大的模型成为可能,并在NLU任务上达到卓越的性能。

7. ELECTRA

标准MLM预训练目标的一个限制是,在每个训练步骤中,仅更新 mask token 的表示,而其他输入token则不更新。为了解决这个问题,ELECTRA使用双模型方法:第一个模型(通常很小)的工作原理类似于标准 masked language model,并预测 mask token。第二个模型称为鉴别器,然后负责预测第一个模型输出中的哪些 token是最初的 mask token。因此,判别器需要对每个 token进行二分类,这使得训练效率提高了30倍。对于下游任务,鉴别器像标准 BERT 模型一样进行微调。

8. DeBERTa

DeBERTa 模型引入了两个架构变化。首先,每个 token 都表示为两个向量:一个表示内容,另一个表示相对位置。通过将 token 的内容与其相对位置分开,自注意力层可以更好地对附近 token 对的依赖性进行建模。另一方面,单词的绝对位置也很重要,尤其是对于解码而言。因此,在 token 解码头的 softmax 层之前添加了绝对 position embedding。DeBERTa 是第一个在 SuperGLUE 基准测试上击败人类基线的模型,SuperGLUE 基准测试是 GLUE 的更困难版本,由多个用于衡量 NLU 性能的子任务组成。

二、Decoder 家族

Transformer decoder 模型的进展在很大程度上是由OpenAI引领的。这些模型非常擅长预测序列中的下一个单词,因此主要用于文本生成任务。它们的进步是通过使用更大的数据集并将语言模型扩展到越来越大的尺寸来推动的。

1. GPT

GPT的引入结合了NLP中的两个关键思想:新颖高效的Transformer decoder 架构和迁移学习。在该设置中,通过 根据先前的单词预测下一个单词来对模型进行预训练。该模型在 BookCorpus 上进行训练,并在分类等下游任务上取得了很好的效果。

2. GPT-2

受到简单且可扩展的预训练方法成功的启发,通过升级原始模型和训练集诞生了 GPT-2。该模型能够生成连贯文本的长序列。由于担心可能被滥用,该模型以分阶段的方式发布,先发布较小的模型,然后发布完整的模型。

3. CTRL

像GPT-2这样的模型可以继续输入序列(也称为提示:prompt)。然而,用户对生成序列的样式几乎没有控制权。CTRL(Conditional Transformer Language)模型通过在序列开头添加“控制 token”来解决此问题。这些允许控制生成文本的样式,从而允许多样化的生成。

4. GPT-3

成功将 GPT 扩展到 GPT-2 后,对不同规模的语言模型行为的全面分析表明,存在简单的幂律来控制计算、数据集大小、模型大小和语言模型性能之间的关系。受这些见解的启发,GPT-2 被放大了 100 倍,生成了具有 1750 亿(175B)个参数的 GPT-3。除了能够生成令人印象深刻的真实文本段落之外,该模型还表现出少量学习能力:通过一些新颖任务的示例(例如将文本翻译为代码),该模型能够在新示例上完成该任务。OpenAI 并没有开源这个模型,我们只能通过 OpenAI API 提供接口来访问 GPT-3。

5. GPT-Neo / GPT-J-6B

GPT-Neo 和 GPT-J-6B 是类似 GPT 的模型,由 EleutherAI 训练,EleutherAI 是一个旨在重新创建和发布 GPT-3 规模模型的研究人员社区。当前模型是完整 175B 模型的较小变体,具有 1.3B、2.7B 和 6B 个参数,与 OpenAI 提供的较小 GPT-3 模型具有竞争力。

三、Encoder-Decoder 家族

尽管使用单个 encoder 或 decoder 堆栈构建模型已变得很常见,但 Transformer 架构有多种 encoder-decoder 变体,它们在 NLU 和 NLG 领域都有新颖的应用:

1. T5

T5 模型通过将所有 NLU 和 NLG 任务转换为文本到文本任务来统一它们。所有任务都被构建为序列到序列的任务,其中采用 encoder-decoder 架构是很自然的。例如,对于文本分类问题,这意味着文本用作encoder 输入,并且 decoder 必须将标签生成为普通文本而不是类别。T5 架构采用原有的 Transformer 架构。使用大型爬网 C4 数据集,通过将所有这些任务转换为文本到文本任务,使用 MLM 以及 SuperGLUE 任务对模型进行预训练。11B 模型在多个基准测试中产生了领先的结果。

2. BART

BART 在 encoder-decoder 架构中结合了 BERT 和 GPT 的预训练过程。输入序列会经历几种可能的转换之一,从简单的 mask token 到句子排列、删除 token 和文档旋转。这些修改后的输入通过 encoder 传递,decoder 必须重建原始文本。这使得模型更加灵活,因为可以将其用于 NLU 和 NLG 任务,并且在这两个任务上都实现了领先的性能。

3. M2M-100

通常,翻译模型是针对一种语言对和翻译方向构建的。当然,这并不能扩展到许多语言,此外,语言对之间可能存在共享知识,可用于稀有语言之间的翻译。M2M-100 是第一个可以在 100 种语言之间进行翻译的翻译模型。这可以在稀有语言和代表性不足的语言之间进行高质量翻译。该模型使用前缀 token(类似于特殊的 [CLS] token)来指示源语言和目标语言。

4. BigBird

由于注意力机制的二次内存要求,Transformer 模型的一个主要限制是最大上下文大小。BigBird 通过使用线性扩展的稀疏注意力形式来解决这个问题。这允许上下文从大多数 BERT 模型中的 512 个 token 大幅扩展至 BigBird 中的 4096 个。这在需要保留长依赖性的情况下特别有用,例如在文本摘要中。

参考:PyTorch研习社

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1463411.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot---集成MybatisPlus

介绍 使用SpringBoot集成MybatisPlus框架。 第一步&#xff1a;添加MybatisPlus依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.4</version> </dependenc…

MIT6.S081学习——一、环境搭建、资料搜集

MIT6.S081学习——一、环境搭建、资料搜集 1、环境准备2、资料搜集2、环境搭建2.1 Linux环境准备2.2 环境搭建2.2.1 根据官网指导代码进行相关工具的安装2.2.2 下载并且编译QEMU 3、VSCode远程连接Ubuntu3.1 安装remote-ssh3.1.1 安装插件3.1.2 配置config文件 3.2 Ubuntu安装S…

springcloud:2.OpenFeign 详细讲解

OpenFeign 是一个基于 Netflix 的 Feign 库进行扩展的工具,它简化了开发人员在微服务架构中进行服务间通信的流程,使得编写和维护 RESTful API 客户端变得更加简单和高效。作为一种声明式的 HTTP 客户端,OpenFeign 提供了直观的注解驱动方式,使得开发人员可以轻松定义和调用…

Redis突现拒绝连接问题处理总结

一、问题回顾 项目突然报异常 [INFO] 2024-02-20 10:09:43.116 i.l.core.protocol.ConnectionWatchdog [171]: Reconnecting, last destination was 192.168.0.231:6379 [WARN] 2024-02-20 10:09:43.120 i.l.core.protocol.ConnectionWatchdog [151]: Cannot reconnect…

win32 汇编读文件

做了2个小程序&#xff0c;没有读成功&#xff1b;文件打开了&#xff1b; .386.model flat, stdcalloption casemap :noneinclude windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib include Comdlg32.inc includelib …

Pormise---如何解决javascript中回调的信任问题?【详解】

如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 本人会很热心的阐述自己的想法&#xff01;谢谢&#xff01;&#xff01;&#xff01; 文章目录 回调中的信任问题回调给我们带来的烦恼&#xff1f;调用过早调用过晚调用的次数太少或太多调用回调时未能…

数据结构之链表经典算法QJ题目

目录 单链表经典算法题目1. 单链表相关经典算法OJ题&#xff1a;移除链表元素思路一&#xff1a;思路二&#xff1a; 2. 单链表相关经典算法QI题&#xff1a;链表的中间节点思路一思路二 3. 单链表相关经典算法QJ题&#xff1a;反转链表思路一思路二 4. 单链表相关经典算法QJ题…

pytest 框架自动化测试

随笔记录 目录 1. 安装 2. 安装pytest 相关插件 2.1 准备阶段 2.2 安装 2.3 验证安装成功 3. pytest测试用例的运行方式 3.1 主函数模式 3.1.1 主函数执行指定文件 3.1.2 主函数执行指定模块 3.1.3 主函数执行某个文件中的某个类、方法、函数 3.1.4 主函数执行生…

学习鸿蒙背后的价值?星河版开放如何学习?

现在是2024年&#xff0c;华为在1月18开展了鸿蒙千帆起仪式发布会。宣布了鸿蒙星河版&#xff0c;并对开发者开放申请&#xff0c;此次发布会主要是说明了&#xff0c;鸿蒙已经是全栈自研底座&#xff0c;鸿蒙星河版本的编程语言改为ArkTS/仓颉&#xff0c;内核改为鸿蒙原生内核…

操作系统虚拟内存(上)

一、虚拟内存简要 1.为什么需要虚拟内存? 如果第一个程序在 2000 的位置写入一个新的值&#xff0c;将会擦掉第二个程序存放在相同位置上的所有内容&#xff0c;所以同时运行两个程序是根本行不通的&#xff0c;这两个程序会立刻崩溃&#xff0c;所以想要在这种情况下&#…

SQL 练习题目(入门级)

今天发现了一个练习SQL的网站--牛客网。里面题目挺多的&#xff0c;按照入门、简单、中等、困难进行了分类&#xff0c;可以直接在线输入SQL语句验证是否正确&#xff0c;并且提供了测试表的创建语句&#xff0c;也可以方便自己拓展练习&#xff0c;感觉还是很不错的一个网站&a…

OpenAI 的 GPTs 提示词泄露攻击与防护实战:防御卷(一)

前面的OpenAI DevDay活动上&#xff0c;GPTs技术的亮相引起了广泛关注。随着GPTs的创建权限开放给Plus用户&#xff0c;社区里迅速涌现了各种有趣的GPT应用&#xff0c;这些都是利用了Prompt提示词的灵活性。这不仅展示了技术的创新潜力&#xff0c;也让人们开始思考如何获取他…

Java 面向对象进阶 15 接口(黑马)

案例&#xff1a; 代码&#xff1a; Animal类代码&#xff1a; public abstract class Animal {private String name;private int age;public Animal() {}public Animal(String name, int age) {this.name name;this.age age;}public String getName() {return name;}public…

揭秘H5与小程序的测试奥秘!

最近接触了较多关于H5页面的测试&#xff0c;H5页面的测试除了业务逻辑功能测试外&#xff0c;其他部分的测试方法基本是可以通用的&#xff0c;在此对H5页面和小程序的一些通用测试方法进行总结分享给大家。 H5优势 H5可以跨平台&#xff0c;开发成本相对较低&#xff1b; H…

洛谷p1002过河卒

[NOIP2002 普及组] 过河卒 题目描述 棋盘上 A A A 点有一个过河卒&#xff0c;需要走到目标 B B B 点。卒行走的规则&#xff1a;可以向下、或者向右。同时在棋盘上 C C C 点有一个对方的马&#xff0c;该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为…

having子句

目录 having子句 having和where的区别 Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 现在要求查询出每个职位的名称&#xff0c;职位的平均工资&#xff0c;但是要求显示平均工资高于 200 的职位 按照职位先进行分组&#xff0c;同…

2000-2022年各省城乡收入差距泰尔指数数据(原始数据+计算过程+结果)

2000-2022年各省城乡收入差距泰尔指数数据&#xff08;原始数据计算过程结果&#xff09; 1、时间&#xff1a;2000-2022年 2、指标&#xff1a;地区、居民可支配收入&#xff08;元&#xff09;、农村家庭可支配&#xff08;元&#xff09;、城市家庭可支配&#xff08;元&a…

Java线程基础知识和使用

目录 什么是线程 Java中线程的使用 线程的实现 并运行一个线程 如何为线程命名 查看当前jvm中运行的所有线程 线程池的基本使用 线程休眠 设置线程的优先级&#xff08;都仅供参考&#xff09; 线程的插队 线程的中断 线程的分类 线程的状态 什么是线程 线程是操…

Walmart 砸23亿美元收购 Vizio | 百能云芯

美国零售巨头沃尔玛&#xff08;Walmart&#xff09;宣布以 23 亿美元的价格收购智能电视品牌 Vizio&#xff0c;该举措旨在加速其广告业务 Walmart Connect 的增长。市场研究机构 TrendForce 看好此收购案&#xff0c;认为这有助于 Vizio 挑战三星的地位&#xff0c;成为美国第…

一个诗词网站的设计与实现

诗词网 0、前言 ​  前段时间非常喜欢诗词&#xff0c;又恰逢想开发一个社区类的系统&#xff0c;于是便有将两者结合起来的构想&#xff0c;说干就干&#xff0c;便有了诗词网&#xff08;诗词社区系统&#xff09;这个项目。 ​  由于是利用空闲时间进行开发&#xff0c…