导读:编码器和解码器模型与语言模型中的循环神经网络相似,同时训练阶段均通过遍历每个输出单词来建立动态计算图。
作者:菲利普·科恩
来源:华章计算机(hzbook_jsj)
从很多方面讲,神经翻译模型都是神经语言模型的一种扩展,因此它们的实现方式很相似。编码器和解码器模型与语言模型中的循环神经网络相似,同时训练阶段均通过遍历每个输出单词来建立动态计算图。
本节给出的代码是根据PyTorch官方教程中有关序列到序列翻译模型的部分经过改进后的结果。
1.编码器
编码器与7.8.1节中的循环神经网络相差无几:
由于编码器实际上并不预测单词,因此这里只需去掉softmax的计算。需要注意的是,该实现返回的是门控循环单元的输出状态。本章大部分内容描述了一种更为简单的模型,它采用前馈网络,将隐藏状态用于改进输入表示。
我们向这个编码器的类中添加一个额外的函数,即处理整个输入句子的函数:
函数返回整个输入句子的编码器表示encoder_outputs,它是一个矩阵或一个单词表示向量序列。上述循环遍历整个句子,并将GRU的输出状态存储在这个矩阵中。该循环与第7章循环神经语言模型的训练循环非常相似,不同之处在于该循环不计算任何损失。当然,我们在这里只是生成中间状态,这些状态无法进行评价。这也意味着输出状态不用预测下一个单词,而是由解码器在后续使用。
2.解码器
解码器的核心也是循环神经网络,但是模型进行了改进,使其能够利用输入句子的信息,涉及注意力的计算和编码器输出状态的加权。图8.9给出了解码器的完整代码。下面我们介绍代码中的关键部分。