深度学习正在被广泛地运用于各项日常任务当中,尤其是涉及到一定程度“ 人性化”的领域,例如,图像识别。与其他机器学习算法不同,深度网络最突出的特点是随着获得数据的增多,其性能可以不断提高。因此,如果可以获得更多的数据,那么预期的性能也会变得更好。
深度网络最擅长的任务之一是机器翻译。目前,它是能够完成此项任务的最先进的技术,并且具有足够的可行性,甚至谷歌翻译(Google Translate)也在使用它。在机器翻译中,需要句子级(sentence-level)的并行数据对模型进行训练,即对于源语言中的每个句子来说,都需要是目标语言中被翻译的语言。不难想象为什么这会成为一个问题。因为,对于一些语言对来说,很难获得大量的数据(因此可以使用深度学习的这种能力)。
本文是如何构建的
本文是基于Facebook近期发表的一篇名为“仅使用单语语料库进行的无监督机器翻译”。本文并没有完全遵循论文的结构,我添加了一些自己的解读,进而让文章更加通俗易懂。
阅读本篇文章需要具备一些最关于神经网络的基本知识,比如损失函数、自动编码器等。
机器翻译的问题
如上所述,在机器翻译中使用神经网络的最大问题是,它需要两种语言的句子对数据集。它适用于英语和法语等被广泛使用的语言,而对于其他语言的句子对则不适用。如果语言对数据可用,那么这将成为一个受监督性的任务。
解决方案
这篇论文的作者想出了如何将这一任务转换为无监督任务的方法。在这一任务中,唯一需要的是两种语言中每一种语言的任意两个语料库,如任意一部英语小说和任意一部西班牙语小说。需要注意的一点是,这两部小说不一定是相同的。
从最直观的角度来讲,作者发现了该如何学习一种介于两种语言之间的潜在空间(latent space)的方法。
自动编码器概述
自动编码器是一种用于无监督任务的广泛的神经网络类别。它的工作原理是重新创建一个和最初输入相同的输入。完成这一操作的关键是网络中间有一个名为瓶颈层(bottleneck layer)的网络层。该网络层被用以捕捉所有关于输入的有用信息,并摒弃无用信息。
概念型自动编码器,中间模块是存储压缩表示的瓶颈层
简言之,在瓶颈层中,瓶颈层中输入(现在由编码器转换)所在的空间被称为潜在空间(latent space)。
降噪自动编码器
如果一个自动编码器被调教成完全按照输入的方式重建输入,那么它可能什么都做不了。在这种情况下,输出将得到完美的重建,但是在瓶颈层中没有任何有用的特性。为了解决这一问题,我们使用了降噪自动编码器。首先,实际输入因为增加了一些噪声而受到轻微干扰。然后,使用网络重建原始图像(并非含噪版本)。这样一来,通过学习什么是噪声(以及其真正有用的特征是什么),网络可以学习图像的有用特征。
一个降噪自动编码器的概念实例。利用神经网络对左图进行重建,生成右图。在这种情况下,绿色的神经元共同构成了瓶颈层
为什么要学习一个共同的潜在空间?
潜在空间可以捕捉数据的特征(在我们所举的例子中,数据就是句子)。因此,如果有可能获得一个空间,即当输入语言A时,就会产生与输入语言B相同的特征,那么我们就有可能在它们之间进行翻译。由于该模型已经拥有了正确的“特征”,因此由语言A的编码器进行编码,由语言B的解码器进行解码,这将使二者进行有效的翻译工作。
或许正如你想到的那样,作者利用降噪自动编码器学习一个特征空间。他们还想出了该如何使自动编码器学习一个共同潜在空间的方法(他们将其称之为一个对其潜在空间(aligned latent space)),进而执行无监督的机器翻译。
语言中的降噪自动编码器
作者用降噪编码器以一种无监督的方式学习特征。他们所定义的损失函数为:
方程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的概率从输入中删除一个单词。
其次,每个单词都可以使用下面这个约束进行原始位置的移位:
σ表示第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来学习词级双语词典。请注意,这种方法非常简单,仅需要给模型一个起点即可。
整个框架在下面的流程图中给出
整个翻译框架的高层次工作
本文解读了一种可以执行无监督机器翻译任务的新技术。它使用多个不同的损失改进单个任务,同时使用对抗式训练增强对体系结构行为的约束。