简介
在传统的RNN Encoder-Decoder模型中,在编码的过程中,将t−1时的状态h<t−1>和t时刻的数据x<t>输入到t时刻的RNN单元中,得到t时刻的状态h<t>,经过T个时间片后,得到长度等于隐节点数量的特征向量c。在解码的过程中,将特征向量c和上个时间片预测的输出y<t′−1>输入到RNN的单元中,得到该时刻的输出y<t′>,经过T′个时间片后得到输出结果。但在一些应用中,比如句子长度特别长的机器翻译场景中,传统的RNN Encoder-Decoder表现非常不理想。一个重要的原因是t′时刻的输出可能更关心输入序列的某些部分是什么内容而和其它部分是什么关系并不大。例如在机器翻译中,当前时间片的输出可能仅更注重原句子的某几个单词而不是整个句子。
这篇论文率先提出了Attention的思想,通过Attention机制,模型可以同时学习原句子和目标句子的对齐关系和翻译关系。在编码过程中,将原句子编码成一组特征向量的一个集合,在翻译时,每个时间片会在该集合自行选择特征向量的一个子集用于产生输出结果。
详解
在这篇论文中,作者也是使用的RNN Encoder-Decoder结构。不同于传统的方式,在编码过程中,作者使用的是双向RNN(bi-RNN),每个RNN单元使用的是GRU。在解码过程中,使用的是基于Attention的GRU结构。算法结构如图1:
1.1 Encoder
双向RNN含有正向和反向两个方向,对于含有T个时间片的源句子XT={x1,x2,...,xT},正向的输入数据是x1→x1→...→xT,第t个时间片的隐节点ht表示为
h<t>=f(h<t−1>,x<t>) 反向数据的输入序列是xT→xT−1→...→x1,第t个时间片的隐节点ht′表示为
h<t>′=f(h<t+1>′,x<t>) 其中f使用的是GRU的单元,详见上一篇论文的讲解。则第t个时间片的特征h<t>是前向和后向两个特征向量拼接到一起。
h<t>=[ht;ht′]T 1.2 Decoder
在解码的过程中,传统的RNN Encoder-Decoder的方式将整个句子的特征向量作为输入
s<t>=f(s<t−1>,y<t−1>,c) Attention模型是使用所有特征向量的加权和,通过对特征向量的权值的学习,我们可以使用对当前时间片最重要的特征向量的子集ci,即
s<t>=f(s<t−1>,y<t−1>,ci) 其中ci是h<t>的加权和
ci=t=1∑Tαitht αit=∑k=1Texp(eik)exp(eit) eit=a(s<i−1>,ht) 其中eit是输出序列第i个时间片的对齐模型,表示的是该时刻和输入数据每个时间片的相关程度。使用前一时刻的状态s<i−1>和第t个输入数据ht计算得到,在作者的实验中,a是使用的反正切tanh激活函数。
1.3 实验数据可视化
下图是通过可视化四组平行语料的α值得到的图,α值越大,表示两个数据相关性越强,图中的颜色越浅。