首页  >  文章  >  「无监督」机器翻译?数据都没有也可以翻译?

「无监督」机器翻译?数据都没有也可以翻译?

-
-原创
2018-02-28 18:40:512636浏览

      深度学习正在被广泛地运用于各项日常任务当中,尤其是涉及到一定程度“ 人性化”的领域,例如,图像识别。与其他机器学习算法不同,深度网络最突出的特点是随着获得数据的增多,其性能可以不断提高。因此,如果可以获得更多的数据,那么预期的性能也会变得更好。

深度网络最擅长的任务之一是机器翻译。目前,它是能够完成此项任务的最先进的技术,并且具有足够的可行性,甚至谷歌翻译(Google Translate)也在使用它。在机器翻译中,需要句子级(sentence-level)的并行数据对模型进行训练,即对于源语言中的每个句子来说,都需要是目标语言中被翻译的语言。不难想象为什么这会成为一个问题。因为,对于一些语言对来说,很难获得大量的数据(因此可以使用深度学习的这种能力)。

本文是如何构建的

本文是基于Facebook近期发表的一篇名为“仅使用单语语料库进行的无监督机器翻译”。本文并没有完全遵循论文的结构,我添加了一些自己的解读,进而让文章更加通俗易懂。

阅读本篇文章需要具备一些最关于神经网络的基本知识,比如损失函数、自动编码器等。

机器翻译的问题

如上所述,在机器翻译中使用神经网络的最大问题是,它需要两种语言的句子对数据集。它适用于英语和法语等被广泛使用的语言,而对于其他语言的句子对则不适用。如果语言对数据可用,那么这将成为一个受监督性的任务。

解决方案

这篇论文的作者想出了如何将这一任务转换为无监督任务的方法。在这一任务中,唯一需要的是两种语言中每一种语言的任意两个语料库,如任意一部英语小说和任意一部西班牙语小说。需要注意的一点是,这两部小说不一定是相同的。

从最直观的角度来讲,作者发现了该如何学习一种介于两种语言之间的潜在空间(latent space)的方法。

自动编码器概述

自动编码器是一种用于无监督任务的广泛的神经网络类别。它的工作原理是重新创建一个和最初输入相同的输入。完成这一操作的关键是网络中间有一个名为瓶颈层(bottleneck layer)的网络层。该网络层被用以捕捉所有关于输入的有用信息,并摒弃无用信息。

 5.jpg

概念型自动编码器,中间模块是存储压缩表示的瓶颈层

简言之,在瓶颈层中,瓶颈层中输入(现在由编码器转换)所在的空间被称为潜在空间(latent space)。

降噪自动编码器

如果一个自动编码器被调教成完全按照输入的方式重建输入,那么它可能什么都做不了。在这种情况下,输出将得到完美的重建,但是在瓶颈层中没有任何有用的特性。为了解决这一问题,我们使用了降噪自动编码器。首先,实际输入因为增加了一些噪声而受到轻微干扰。然后,使用网络重建原始图像(并非含噪版本)。这样一来,通过学习什么是噪声(以及其真正有用的特征是什么),网络可以学习图像的有用特征。

 4.jpg

一个降噪自动编码器的概念实例。利用神经网络对左图进行重建,生成右图。在这种情况下,绿色的神经元共同构成了瓶颈层

为什么要学习一个共同的潜在空间?

潜在空间可以捕捉数据的特征(在我们所举的例子中,数据就是句子)。因此,如果有可能获得一个空间,即当输入语言A时,就会产生与输入语言B相同的特征,那么我们就有可能在它们之间进行翻译。由于该模型已经拥有了正确的“特征”,因此由语言A的编码器进行编码,由语言B的解码器进行解码,这将使二者进行有效的翻译工作。

或许正如你想到的那样,作者利用降噪自动编码器学习一个特征空间。他们还想出了该如何使自动编码器学习一个共同潜在空间的方法(他们将其称之为一个对其潜在空间(aligned latent space)),进而执行无监督的机器翻译。

语言中的降噪自动编码器

作者用降噪编码器以一种无监督的方式学习特征。他们所定义的损失函数为:

 3.jpg

方程1.0 自动去燥编码器损失函数

解读方程1.0

