Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation
最后更新于
最后更新于
在很多时序分类(Temporal Classification)的应用中,输入数据X和输出数据Y的标签长度并不相等,而且不存在单调的映射关系,例如机器翻译,对话系统等等。为了解决这个问题,作者提出了RNN Encoder-Decoder模型,RNN Encoder-Decoder是由两个RNN模型级联而成的,通过Encoder将输入数据编码成特征向量,再通过Decoder将特征向量解码成输出数据。
这篇论文的第二个贡献就是GRU(Gated Recurrent Unit)的提出,GRU和LSTM均是采用门机制的思想改造RNN的神经元,和LSTM相比,GRU更加简单,高效,且不容易过拟合,但有时候在更加复杂的场景中效果不如LSTM,算是RNN和LSTM在速度和精度上的一个折中方案。
论文的实现是对SMT中短语表的rescore,即使用MOSES(SMT的一个开源工具)根据平行语料产生短语表,使用GRU的RNN Encoder-Decoder对短语表中的短语对进行重新打分。
给定训练集,我们希望最大化输出标签的条件概率,即:
在上式中,。
1.1 编码
RNN Encoder-Decoder的编码过程是先是通过一个RNN将变长的输入序列转换成固定长度的特征向量,再通过RNN将特征向量解码成需要的输出,如图1.
图1:RNN Encoder-Decoder by Cho K
1.2 解码
另外一篇著名的Seq2Seq的论文 几乎和这篇论文同时发表,在Seq2Seq中,编码器得到的特征向量仅用于作为解码器的第一个时间片的输入,结构如图2
图2:RNN Encoder-Decoder by Sutskever I
图3:GRU的结构
GRU的两个门机制是可以通过SGD和整个网络的参数共同调整的。
RNN Encoder-Decoder模型的提出和RNN门机制的隐层单元(LSTM/GRU)在解决长期依赖问题得到非常好的效果是分不开的。因为解码器使用的是编码器最后一个时间片的输出,加入我们使用的是经典RNN结构,则编码器得到的特征向量将包含大量的最后一个时间片的特征,而早期时间片的特征会在大量的计算过程中被抹掉。
输入序列是一个标准的RNN,在计算时间片的输出时,将和输入激活函数中,表示为
经过个时间片后,得到一个的特征向量,其中是隐层节点的节点数。是一个RNN单元,在这篇论文中,使用的是GRU,GRU的详细内容会在下面详细讲解。
RNN Encoder-Decoder的解码过程是另外一个RNN,解码器的作用是将特征向量,前一个时间片的输出,以及前一个隐层节点作为输入,得到,表示为
其中,也是关于,以及的条件分布
RNN Encoder-Decoder的优化便是最大化的log条件似然
其中是编码解码器的所有参数。
RNN Encoder-Decoder不仅可以用于产生输出数据,根据训练好的模型,使用条件概率模型,也可以对现有的的标签进行评分。在这篇论文的实验中,作者便是对SMT中的短语表进行了重新打分。
对于短语rescore这个任务,作者最先使用的是RNN模型,遗憾的是RNN表现并不是非常理想。究其原因,在时间序列数据中,怎样更新,使用多少比例更新值,这些是可以仔细设计的,或者可以通过数据学习到的。根据LSTM中提出的门机制的思想,作者提出了一种更简单,更高效且更不容易过拟合的GRU,图3便是GRU的结构。
在上图中,有两个门:重置门(reset gate)以及更新门(update gate),两个门的计算均是通过当前时间片的输入数据以及上一个时间片的隐节点计算而来:
重置门:
更新门
其中,表示向量的第j个元素,是sigmoid激活函数。
重置们用于控制前一时刻的状态对更新值的影响,当前一时刻的状态对当前状态的影响并不大时,则更新值只受该时刻的输入数据的影响:
其中是tanh激活函数,是向量的按元素相乘。
而用于控制该时间片的隐节点使用多少比例的上个状态,多少比例的更新值,当时,则完全使用上个状态,即,相当于残差网络的short-cut。