问题:基于文档水平的翻译。尽管神经机器翻译具有灵活性,但大多数神经机器翻译模型都是独立翻译,代词回指和词汇一致性等话语现象可能取决于比前几句更远的远程依赖,在基于句子的翻译中会被忽略。
思路:翻译文本时,还是会翻译输出很多句子,每个时间步产生一个单词。在输出当前时刻的单词时,普通的神经机器翻译只考虑对应的源语句和之前的输出单词,这篇论文考虑了对应的源语句,之前输出的单词,其他的源语句和其他的目标语句。引入了两个记忆网络,源和目标各一个,用来捕捉内部依赖,用在上下文向量的计算中。源memory的内容:一个源语句经过双向RNN得到的隐藏层状态,再输入进一个双向RNN,相当于每个时间步输入一句话,最终获得整个文档的表示,训练过程中保持不变。目标memory的内容:decoder对每个句子输出时隐藏层的最后时刻状态,训练过程中是动态更新的。
普通的NMT decoder计算:
其中是decoder隐藏层状态。
记忆网络的计算:
记忆网络是向量的集合,对于记忆网络有两个操作:读和写,读操作的计算如下,对于查询向量q:
读操作可以简写为:
基于文档水平的机器翻译:每一个x和y都表示一个句子,捕捉
和
,
和
之间的内部依赖,
捕捉
和
之间的依赖。
表示除
之外的句子,
表示除
之外的句子。
训练目标:
使用普通的神经机器翻译初始化每个句子的翻译,然后重复访问文本中的每个句子,使用
更新翻译句子,更新这个句子的时候其他句子更新不变。
上下向量c的计算分为两个部分,分别是从源memory和目标memory中读取内容
其中和
分别表示第t个源语句和翻译语句,
作为查询获得源的上下文向量,翻译
和
共同作为查询获得目标的上下文向量,因此训练目标可以写成
在decoder的计算中隐藏层状态的计算为:
输出的计算为:
源memory的内容:
把一个语句输入进双向RNN(句子水平RNN)获得句子水平的表示,然后把这个句子水平的表示输入进另一个双向RNN(文档水平RNN),每个时间步输入一个语句的表示,最终获得文档水平的表示,文档水平RNN的所有隐藏层状态作为源memory的内容。
目标memory的内容:
把所有输出目标语句的decoder RNN隐藏层的最后时刻状态作为目标memory的内容。