跳到主要内容Transformer 结构及应用详解:GPT、BERT、MT-DNN、GPT-2 | 极客日志编程语言AI算法
Transformer 结构及应用详解:GPT、BERT、MT-DNN、GPT-2
本文详细介绍了 Transformer 架构及其核心组件,包括 Self-Attention、Multi-Head Attention、Positional Encoding 等机制。文章对比分析了基于 Transformer 的四个重要模型:单向预训练模型 GPT、双向预训练模型 BERT、多任务模型 MT-DNN 以及大规模通用模型 GPT-2。重点阐述了各模型在训练目标、网络结构和应用场景上的差异,如 GPT 的单向掩码机制与 BERT 的双向 MLM+NSP 任务。最后总结了深度学习从有监督向无监督发展、从专用模型向通用模型演变的趋势,强调了数据规模和质量对模型性能的关键影响。
引言
在介绍 Transformer 之前,我们先回顾一下 RNN(循环神经网络)的结构。
- 效率问题:需要逐个词进行处理,后一个词要等到前一个词的隐状态输出以后才能开始处理,无法并行。
- 长距离依赖问题:如果传递距离过长,还会有梯度消失、梯度爆炸和遗忘问题。
为了解决这些问题,设计了各种各样的 RNN cell,最著名的两个就是 LSTM(Long Short Term Memory)和 GRU(Gated Recurrent Unit)。但正如业界比喻,给马车换车轮不如直接换成汽车。于是就有了本文的核心——Transformer。
Transformer 是 Google Brain 在 2017 年提出的一篇工作,它针对 RNN 的弱点进行重新设计,解决了 RNN 的效率问题和传递中的缺陷等,在很多问题上超过了 RNN 的表现。Transformer 的基本结构是一个 N 进 N 出的结构,每个 Transformer 单元相当于一层的 RNN 层,接收一整个句子所有词作为输入,然后为句子中的每个词都做出一个输出。与 RNN 不同的是,Transformer 能够同时处理句子中的所有词,并且任意两个词之间的操作距离都是 1,很好地解决了效率问题和距离问题。
每个 Transformer 单元都有两个最重要的子层,分别是 Self-Attention 层与 Feed Forward 层。文章使用 Transformer 搭建了一个类似 Seq2Seq 的语言翻译模型,并为 Encoder 与 Decoder 设计了两种不同的 Transformer 结构。
Decoder Transformer 相对于 Encoder Transformer 多了一个 Encoder-Decoder Attention 层,用来接收来自于 Encoder 的输出作为参数。最终只要按照下图的方式堆叠,就可以完成 Transformer Seq2Seq 的结构搭建。
工作流程示例
举个例子介绍下如何使用这个 Transformer Seq2Seq 做翻译:
- Transformer 对原语言的句子进行编码,得到 memory。
- 第一次解码时输入只有一个标志,表示句子的开始。
- 解码器通过这个唯一的输入得到的唯一的输出,用于预测句子的第一个词。
- 第二次解码,将第一次的输出 Append 到输入中,输入就变成了和句子的第一个词 (ground truth 或上一步的预测),解码生成的第二个输出用于预测句子的第二个词。以此类推。
了解了 Transformer 的大致结构后,接下来看看详细结构。
Transformer 核心组件
Self Attention
Self Attention 就是句子中的某个词对于本身的所有词做一次 Attention。算出每个词对于这个词的权重,然后将这个词表示为所有词的加权和。每一次的 Self Attention 操作,就像是为每个词做了一次 Convolution 操作或 Aggregation 操作。
具体操作如下:首先,每个词都要通过三个矩阵 Wq, Wk, Wv 进行一次线性变化,一分为三,生成每个词自己的 query, key, vector 三个向量。以一个词为中心进行 Self Attention 时,都是用这个词的 key 向量与每个词的 query 向量做点积,再通过 Softmax 归一化出权重。然后通过这些权重算出所有词的 vector 的加权和,作为这个词的输出。
归一化之前需要通过除以向量的维度 dk 来进行标准化,所以最终 Self Attention 用矩阵变换的方式可以表示为:
$$\text{Attention}(Q, K, V) = \text{softmax}(\frac{QK^T}{\sqrt{d_k}})V$$
最终每个 Self Attention 接受 n 个词向量的输入,输出 n 个 Aggregated 的向量。
上文提到 Encoder 中的 Self Attention 与 Decoder 中的有所不同,Encoder 中的 Q、K、V 全部来自于上一层单元的输出,而 Decoder 只有 Q 来自于上一个 Decoder 单元的输出,K 与 V 都来自于 Encoder 最后一层的输出。
Masked Attention
Decoder 与 Seq2Seq 中的解码器类似,每个词都只能看到前面词的状态,所以是一个单向的 Self-Attention 结构。
Masked Attention 的实现非常简单,只要在普通的 Self Attention 的 Softmax 步骤之前,与一个下三角矩阵 M 相乘就好了。
Multi-Head Attention
Multi-Head Attention 就是将上述的 Attention 做 h 遍,然后将 h 个输出进行 concat 得到最终的输出。这样做可以很好地提高算法的稳定性。Transformer 的实现中,为了提高 Multi-Head 的效率,将 W 扩大了 h 倍,然后通过 view(reshape) 和 transpose 操作将相同词的不同 head 的 k、q、v 排列在一起进行同时计算,完成计算后再次通过 reshape 和 transpose 完成拼接,相当于对于所有的 head 进行了一个并行处理。
Position-wise Feed Forward Networks
Encoder 中和 Decoder 中经过 Attention 之后输出的 n 个向量(这里 n 是词的个数)都分别的输入到一个全连接层中,完成一个逐个位置的前馈网络。
Add & Norm
是一个残差网络,将一层的输入与其标准化后的输出进行相加即可。Transformer 中每一个 Self Attention 层与 FFN 层后面都会连一个 Add & Norm 层。
Positional Encoding
由于 Transformer 中既不存在 RNN,也不同于 CNN,句子里的所有词都被同等的看待,所以词之间就没有了先后关系。为了解决这个问题,Transformer 提出了 Positional Encoding 的方案,就是给每个输入的词向量叠加一个固定的向量来表示它的位置。
文中使用的 Positional Encoding 公式如下:
$$PE_{(pos, 2i)} = \sin(pos / 10000^{2i/d_{model}})$$
$$PE_{(pos, 2i+1)} = \cos(pos / 10000^{2i/d_{model}})$$
其中 pos 是词在句子中的位置,i 是词向量中第 i 位,即将每个词的词向量为一行进行叠加,然后针对每一列都叠加上一个相位不同或波长逐渐增大的波,以此来唯一区分位置。
主要模型演进
单向二阶段训练模型——OpenAI GPT
GPT (Generative Pre-Training),是 OpenAI 在 2018 年提出的模型,利用 Transformer 模型来解决各种自然语言问题,例如分类、推理、问答、相似度等应用的模型。GPT 采用了 Pre-training + Fine-tuning 的训练模式,使得大量无标记的数据得以利用,大大提高了这些问题的效果。
- Pre-Training 的方式
- 单向 Transformer 模型
- Fine-Tuning 与不同输入数据结构的变化
Pre-Training 训练方式
很多机器学习任务都需要带标签的数据集作为输入。但随着算力不断提高,计算机能够处理的数据量逐渐增大。如果不能很好利用这些无标签的数据就显得很浪费。半监督学习和预训练 + 微调的二阶段模式变得越来越受欢迎。
ELMo 首先想到了在预训练阶段为每个词汇集其上下文信息,使用的是基于 bi-LSTM 的语言模型给词向量带上上下文语义信息。但 ELMo 使用的是 RNN 来完成语言模型的预训练,那么如何使用 Transformer 来完成预训练呢?
单向 Transformer 结构
OpenAI GPT 采用了单向 Transformer 完成了这项预训练任务。在 Decoder Block 中,使用了 Masked Self-Attention,即句子中的每个词,都只能对包括自己在内的前面所有词进行 Attention,这就是单向 Transformer。GPT 使用的 Transformer 结构就是将 Encoder 中的 Self-Attention 替换成了 Masked Self-Attention。
由于采用的是单向的 Transformer,只能看到上文的词,所以语言模型为预测下一个词。训练的过程其实非常的简单,就是将句子 n 个词的词向量加上 Positional Encoding 后输入到前面提到的 Transformer 中,n 个输出分别预测该位置的下一个词。
Fine-Tuning 与不同输入数据结构的变化
接下来就进入模型训练的第二步,运用少量的带标签数据对模型参数进行微调。上一步中最后一个词的输出我们没有用到,在这一步中就要使用这一个输出来作为下游监督学习的输入。
为避免 Fine-Tuning 使得模型陷入过拟合,文中还提到了辅助训练目标的方法,类似于一个多任务模型或者半监督学习。针对不同任务,需要修改输入数据的格式,例如 Classification、Entailment、Similarity、Multiple Choice 等。
双向二阶段训练模型——BERT
BERT (Bidirectional Encoder Representation from Transformer),是 Google Brain 在 2018 年提出的基于 Transformer 的自然语言表示框架。BERT 与 GPT 一样,采取了 Pre-training + Fine-tuning 的训练方式,在分类、标注等任务下都获得了更好的效果。
虽然 BERT 与 GPT 看上去非常的相似,但是它们的训练目标和模型结构和使用上还是有着些许的不同:
- GPT 采用的是单向的 Transformer,而 BERT 采用的是双向的 Transformer,也就是不用进行 Mask 操作;
- 使用的结构的不同,直接导致了它们在 Pre-Training 阶段训练目标的不同。
双向 Transformer
BERT 采用的是不经过 Mask 的 Transformer,也就是与 Transformer 文章中的 Encoder Transformer 结构完全一样。BERT 为了能够同时得到上下文的信息,而不是像 GPT 一样完全放弃下文信息,采用了双向的 Transformer。
Pre-Training 阶段
- Masked Language Model (MLM):在输入的句子中,随机选择 15% 的词用于预测。这 15% 的词中,80% 的词向量输入时被替换为 [MASK],10% 的词的词向量在输入时被替换为其他词的词向量,另外 10% 保持不动。这样一来就相当于告诉模型,我可能给你答案,也可能不给你答案,也可能给你错误的答案。
- Next Sentence Prediction (NSP):BERT 还提出了另外一种预训练方式 NSP,与 MLM 同时进行,组成多任务预训练。这种预训练的方式就是往 Transformer 中输入连续的两个句子,左边的句子前面加上一个标签,它的输出被用来判断两个句子之间是否是连续上下文关系。
为了区分两个句子的前后关系,BERT 除了加入了 Positional Encoding 之外,还另外加入了一个在预训练时需要学习的 Segment Embedding 来区分两个句子。此外,两个句子之间使用标签予以区分。
Fine-Tuning 阶段
BERT 的 Fine-Tuning 阶段和 GPT 没有太大区别。因为采用了双向的 Transformer 所以放弃了 GPT 在 Fine-Tuning 阶段使用的辅助训练目标,也就是语言模型。此外就是将分类预测用的输出向量从 GPT 的最后一个词的输出位置改为了句子开头的位置了。
多任务模型——MT-DNN
MT-DNN (Multi-Task Deep Neural Networks) 依然采用了 BERT 的二阶段训练方法以及双向 Transformer。在 Pre-Training 阶段,MT-DNN 与 BERT 几乎完全一样,但是在 Fine-Tuning 阶段,MT-DNN 采用了多任务的微调方式。同时采用 Transformer 输出的上下文 Embedding 进行单句分类、文本对相似度、文本对分类以及问答等任务的训练。
单向通用模型——GPT-2
GPT-2 继续沿用了原来在 GPT 种使用的单向 Transformer 模型,而这篇文章的目的就是尽可能利用单向 Transformer 的优势,做一些 BERT 使用的双向 Transformer 所做不到的事。那就是通过上文生成下文文本。
GPT-2 的想法就是完全舍弃 Fine-Tuning 过程,转而使用一个容量更大、无监督训练、更加通用的语言模型来完成各种各样的任务。严格来说 GPT-2 可能不算是一个多任务模型,但是它确实使用相同的模型、相同的参数完成了不同的任务。
GPT-2 满足零样本设置 (zero-shot setting),在训练的过程中不需要告诉他应该完成什么样的任务,预测是也能给出较为合理的回答。
关键改进
- 拓宽并加大数据集:GPT-2 收集了一个规模更大、范围更广的数据集。最终组成了一个 800 万个文本,40G 的数据集 WebText。
- 扩大网络容量:为了提高网络的容量,使其拥有更强的学习潜力,GPT-2 将 Transformer 堆叠的层数增加到 48 层,隐层的维度为 1600,参数量达到了 15 亿。
- 调整网络结构:GPT-2 将词汇表提升到 50257,最大的上下文大小 (context size) 从 GPT 的 512 提升到了 1024,batchsize 从 512 提升为 1024。此外还对 Transformer 做出了小调整,标准化层放到没每个 sub-block 之前,最后一个 Self-attention 后又增加了一个标准化层;改变了残差层的初始化方法等等。
总结与趋势
通过对 Transformer 及其衍生模型(GPT、BERT、MT-DNN、GPT-2)的发展分析,可以整理出深度学习的一些发展趋势:
- 有监督模型向半监督甚至无监督方向发展:数据的规模的增长速度远远超过了数据的标注速度,导致大量无标签数据的产生。如何利用上这些无标签的数据来改善任务的表现变成了一个越来越无法轻视的问题。
- 从少量数据复杂模型到大量数据简单模型:深度神经网络的拟合能力非常的强大。数据量越是上升,数据质量越是提高,往往对模型的要求就会越会降低。数据量越大,模型就越容易捕捉到符合真实世界分布的特征。
- 从专用模型向通用模型发展:GPT、BERT、MT-DNN、GPT-2 都使用了经过预训练的通用模型来继续进行下游的机器学习任务。如果一个模型的表达能力足够的强,训练时候使用的数据量足够的大,那么模型的通用性就会更强,就不需要针对特定的任务做太多的修改。
- 对数据的规模和质量要求提高:成绩的提升中,数据规模的提升占有比结构调整更大的比重。随着模型的通用化和简单化,为提升模型的性能,今后更多的注意力将会从如何设计一个复杂、专用的模型转移到如何获取、清洗、精化出质量更加出众的、大量的数据上。
综上所述,深度学习竞赛迟早要成为大厂间拼资源、拼算力的较量。未来可能会出现更多关于绿色 AI、低碳 AI、可持续 AI 等新课题的研究方向。
相关免费在线工具
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online