I是语言(对于这一设定,可能有两种语言)。X是输入,C(x)是给x添加噪声后的结果。我们将很快得到噪声所创建的函数C。e()是编码器,d()是解码器。最后一项Δ(x hat,x)是标记级(token level)的交叉熵误差值之和。由于我们有一个输入序列,并且我们得到了一个输出序列,因此我们要确保每个标记(token)的顺序都是正确的。因此使用这种损失函数。我们可以将它视为多标签分类,其中将第i个输入的标记与第i个输出标记进行比较。其中,标记(token)是一个不能被进一步破坏的基本单位。在我们的例子中,标记(token)是一个单词。方程1.0是一个损失函数,使得网络最小化输出(当给定一个噪声输入时)与原始、未受影响的句子之间的差别的损失函数。

□与~的符号表示

□是我们期望的表示,在这种情况下,这意味着输入的分布取决于语言l,并且采用损失的平均值。这只是一个数学形式,运算过程中的实际损失(交叉熵之和)将如往常一样。

这个特殊符号〜意味着“来自概率分布”。

在本文中我们不详细讨论这个细节,你可以在Deep Learning Book一文的第8.1章中详细了解这个符号。

如何添加噪声

对于图像而言,只需在像素上添加浮点数就可以增加噪声,而对于语言而言,则需采用其他方法。因此,作者开发了自己的系统来制造噪声。他们把他们的噪声函数表示为C()。它将句子作为输入,并输出该句子的含噪版本。

有两种不同的方法添加噪声。

首先,可以简单地以P_wd的概率从输入中删除一个单词。

其次,每个单词都可以使用下面这个约束进行原始位置的移位:

2.jpg

 

σ表示第i个标记的移位位置。因此,方程2.0意味着:“一个标记(token)可以最多向左或向右移动k个标记(token)的位置”

作者将K值设为3,将P_wd值设为1。

跨域训练

为了学习两种语言之间的翻译,应该通过一些处理将输入句子(语言A)映射到输出句子(语言B)。作者将这个过程称为跨域训练(cross domain training)。首先,输入句子(x)被采样。然后,使用先前迭代中的模型(M())生成翻译后的输出(y)。把它们放在一起,我们便得到了y=M(x)。随后,使用上述相同的噪声函数C()干扰y,得到C(y)。语言A的编码器对这一被干扰的版本进行编码,语言B的解码器对语言A编码器的输出进行解码,并重新构建一个纯净版的C(y)。使用与方程1.0中相同的交叉熵误差值之和(sum of cross entropy error)对模型进行训练。

运用对抗式训练学习一个共同的潜在空间

到目前为止,还没有提到如何学习共同潜在空间。上面提到的跨域训练有助于学习一个相似空间,但需要一个更强的约束来推动模型学习一个相似的潜在空间。

作者使用对抗式训练。他们使用了另一个模型(称为鉴别器),该模型接受每一个编码器的输出,并预测编码后的句子属于哪一种语言。然后,从鉴别器中提取梯度,并对编码器进行训练,以欺骗鉴别器。这在概念上与标准的GAN(生成对抗网络)没有什么不同。鉴别器接收每个时间步的特征向量(因为使用了RNN),并预测它来自哪种语言。

将它们结合在一起

将上述3种不同的损失(自编码器损失、翻译损失和鉴别器损失)相加,所有模型的权重同时更新。

由于这是一个序列到序列的问题,因此作者使用了一个长短期记忆网络(LSTM),需要注意的是,这里存在两个基于LSTM的自动编码器,每种语言各含一个。

在较高级别上,训练这个架构需要三个主要步骤。它们遵循一个迭代训练过程。训练循环过程看起来有点像这样:

1.使用语言A的编码器和语言B的解码器获得翻译。

2.训练每个自动编码器,使其能够在给定一个损坏的句子时重新生成一个未损坏的句子。

3.通过破坏步骤1中获得的翻译来改进翻译并重新创建翻译。对于这一步,语言A的编码器和语言B的解码器一起进行训练(语言B的编码器和语言A的解码器一起训练)。

值得注意的是,即使步骤2和步骤3被分开列出,权重也会一起进行更新。

如何启动这个框架

如上所述,该模型使用之前的迭代过程中自身的翻译来提高其翻译能力。因此,在循环过程开始之前,拥有一定翻译能力是很重要的。作者使用FastText来学习词级双语词典。请注意,这种方法非常简单,仅需要给模型一个起点即可。

整个框架在下面的流程图中给出

 1.jpg

整个翻译框架的高层次工作

本文解读了一种可以执行无监督机器翻译任务的新技术。它使用多个不同的损失改进单个任务,同时使用对抗式训练增强对体系结构行为的约束。

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn