Transformer
1. 为什么要使用Self-attention?
Transformer的中文意思是’变形金刚’,其一个很经典的应用就是BERT,Transformer实际上是Seq2seq model with “Self-attention”
一般提到要处理一个Sequence,最常使用的是RNN:
输出b1-b4时把每一个a1-a4都处理过,这样不容易被平行化,这样就有人提出了CNN来代替RNN进行处理(CNN可以平行处理):
这样每个CNN只能考虑一段时间的信息,其实只要叠足够的层数,等同于蓝色的Filter已经看了所有的句子(较高层的滤波器可以考虑较长的序列)
问题是需要叠很多层,所以提出了Self-Attention的方法:
2. Self-Attention
2.1 基本思想
最早来自于论文《Attention is all you need.》(https://arxiv.org/abs/1706.03762):
拿每个 query q 去对每个key k 做 attention,Attention可以自己设计:
b2的计算是可以同时进行的,b3、b4同理:
如果之前的听不懂,只需要知道有一个Self-attention层,输入输出如下所示:
2.2 平行化(矩阵)计算
接下来进一步说明Self-attention是如何进行平行化计算的
为了简单起见,忽略√𝑑,把k做转置操作:
把q2拿出来:
下面做weighted sum:
再把之前的计算快速看一遍:
反正就是一堆矩阵乘法,用 GPU 可以加速
2.3 Multi-head Self-attention
Self-attention有一个变形(Multi-head Self-attention), (2 heads as example):
好处是:有可能不同的head关注的点不一样
2.4 Positional Encoding
- Self-attention中没有位置信息,例如’我打了他’和’他打了我’是一样的,这显然是不合理的
- 原稿:每个位置都有一个唯一的位置向量𝑒^𝑖(未从数据中学习)
- 换言之:每个𝑥𝑖附加一个one-hot向量𝑝𝑖,代表了位置的信息
原论文的WP是手设的,图片如下:
这样我们原来的Seq2seq with Attention中的RNN都可以用Self-attention换掉:
一个关于Self-Attention的Seq2seq modle动画演示:
3. Transformer结构
以汉英翻译为例:
接下来看看里面每一个Encoder、Decoder在做什么事:
4. Attention可视化
Attention 可视化:
编码器对单词“it”从第5层到第6层的自我注意力分布进行了英法翻译训练(八个注意力头中的一个):
Multi-head Attention,显然下面红色的做的是一个Local Attention:
5. 应用场景
- 如果可以使用seq2seq,那么就可以使用transformer,例如此:
- Transformer后面有一个变形叫做Universal Transformer:
- 影像处理 Self-Attention GAN:
小结
- 问题提出:使用RNN不能平行处理,每一个输出需要考虑所有的输入,CNN需要叠很多层
- 原来的Attention只是一个句子生成一个隐层或者Memory Network一个句子生成两个向量?这里Self-Attention把一个输入的embedded分成三个部分,分别用其中两个来匹配,另一个储存着信息
- 插入时间的维度的操作好像懂了,但是为什么不能通过训练学出来?
- Transformer的结构还是很复杂的,动手编程实现一下