详解Attention is All U Need

已有Seq2Seq模型

Seq2Seq模型是处理序列到序列问题的利器,尤其是在神经网络翻译方面,取得了很大的成功。Seq2Seq常常由一个encoder和一个decoder构成,encoder把观测样本X编码成一个固定长度的隐变量Z,decoder再把隐变量Z解码成输出标签Y。

传统的Seq2Seq模型把观测样本编码成一个固定长度的隐变量Z,这个操作被认为限制了Seq2Seq模型的能力。因此,后来提出了基于 attention mechanism 的RNNSearch模型,在decoder端使用含一个隐含层S的RNN网络,并用S(t-1)来计算观测序列X中每个word与输出标签Y(t)的相似度。

FaceBook提出了由CNN构成的Seq2Seq模型,完全采用堆叠的CNN来构建encoder和decoder,通过CNN的堆叠方式来获取sequence中的 long-range dependencies 关系,在decoder端采用了多层的attention机制。堆叠的CNN之间用加入残差的GLU单元来连接,加快计算的同时最大限度保留输入sequence的信息。

已有Seq2Seq模型的优缺点

传统的基于CNN或RNN的Seq2Seq模型都存在一定的不足:CNN不能直接处理变长的序列样本,RNN不能并行计算。虽然完全基于CNN的Seq2Seq模型可以并行实现,但非常占内存,很多的trick,大数据量上参数调整并不容易。

传统的Seq2Seq模型不适用于长的句子,Seq2Seq+attention虽然提升了处理长句的能力,但encoder编码得到隐变量Z时,仍然是依赖RNN或CNN,上述的不足之处仍然存在。

基于 Attention Mechanism+LSTM 的 Seq2Seq 模型的优点:自适应地计算一个权重矩阵W,W(t)的长度与输入序列X的词数目一致,每个权重用来衡量X中相应的词对当前输出Y(t)的重要性,完全不需要考虑输入序列X与输出序列Y中词与词之间的距离关系。缺点:attention mechanism是和RNN结合使用,但RNN需要用t-1时刻的历史信息来计算t时刻的信息,因此不能并行实现,计算效率比较低,特别是训练样本量非常大的时候。

基于 Attention Mechanism+CNN 的 Seq2Seq 模型的优点:基于CNN的Seq2Seq模型具有基于RNN的Seq2Seq模型捕捉 long-distance dependency 的能力,并且可以实现并行化,效率比基于RNN的Seq2Seq模型高。缺点:不能直接处理变长的序列样本。

针对基于CNN和RNN的Seq2Seq模型存在的不足,本文提出了一种完全基于Attention Mechanism的Transformer机制:抛弃CNN和RNN,基于Self-Attention来构造encoder和decoder,搭建完全基于Attention的Seq2Seq模型。

All Attention Seq2Seq模型基本单元分析

1、Add & Norm(AN)单元

Add & Norm = LayerNorm( x + Sublayer(x) ),Sublayer(x)是前面 Multi-Head attention或FeedFoward Layer的输出,这种连接方式有两个明显好处:

1)  Norm有助于快速训练。LayerNorm是Batch Normalization的一个变体。简要对比下BN与LN:BN是对一个batch的样本数据在单个维度上进行Normalization,LN是对一个样本数据的所有维度进行Normalization。LN可以对RNN进行规范化,但BN不行。我个人经验:基于LN的加速比BN快8-10倍。

2)  引入Add,尽可能保留了原始输入x的信息。

2、Scaled Dot-Product Attention 和 Multi-Head Attention

Attention有三个输入(querys,keys,values),有一个输出。选择三个输入是考虑到模型的通用性,输出是所有value的加权求和。value的权重来自于query和keys的乘积,经过一个softmax之后得到。scaled dot-product attention的公式如下:

 

为什么要除去一个根下dk呢?常用的attention机制有additive attention(由一个前向神经网络实现,简写成AA)和 dot-product attention(简写成DA)。虽然两种方法理论上的复杂度类似,但DA实际运行速度更快且更节省内存。当dk值比较小时,两种算法效果相当。但当dk值比较大时,AA比DA的效果要好,原因可能是DA中q与K点乘得到的值之间差距过大,经过Softmax之后非1即0(有一个1,其余全为0)。

 

Multi-Head Attention:对输入K,V,Q分别进行h次线性变换,然后进行h次 Scaled Dot-Product Attention,这类似于卷积网络里使用不同的卷积核多次进行卷积操作。Multi-Head Attention可以使模型从不同的角度来获取输入X的不同subspaces representation。由于在线性变换时对每个样本的维度做了reduce(变为原来的1/h),这使得 Multi-Head Attention 总的计算量与 Single-Head Attention 差不多。

3、position-wise(逐项)的 feed-forward 网络

Multi-Head Attention子层后面跟了一个FFN层,它由两个线性变换组成,中间嵌了一个Relu激活函数,如下:

这样做的目的应该是提高模型特征抽取的能力,考虑到效率,选择两个线性变换。

4、Position Encoding

向模型的 input embedding 中添加 position embedding,使网络能够获得输入序列的相对位置和绝对位置信息。Position embedding有很多种方式获得,比如采用word2vec方式训练。本文采用较简单的方式,基于正弦和余弦函数,根据位置pos和维度i来计算:

 

这样做的目的是因为正弦和余弦函数具有周期性,对于固定长度偏差k(类似于周期),pos+k 位置的 PE 可以表示成 pos 位置的 PE 的一个线性变换,即存在线性关系,这样可以方便模型学习词与词之间的相对位置关系。

网络整体结构分析

Transformer的每一个layer均由一个attention子层+逐项的全连接子层构成,通过堆叠多个这样的layer来构造encoder和decoder,网络结构如图所示:

 

Encoder端:input embedding 与 position embedding 的加和作为堆叠N(N=6)个完全相同的 layer 层的输入。每一个 layer层均由一个 self-attention 子层和一个 FeedFoward 子层组成,两个子层直接通过 Add & Norm 的方式连接。

Decoder端:decoder 也是由N(N=6)个完全相同的 layer 组成,decoder 的 layer 比 encoder 的 layer 多插入了一个 Attention 中间层。output词向量与其 position embedding 求和作为 decoder self-attention 子层的输入(Q=K=V)。然后self-attention子层的输出作为 中间Attention层 的输入(Q),同时,encoder中对应于该层的输出作为 中间Attention层 的输入(K=V)。随后,中间Attention层的输出作为decoder前馈层的输入。以此类推,所有的layer都这样work。最后,通过一个线性变换(Linear)和一个Softmax,就可得到目标输出的一个概率分布。

Self-Attention机制分析

1)  encoder端的 layer 包含一个 self-attention 子层。当前 self-attention 的输入Q、K、V来源于前一个 layer 的输出。encoder中的 position 之间可以相互注意,不分前后,这样可以全面获取输入序列X中 position 之间的依赖关系。

2)  decoder端的 layer 同样包含一个 self-attention 子层。当前 self-attention 的输入Q、K、V来源于前一个 layer 的输出。decoder中的 self-attention 只能是后面的 position 注意前面的 position,这是因为decoder是利用y1,y2,……,y(t-1)来预测 yt 。

3)  decoder端的 attention中间层,它的输入Q来源于 decoder self-attention 子层的输出,输入K、V来源于 encoder中对应的层输出。这一设计使得 decoder端可以获取输入X整个序列的信息,这类似于传统 Seq2Seq 中的 decoder端的 attention机制。

4)  相比基于 CNN 和 RNN 的 Seq2Seq模型,基于 Self-Attention 的 Seq2Seq模型计算效率更高,单层计算复杂度更低,学习 long-range dependencies 的能力更强,三种类型的 Seq2Seq模型对比如下表所示:

 

值得强调的是,基于 Self-Attention 的 Seq2Seq网络学习 long-range dependencies 的能力很强。Seq2Seq中的一个关键问题是如何学习 sequence 中词与词之间的 long-range dependencies 关系。

在双向LSTM中,我们通过正向和反向分别计算一次 Sequence 的信息。学习 long-range dependencies 关键的一点是信号在网络正向和反向计算中传递的path长度(计算次数),计算次数越多,依赖关系消失情况越严重。在 Self-Attention结构中,词与词之间直接计算权重(相似度),因此path长度为O(1),最大程度地保留了 sequence 中词与词之间的依赖关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值