《Neural Machine Translation by Jointly Learning To Align and Translate》阅读心得分享
论文原文链接
《Neural Machine Translation by Jointly Learning To Align and Translate》
论文导读
机器翻译本质上是源语言和目标语言的一种等价信息转换,也成为自动翻译,是将一种语言(源语言)转化为另一种语言的过程。从历史上来看,机器翻译的发展历史经过了三个阶段。在1980年代出现的基于规则的机器翻译、1990年代出现的基于统计的翻译和2013年左右出现的基于神经网络的翻译。基于统计的翻译和基于神经网络的翻译又被称作为基于数据驱动的机器翻译。
最古老的机器翻译方法就是基于规则的机器翻译,在翻译的时候,首先根据源语言的词的词性,然后将词语翻译成目标语言,接着,再使用语法规则,对翻译后的句子进行调整。根据翻译方式的不同,有基于词的方式、基于结构转换的翻译和基于中间语的翻译。举个例子来说,”We do achieve the target“就有可能被翻译为“我们 做 实现 目标”,而实际上“do”只是强调的作用。有限的语法无法覆盖各种各样的语言现象,并且这种实现方法非常依赖于专家的知识。
第二类方法就是基于统计的机器翻译。这种方法通过对语料进行统计分析,构建模型。它的本质是如何找到源语言被翻译成目标语言后,出现最大概率的那句话,也就是对概率进行建模。举个例子来说,“我 已经 看 了 这篇 博客”这句话,就会被翻译成“I have read this blog”。从直观上来说,在翻译的时候,我们可以枚举所有的英文句子来建立概率分布,但这种方法显然是不合适的,因为句子有“无限”多个。在这个时候,我们就引入了隐变量。主流的方法就是2002年提出的“隐变量对数线性模型”,它的方法是设计特征函数,也就是在隐式语言结构上设计特征。
第三类就是基于神经网络的机器翻译。它通过学习大量的成对的语料,让模型可以自己学习语言的特征,找到输入和输出之间的映射。它的核心理念就是建立一种端到端模型(end-to-end),让算法自动找到映射的关系,因此这类方法也被称为表示学习。主流的方法有2014年Kyunghyun等人提出的encoder-decoder模型和Sutskever等人提出的sequence-to-sequence模型。和第二类基于统计的机器翻译方法不一样的地方在于,它并没有引入隐变量,它利用马尔科夫性,将句子生成的概率分解成了各个条件概率的乘积。同时,不像基于统计的机器翻译方法那样是离散形式的建模,它可以对模型进行连续的建模。这也是深度学习带来的革命性的变化。
论文abstract和introduction
神经机器翻译是最近新兴的一种机器翻译的方法。大部分的神经机器翻译都是基于enoder-decoder框架的。并且它们都会将源语言的句子压缩成一个固定的向量,然后传递给decoder。这存在一些潜在的问题,比如,从我们直觉上来感受,如果句子长,那么强行的将句子中的有效信息全部压缩在一个固定的向量中的话,信息肯定会丢失。
于是,该篇论文的作者提出了一种新的方法,这个方法也是基于encoder-decoder的。与之前的encoder-decoder的模型不同之处在于,每次在翻译一个单词的时候,模型会自动的搜寻该单词与源语言哪些单词有关联,并将这种关联的强度进行数字化表示(在模型中就是权重)。并且,实验得出,这种方法可以解决长句子翻译不准的问题(相较于传统的encoder-decoder模型)。
背景-传统RNN Encoder-Decoder模型
传统的RNN Encoder-Decoder模型在训练阶段的时候,会使模型去最大化源语言翻译成目标语言的条件概率。当模型训练好后,当待翻译的源语言句子放入到模型中的时候,模型会自动的计算最大的目标语言句子的概率,并且将这个句子当做是翻译后的句子。下面具体讲一下传统的RNN Encoder-Decoder模型,直接上图,
如上图所示,假设我们有一句待翻译的话,“我/已经/阅读/了/这篇/博客",我们要将它翻译成英文。图中”C“的左侧是encoder,右侧是decoder,”C"是待翻译语句的语义信息。
首先,“我/已经/阅读/了/这篇/博客"这句话会经过encoder,encoder会将这句话进行编码,encoder用到的模型是RNN,RNN的原理可以见我的博客,RNN会通过一个时刻,一个时刻地对“我/已经/阅读/了/这篇/博客"这句话进行编码,当编码结束后,我们会将最后一个时刻的RNN的隐层的输出当做“我/已经/阅读/了/这篇/博客"这句话的语义压缩,在图中也就是C。
接着,解码器每次在产生一个翻译后的英文单词的时候,它都会利用这个编码器的语义压缩C。那具体是如何做到的呢?解码器的模型也是RNN,首先,在时刻为0的时候,RNN会利用语义压缩C,产生第一个单词“I”(这里利用了softmax,输出层是一个词典大小维度的向量,哪个维度的值最大,就取那个维度所对应的单词作为所预测的单词),大家可以想的到,在训练阶段,解码器不可能可以立马产生“I”,而是产生其他的单词,如“tell”等等单词。因此,训练阶段的目的,就是让编码器和解码器的参数,随着训练次数的增加,往“正确”的方向改变,以至于让其产生单词“I”。换句话说,在时刻为0的时候,我们希望解码器产生单词“I”。接着,无论在时刻为0的时候产生什么单词,它都会被当做时刻为1(也就是s1)的输入。因此,如上图,在时刻为1的时候,共有3个输入,一个是C,一个是时刻为0时候产生的隐层结果,最后一个依旧是时刻为0时候产生的隐层结果(这个被利用了两次当做输入)。直到这句话产生结束(结束的标志是解码器产生了/s等特殊标志,这个可以在训练的时候指定)。至此,decoder的任务也就完成了。
如果要用公式去说明的话,其推导过程如下,