每天学点机器学习理科生的果壳首页投稿(暂停使用,暂停投稿)

[译] 使用 GPU 进行神经网络机器翻译(第三部分)

2015-09-28  本文已影响4578人  朱小虎XiaohuZhu

Neil Zhu,简书ID Not_GOD,University AI 创始人 & Chief Scientist,致力于推进世界人工智能化进程。制定并实施 UAI 中长期增长战略和目标,带领团队快速成长为人工智能领域最专业的力量。
作为行业领导者,他和UAI一起在2014年创建了TASA(中国最早的人工智能社团), DL Center(深度学习知识中心全球价值网络),AI growth(行业智库培训)等,为中国的人工智能人才建设输送了大量的血液和养分。此外,他还参与或者举办过各类国际性的人工智能峰会和活动,产生了巨大的影响力,书写了60万字的人工智能精品技术内容,生产翻译了全球第一本深度学习入门书《神经网络与深度学习》,生产的内容被大量的专业垂直公众号和媒体转载与连载。曾经受邀为国内顶尖大学制定人工智能学习规划和教授人工智能前沿课程,均受学生和老师好评。

NVIDIA 深度学习系列

theano

前面的系列文章中,我介绍了一种用来做机器翻译的简单的编码解码器模型。这个模型在英法翻译任务上效果很好。但是在本文中,我们会简要讨论这个模型自身的缺点,给出近期出现的引入软注意力机制来克服这些缺点并给出了显著性能提升的模型。
另外,我还会列出一些近期的推广这种神经网络机器翻译模型的方法到其他的场景的尝试的研究成果,比如说图像描述生成和视频描述生成。最后我会对未来的研究方向做一个展望,并给出一些关于文中提及的模型开源实现。

简单的编码器-解码器架构存在的问题

编码器将输入序列压缩成一个定长的向量,然后从这个定长向量来产生全句的翻译。简言之,定长向量(也称上下文向量),必须包含源语句中的每一个细节都包含进去。直觉上看,这意味着由编码器近似的真实函数必须是非常地非线性和复杂的。而且,上下文向量的维度必须足够大使得任意长度的句子都可以被压缩。
在我的这篇 On the Properties of Neural Machine Translation: Encoder-Decoder Approaches 文章中,我们通过实验确认了在编码器-解码器模型规模很小的时候,翻译质量会随着源语句长度增加而急剧下降。加上 Sutskever et al. (2014) 的更好的结果,使用了同样类型的编码器-解码器架构,指出编码器的表示能力需要被扩展,也就是说模型必须变很大,来解决长句子的问题。

图 1:编码器-解码器模型性能随着句子的长度增加急剧下降

当然了,更大的模型带来的是更多的计算和内存需求。使用诸如 NVIDIA Titan X 这样的高级 GPU,可以帮助我们处理计算的问题,不过也还是不足以解决内存问题(至少现在是这样)。现在能够达到的内存通常限制在几个 G 的规模,这就带来对模型大小的限制。(注意:使用多 GPU,并将单一模型分布置于这些 GPU 上是可以解决这个问题的。但是这里我们简化场景为单一 GPU 机器,存在着空间,计算能力和其他物理上的限制)
接着,问题就是:“我们能够做得比简单的 编码器-解码器 模型更好么?”

用于神经机器翻译软注意力机制

简单编解码模型的最大问题就是任意长度的句子需要被压缩成定长向量。当你思考我们一般处理压缩任务的方法时能体会到这个问题的诡异。当我们压缩文件时,压缩后的文件长度一般是和原始文件的长度成比例的。(这也说得不准确,应该是,压缩后的文件大小和原始文件中的信息量成比例,而不是简单的长度。然而,我们再简化一下,原始文件的长度反应了文件中的信息量。)
继续类比数字计算机,我们不会按照定长向量来存放整个句子,而是根据源句子的长度来放置句子到内存单元中。通过BiRNN 来做到这一点。这是一种双向的 RNN,从正向和反向来阅读源语句。

现在我们记来自 正向 RNN 的隐藏状态为


Paste_Image.png

而 反向 RNN 的隐藏状态记为

Paste_Image.png

正如我们在前面的文章中讨论的那样,RNN 通过一次读取一个符号来总结序列。所以


Paste_Image.png

是对源语句从开头到第 j 个词的总结,而


