1、Transformer总体结构
其中,左边代表Encoder(编码器)的执行流程,右边代表Decoder(解码器)的执行流程。
2、Encoder部分
2.1 编码
在Encoder中,原始Transformer的输入(上图中的Inputs)为单词序列(句子)。首先要对单词序列进行Embedding,将其变为对应的词向量;其次加入Positional Encodings(位置编码)。位置编码用PE来表示,可以通过训练得到,也可以通过公式计算得到。
2.1.1 位置编码(Positional Embedding)
Transformer原文使用计算公式得到位置编码PE,计算表达式如下:
其中,pos代表单词在句子中的位置(0到句子的最大长度),以句子“C我是一个打工人C”为例,“我”的pos值为1,“是”的pos值为2,以此类推,“人”的pos值为7。
PE是一个矩阵,d表示PE的列的维度(等于单词的Embedding维度),i 是0到dmodel/2-1之间的整数值(当PE的维度dmodel为512时,i为255),因此可推出2i表示向量中的偶数维,2i+1表示向量中的奇数维。PE(pos,2i)是PE矩阵中第pos行,第2i列的数值,是一个标量;同理,PE(pos,2i+1)是PE矩阵中第pos行,第2i+1列的数值,也是一个标量。
还以dmodel=512为例,对于“我是一个打工人”中的“我”,计算如下:
- i = 0时:
- PE(1, 0) = sin(1/10000^(2*0/512)) = sin(1/1) ≈ 0.8414
- PE(1, 1) = cos(1/10000^(2*0/512)) = cos(1/1) ≈ 0.5403
- i = 1时:
- PE(1, 2) = sin(1/10000^(2*1/512)) = sin(1/1.036) ≈ 0.8218
- PE(1, 3) = cos(1/10000^(2*1/512)) = cos(1/1.036) ≈ 0.5696
- i = 2时:
- PE(1, 4) = sin(1/10000^(2*1/512)) = sin(1/1.036) ≈ 0.8019
- PE(1, 5) = cos(1/10000^(2*1/512)) = cos(1/1.036) ≈ 0.5973
- …
- …
- i = 255时:
- PE(1, 510) = sin(1/10000^(2*1/512)) = sin(1/1.036) ≈ 0.0001
- PE(1, 511) = cos(1/10000^(2*1/512)) = cos(1/1.036) ≈ 0.9999
所以:“我”的位置向量表示为[0.8414, 0.5403, 0.8218, …, 0.0001, 0.9999],同理根据以上过程可以将所有词的位置向量计算出来。
2.1.2 词编码(Token Embedding)
做词编码的时候可以提前使用word2vec等算法训练得到Embedding矩阵,也可以在Transformer训练时获得。
2.2 Multi-Head Attention
由上图可看出,Multi-Head Attention模块由多个Scaled Dot-Product Attention机制构成。在做运算时,Scaled Dot-Product Attention以Q,K,V作为输入,其中,Q表示查询,K表示键,V表示值。
2.2.1 Q,K和V的计算
原始数据X(词编码+位置编码)分别与三个线性变换矩阵相乘,得到Scaled Dot-Product Attention的输入Q、K和V,过程如下图所示:
其中,WQ、WK、WV都是训练得到的,上图Q、K、V的计算过程用公式可表示为:X·
W
Q
W_Q
WQ=Q、X·
W
K
W_K
WK=K、X·
W
V
W_V
WV=V,而X、Q,K和V的每一行都表示一个单词。
2.2.2 Self-Attention(Scaled Dot-Product Attention)的计算及输出
计算完Q、K和V之后,就得到了Self-Attention模块的所有输出,即可完成注意力的计算:
其中,dk代表Q,K矩阵的列数(表征每个词的向量的维度),因要计算Q和K矩阵中每个向量之间的内积,为了防止内积过大导致softmax分布过于陡峭,影响梯度计算的稳定性,所以每个元素都除以
d
k
2
\sqrt[2]{d_k}
2dk进行缩放,以在训练过程中使梯度得以稳定。
具体操作示意如下图所示:
其中,Q的每一行,
K
T
K^T
KT的每一列都代表一个单词,执行Q·
K
T
K^T
KT并通过softmax得到每个单词对其他单词的attention系数(每一行和都变为1)。
最后,将得到的矩阵和V相乘,来获得Self-Attention最终的输出。
2.2.3 整合多个Self-Attention
为了让模型在不同的表示空间里学习到相关的信息,Transformer在Encoder中使用了多个Scaled Dot-Product Attention模块(后续以8个Scaled Dot-Product Attention为例),组合成Multi-Head Attention。具体如下:
输入X首先分别经过8个Scaled Dot-Product Attention模块,得到8个输出矩阵
S
1
S_1
S1,
S
1
S_1
S1,…,
S
8
S_8
S8;然后,将这8矩阵进行Concat拼接;最后,将拼接后的矩阵传入一个Linear层,得到最终的Multi-Head Attention输出。
2.3 Feed Forward Network(FFN)+ 残差结构
得到Multi-Head Attention的输出之后,Transformer的Encoder将Multi-Head Attention的输出作为输入送入一个包含前馈神经网络模块(FFN)的残差结构中。
FFN比较简单,就是从输入–>全连接层1–>ReLu激活函数–>Dropout–>全连接层2的执行过程,公式可表示如上图。使用FFN能够增强模型的非线性表达能力。
FFN之后,再进行add和Layer Normalization操作,提高模型拟合程度。