循环神经网络(RNN,Recurrent Neural Networks)中的编码器 - 解码器(Encoder-Decoder)架构在标准机器翻译基准上取得了相当先进的成果,这一架构目前正被工业级翻译服务作为核心来使用。
这种模型虽然简单,但需要大量的数据来进行训练,为了获得最优性能而去调整模型中无数的设计决策(Design decisions),这其实是非常困难的。值得庆幸的是,科研人员已经使用谷歌级规模(Google-scale)的硬件为我们做这项工作,他们同时也提供了一套启发式算法,用于配置通常的神经机器翻译以及序列预测中的编码器 - 解码器模型。
通过这篇文章,您将会了解到关于 “如何最优地配置一个编码器 - 解码器循环神经网络,以完成神经机器翻译和其他自然语言处理任务” 的详细内容。
阅读本文后,您会了解到:
- Google 的研究:他们研究了编码器 - 解码器模型中的每个模型的设计决策,以隔离它们之间的影响。
- 对于词嵌入(Word embedding),编码器深度,解码器深度以及注意机制的设计决策的结果与建议。
- 一套基本的模型设计决策,您可以用它们开启自己的序列到序列(Sequence-to-sequence)项目。
让我们开始吧。
图片源自 Sporting Park,部分版权保留。
神经机器翻译中的编码器 - 解码器模型
具有编码器 - 解码器架构的循环神经网络取代了传统的基于短语的统计机器翻译系统,并且超越后者获得了最先进的成果。
Google 在2016年发表的论文 “Google's Neural Machine Translation System: Bridging the Gap between Human and Machine Translation(Google 的神经机器翻译系统:缩小机器翻译与人之间的差距)” 就是超越的证据,现在他们在其 Google 翻译服务的核心中使用了这种技术。
这种架构有一个问题,就是模型很大,也就是说需要非常大的数据集来训练它。这导致训练模型需要消耗几天甚至数周的时间,而且它通常还需要成本高昂的计算资源。就此而言,在关于模型的不同设计选择所造成的影响这方面,研究还很少。
Denny Britz 等人在 2017 年发表的论文 “Massive Exploration of Neural Machine Translation Architectures(对神经机器翻译架构的大规模探索)”中,明确地解决了上述问题。他们为标准的英德翻译任务设计了一个基准模型(Baseline model),并列举了一套不同的模型设计选择,以及描述了不同选择对模型能力的影响。他们宣称,完整的这套实验耗费了超过 250,000 小时的 GPU 计算时间,这可以说是很了不起的了。
我们报告了数百次运行实验的结果和方差数,相当于在标准 WMT 英德翻译任务上的超过 250,000 小时的 GPU 时间。我们的实验能为构建与扩展 NMT 架构提供全新见解以及实用的建议。
在本文中,我们将介绍论文中的一些发现,这些发现可以用于调整我们自己的神经机器翻译模型,以及广义的序列到序列模型。
更多关于编码器 - 解码器架构和注意机制的背景,请参阅以下文章:
- Encoder-Decoder Long Short-Term Memory Networks(编码器 - 解码器长短期记忆网络)
- Attention in Long Short-Term Memory Recurrent Neural Networks(长短期记忆循环神经网络中的注意机制)
基准模型
首先,我们介绍一下用于所有实验的起点的基准模型。
我们所选的基准模型配置要使模型能在翻译任务上有相当好的表现。
- 嵌入:512 维
- RNN 神经元:门控循环单元(GRU)
- 编码器:双向
- 编码器深度:2 层(每个方向 1 层)
- 解码器深度:2 层
- 注意机制:Bahdanau 风格的
- 优化器:Adam
- Dropout(丢弃):输入的 20%
所有实验都是从基准模型开始,并且每次只改变一个元素,以隔离设计决策对模型能力的影响。在这里,我们用 BLEU 分数作为评估标准。
- 摘自论文 “Massive Exploration of Neural Machine Translation Architectures”。
嵌入的大小
输入到编码器中的词,我们用一个词嵌入来表示。
词嵌入是一个分布式的表征(Distributed representation),其中每个单词映射到一个由连续值组成的固定大小的向量。这种方法的优点是,具有相似含义的不同单词将具有类似的表征。
这种分布式表征通常是在训练数据上拟合模型时学习到的。嵌入的大小定义了用于表征词的向量长度。一般来说,使用更高的维度会得到更具表现力的表征,由此模型也就具有更强的能力。
有趣的是,结果表明使用最大的嵌入寸的确取得了最好的结果,但从整体来说,增加大小的增益是比较小的。
[结果显示] 2048 维的嵌入得到了整体上最好的结果,但它只是以微小优势获胜。虽然 128 维嵌入比较小,但它依旧表现出色,其收敛速度几乎快了一倍。
建议:从一个小的嵌入(比如 128 维)开始,也许以后可以为了一些小的能力提升而增加其大小。
RNN 神经元类型
通常我们有三种类型的循环神经网络单元可以使用:
- 简单 RNN。
- 长短期记忆(LSTM)。
- 门控循环单元(GRU)。
LSTM 是为解决简单 RNN 中的梯度问题而开发出来的,因为梯度问题限制了深度 RNN 的训练。而 GRU 则是为了简化 LSTM 而开发的。
结果表明,GRU 和 LSTM 明显优于简单 RNN,但从整体来看,LSTM 略胜一筹。
在我们的实验中,LSTM 神经元始终比 GRU 表现得更出色。
建议:在您的模型中使用 LSTM RNN 神经元。
编码器 - 解码器深度
一般认为,深层网络比浅层网络有着更好的性能。
关键是要在网络深度,模型能力与训练时间之间找到一个平衡点。因为我们一般没有无限的资源,所以若模型的能力提升不大,则不必训练很深的网络。
论文的作者研究了编码器和解码器模型的深度,及其对模型能力的影响。
对于编码器,他发现深度对能力没有太大的影响,更令人惊讶的是,有个 1 层的双向模型配置比一个 4 层的略好一些。还有个 2 层的双向编码器的性能也比测试中的其它配置表现稍好。
我们没有找到明确的证据表明超过两层的编码器深度是必要的。
建议:使用 1 层双向编码器,之后扩展到 2 层可以小幅提升模型能力。
对于解码器也是类似的情况。具有 1, 2 和 4 层的解码器之间的能力使不同的,其中 4 层解码器更好一些。在测试条件下,8 层解码器无法收敛。
在解码器方面,较深的模型略胜一筹。
建议:使用 1 层解码器作为出发点,而后使用 4 层解码器可以获得更好的效果。
编码器输入的方向
源文本的序列顺序可以通过多种方式提供给编码器:
- 向前(正常方向)。
- 反向。
- 同时输入向前和反向。
作者通过比较多种单向和双向配置,探索了输入序列顺序对模型能力的影响。
总而言之,他们证实了先前的发现,即反向序列比正向序列表现得好,而双向比反向序列又更好一些。
... 双向编码器通常优于单向编码器,但幅度不大。具有反向输入的编码器则始终优于前向输入对应的编码器。
建议:使用反向输入顺序,或转用双向输入以获得模型能力的小幅度提升。
注意机制
朴素的编码器 - 解码器模型存在一个普遍问题,就是编码器将输入映射到固定长度的内部表征,而解码器则必须基于该内部表征来获得整个输出序列。
注意机制是对模型的一个改进,它使得解码器在输出序列中每一个词时,“注意” 到输入序列中的不同词。
论文作者调查了简单注意机制的几种变体。结果表明有注意机制的情况下,模型的表现(比无注意机制时)有了显著提升。
虽然我们能预料到基于注意机制的模型会有显著的能力提升,但无注意机制的模型表现之差,是我们始料未及的。
Bahdanau 等人在 2015 年发表的论文 “Neural machine translation by jointly learning to align and translate(通过共同学习对齐与翻译的神经机器翻译)” 中,描述了一个简单的加权平均式的注意机制,事实表明这种注意是表现最佳的。
建议:使用注意机制,最好是 Bahdanau-style 的加权平均式注意。
推理
在神经机器翻译系统中,通常使用波束搜索(Beam-search)来对模型输出序列中的词进行概率采样。
波束越宽,搜索就越彻底,结果也随之更好。
结果表明,使用 3 - 5 之间适当的波束宽度表现是最好的,通过设定长度惩罚项(Length penalities)只能带来微小改善。一般情况下,作者建议根据具体的问题来调整波束宽度。
我们发现,要获得好的结果,设置一个经过良好调节的波束宽度是至关重要的,它能带来超过 1 个 BLEU 分数的增益。
建议:以一个贪婪搜索(波束为 1)为起始点,并根据你的具体问题进行调节。
最终模型
论文的作者们将他们的研究结果汇总成一个单独的 “最优模型”,并将其所得结果与其它性能优良的模型,以及当时最先进的模型的结果进行了比对。
关于模型的具体配置如下表所述(摘自论文)。当你在为自己的自然语言处理应用开发编码器 - 解码器模型时,这些参数或许是一个好的,或最佳的起点。
摘自论文 “Massive Exploration of Neural Machine Translation Architectures.”
该系统的结果令人印象深刻,并且它以更简单的模型实现了接近最先进技术的能力,而这并非本论文的主要目的。
... 我们通过仔细调整超参数和并进行良好的初始化来证明,这个模型可以在标准的 WMT 基准测试中获得最先进的性能
重点是,作者将他们所有的代码以一个名为 tf-seq2seq 的开源项目发布出来。其中两位作者是 Google Brain 实习项目的成员,因此他们将相关工作发布在了 Google Research 博客上,其标题为 “Introducing tf-seq2seq: An Open Source Sequence-to-Sequence Framework in TensorFlow(在 tensorFlow 中引入 tf-seq2seq:一个开放源代码序列框架)”(2017年)。
扩展阅读
如果您想继续深入了解,本节将提供更多有关该主题的资源。
- 2017 年论文:Massive Exploration of Neural Machine Translation Architectures
- 个人主页:Denny Britz Homepage
- 博客:WildML Blog
- 2017 年论文:Introducing tf-seq2seq: An Open Source Sequence-to-Sequence Framework in TensorFlow
- Github 项目:tf-seq2seq: A general-purpose encoder-decoder framework for Tensorflow
- 项目 Github 文档:tf-seq2seq Project Documentation
- 项目 Github 文档:tf-seq2seq Tutorial: Neural Machine Translation Background
- 2015 年论文:Neural machine translation by jointly learning to align and translate
总结
在这篇文章中,您了解到了如何最优地配置一个编码器 - 解码循环神经网络,该网络是用于神经机器翻译和其他自然语言处理任务的。
具体说来,您学到了:
- Google 的研究:他们研究了编码器 - 解码器模型中的每个模型的设计决策,以隔离它们之间的影响。
- 对于词嵌入(Word embedding),编码器深度,解码器深度以及注意机制的设计决策的结果与建议。
- 一套基本的模型设计决策,您可以用它们开启自己的序列到序列(Sequence-to-sequence)项目。