Transformer的中文意思是’变形金刚’,其一个很经典的应用就是BERT,Transformer实际上是Seq2seq model with “Self-attention”
一般提到要处理一个Sequence,最常使用的是RNN:
输出b1-b4时把每一个a1-a4都处理过,这样不容易被平行化,这样就有人提出了CNN来代替RNN进行处理(CNN可以平行处理):
这样每个CNN只能考虑一段时间的信息,其实只要叠足够的层数,等同于蓝色的Filter已经看了所有的句子(较高层的滤波器可以考虑较长的序列)
问题是需要叠很多层,所以提出了Self-Attention的方法:
最早来自于论文《Attention is all you need.》(https://arxiv.org/abs/1706.03762):
拿每个 query q 去对每个key k 做 attention,Attention可以自己设计:
b2的计算是可以同时进行的,b3、b4同理:
如果之前的听不懂,只需要知道有一个Self-attention层,输入输出如下所示:
接下来进一步说明Self-attention是如何进行平行化计算的
把q2拿出来:
下面做weighted sum:
再把之前的计算快速看一遍:
反正就是一堆矩阵乘法,用 GPU 可以加速
Self-attention有一个变形(Multi-head Self-attention), (2 heads as example):
这样我们原来的Seq2seq with Attention中的RNN都可以用Self-attention换掉:
一个关于Self-Attention的Seq2seq modle动画演示:
以汉英翻译为例:
接下来看看里面每一个Encoder、Decoder在做什么事:
Attention 可视化:
编码器对单词“it”从第5层到第6层的自我注意力分布进行了英法翻译训练(八个注意力头中的一个):
Multi-head Attention,显然下面红色的做的是一个Local Attention: