10.3 基于循环神经网络的翻译建模 359
显然,根据上下文中提到的“没/吃饭”、“很/饿”,最佳的答案是“吃饭”或者
“吃东西”。也就是,对序列中某个位置的答案进行预测时需要记忆当前时刻之前的
序列信息,因此,循环神经网络应运而生。实际上循环神经网络有着极为广泛的应
用,例如语音识别、语言建模以及即将要介绍的神经机器翻译。
第九章已经对循环神经网络的基本知识进行过介绍,这里再回顾一下。简单来说,
循环神经网络由循环单元组成。对于序列中的任意时刻,都有一个循环单元与之对
应,它会融合当前时刻的输入和上一时刻循环单元的输出,生成当前时刻的输出。这
样每个时刻的信息都会被传递到下一时刻,这也间接达到了记录历史信息的目的。比
如,对于序列 x = {x
1
,...,x
m
},循环神经网络会按顺序输出一个序列 h = {h
1
,...,h
m
},
其中 h
i
表示 i 时刻循环神经网络的输出(通常为一个向量)。
图10.8展示了一个循环神经网络处理序列问题的实例。当前时刻循环单元的输
入由上一个时刻的输出和当前时刻的输入组成,因此也可以理解为,网络当前时刻
计算得到的输出是由之前的序列共同决定的,即网络在不断地传递信息的过程中记
忆了历史信息。以最后一个时刻的循环单元为例,它在对“开始”这个单词的信息
进行处理时,参考了之前所有词(“<sos> 让 我们”)的信息。
RNN Cell RNN Cell RNN Cell RNN Cell
<sos>
让
我们
开始
图 10.8 循环神经网络处理序列的实例
在神经机器翻译里使用循环神经网络也很简单。只需要把源语言句子和目标语
言句子分别看作两个序列,之后使用两个循环神经网络分别对其进行建模。这个过
程如图10.9所示。图中,下半部分是编码器,上半部分是解码器。编码器利用循环神
经网络对源语言序列逐词进行编码处理,同时利用循环单元的记忆能力,不断累积
序列信息,遇到终止符 <eos> 后便得到了包含源语言句子全部信息的表示结果。解
码器利用编码器的输出和起始符 <sos> 开始逐词地进行解码,即逐词翻译,每得到
一个译文单词,便将其作为当前时刻解码器端循环单元的输入,这也是一个典型的
神经语言模型的序列生成过程。解码器通过循环神经网络不断地累积已经得到的译
文的信息,并继续生成下一个单词,直到遇到结束符 <eos>,便得到了最终完整的译
文。
从数学模型上看,神经机器翻译模型与统计机器翻译模型的目标是一样的:在
给定源语言句子 x 的情况下,找出翻译概率最大的目标语言译文 ˆy,其计算如下式: