摘要
Transformer是用multi-head attention机制取代了传统的RNN网络,结构为sequence2sequence的模型,包含encoder-decoder结构。
其主要贡献在于:
- multi-head attention 可以更容易的捕捉长距离单词间的依存关系,避免了RNN中长距离的依存关系需要经过多个时间步骤才能联系到一起,从而容易造成难以捕捉。同时还可以进行并行化同时计算multi-head attention,避免了RNN的依存计算关系
- Transformer可以更有效的提取特征,multi-head attention机制可以构成不同的representation subspaces来提取序列中不同位置的句法和语义信息
模型总览
Transformer是个典型的encoder-decoder模型,利用self-attention取代rnn,可以实现并行运算
Encoder端由N个相同的大模块堆叠而成,每个大模块包含「两个子模块」:多头注意力模块和前馈神经网络模块。
Encoder 端每个大模块接收的输入是不一样的,第一个大模块 (最底下的那个)接收的输入是输入序列的embedding(embedding 可以通过 word2vec 预训练得来),其余大模块接收的是其前一个大模块的输出,最后一个 模块的输出作为整个 Encoder 端的输出。
Decoder 端同样由 N(原论文中「N=6」)个相同的大模块堆叠而成,其中每个大模块 则由「三个子模块」构成,这三个子模块分别为多头 self-attention 模块,多头 Encoder-Decoder attention 交互模块,以及一个前馈神经网络模块;
Decoder第一个大模块在训练和测试时接受的输入不同,且每次训练时的输入也不一样(如图所示的shifted right)。其余大模块接收的是同样是其前一个大模块的输出,最后一个模块的输出作为 整个 Decoder 端的输出。
- Decoder第一个大模块输入:
训练时每次输入为上次的输入加上输入序列后移一位的ground truth(例如每向后移一位就是一个新的单词,那么则加上其对应的 embedding),目标是预测下一个位置的单词是什么。
当第一次输入时,输入内容为一个特殊token,如目标序列开始的token或源序列结尾的token,目标则是预测目标序列第一个单词。
Encoder端
每个Encoder模块包含「两个子模块」:多头注意力模块和前馈神经网络模块。
- 前馈神经网络模块:
Add,Residual connection残差连接,来源于论文Deep Residual Learning for Image Recognition[1],常用于解决深度神经网络梯度更新问题。
Norm , layer normalization
经过两个操作后子模块的输出为
LayerNorm(x + sublayer(x)) ,其中Sublayer 为子模块的输出
- Multi-Head Attention子模块
先看self-attention操作,其本质就是attention注意力机制,不过是自身和自身进行运算(token)目的是将q和k-v键值对的组合映射到输出,输出可以理解为对values的加权和,对应给每个value的权重由query 与对应 key 的相似性函数计算得来。输入query,keys,values 和输出都是向量,query 和 keys 的维度均为 d k d_k dk,values 的维度为 d v d_v dv。
回顾seq2seq模型使用attention机制,其目的是计算decoder中的向量和encoder中向量的关系,self- attention也不例外。
论文中相似性函数为“Scaled Dot-Product”,与一般的dot-prodect相比加入了scaled步骤,这么做的原因是当 d k d_k dk很大时,query 与key的点乘结果的方差会很大,当这个结果直接进入softMax函数后,大的值会更大,小的值会被压低,导致softMax的pdf会很peak。
蓝色曲线代表query 与key的点乘结果的pdf,黄色曲线美为softMax的pdf
产生的问题:
除了高数值的那些dimension会在training过程得到gradient的update,其余数值接近0的维度很难被训练到,导致每次训练的效率很低。
解决方案:
将计算后的q和v的点乘结果处以
d
k
\sqrt{d_{k}}
dk,背后的原因如下:
假设q和k是均值为0方差为1的随机变量,那么点积的结果
q
⋅
k
=
∑
i
=
1
d
k
q
i
k
i
q \cdot k = \sum_{i=1}^{d_k} q_i k_i
q⋅k=∑i=1dkqiki,均值为0,方差为
d
k
d_{k}
dk
multi-head attention 就是重复h次self-attention操作,每次将 Q , K , V Q,K,V Q,K,V(代表一个词的embedding)通过对应的参数矩阵映射到一个低维子空间后之后,做self-attention,然后将拼接的结果经过一个linear全连接层得到最后的输出向量(作为value的一个加权和)。具体图解如下
关于Multi-head Attention 的作用:
论文原文提到:
Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions. With a single attention head, averaging inhibits this.
解读:
是将模型分为多个头,形成多个子空间,可以让模型去关注不同方面的信息,最后再将各个方面的信息综合起来。可以类比 CNN 中同时使用「多 个卷积核」的作用,直观上讲,多头的注意力「有助于网络捕捉到更丰富的特征/信息」。
上面图中公式的图解如下:
X代表上面图中的QKV,分别与对应的权重矩阵W相乘进行linear project,同时也可以降维。(论文中输入维度为512,降维后可以有效压缩输入向量)
拓展到矩阵形式:
将不同head产生的output拼接到一起然后通过乘上对应的参数矩阵,得到最终的encoder输出
整个encoder端的计算示意图:
X矩阵每一行代表一个token的输入词向量
- Encoder input
由于缺少了recurrent unit,导致无法获得词的顺序,解决方案就是加入Positional Encoding ,具有与 embedding 相同的维度 d m o d e l d_{model} dmodel。公示如下图所示
下图中每一行代表一个Positional Encoding,可以看出每个词的Positional Encoding存在明显的差异
Decoder端
说完Encoder后再来看Decoder端,如下图所示右半部分的decoder端包含两个Multi-head attention模块(绿色和蓝色)
值得关注的是decoder端的输入在训练和预测阶段是不同的:
训练时候的输入为shifted right一位后的整体目标序列然后加上对应的Positional encoding。
关于shifted right的解释:
类似于seq2seq中decoder的输入,对于第一个要预测的位置来讲,要以一个特殊的字符作为句子开始,然后预测出目标序列的第一个字符单词。
例如原始目标序列为“I am a student”, 那么shifted right一位后的输入就是“ I am a student”, 是代表目标序列开始的 特殊字符(与seq2seq中decoder端的第一个输入相同)。其目标则是预测下一个位置的单词(token)是什么。
对应到 time step 为 1 时,则是预测目标序列的第一个单词(token)是什么,以此类推。
而在测试的时候,先生成第一个位置的输出,在第二次预测时将其加入输入序列,以此类推直至预测结束。
绿色模块Decoder self attention与Encoder端的红色模块Encoder self attention一致, Q , K , V Q,K,V Q,K,V都代表一个词的embedding,但需要注意的是decoder端需要做mask操作,只允许关注到输出序列中早于当前位置之前的单词,将当前token之后的token全都mask掉(具体操作为对应的value设置成- infinity),因为在预测的时候是看不到未来序列的,此举是为了保持训练和预测阶段的一致性。
蓝色模块Encoder-Decoder self attention不同之处是:
Query 矩阵来自前一层绿色模块Decoder self attention的输出 ,而 Key 矩阵和 Value 矩阵来自于解码器最终的输出,这样做的直观理解为计算Decoder端Q与Encoder端输入序列每个词的联系。
下图展示了Transformer如何处理machine translation任务,值得注意的是encoder的最后一层输出K和V矩阵到decoder端的encoder-decoder attention模块进行运算。
由于每个decoder中的encoder-decoder attention都要用到decoder self attention的Q和 encoder端self-attention的kv进行运算,所以如下图绿色虚线所示,encoder #2输出的kv矩阵会送到每个decoder(图中为decoder #1和#2)。
关于encoder-decoder attention的直观理解可以类比seq2seq中attention机制(decoder的hidden state 作为query 分别关注每个encoder的hidden state(key-value pair)以此去得到原始序列的不同位置信息)
残差连接
The Final Linear and Softmax Layer
Linear and Softmax Layer 的主要作用是将decoder端输出的浮点数向量转化为具体的token。
- linear层将decoder输出的vector映射为一个维度更大的logits向量。
- 假设模型已知10000个从训练集学习到的单词(输出单词表),对应的logits向量维度就是10000,每个维度的值对应每个单词的分数。
- softmax 层将这些分数转化为概率,加合为一。与概率最高的维度对应的单词会被当作当前时间点的输出。
训练过程
至此前向传播过程随着decoder能成功输出而结束,以机器翻译为例子,我们想要模型的输出和输入的目标语句保持一致,也就是让两个句子的概率分布尽量接近,以此为损失函数来进行反向传播优化模型参数
并行计算
Transformer的出现解决了传统seq2seq模型无法并行训练的问题,例如将"I am fine" 翻译成“我很好”,seq2seq模型在每个时间步只能逐次翻译出每个token,而Transformer可以翻译出一整句话。值得注意的是Encoder端默认在训练和测试阶段都是并行化一次得到整个句子的representation,但decoder端的并行计算需要teach-forcing和masked self-attention 而且只在训练阶段有效,因为预测阶段缺少真实数据,如果有了真实数据作为decoder端每个时间步的输入,则可以打破RNNs在预测时需要上一个时间步的输出才能进行后续计算的限制,从而进行并行训练。
masked self-attention其目的是为了在预测未来数据时把不可见的滞后的数据屏蔽掉,防止数据泄露
参考:
《应用深度学习》台湾大学
Attention is all you need
The Illustrated Transformer