循环神经网络的编码器-解码器架构在标准机器翻译基准测试中取得了最先进的成果,并被用于工业翻译服务的核心。
该模型很简单,但鉴于训练它需要大量数据,在模型中调整无数的设计决策以在您的问题上获得最佳性能实际上可能难以实现。值得庆幸的是,研究科学家们已经使用Google规模的硬件为我们完成了这项工作,并提供了一套启发式方法,用于如何配置编码器-解码器模型以实现神经机器翻译以及一般的序列预测。
在这篇文章中,您将了解如何最好地配置用于神经机器翻译和其他自然语言处理任务的编码器-解码器循环神经网络的详细信息。
阅读本文后,你将了解:
- Google 研究调查了编码器-解码器模型中的每个模型设计决策,以分离它们的影响。
- 有关词嵌入、编码器和解码器深度以及注意力机制等设计决策的结果和建议。
- 一组可以作为您自己的序列到序列项目的起点的基本模型设计决策。
通过我的新书《自然语言处理深度学习》启动您的项目,其中包括分步教程和所有示例的 Python 源代码文件。
让我们开始吧。

如何为神经机器翻译配置编码器-解码器模型
图片由 Sporting Park 提供,部分权利保留。
用于神经机器翻译的编码器-解码器模型
循环神经网络的编码器-解码器架构正在取代传统的基于短语的统计机器翻译系统,以实现最先进的成果。
证据是,在他们2016年的论文《Google的神经机器翻译系统:弥合人机翻译之间的差距》中,Google现在在他们的Google Translate服务的核心中使用了这种方法。
这种架构的一个问题是模型很大,反过来需要非常大的数据集进行训练。这导致模型训练需要几天或几周,并且需要通常非常昂贵的计算资源。因此,关于不同设计选择对模型及其对模型技能的影响的研究很少。
这个问题由 Denny Britz 等人在他们2017年的论文《神经机器翻译架构的大规模探索》中明确解决。在论文中,他们为标准的英语到德语翻译任务设计了一个基线模型,并列举了一系列不同的模型设计选择,并描述了它们对模型技能的影响。他们声称完整的实验消耗了超过250,000个GPU计算小时,这至少可以说令人印象深刻。
我们报告了数百次实验运行的经验结果和方差数字,对应于标准WMT英德翻译任务上超过250,000个GPU小时。我们的实验为构建和扩展NMT架构提供了新的见解和实用建议。
在这篇文章中,我们将研究这篇论文中的一些发现,我们可以用它们来调整我们自己的神经机器翻译模型,以及一般的序列到序列模型。
有关编码器-解码器架构和注意力机制的更多背景信息,请参阅以下帖子:
需要深度学习处理文本数据的帮助吗?
立即参加我的免费7天电子邮件速成课程(附代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
基线模型
我们可以首先描述用作所有实验起点的基线模型。
选择了一个基线模型配置,使模型在翻译任务上表现良好。
- 嵌入:512维
- RNN 单元:门控循环单元(GRU)
- 编码器:双向
- 编码器深度:2层(每个方向1层)
- 解码器深度:2层
- 注意力:Bahdanau风格
- 优化器:Adam
- Dropout:输入层20%
每个实验都从基线模型开始,并改变一个元素,以试图隔离设计决策对模型技能(在本例中为BLEU分数)的影响。

用于神经机器翻译的编码器-解码器架构
取自“大规模探索神经机器翻译架构”。
嵌入尺寸
词嵌入用于表示输入到编码器的词语。
这是一种分布式表示,其中每个单词被映射到一个固定大小的连续值向量。这种方法的优点是具有相似含义的不同单词将具有相似的表示。
这种分布式表示通常在模型拟合训练数据时学习。嵌入大小定义了用于表示单词的向量的长度。通常认为,更高的维度将导致更具表现力的表示,进而带来更好的技能。
有趣的是,结果表明,测试的最大尺寸确实取得了最好的结果,但增加尺寸的好处总体上是微小的。
[结果显示]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 年论文《通过联合学习对齐和翻译的神经机器翻译》中描述的简单加权平均风格的注意力被发现表现最佳。
建议:使用注意力机制,并优先选择 Bahdanau 风格的加权平均注意力。
推理
在神经机器翻译系统中,通常使用束搜索来对模型输出序列中单词的概率进行采样。
束宽度越宽,搜索越穷尽,并且人们认为结果越好。
结果表明,适度的束宽3-5表现最佳,通过使用长度惩罚只能略微改善。作者普遍建议针对每个具体问题调整束宽。
我们发现,经过良好调优的束搜索对于取得良好结果至关重要,并且它能带来超过一个 BLEU 分数的持续提升。
建议:从贪婪搜索(beam=1)开始,并根据您的问题进行调整。
最终模型
作者将他们的发现整合到一个“最佳模型”中,并将该模型的结果与其他表现良好的模型和最先进的结果进行比较。
该模型的具体配置总结在下表中,摘自论文。在为NLP应用程序开发您自己的编码器-解码器模型时,这些参数可以作为良好或最佳的起点。

最终NMT模型的模型配置总结
取自“大规模探索神经机器翻译架构”。
该系统的结果令人印象深刻,并以一个更简单的模型实现了接近最先进水平的技能,这并非本文的目标。
…我们确实表明,通过仔细的超参数调整和良好的初始化,有可能在标准WMT基准测试上实现最先进的性能。
重要的是,作者将他们的所有代码作为开源项目 tf-seq2seq 提供。由于其中两位作者是 Google Brain 住院项目成员,他们的工作在 Google Research 博客上宣布,标题为“介绍 tf-seq2seq:TensorFlow 中的开源序列到序列框架”,2017 年。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
- 神经机器翻译架构的大规模探索, 2017.
- 丹尼·布里茨主页
- WildML 博客
- 推出 tf-seq2seq:TensorFlow 中的开源序列到序列框架, 2017.
- tf-seq2seq:一个用于Tensorflow的通用编码器-解码器框架
- tf-seq2seq 项目文档
- tf-seq2seq 教程:神经机器翻译背景
- 通过联合学习对齐和翻译的神经机器翻译, 2015.
总结
在这篇文章中,您了解了如何最佳配置用于神经机器翻译和其他自然语言处理任务的编码器-解码器循环神经网络。
具体来说,你学到了:
- Google 研究调查了编码器-解码器模型中的每个模型设计决策,以分离它们的影响。
- 有关词嵌入、编码器和解码器深度以及注意力机制等设计决策的结果和建议。
- 一组可以作为您自己的序列到序列项目的起点的基本模型设计决策。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
嗨,杰森,谢谢你的帖子。我猜你说“1层双向模型仅比4层双向配置略好”时,你是想说4层略好于1层吧?
*想说
我才刚开始接触这个概念。我做了一个图像字幕项目,并试图将其改造成一个图像字幕模型。我记得一篇机器学习论文的标题是“分离‘什么’和‘哪里’”,我从中得到了一些灵感。太阳底下没有新鲜事,所以我还在努力寻找它以前在哪里被做过,但是。我从ResNet全局平均池化(GAP)层中取出了2048长度的向量,并将其转换为一个句子。句子长度为2048,并且始终是相同的1-2048有序列表。该索引列表被嵌入,然后每个嵌入向量乘以GAP层特征向量中的相应值,有点像“什么”乘以“多少”。据我所知,效果还不错。
干得好!
非常感谢你的帖子....
不客气。
嗨,Jason,我正在研究神经机器翻译,我的数据集(0.25M)有点小,用于训练模型。那么根据您的看法,对于小型数据集模型,最佳的超参数应该是什么?我没有太多的GPU资源,所以不能进行太多调优。对于小型数据集,如果我们将网络做得越来越深,模型是否总是表现最佳?
测试一套并看看什么最适合您的问题和模型。
嗨 Jason,
感谢这篇精彩的帖子。请问如何对将输入到解码器的双向编码器状态进行拼接?
我这里有一个例子
https://machinelearning.org.cn/develop-bidirectional-lstm-sequence-classification-python-keras/
嗨,Jason,
我想知道下面这本书是否有关于机器翻译的双向LSTM的项目示例?它是否有可以用来玩双向LSTM的Python代码和数据?想深入研究模型。谢谢。
用于自然语言处理的深度学习
此致,
Tom Chan。
这本书包含了一个开发神经机器翻译系统的示例,您可以轻松地将其改编为使用双向输入层。
嗨 Jason
感谢这篇精彩的帖子。有没有可能从用户那里获取短语作为输入进行翻译?
是的,如果您愿意,可以为该模型开发一个界面。
对于抽象式摘要,单向还是双向LSTM(在编码器侧)更好?
我建议在您的特定数据集上测试这两种方法并比较性能。我猜双向会更好。
嗨,Jason,我正在训练基于TensorFlow和TensorFlow示例中的BahdanauAttention的NMT模型。由于翻译效果不佳,如何改进它,以及我应该如何调整以改进它。我还按照您的NMT编码器-解码器帖子,正在使用256个节点和64的批次大小在完整的德语-英语数据上训练模型。但30个epoch后,验证损失没有改善。翻译质量也不好,请帮助。
好问题,这里的教程将帮助您诊断问题并提升性能
https://machinelearning.org.cn/start-here/#better
这些配置在今天仍然是一个好的起点吗,或者有没有额外的研究来改进这些发现?
是的,对于一个适度的项目来说,这是一个很好的起点。
您好 Jason,帖子很棒。我正在做一个关于抽象摘要的项目,目前尝试使用编码器-解码器模型,但没有成功。
我有一个关于 LSTM 层中单元数量的问题:它们与嵌入大小和训练样本数量有关吗?我使用大小为 128 的词嵌入,由于资源限制(1000 个样本),我被迫使用小型训练集。LSTM 层的单元数量使用 300 是否正确,或者您认为它太大了?在您看来,训练集中应该包含多少个样本,因为我知道 1000 个太少了?
这取决于你的雄心壮志。你可以尝试查看 HuggingFace 提供的数据集(例如,https://hugging-face.cn/datasets/wikitext)
LSTM 的 300 个单元对于 128 大小的嵌入可能太少了,但我可能错了。尝试实验并看看你的模型产生什么效果。