Attention Is All You Need
1 模型
Transformer 是基于经典的Encoder-Decoder架构:
-
Encoder 的输入由 Input Embedding 和 Positional Embedding 求和组成。
-
Decoder 的初始输入由 Output Embedding 和 Positional Embedding 求和得到。
上图中 Nx 框出来的部分是 Encoder/Decoder 的一层,Transformer 中 Encoder 和 Decoder 各有6层。
2 Attention机制
2.1 Scaled Dot-Product Attention
Attention
(
Q
,
K
,
V
)
=
softmax
(
Q
K
T
d
k
)
V
\text { Attention }(Q, K, V)=\operatorname{softmax}\left(\frac{Q K^{T}}{\sqrt{d_{k}}}\right) V
Attention (Q,K,V)=softmax(dkQKT)V
具体计算步骤见:NLP中的Attention机制,这里打分采用缩放点积模型。
公式 Q K T Q K^{T} QKT, 其实就会组成一个word2word的attention map(加了softmax之后就是一个合为1的权重了)。比如说你的输入是一句话 “i have a dream” 总共4个单词,这里就会形成一张4x4的注意力机制的图:
注意:encoder里面是叫self-attention,decoder里面是叫masked self-attention。
masked就是要在做language modelling(或者像翻译)的时候,不给模型看到未来的信息(沿着对角线把灰色的区域用0覆盖掉):
详细来说,i作为第一个单词,只能有和i自己的attention。have作为第二个单词,有和i, have 两个attention。 a 作为第三个单词,有和i,have,a 前面三个单词的attention。到了最后一个单词dream的时候,才有对整个句子4个单词的attention。
做完softmax后就像这样,横轴合为1
2.2 Multi-Head Attention
Multi-Head Attention就是把Scaled Dot-Product Attention的过程做H次,然后把输出Z合起来,结构如下:
MultiHead ( Q , K , V ) = Concat ( head 1 , … , head h ) W O where head i = Attention ( Q W i Q , K W i K , V W i V ) \begin{aligned} \text { MultiHead }(Q, K, V) &=\text { Concat }\left(\text { head }_{1}, \ldots, \text { head }_{\mathrm{h}}\right) W^{O} \\ \text { where head }_{\mathrm{i}} &=\text { Attention }\left(Q W_{i}^{Q}, K W_{i}^{K}, V W_{i}^{V}\right) \end{aligned} MultiHead (Q,K,V) where head i= Concat ( head 1,…, head h)WO= Attention (QWiQ,KWiK,VWiV)
具体计算步骤见:NLP中的Attention机制
3 结构
3.1 Positional Encodings
因为模型不包括Recurrence/Convolution,因此是无法捕捉到序列顺序信息的,例如将K、V按行进行打乱,那么Attention之后的结果是一样的。但是序列信息非常重要,代表着全局的结构,因此必须将序列的分词相对或者绝对position信息利用起来。
positional encodings的计算公式如下:
P
E
(
p
o
s
,
2
i
)
=
sin
(
p
o
s
/
1000
0
2
i
/
d
model
)
P
E
(
p
o
s
,
2
i
+
1
)
=
cos
(
p
o
s
/
1000
0
2
i
/
d
model
)
\begin{aligned} P E_{(p o s, 2 i)} &=\sin \left(p o s / 10000^{2 i / d_{\text {model }}}\right) \\ P E_{(p o s, 2 i+1)} &=\cos \left(p o s / 10000^{2 i / d_{\text {model }}}\right) \end{aligned}
PE(pos,2i)PE(pos,2i+1)=sin(pos/100002i/dmodel )=cos(pos/100002i/dmodel )其中,pos 是 position,i 是 dimension。
Position Embedding本身是一个绝对位置的信息,但在语言中,相对位置也很重要,Google选择前述的位置向量公式的一个重要原因是,由于我们有:
这表明位置p+k的向量可以表示成位置p的向量的线性变换,这提供了表达相对位置信息的可能性。
3.2 Position-wise Feed-forward Networks
在进行了Attention操作之后,encoder和decoder中的每一层都包含了一个全连接前向网络,对每个position的向量分别进行相同的操作,包括两个线性变换和一个ReLU激活输出:
F
F
N
(
x
)
=
W
2
σ
(
W
1
x
)
=
max
(
0
,
x
W
1
+
b
1
)
W
2
+
b
2
\begin{aligned} F F N(x)&=W_{2} \sigma\left(W_{1} x\right)\\ &=\max \left(0, x W_{1}+b_{1}\right) W_{2}+b_{2} \end{aligned}
FFN(x)=W2σ(W1x)=max(0,xW1+b1)W2+b2其中每一层的参数都不同。
为什么是两层的前馈神经网络:只有至少两层的前馈神经网络才能拟合任意的函数(单层的不可以——如只有一层的感知器)。
3.3 Encoder
Encoder 由 6 个相同的层组成,每个层包含 2 个部分:
- sub-layer1:Multi-Head Self-Attention
- sub-layer2:Position-Wise Feed-Forward Network,全连接网络
残差网络出处:ResNet
- 原理:假如输入为x,要得到的输出为H(x)。那么可以通过 H(x) = F(x) + x,转换为学习F(x)。等得到F(x)后,在此基础上加上X即可得H(x)。
- 解决"网络退化"的机理:
- 恒等映射的梯度为1,保证深层的梯度顺畅回传
- 传统线性网络难以拟合"恒等映射",即什么都不做
每个sub-layer都模拟了残差网络,每个sub-layer的输出都是:
L
a
y
e
r
N
o
r
m
(
x
+
S
u
b
l
a
y
e
r
(
x
)
)
LayerNorm(x + Sublayer(x))
LayerNorm(x+Sublayer(x))
其中Sublayer(x) 表示Sub-layer对输入 x 做的映射,为了确保连接,所有的sub-layers和embedding layer输出的维数都相同,为 d m o d e l d_{model} dmodel。
3.4 Decoder
和 Encoder 相似,Decoder 也是由 6 个相同的层组成,每个层包含 3 个部分:
- sub-layer1:Masked Multi-Head Self-Attention
mask机制的原理:在 decoder 端, 预测的信息是基于encoder 与以及已预测出的单词
mask机制的目的:保证训练时位置 i i i 的预测仅仅依靠位置 i i i 之前的输出,即在生成当前词的时候不会注意到之后的词
参考:Transformer 源码中 Mask 机制的实现
- sub-layer2:Multi-Head Context-Attention(Encoder-Decoder Attention)
Encoder输出结果跟Decoder第一部分输出结果之间做Attention。
Q为decoder中第一部分的输出,K,V均为encoder的输出。
- sub-layer3:Position-Wise Feed-Forward Network,全连接网络,与encoder中的相同
Transformer的Decoder的输入输出:Transformer的Decoder的输入输出都是什么
3.5 The Final Linear and Softmax Layer
decoder组件最后会输出一个实数向量,但我们需要得到一个单词:这便是线性变换层(Linear Layer)要做的工作,它之后就是Softmax层。
- Linear Layer:是一个简单的全连接神经网络,它可以把解码组件产生的向量投射到一个比它大得多的、被称作对数几率(logits)的向量里。
不妨假设我们的模型从训练集中学习一万个不同的英语单词(我们模型的“输出词表”)。因此对数几率向量为一万个单元格长度的向量——每个单元格对应某一个单词的分数。
- Softmax Layer:把那些分数变成概率(均为正数、上限1.0)。概率最高的单元格被选中,并且它对应的单词被作为这个时间步的输出。
4 Decode流程演示
decoder从处理输入序列开始。然后,最顶层encoder的输出被转化为一组注意力向量K和V,这些向量要被每个decoder在其 "Encoder-Decoder Attention"层中使用,它帮助decoder将注意力集中在输入序列中的适当位置:
下面的步骤重复这个过程,直到达到一个特殊的符号(&lend of sentence>),表示decoder已经完成了输出。每一步的输出都会在下一个时间步骤中被输入到最底层的decoder中:
5 训练过程总结
模型的输出词表在训练之前的预处理流程中就被设定好。假设我们的输出词汇仅仅包含六个单词:“a”, “am”, “i”, “thanks”, “student”以及 “<eof>”(end of sentence的缩写形式)。例如根据输出词表得到"am"的one-hot编码:
损失函数
例如我们正在训练模型——把“merci”翻译为“thanks”。即我们想要一个表示单词“thanks”概率分布的输出。
(untrained)模型产生的概率分布在每个单元格/单词里都赋予了随机的数值。我们可以用真实的输出(correct and desired output)来比较它,然后用反向传播算法来略微调整所有模型的权重,生成更接近结果的输出:
我们的目标输出:
在一个足够大的数据集上训练模型足够长的时间后,我们希望生成的概率分布看起来像这样: