0. 前言
Transformer实际上就是一个带有“self-attention”的sequence-to-sequence模型。
1.Transformer的提出
一般的sequence-to-sequence模型是用RNN来做的,但这样构成的模型不能进行平行计算,例如下图中左边的模型就是RNN结构的sequence-to-sequence模型,想要求出
b
4
b^4
b4就得先从
a
1
a^1
a1输入开始一步一步往后求,直到求出
b
4
b^4
b4,而不能对
a
1
,
a
2
,
a
3
,
a
4
a^1,a^2,a^3,a^4
a1,a2,a3,a4一起计算。
为了能够进行并行计算,提出了使用CNN代替RNN的方法,如上图右侧基于CNN的sequence-to-sequence模型。这个模型中每个三角形的底部是m个输入,顶部是n个输出,n<m,这样的话这个模型就可以并行计算了,但它的感受野与每个CNN的输入尺寸有关,也与CNN的层数有关。但不管怎么样,CNN都无法像RNN一样看的无限远。
也就是说RNN结构的sequence-to-sequence模型和CNN结构的sequence-to-sequence模型都有其优缺点,所以就有了Transformer。Transformer是用Self-Attention Layer来替代RNN的sequence-to-sequence模型。
Transformer模型在质量上更优越,同时更具可并行性,并且需要更少的训练时间。
Transformer中的
b
i
b^i
bi是由所有的输入决定的,比如上图中的
b
2
b^2
b2是由
a
1
,
a
2
,
a
3
,
a
4
a^1,a^2,a^3,a^4
a1,a2,a3,a4共同决定的,且
b
1
,
b
2
,
b
3
,
b
4
b^1,b^2,b^3,b^4
b1,b2,b3,b4能够被平行计算。
2. Self-attention
第一步:
第二步:
第三步:
第四步:
计算 b 1 b^1 b1的时候可以如果让 α ^ \hat{\alpha} α^都不为0,那么 b 1 b^1 b1就考虑了全局的输入,如果计算 b 1 b^1 b1的时候让 α ^ 1 , 1 , α ^ 1 , 2 , α ^ 1 , 3 \hat{\alpha}_{1,1},\hat{\alpha}_{1,2},\hat{\alpha}_{1,3} α^1,1,α^1,2,α^1,3为0,但 α ^ 1 , 4 \hat{\alpha}_{1,4} α^1,4不为0,则 b 1 b^1 b1只考虑了局部输入。下图中的“×”代表乘。
用上面的方法就可以计算出所有的
b
b
b了
用矩阵的形式来看:
框着
k
k
k的橘色方框横过来代表转置
将
α
\alpha
α进行softmax变为
α
^
\hat{\alpha}
α^
整个过程
3. Multi-head Self-attention(以双头为例)
其实就是把多个自注意力连起来,这样的一来就可以分工协作了,比如有的头可以把注意力放在长期信息上,有的头可以把注意力放在短期信息上,然后再进行集合。
4. 位置编码
因为在Transformer中没有rnn,所以如果直接将数据输入模型的话是没有位置信息的,所以需要位置编码。
对
p
i
p^i
pi进行独热编码,编码完为一个向量,这个向量只有第i个值为1,其余都为0,这样再将输入
x
i
x^i
xi和
p
i
p^i
pi拼接起来就可以表示value和position了。
W
p
W^p
Wp是人为设置的,绘制出来如下所示:
5.seq2seq with attention
就是将普通的seq2seq模型中的rnn换位Self-Attention
6. Transformer
编码器部分的Multi-Head Attention是让
a
a
a经过Self-Attention Layer变成
b
b
b;Add&Norm是让
a
a
a和
b
b
b先加起来再通过Layer Norm。
解码器部分粉色框里面的输入是上一次计算产生的输出。
Masked表示decoder会append到已经产生出来的sequence。
7. 可视化
一个句子中的每两个单词都有连接,连接的线条越粗说明attention的权重越大。
下图中第一句话中的it分给animal的注意力最多,因为it代指的就是这个animal,第二句话的it分给street的注意力最多,因为这个it代指street。
下图中绿色的代表Multi-head Attention
8. 应用