Transformer解读和实战
Transformer解读和实战
背景
循环神经⽹络(RNN),LSTM,GRU等循环结构的神经⽹络已经在NLP应⽤任务中取得了卓越的表现,循环模型通常沿输⼊和输出序列的符号位置考虑计算,产⽣对应位置的隐藏状态ht,ht是前⼀状态ht-1和位置t的函数,这种顺序序列特性使得⽹络⽆法进⾏并⾏计算,对于较长的输⼊序列⽽⾔,其弊端就更加明显。
Transformer是第⼀个完全依靠⾃我注意来计算其输⼊和输出表⽰的转导模型,⽽⽆需使⽤序列对齐的RNN或卷积。
优点
(1)因为其抛弃了在NLP中最根本的RNN或者CNN并且取得了⾮常不错的效果,算法的设计⾮常精彩;
(2)Transformer长距离依赖: 由于Self-Attention是每个词和所有词都要计算Attention,所以不管他们中
间有多长距离,最⼤的路径长度也都只是 1,可以捕获长距离依赖关系,这对解决NLP中棘⼿的长期依赖问题是⾮常有效的。
(3)Transformer不仅仅可以应⽤在NLP的机器翻译领域,甚⾄可以不局限于NLP领域,是⾮常有科研潜⼒的⼀个⽅向。
(4)算法的并⾏性⾮常好,符合⽬前的硬件(主要指GPU)环境。
Transformer
transformer总体框架
Attention
Attention函数的本质可以被描述为⼀个查询(query)与⼀系列(键key-值value)对⼀起映射成⼀个输出。分为以下3步:
1.将query和每个key进⾏相似度计算得到权重,常⽤的相似度函数有点积,拼接,感知机等
2.使⽤⼀个softmax(因为是⼀系列的k/v,所以类似多分类,要⽤softmax)函数对这些权重进⾏归⼀化
3.将权重和相应的键值value进⾏加权求和得到最后的Attention
公式如下:
⽬前在NLP研究中,key和value常常都是同⼀个,即 key=value
k=v=源语⾔的encoder输出,q=⽬标语⾔的隐层状态
对于机器翻译来说,attention本质就是想给源语⾔的encoder输出的每⼀个元素(即V) 搞⼀个权重,然后加权求和。⽽这个权重是通元素它⾃⼰ (即K=V) 与⽬标语⾔的隐层状态 (即Q) 进⾏变换得到的
除以根号dk,防⽌点乘值过⼤,使得softmax函数值位于梯度很⼩的区域,换算后⾮0即1
self-attention
Self-Attention即K=V=Q,例如输⼊⼀个句⼦,那么⾥⾯的每个词都要和该句⼦中的所有词进⾏Attention计算。⽬的是学习句⼦内部的词依赖关系,捕获句⼦的内部结构
multi-head attention
就是把Q,K,V通过参数矩阵映射⼀下,然后再做Attention,把这个过程重复做h次,结果拼接起来
类⽐CNN中同时使⽤多个滤波器的作⽤,直观上讲,多头的注意⼒有助于⽹络捕捉到更丰富的特征/信息。
根据《Analyzing Multi-Head Self-Attention: Specialized Heads Do the Heavy Lifting, the Rest Can Be Pruned》论⽂中的结论:Multi-Head其实不是必须的,去掉⼀些头效果依然有不错的效果(⽽且效果下降可能是因为参数量下降),这是因为在头⾜够的情况下,这些头已经能够有关注位置信息、关注语法信息、关注罕见词的能⼒了,再多⼀些头,⽆⾮是⼀种enhance或noise⽽已。
Positional Encoding
由于transformer模型是并⾏输⼊单词,所以缺少⼀种解释输⼊序列中单词顺序的⽅法
在本⽂的⼯作中,使⽤了不同频率的正弦和余弦函数:
偶数位置,使⽤正弦编码,在奇数位置,使⽤余弦编码
选择正弦和余弦函数作为位置编码,是因为对于任意固定的偏移量k, PEpos+k都可以表⽰为PEpos 的线性函数。
举例:我是中国⼈
我 [sin1a cos1a sin2a cos2a ,…,cosna] PE1
是[sin1b cos1b sin2b cos2b,…,cosna] PE2
中[sin1c cos1c sin2c cos2c,…,cosnb] PE3
国 [sin1d cos1d sin2d cos2d,…,cosnd] PE4
⼈[sin1e cod1e sin2e cos2e,…,cosne] PE5
按照公式3可以 PE1、PE2、PE3可以互相表⽰,PE1、PE2、PE4不能互相表⽰,建⽴了句⼦中各个单词的联系,如果单词顺序被打乱,计算出来的位置编码就会有不同,所以⽤该位置编码函数可以表⽰单词的相对位置可以解决transformer并⾏输⼊缺少单词顺序信息的问题。
Encoder
由6个identical layer堆叠⽽成,每⼀个identical layer由2个sub-layers组成:
第⼀个部分是multi-head self-attention机制
第⼆个部分是⼀个简单的全连接前馈⽹络(position-wise fully connected feed-forward network)
在每个sub-layers中加⼊了残差连接(residual connection),并归⼀化,即每个sub-layer的输出为LayerNorm(x + Sublayer(x))。所有sub-layers中向量的维度均为 512
Batch Normalization
BN的主要思想就是:在每⼀层的每⼀批数据上进⾏归⼀化。我们可能会对输⼊数据进⾏归⼀化,但是经过该⽹络层的作⽤后,我们的数据已经不再是归⼀化的了。随着这种情况的发展,数据的偏差越来越⼤,我的反向传播需要考虑到这些⼤的偏差,这就迫使我们只能使⽤较⼩的学习率来防⽌梯度消失或者梯度爆炸。BN的具体做法就是对每⼀⼩批数据,在批这个⽅向上做归⼀化。
Layer normalization
它也是归⼀化数据的⼀种⽅式,不过LN 是在每⼀个样本上计算均值和⽅差,⽽不是BN那种在批⽅向计算均值和⽅差!
Decoder
由6个identity layer堆叠⽽成,每⼀个identical layer由3个sub-layers组成
第⼀个部分是 masked multi-head self-attention mechanism
第⼆部分是 multi-head context-attention mechanism
第三部分是⼀个 position-wise feed-forward network
第⼆部分是Encoder-Decoder attention
k,v来⾃Encoder模块的最终输出,q来⾃第⼀部分的输出
masked mutil-head self-attetion
splitwisemask 表⽰掩码,它对某些值进⾏掩盖,使其在参数更新时不产⽣效果。Transformer 模型⾥⾯涉及两种 mask,分别是 padding mask 和 sequence mask。其中,padding mask 在所有的 scaled dot-product attention ⾥⾯都需要⽤到,⽽ sequence mask 只有在decoder 的 self-attention ⾥⾯⽤到。
padding mask
因为每个批次输⼊序列长度是不⼀样的也就是说,我们要对输⼊序列进⾏对齐。具体来说,就是给在较短的序列后⾯填充 0。但是如果输⼊的序列太长,则是截取左边的内容,把多余的直接舍弃。因为这些填充的位置,其实是没什么意义的,所以我们的attention机制不应该把注意⼒放在这些位置上,所以我们需要进⾏⼀些处理。
具体的做法是,把这些位置的值加上⼀个⾮常⼤的负数(负⽆穷),这样的话,经过 softmax,这些位置的概率就会接近0!
⽽我们的 padding mask 实际上是⼀个张量,每个值都是⼀个Boolean,值为 false 的地⽅就是我们要进⾏处理的地⽅。
Sequence mask

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。