一、概要
现有的序列模型存在的问题:
现在主流的序列模型都是基于复杂的循环神经网络或者是卷积神经网络构造而来的Encoder-Decoder模型。由于传统的Encoder-Decoder架构在建模过程中,下一个时刻的计算过程会依赖于上一个时刻的输出,这种固有的属性限制了传统的Encoder-Decoder模型在时间维度上不能进行并行计算。
所以,就提出了一种全新的Transformer架构来解决这一个问题,它摒弃了传统的循环结构,使用了自注意力机制(self-attention)。
二、Transformer模型详解
1.整体结构和流程
图 1 Transformer的整体结构
Transformer由Encoder和Decoder两部分组成。
Transformer的工作流程:
第一步:获取输入句子的每一个单词的表示向量X,X由单词的Embedding和单词位置的Embedding相加得到。
图 2 Transformer的输入表示
为什么需要单词位置的Embedding?
因为Transformer不采用RNN的结构,而是使用全局信息,不能利用单词的顺序信息。
第二步:将得到的单词表示向量矩阵(Xn*d)传入Encoder中,经过6个Encoder block后得到句子所有单词的编码信息矩阵C。
n是单词个数,d是向量的维度(论文里d=512)
图 3 Transformer Encoder编码句子信息
第三步:将Encoder输出的编码信息矩阵C传递到Decoder中,Decoder依次会根据当前翻译过的单词i翻译下一个单词i+1。翻译到单词i+1的时候需要通过Mask(掩盖)操作遮盖住i+1之后的单词。
图 4 Transformer Decoder预测
如图,Decoder先接收了Encoder的编码矩阵C,然后手续输入一个翻译开始符“<Begin>”,预测第一个单词“I”;然后输入翻译开始符“<Begin>”和单词“I”,预测单词“have”,依次类推。
2.Transformer输入
Transformer的单词输入表示:单词Embeding和位置Embedding相加得到。
位置Embedding?
因为Transformer不采用RNN的结构,而是使用全局信息,不能利用单词的顺序信息,所以使用位置Embedding保存单词在序列中的相对或绝对位置。
位置Embedding用PE表示,计算公式如下:
pos:单词在句子中的位置;d:表示PE的维度;2i表示偶数的维度,2i+1表示奇数的维度。
使用这种公式计算PE的好处:
- 使PE能够适应比训练集里面所有句子更长的句子,假设训练集里面最长的句子是有20个单词,突然来了一个长度为21的句子,则使用公式计算的方法可以计算出21位的Embedding。
- 可以让模型容易地计算出相对位置。对于固定长度的间距 k,PE(pos+k) 可以用 PE(pos) 计算得到。因为 Sin(A+B) = Sin(A)Cos(B) + Cos(A)Sin(B), Cos(A+B) = Cos(A)Cos(B) - Sin(A)Sin(B)。
3.Self-Attention(自注意力机制)
图 5 transformer的内部结构图
Multi-Head Attention:由多个Self-Attention组成,Encoder block包含一个Multi-Head Attention, 而Decoder block包含两个Multi-Head Attention(其中有一个用到Masked)。
Multi-Head Attention上方包括一个Add&Norm层,Add表示残差连接,Norm表示对每一层的激活值进行归一化。
3.1 Self-Attention结构
图 6 Self-Attention结构
Self-Attention接收的是输入(单词的表示向量x组成的矩阵X)或者上一个Encoder block的输出。Q、K和V是通过Self-Attention的输入进行线性变换得到。
Self-Attention 的输入用矩阵X进行表示,则可以使用线性变阵矩阵WQ,WK,WV计算得到Q,K,V。计算如下图所示,注意 X, Q, K, V 的每一行都表示一个单词。
图 7 Q、K和V的计算
得到矩阵Q、K和V之后,就可以计算出Self-Attention的输出。计算公式如下:
公式中计算矩阵Q和K每一行向量的内积,为了防止内积过大,因此除以dk的平方根。Q乘以K的转置后,得到的矩阵行列数都为 n,n 为句子单词数,这个矩阵可以表示单词之间的 attention 强度。下图为Q乘以KT,1234 表示的是句子中的单词。
图 8 Q乘以K的转置的计算
得到QKT之后,使用 Softmax 计算每一个单词对于其他单词的 attention 系数,公式中的 Softmax 是对矩阵的每一行进行 Softmax,即每一行的和都变为 1。
图 9 对矩阵的每一行进行Softmax
得到Softmax矩阵之后就可以和V相乘,得到最终的输出Z。
图 10 Self-Attention输出
上图中Softmax矩阵的第一行表示单词1与其他所有单词的attention系数,最终单词1的输出Z1等于所有单词i的值Vi根据attention系数的比例加在一起得到。如下图所示:
图 11 Zi的计算方法
3.2 Multi-Head Attention
Multi-Head Attention是由多个Self-Attention组合形成的。
图 12 Multi-Head Attention
从上图可以看到Multi-Head Attention包含多个Self-Attention层,首先将输入X分别传递到h个不同的Self-Attention中,计算得到h个输出矩阵Z。论文中h=8。
图 13 多个Self-Attention
得到8个输出矩阵Z1到Z8之后,Multi-Head Attention将它们拼接在一起(Concat),然后传入一个Linear层,得到Multi-Head Attention最终的输出Z。
图 14 Multi-Head Attention的输出
Multi-Head Attention输出的矩阵Z与其输入的矩阵X的维度是一样的。
4.Encoder结构
4.1 Add & Norm
Add & Norm层由Add和Norm两部分组成,其计算公式如下:
其中X表示Multi-Head Attention或者Feed Forward的输入,MultiHeadAttention(X) 和 FeedForward(X) 表示输出。
Add指X+MultiHeadAttention(X),是一种残差连接,通常用于解决多层网络训练的问题。
Norm指 Layer Normalization,通常用于 RNN 结构,Layer Normalization 会将每一层神经元的输入都转成均值方差都一样的,这样可以加快收敛。
4.2 Feed Forward
Feed Forward是一个两层的全连接层,第一层的激活函数为Relu,第二层不适用激活函数。公式如下:
X是输入,Feed Forward 最终得到的输出矩阵的维度与X一致。
4.3 组成Encoder
通过Multi-Head Attention,Feed Forward和Add & Norm就可以构造出一个Encoder block。Encoder block接收输入矩阵Xn*d,输出矩阵On*d,通过多个Encoder block叠加就可以组成Encoder。
第一个Encoder block的输入为句子单词的表示向量矩阵,后续Encoder block的输入是前一个Encoder block的输出,最后一个Encoder block输出的矩阵就是编码信息矩阵C,这一矩阵后续会作为Decoder的输入。
图 15 Encoder编码句子信息
5.Decoder结构
上图红色部分为Transformer的Decoder block结构,与Encoder block的差别:
- 包含两个Multi-Head Attention层;
- 第一个Multi-Head Attention层采用了Masked操作。
- 第二个Multi-Head Attention层的K、V矩阵使用Encoder的编码信息矩阵C进行计算,而Q使用上一个Decoder block输出矩阵。
- 最后有一个Softmax层计算下一个翻译单词的概率。
5.1 第一个Multi-Head Attention
Decoder block 的第一个 Multi-Head Attention 采用了 Masked 操作,因为在翻译的过程中是顺序翻译的,即翻译完第 i 个单词,才可以翻译第 i+1 个单词。通过 Masked 操作可以防止第 i 个单词知道 i+1 个单词之后的信息。
图 16 Decoder预测
第一步:是Decoder输入矩阵和Mask矩阵,输入矩阵包含"<Begin> I have a cat" (0, 1, 2, 3, 4) 五个单词的表示向量,Mask 是一个 5×5 的矩阵。在 Mask 可以发现单词 0 只能使用单词 0 的信息,而单词 1 可以使用单词 0, 1 的信息,即只能使用之前的信息。
图 17 输入矩阵与Mask矩阵
第二步:接下来的操作和之前的Self-Attention一样,通过输入矩阵X计算得到Q、K、V矩阵,然后计算Q和KT的乘积QKT。
第三步:在得到QKT之后需要进行Softmax,计算attention score,在Softmax之前需要使用Mask矩阵遮挡住每一个单词之后的信息。遮挡操作如下:
图 18 Softmax之前Mask
得到Mask QKT之后在Mask QKT上进行Softmax,每一行的和都为1。但是单词0在单词1,2,3,4上的attention socre都为0.
第四步:使用Mask QKT与矩阵V相乘,得到输出Z,则单词1的输出向量Z1是只包含单词1信息的。
图 19 Mask之后的输出
第五步:通过上述步骤就可以得到一个Mask Self-Attention的输出矩阵Zi,然后和Encoder类似,通过Multi-Head Attention拼接多个输出Zi,然后计算得到第一个Multi-Head Attention的输出Z,Z与输入X维度一样。
5.2 第二个Multi-Head Attention
Decoder block与第二个Multi-Head Attention变化不大,主要的区别在于其中Self-Attention的K、V矩阵不是使用上一个Decoder block的输出计算的,而是使用Encoder的编码信息矩阵C计算的。
根据Encoder的输出C计算得到K、V,根据上一个Decoder block的输出Z计算Q(如果是第一个Decoder block则使用输入矩阵X进行计算),后续的计算和之前一样。
这样做的好处:在Decoder的时候,每一位单词都可以利用到Encoder所有单词的信息(这些信息无需Mask)。
5.3 Softmax预测输出单词
Decoder block最后的部分是利用Softmax预测下一个单词,在之前的网络层可以得到最终的输出Z,因为Mask的存在,使得到此0的输出Z0只包含单词0的信息,如下:
Softmax根据输出矩阵的每一行预测下一个单词:
与Encoder一样,Decoder是由多个Decoder block组合而成。
6.Transformer总结
1.Transformer与RNN不同,可以比较好地进行并行训练;
2.Transformer本身是不能利用单词的顺序信息的,因此需要在输入中添加位置Embedding,否则Transformer就是一个词袋模型。
3.Transformer的重要技巧是Self-Attention结构,其中用到的Q、K、V矩阵通过输出进行线性变换得到。
4.Transformer中Multi-Head Attention中有多个Self-Attention,可以捕获单词之后多种维度上的相关系数attention score。