五月份的时候,Facebook发布了Fairseq机器翻译模型,号称比基于RNN的模型训练速度提升了九倍,而且翻译质量更高,经过实测,速度和翻译质量也确实有可观的提升,基于pytorch实现的版本也于不久前开源,学习笔记如下:
一、概览
- 相较于RNN,CNN工作不依赖于上一时间步的结果,所以可以做到最大程度的并行计算,提升训练速度。
- 模型实现了基于CNN的分层结构,这使得一句话中距离较近的词汇可以在较低的层中产生联系,距离较远的在网络的高层的产生联系。CNN的分层结构O(n/k)比RNN通过门机制O(n)建立词汇之间的联系提供了更短的路径。
- 位置感(Position Embedding) :将单词的位置也作为输入的feature进行embedding,将其结果与Word Embedding相加,作为模型Encoder/Decoder的输入。
- 门线性单元(gated linear unit):个人理解有点类似于RNN神经元内部的门机制,它或许可以使得网络能够全面利用输入信息或者专注于某些重要信息。
- 另外添加了残差连接(resdual connections)并对decoder的每层使用attention。
二、模型结构
-
整体的模型结构还是一个Encoder-to-Decoder的结构。
Encoder
原文句子中的词汇和其位置各自经过embedding之后相加,经过dropout之后得到Encoder需要的input_embedding。
- 【单层网络的操作】
- 经过线性映射fc1,将embedding的维度映射到模型kernel需要的维度(encoder_input)。
- 将其输入卷积层之前要“备份”一下,并将“备份”通过另一线性映射函数fc2,映射到本层卷积神经网络的输出维度,以为残差连接作准备。
- 将encoder_input输入卷积层,将得到的结果输入glu,
- 将2、3步的结果相加,得到单层网络的输出,可作为下层网络的输入。
5.最后一层网络输出的结果称为x_encoder,将x_encoder映射到embedding维度,然后将x_encoder与input_embedding相加作为y_encoder,encoder同时返回x_encoder,y_decoder以被后续使用。
Decoder
其输入input_embedding与Encoder相同。
- 【单层网络的操作】
Deocer中单层网络的操作跟Encoder中的操作基本一样,只不过在每一层的【3.】步之后加上一个成为mutil-step Attention的操作,而这也是Fairseq模型表现的如此只好的一个核心trick。 - 【Mutil-step Attention】:
- 目标原文句子中的词汇和其位置各自经过embedding之后相加,经过dropout之后作为target-embedding。
- target-embedding作为第一层网络的输入,依次经过Decoder的1、2、3步后得到的结果作为x_decoder。
- encoder的输出作为encoder_out。
- Mutil-step Attention的操作就是,将x_decoder映射到与target-embedding相同的维度并与target-embedding相加;
- 将得到的矩阵与x_encoder相乘并沿着最后一维计算softmax,得到attention-score,即译文中每个词与原文中每个词的相关程度;
- 再将attention-score与y_encoder矩阵相乘,得到计算attention之后的y_encoder_attn矩阵。
- 将y_encoder_attn映射到与Decoder本卷积层本来的维度与最初的x_decoder相加,得到Decoder下一层网络的输入。
模型的效果:
根据论文的描述来看,得益于CNN的并行计算性,CNN在大幅度提高训练速度的前提下,还不同程度的提高了各语种的翻译质量。
在WMT’14 En-Ro 语对上比之前最好的模型提高了1.9BLEU,
在En-Ge语对上提升了0.5BLEU,
在En-Fr语对上提高了1.6BLEU。
总结:
Fairseq真的是个神奇的模型,其应用在英中语对上比之前的最好的模型都要好不少,尤其是其pytorch版的模型相较于初始Lua版模型在训练速度和显存占用上又有不小的改进,但这并不是神经网络翻译的极限,在英中上我们一定程度上修改了一下模型,并尝试这添加了几个trick,感觉还相较于官方的模型,仍会有超过1个BLEU值的提升,并且其与LSTM模型ensemble后会有更大的提升,以此可以认为CNN和RNN在机器翻译领域有某种程度的互补作用。
最后,向Facebook这家在天朝并不存在的公司为机器翻译做出的巨大贡献致敬!