Paste_Image.png
就是对源语句从结尾到反向第 j 个词的总结。见下图,理解这两个状态的含义。 图2. 双向 RNN 对源语句的编码
但是,在每个词处的总结并不是关于整个输入语句的最优总结。由于序列化的特性,RNN 倾向于记住出现更近的符号。换言之,输入符号越远离 j,RNN 的隐藏状态就越不可能记起这个符号。用来表示隐藏状态的连接的注解向量能够最好地表示当前词。
这肯定不是一个已被认可的假设,但是为了更好地理解,我将注解向量看做是 上下文依赖的词表示。而且,我们可以将这个上下文依赖的词表示方法看成变长存储源语句的一种机制,而非简单的编解码器那样的定长定维度的表示。
借助这样的变长表示,解码器需要能够对每个目标词选择性地集中在一个或者多个上下文依赖的词表示(或者注解向量)上。所以,每次我们需要选择哪个注解向量呢?
假设,你正在翻译一个给定的源语句,已经写了前 i-1 个目标词序 (y_1, y_2, ..., y_{i-1}),下一步就是确定哪个目标词作为第 i 个目标词。此时,你如何决定翻译哪个源词呢?
一种典型的翻译器是看每个源词 x_j(或者它的上下文依赖表示 h_j),将其与前面 i-1 个已翻译的词序 (y_1, y_2, ..., y_{i-1})合在一起,确定源词 x_j 是否已经被翻译过了(等价地看,就是源词 x_j 对下一个目标词有多相关)。然后对在源语句中的每个词重复这样的过程。 图 3. 注意力机制考虑到了已经被翻译过了的词和源词之一

Dzmitry bahdanau 和我跟Yoshua Bengio在去年夏天提出了一个将小神经网络包含进解码器中的方法实现了这个想法。小的神经网络,我们称之为 注意力机制(图 3. 中紫色的部分)使用前面的解码器的隐藏状态 z_i (已经翻译过了的)和一个源 上下文依赖的词表示 h_j 作为输入。注意力机制使用单隐藏层的神经网络实现,其输出是一个标量

Paste_Image.png

参见图 4.

图 4.注意力机制返回一个标量对应于第 j 个源词的相关分数

一旦我们已经计算出了每个源词的相关分数,我们要保证归一化。这个通过 softmax 归一化就可以了

Paste_Image.png

可以参看图 5的图形化解释。
我们为何需要这样的归一化?这里其实有很多的原因,但是我最喜欢的解释是,这样的方式让我们可以用概率框架来解释通过注意力机制分配的分数。从概率上看,我们可以将注意力权重

Paste_Image.png

看做是解码器从所有 T 个源词中选择第 j 个上下文依赖的源词表示的概率。所以,我们可以计算在这个由

Paste_Image.png

确定的分布下源词表示期望值

Paste_Image.png

这个期望值向量

Paste_Image.png

总结了整个源语句的信息,但是包含了对不同位置的词的重要性的考量。任何注解向量(上下文依赖向量)通过注意力机制确定为相关的(更高的注意力权重)比那些低注意力权重的表示得更好。

图 5 . 通过注意力机制返回的相关分数被归一化,帮助我们将这些分数解释为概率。从概率上看,我们计算出了在这个分布下的注解向量的期望值

一旦,向量

Paste_Image.png

计算好了,每个步骤 i 其实就跟前面的解码器过程相同了,只需要把前面的

Paste_Image.png

改成


Paste_Image.png

软注意力机制给出什么启示?

引入注意力机制的方法已经成为深度学习领域最热门的话题之一(见Cho et al., 2015)而对引入注意力在神经网络中的后果的讨论——是否可以将我们带到另一个层次的成功,也是非常有趣的事情,这些讨论超过了一篇博文的篇幅了。看看图 6,这是一个没有任何相邻信息的考虑的学到的注意力例子。(尽管弱监督通常被用来表示强化学习,我任务这类模型同样是弱监督的。除了最终目标的翻译,其他部分都没有监督的过程(内部对应、注意力、相邻)存在)

图 6. 通过采用了软注意力机制的神经网络机器翻译模型翻译的样例。边的粗细表示注意力权重。
很棒,这个模型已经自动找出了两个语言之间的对应结构。我很确定,如果你说法语或者德语的话,会比较认可它的效果。但是问题是,这样的注意力机制是不是能够提升翻译的性能?
是的,当然!而且效果很显著。特别在 [Bahdandau et al., 2015] 中,我们看到,引入注意力机制,翻译的质量不会随着语句的长度增加而下降,甚至是模型的规模也不发生太大的情况下,正如图 7所示。 图 7. RNNsearch-50 是一种引入了注意力机制的神经网络机器翻译模型,在长度最多为 50 的语句对上进行训练
最后的问题时,这看起来非常难以实现。那么,现在又是 Theano 表现的时刻了!仅仅需要写出一个前向的过程(参见here),使用 theano.tensor.grad 就搞定了。

神经图灵机(Neural Turing Machine)和记忆网络(Memory Networks)

读者 Zzzz 在我这系列之前的文章评论中说

你们试过神经图灵机或者记忆网络进行这项任务么?这些方法是不是需要更多的训练数据才能得到更好的结果?

我本打算当时想给出回答,不过等到现在才给出来。为什么?因为,这两个模型可以被看成是软注意力机制的神经网络机器翻译的变体或者扩展。想想上下文依赖的词表示

Paste_Image.png
作为记忆中的内容,注意力机制作为神经图灵机的读头,而解码器就是神经图灵机的控制器。他们是很像的!
实际上,如果你阅读了关于记忆网络最新论文Sukhbaatar et al. (2015),对于基于注意力的神经网络机器翻译模型就很清楚了,NTM 和记忆网络或多或少是等价的,除了一些细节和相应的应用场景的变化外。我,可能你也会,想知道这些观点最终极的推广形式,以及在未来这种终极模型能够给我们带来究竟什么样的效果。

