Transformer
- 做Softmax不是唯一的选项,做ReLu之类的结果也不会比较差,但是Softmax是用的最多的
- CNN是self-attention的特例,论文:On the Relationship between Self-Attention and Convolutional Layers
- CNN和self-attention做对比:AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE
Transformer是谷歌团队在2017年提出的一个模型,其舍弃了先前在NLP中使用最广泛的RNN,全面使用Attention机制最为模型的核心,而Transformer模型是后续bert模型的核心。本文部分参考了台大李宏毅老师的教学视频
视频地址:李宏毅老师机器学习视频
论文地址:《Attention Is All You Need》
Background
图1 Seq2Seq Model
Transformer是一种典型的Seq2Seq模型(输入是一个序列,输出也是一个序列的模型),如图1是一个Seq2Seq Model的基本结构,由Encoder处理输入的Sequence,然后丢给Decoder将其处理后产生一个Sequence并输出,而Transformer的核心机制attention相比于RNN最大的优点就是可并行处理,训练速度快。
RNN(循环神经网络)
图2 Seq2Seq with RNN[李宏毅老师transformer]
如图2是一个简单的RNN模型,输入是由四个向量组成的序列,输出也是由四个向量组成的序列(但是Seq2Seq不一定都是输入输出序列长度相同,也可能有一对多、多对一等)。当输出\(b^4\)的时候RNN已经将$a^1 $ ~ \(a^4\)的信息都看过了,因此RNN常用来处理序列模型,但是RNN有一个最大的缺点就是不可并行处理,其后一层的信息必须依赖于前一层神经网络的输出导致RNN的训练速度缓慢。
CNN(卷积神经网络)
而在处理序列模型问题时有人将卷积神经网络引入来解决RNN不能并行处理的缺点
图3 Seq2Seq with CNN[李宏毅老师transformer]
通过不同的filter来对输入向量进行处理,之后将第一层filter的输出合并送入第二层filter,以此来扩大filter的感受野,使其能看到更多的全局信息,但是这就牺牲了模型的序列处理能力来提高训练速度。而self-attention机制则完美地解决了这个问题,其既能很好地处理序列信息,又可以被并行计算。
Attention机制
Self-attention
图4 self-attention and RNN[李宏毅老师transformer]
在transformer中使用的self-attention,而self-attention机制的\(b^1 \to b^4\)可以并行计算出来,而且每个输出向量也可以看到输入序列中所有的向量。
图5 self-attention
图5中列出的为其中一个输出向量\(b^1\)的计算方法,其中\(q^i,k^i,v^i\)的计算公式如下:
\]
首先根据输入向量序列\(a^1 \to a^4\)计算出各自的\(q^i,k^i,v^i\)向量,用\(q^1\)分别和\(k^1 \to k^4\)做点积求出\(\alpha_{1,1}\’ \to \alpha_{1,4}\’\),之后用\(\alpha_{1,i}\’\)分别和\(v^i\)做点积,将四个计算结果相加即求得这一层self-attention layer的第一个输出向量\(b^1\),其它\(b^2 \to b^4\)的运算方法同\(b^1\)类似。而对于矩阵\(W^q, W^k, W^v\)是神经网络要学习的参数,可以随机初始化或者使用其它一些方法初始化,然后通过反向传播可以不断对这三个矩阵进行优化。
Mutil-head Self-attention
Mutil-head self-attention是self-attention的一个进阶版本,其中mutil-head指的是将\(q,k,v\)三个向量对不同矩阵做运算得到的不同的head,在李宏毅老师的视频中说不同的head可以理解为从数据中提取不同的特征,而对于翻译和语音识别在head较多的情况下取得的效果较好,head的数量是一个超参数,需要在具体情况根据需要设置。
图6 Mutil-head self-attention
如图6是mutil-head self-attention的计算方法,先由输入向量\(a^i\)得出向量\(q^i,k^i,v^i\),和\(q^i,k^i,v^i\)的生成方式类似,\(q^{i,1}\)也是将\(q^i\)乘上一个矩阵\(W^{q,1}\)来生成,其它几个head计算方法类似,而这个矩阵\(W^{q,1}\)也是神经网络的参数,需要通过反向传播来优化。需要注意的是,在计算\(b^{i,1}\)的时候,只需要将\(q^{i,1}\)和\(k^{i,1},v^{i,1}\)进行计算,而不需要计算\(q^{i,2}\)。
图7 mutil-head self-attention输出向量转换
如图7所示,由mutil-head self-attention生成的两个向量\(b^{1,1}, b^{1,2}\)通过乘上一个转换矩阵最后生成输出向量\(b^1\)。
Transformer
介绍完Transformer的核心机制self-attention,之后我们可以介绍Transformer了,其结构如图8所示,左半部分为transformer的Encoder部分,右半部分为Transformer的Decoder部分。
图8 Transformer
Encoder
图9 Encoder
Encoder的结构如图9所示,首先将Inputs嵌入一个Sequence中,再将Inputs中的位置信息编码后与Sequence相加(注意再self-attention中并没有嵌入位置信息,因此此处需要对位置信息进行编码后加到Sequence中)。之后将处理好的Sequence输入到图中圆角矩形包裹的模块中,此处的N×是指这个模块重复N次。
在transformer模块中首先对输入的Sequence送入multi-head attention layer中进行处理,将处理好的结果送入Add & Norm中,此处的Add & Norm,是指先进行一次Residual操作,即将输入的Sequence和multi-head attention layer进行相加,再对他们的结果进行layer normalization,即对每一个向量进行归一化处理。经过Add & Norm后送入一个全连接网络,最后再经过一次Add & Norm层,由此经过N次即是Transformer的Encoder的结构了,而在原论文中Encoder取N=6。
Decoder
对于Decoder可以分为两种:Autoregressive Decoder(AT)和None-autoregressive Decoder(NAT)。
图10 AT Decoder
在AT中会先输入BEGIN Token和Encoder的输出,之后输出一个结果向量,再将结果向量作为输入再输入到Decoder中来计算下一个结果,可以看出在AT中计算是不可并行的,因为后一个输入依赖于前一个输出。
图11 Transformer Decoder
在Transformer中的Decoder使用的是AT,可以注意到它和Encoder有两个地方不同,第一个是模块中加入了一个Masked Mutil-Head Attention Layer。
图12 Masked Self-Attention
Masked self-attention与self-attention不同的地方在于其计算\(b^2\)时只会使用到\(a^1\)和\(a^2\)的信息,而不会使用\(a^3,a^4\)的信息,因为在AT中,后一个输入依赖于前一个输出,要计算\(b^2\)时\(a^3,a^4\)还没有计算出来,因此需要忽略掉他们的信息。而在Encoder中\(a^1 \to a^4\)是一次全部输入进来的,所以不需要使用Masked self-attention。
图13 AT v.s. NAT
而NAT Decoder不同于AT Decoder,如图13所示,AT的每一个输入都依赖于前一个输出,而NAT则是一次性输入很多BEGIN Token进去,当遇到输出的一个END Token时则丢弃后面的输出,其相比于AT最大的好处就是可以并行计算,并且可以控制输出的长度,但是如何决定输入BEGIN Token的个数还有待研究。所以NAT的运算速度通常比AT快很多,但是其结果往往不如AT好。
对于Decoder模块的第二个self-attention,其有两个输入来自于Encoder,这叫做Cross Attention,在原始论文中Decoder中的每一层都是拿Encoder中最后一层的输出作为输入的,但是也可以用Encoder其他层的输出作为Decoder的输入,在论文:Layer-Wise Multi-View Decoding for Natural Language Generation中有详细做实验比较如果使用Encoder中不同层的输出作为Decoder的输入会有什么不同的结果。
Training
在Transformer的训练过程中,在Masked self-attention层中,我们不是将Decoder自己的输出作为下一个输入,而是将正确答案作为下一个输入,这叫Teacher Forcing
图14 Beam Search
Tips:
- Copy Mechanism:通过复制大大降低训练难度,将有些机器难以理解的东西直接复制过来
- Guided Attention(Montonic Attention, Location-aware attention):固定Attention 的计算顺序等,例如防止在语音合成等任务中先看到后面的信息再看前面的信息
- Beam Search:如图14所示,如果在AT中每次我们都选择最大的结果,有可能只达到一个局部最优解,而想获得全局最优解又不可能对所有解进行暴搜,这时候使用Beam Search可以帮我们获得一个接近全局最优解的解,对于Beam Search并不适用所有任务,可能在一些需要机器发挥一下创造性的任务时Beam Search,尤其是在语音合成任务中,往往需要加入一些噪音才能训练出更好的模型
- mismatch:在训练时我们给AT Decoder输入的全是最正确的答案,而在测试时Decoder遇到一点错误答案往往会产生较大的误差,一个解决方法是在训练时故意给AT Decoder一些错误的答案,这样Decoder在测试时遇到错误的答案时鲁棒性更好