笔记来源:
Transformer、GPT、BERT,预训练语言模型的前世今生(目录) - B站-水论文的程序猿 - 博客园
ShusenWang的个人空间-ShusenWang个人主页-哔哩哔哩视频(RNN模型与NLP应用)
Transformer 简单点看其实就是 self-attention 模型的叠加。
一、 Transformer 的结构
Transformer 也是一个 Seq2Seq 模型(Encoder-Decoder 框架的模型),左边一个 Encoders 把输入读进去,右边一个 Decoders 得到输出,如下所示:
第一眼看到上述的 Encodes-Decoders 框架图,随之产生问题就是 Transformer 中 左边 Encoders 的输出是怎么和右边 Decoders 结合的。因为decoders 里面是有N层的,再画张图直观的看就是这样:
现在我们取其中一层进行详细的展示:
通过上述分析,发现我们想要详细了解 Transformer,只要了解 Transformer 中的 Encoder 和 Decoder 单元即可,接下来我们将详细阐述这两个单元。
二、Encoder
有了上述那么多知识的铺垫,我们知道 Eecoders 是 N=6 层,通过上图我们可以看到每层 Encoder 包括两个 sub-layers:
- 第一个 sub-layer 是 multi-head self-attention,用来计算输入的 self-attention;
- 第二个 sub-layer 是简单的前馈神经网络层 Feed Forward;
注意:在每个 sub-layer 我们都模拟了残差网络(在下面的数据流示意图中会细讲),每个sub-layer的输出都是 𝐿𝑎𝑦𝑒𝑟𝑁𝑜𝑟𝑚(𝑥+𝑆𝑢𝑏_𝑙𝑎𝑦𝑒𝑟(𝑥)),其中 𝑠𝑢𝑏_𝑙𝑎𝑦𝑒𝑟 表示的是该层的上一层的输出
现在我们给出 Encoder 的数据流示意图,一步一步去剖析
- 深绿色的 𝑥1 表示 Embedding 层的输出,加上代表 Positional Embedding 的向量之后,得到最后输入 Encoder 中的特征向量,也就是浅绿色向量 𝑥1;
- 浅绿色向量 𝑥1 表示单词 “Thinking” 的特征向量,其中 𝑥1 经过 Self-Attention 层,变成浅粉色向量 𝑧1;
- 𝑥1 作为残差结构的直连向量,直接和 𝑧1 相加,之后进行 Layer Norm 操作,得到粉色向量 𝑧1;
- 残差结构的作用:避免出现梯度消失的情况
- Layer Norm 的作用:为了保证数据特征分布的稳定性,并且可以加速模型的收敛
- 𝑧1 经过前馈神经网络(Feed Forward)层,经过残差结构与自身相加,之后经过 LN 层,得到一个输出向量 𝑟1;
- 该前馈神经网络包括两个线性变换和一个ReLU激活函数:𝐹𝐹𝑁(𝑥)=𝑚𝑎𝑥(0,𝑥𝑊1+𝑏1)𝑊2+𝑏2
- 由于 Transformer 的 Encoders 具有 6 个 Encoder,𝑟1 也将会作为下一层 Encoder 的输入,代替 𝑥1 的角色,如此循环,直至最后一层 Encoder。
需要注意的是,上述的 𝑥、𝑧、𝑟 都具有相同的维数,论文中为 512 维。
三、Dncoder
Decoders 也是 N=6 层,通过上图我们可以看到每层 Decoder 包括 3 个 sub-layers
- 第一个 sub-layer 是 Masked multi-head self-attention,也是计算输入的 self-attention;
- 第二个 sub-layer 是 Encoder-Decoder Attention 计算,对 Encoder 的输入和 Decoder 的Masked multi-head self-attention 的输出进行 attention 计算,这个计算和我上一篇在attention那里举的那个例子Seq2Seq模型类似;
- 第三个 sub-layer 是前馈神经网络层,与 Encoder 相同。
四、Transformer 输出结果
将 “机器学习” 翻译成 “machine learing”,解码器的输出是一个浮点型的向量,怎么转化成 “machine learing” 这两个词呢?让我们来看看 Encoders 和 Decoders 交互的过程寻找答案:
从上图可以看出,Transformer 最后的工作是让解码器的输出通过线性层 Linear 后接上一个 softmax
- 其中线性层是一个简单的全连接神经网络,它将解码器产生的向量 A 投影到一个更高维度的向量 B 上,假设我们模型的词汇表是10000个词,那么向量 B 就有10000个维度,每个维度对应一个惟一的词的得分。
- 之后的softmax层将这些分数转换为概率。选择概率最大的维度,并对应地生成与之关联的单词作为此时间步的输出就是最终的输出啦
假设词汇表维度是 6,那么输出最大概率词汇的过程如下:
五、Transformer 动态流程展示
https://imgmd.oss-cn-shanghai.aliyuncs.com/BERT_IMG/tf-%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90.gif
https://imgmd.oss-cn-shanghai.aliyuncs.com/BERT_IMG/tf-%E5%8A%A8%E6%80%81%E7%BB%93%E6%9E%9C-2.gif
补充问题:为什么 Decoder 需要做 Mask
-
训练阶段:我们知道 “je suis etudiant” 的翻译结果为 “I am a student”,我们把 “I am a student” 的 Embedding 输入到 Decoders 里面,翻译第一个词 “I” 时
- 如果对 “I am a student” attention 计算不做 mask,“am,a,student” 对 “I” 的翻译将会有一定的贡献
- 如果对 “I am a student” attention 计算做 mask,“am,a,student” 对 “I” 的翻译将没有贡献
-
测试阶段:我们不知道 “我爱中国” 的翻译结果为 “I love China”,我们只能随机初始化一个 Embedding 输入到 Decoders 里面,翻译第一个词 “I” 时:
- 无论是否做 mask,“love,China” 对 “I” 的翻译都不会产生贡献
- 但是翻译了第一个词 “I” 后,随机初始化的 Embedding 有了 “I” 的 Embedding,也就是说在翻译第二词 “love” 的时候,“I” 的 Embedding 将有一定的贡献,但是 “China” 对 “love” 的翻译毫无贡献,随之翻译的进行,已经翻译的结果将会对下一个要翻译的词都会有一定的贡献,这就和做了 mask 的训练阶段做到了一种匹配
总结下就是:Decoder 做 Mask,是为了让训练阶段和测试阶段行为一致,不会出现间隙,避免过拟合
六、总结
Transformer在encoder阶段用了multi-head self-attention,在decoder阶段用了Masked multi-head self-attention,在encoder和decoder之间使用了attention连接。