超越翻译:图像/视频描述生成

关于整个神经网络机器翻译工作中最为让人吃惊的和重要的一点是方法并没有限制在语言这个场景上。特别地,这样的方法可以对任何类型的输入数据进行处理,只要数据本身能够对应某些合适的神经网络结构,或者返回定长的向量表示或者它的注解向量。
蒙特利尔大学和多伦多大学最近发布的工作展示了设计基于注意力的编码器-解码器模型来通过用卷及网络替代解码器来描述图像的可能性,如图 8 所示。类似观点在[Donahue et al., 2014; Fang et al., 2014; Karpathy and Li, 2014; Kiros et al., 2014; Mao et al., 2014]也都有提及。

图 8. 使用注意力机制的图像描述的生成

Li et al. (2015) 工作将该模型的能力又向前推进了一步,用来进行视频的描述生成,让解码器使用视频的时态结构。类似地,使用简单的编码-解码器进行的视频描述生成也已经成功了,见 [Li et al., 2015; Venugopalan et al., 2015] 。

Paste_Image.png
而且,类似的引入注意力的进行结构化输入输出的映射已经被广泛地应用在众多应用中了。我最喜欢的是Vinyals et al. (2015) 对离散优化问题的应用,其中使用了这种基于注意力的神经网络来近似地解决旅行商问题!想要参看更多最新的应用,请看看我这篇综述文章paper
看到所有这些近期的研究工作,我不禁想知道未来会发生什么?读者朋友,您又是怎么想的呢?欢迎在评论中给出你们的想法。

下一步

我在文章中介绍了近期深度学习领域中最新的发展,聚焦于神经网络翻译。然而,仍然存在众多于机器翻译相关的问题。我列举如下:

天气数据彩云天气已经做的很棒了,欢迎使用彩云天气

代码在哪儿?

本系列文章直到现在,我一直在避免对实际实现的讨论。然而,我们在蒙特利尔大学已经在积极地推进代码的公开了,因为我们相信开源鼓励大家对代码进行试用和定制开发,这样会加速研究的进程。
近几年来,我们作出的重要贡献之一就是 Theano。这是一种使用 python 语言来符号化创建任意神经网络的工具。它对内部的计算架构进行了抽象,可以在平常的 CPU 机器上执行,也可以使用 GPU 计算架构运行。而且,Theano 实现了符号化的求微分的过程,这是训练神经网络的关键,也就使得我们可以快速地构建出复杂的神经网络(诸如 基于注意力的神经网络机器翻译模型)。不过,Theano 只提供了基本的原语操作,我们需要组合这些原语来设计神经网络,这也是比较困难的。
我们(Razvan Pascanu, Caglar Gulcehre, myself, Dzmitry Bahdanau and Bart van Merrienboer)发布了GroundHog,实现了构建一个神经网络机器翻译模型所有必须的部分。不过这个项目的代码,可用性和可读性都不好。现在Orhan Firat, Dzmitry Bahadanu and Bart van Merrienboer在一个新的框架Blocks下重新给出了相关的脚本。然而,这同样只是一个例子罢了。
今年10月份,我在DL4MT Winter School上于都柏林城市大学会给出关于神经网络机器翻译的报告。为了让这个课程更有价值和实用性更强,我正准备一个基于 Theano 的更加深入的神经网络机器翻译实现。代码here在这里,叫做 dl4mt-material,大家可以查看,还在着力准备中。
当前,代码包含:session0, session1 and session2 三个部分。session 0 包含了使用 Gated recurrent units 的 recurrent neural network language model的实现;session1 则是简单的神经网络机器翻译模型的实现。在 session 2 中,你可以看到基于注意力的神经网络机器翻译模型。未来还会有更多的部分,保持关注!
在我结束本章内容和整个系列之前。我明确地指出一点:永远使用 GPU 来进行训练!为了得到一个良好训练的模型,需要用 GeForce GTX Titan X 训练 3 到 12 天;而用 CPU,我并不知道合理的估计是多少天。当然你可能已经构建了一个跟 Google 差不多的计算集群,使用分布式的优化算法,但是我坚信这不是最有效的进行模型训练的途径(除非你是微软,Facebook或者IBM)。

致谢

I’ve covered a lot of recent research in this series of Parallel Forall posts on Neural Machine Translation. Hopefully I didn’t make it sound like I did all this work on my own. Any work introduced here has been done by all the authors in the cited papers including those at the University of Montreal as well as other institutes. Furthermore, most of my work in the past few years wouldn’t have been possible without the availability of Theano, and I’d like to thank all the contributors to Theano, and especially, Fred Bastien, Pascal Lamblin and Arnaud Bergeron.
Note that any error in the text is my own, and feel free to contact me if you found anything suspicious here.

参考文献

上一篇下一篇

猜你喜欢

热点阅读