无监督神经机器翻译二
-
- 技术点
- 神经机器翻译模型
- 模型整体架构
- 算法流程
- 设计细节
-
- 去噪自编码器
- 噪音模型
- 译文重构
- 对抗训练
- 无监督模型选择标准
本文继续上一篇博文来总结facebook小哥哥的第二篇文章 《Unsupervised Machine Translation Using Monolingual Corpora Only》,上一篇是词级别的翻译,这篇是句子级别的翻译。
这一篇是在上一篇的基础上继续做的工作,里面用到了上一篇的方法,所以没有看上一篇的建议先看一下上一篇文章的介绍。
技术点
首先介绍一下本文所用到的关键技术:
- 输入数据都加了噪声,以提高模型泛化性能。
- 初始(第一轮)翻译模型用的是上一篇中的模型,后面迭代用的是本模型的翻译结果。
- 用了原文重构和译文重构两种重构方法。
- 两种语言各有一个 encoder 和 decoder,两个 encoder 共享隐层参数,两个 decoder 共享隐层和 attention 参数,输入和输出层则不共享。
- encoder后面加了判别器,通过这种对抗的方法让两个 encoder 编码的语义空间重合。
- 提出了无监督翻译度量标准。
神经机器翻译模型
神经机器翻译模型主要使用了seq2seq的方法,文中介绍了Encoder和Decoder的一些知识,这些都很基础,怀疑作者是在凑字数(哈哈哈,这么帅气并且得到EMNLP best paper的facebook小哥哥怎么能凑字数呢)。
如果读者没有这方面的基础,也不要担心,鄙人早已将其总结在了博客seq2seq模型及Attention机制中,欢迎阅读。
模型整体架构
上面的图炸一看感觉很复杂,不知道作者想干嘛,其实仔细分析发觉原理很简单。
首先我们来弄懂图中的符号,D是句子组成的数据集,src代表源语言,tgt代表目标语言,x是来自于句子集的句子,C是给输入加噪声,z是encoder的输出,M是第一篇博客中设计的翻译模型,L是损失计算公式。
模型主要包含原文重建和译文重建两个部分。图中上面是原文重建部分,使用的是自编码器,输入源语言最后的输出仍然是源语言。下面是译文重建部分,给定源语言之后,先经过M模型翻译为对应的译文,然后经过encoder-decoder模型翻译回原文。
算法流程
可以看出作者通过不断地迭代来更新翻译模型。
下面介绍模型设计细节
设计细节
去噪自编码器
自编码器文中没有做过多解释,只是说构造自编码器非常简单。
总体流程为:首先输入句子x,然后给句子加噪声生成噪声数据C(x),然后经过encoder编码为中间结果(隐向量)z,z再通过decoder解码为x_,通过x 和x_做对比来更新模型参数。
自编码器结构如下所示(便于大家理解,并不一定是文中所用的自编码器):
自编码器的目标函数为:
l是语言(按其设置,应该有两种可能的语言),x 是输入,C(x) 是将噪声加到 x 之后的结果。e() 是编码器,d() 是解码器。等式末尾的 Δ(x_hat ,x) 项是 token 级别的交叉熵误差总和。
自编码器模型用了Pascal Vincent在2008年发表的文章Extracting and
composing robust features with denoising autoencoders中的模型。
噪音模型
C(x)是句子x随机采样的噪声,文中主要加入了两种噪声,一种是P_wd 的概率从输入中随机删除一个单词,第二种是打乱单词的顺序,即每个单词以下式中的约束从初始位置偏移:
这里,σ是第 i 个 token 偏移后的位置。因此,上式的含义是:一个 token 最多可以偏离原来位置 k 个 token 的距离。
不管是原文还是译文都加入了噪声。实验结果表明,同时加入这两种噪声能取得更好的效果。作者还通过实验证实了 k 取 3,P_wd 取 0.1时能得到很好的结果。
其实加噪声是为了提高模型的识别能力。数据好比人脸,噪声就好比人化了妆,不管人怎么化妆,我们还是能够认出来。之所以我们不被噪声干扰,是因为我们在成长的过程中学习了这种抗干扰的能力,我相信刚生下的婴儿是没有这种能力的。如果我们的训练数据中没有噪声,那我们的模型就好比刚出生的婴儿,只要有干扰就很容易做出错误的判断。加入噪声就是为了让我们所设计的模型同样拥有抗干扰能力。
译文重构
文中所谓的跨领域训练就是译文重构,具体流程为:
首先,采样一个输入语句 x,然后使用前一次迭代后的模型 M() 生成翻译后的输出 y,即 y=M(x)。然后给译文y加随机噪声生成噪声数据C(y),接着通过encoder生成中间结果z,最后通过decoder将加噪声的译文回译为原语言句子x_^ ,通过x和x_^的对比来更新模型参数。
译文重构部分的目标函数为:
译文重构模型用了2015年Improving neural machine translation models
with monolingual data文章中的方法。
对抗训练
其实对抗训练就是在encoder后面加一个分类器,以鉴别输出结果属于哪种语言。文中用了一个具有三个隐藏层的多层感知机,预测结果为0代表源语言,结果为1代表目标语言。encoder的输出结果(隐向量z组成的序列)就是分类器的输入。
本文的关键是在两种语言(或域)之间建立一个共同的潜在空间。
encoder后加分类器类似于GAN,encoder部分相当于生成器,用于生成两种语言的共同空间,分类器相当于鉴别器,用于从共同空间中区分两种语言。生成器的作用是使所生成的空间为两种语言所共有,分类器无法辨别语种,这样的话不论输入是哪种语言,都能够准确的翻译为目标语言。
对抗训练的目标函数为:
整个系统最终的目标函数为:
无监督模型选择标准
度量标准:
先把源语言L1翻译为目标语言,然后再反向翻译回源语言L2,然后计算L1和L2的BLEU得分,两种语言都翻译一遍取平均值。
计算公式为:
下图将本文的度量标准所得到的BLEU和有监督方法所得到的BLEU做了对比,可以看出他们的趋势相同,说明本文所设计的无监督度量方法是正确的且合理的。