基于注意力机制,机器之心带你理解与训练神经机器翻译系统腾讯云开发者社区

本文是机器之心 GitHub 实现项目,我们根据谷歌的 Transformer 原论文与 Harvard NLP 所实现的代码学习构建了一个神经机器翻译系统。因此,我们希望各位读者也能根据这篇文章了解 Transformer 的架构,并动手实现一个神经机器翻译系统。

自去年 6 月份「Attention is All You Need」发表以来,Transformer 受到越来越多的关注。它除了能显著提升翻译质量,同时还为很多 NLP 任务提供了新的架构。这篇论文放弃了传统基于 RNN 或 CNN 的深度架构,并只保留了注意力(Attentaion)机制,虽然原论文在这一方面描述地比较清楚,但要正确地实现这样的新型架构可能非常困难。

在这篇文章中,我们从注意力机制到神经机器翻译系统解释了实现 Transformer 的架构与代码,并借助这些实现理解原论文。机器之心整理了整个实现,并根据我们对原论文与实现的理解添加一些解释。整个文章就是一个可运行的 Jupyter Notebook,读者可直接在 Colaboratory 中阅读文章与运行代码。

本文所有的代码都可以在谷歌 Colab 上运行,且读者也可以在 GitHub 中下载全部的代码在本地运行。这篇文章非常适合于研究者与感兴趣的开发者,代码很大程度上都依赖于 OpenNMT 库。

在运行模型前,我们需要确保有对应的环境。如果在本地运行,那么需要确保以下基本库的导入不会报错,若在 Colab 上运行,那么首先需要运行以下第一个 pip 语句安装对应的包。Colab 的环境配置非常简单,一般只需要使用 conda 或 pip 命令就能完成。此外,Colab 语句前面加上「!」表示这是命令行,而不加感叹号则表示这个代码框是 Python 代码。

引言

减少序列计算的任务目标构成了 Extended Neural GPU、ByteNet 和 ConvS2S 的基础,它们都是使用卷积神经网络作为基本构建块,因而能对所有输入与输出位置的隐藏表征执行并行计算。在这些模型中,两个任意输入与输出位置的信号关联所需要的运算数量与它们的位置距离成正比,对于 ConvS2S 为线性增长,对于 ByteNet 为对数增长。这种现象使得学习较远位置的依赖关系非常困难。而在 Transformer 中,这种成本会减少到一个固定的运算数量,尽管平均注意力位置加权会减少有效表征力,但使用 Multi-Head Attention 注意力机制可以抵消这种成本。

自注意力(Self-attention),有时也称为内部注意力,它是一种涉及单序列不同位置的注意力机制,并能计算序列的表征。自注意力在多种任务中都有非常成功的应用,例如阅读理解、摘要概括、文字蕴含和语句表征等。自注意力这种在序列内部执行 Attention 的方法可以视为搜索序列内部的隐藏关系,这种内部关系对于翻译以及序列任务的性能非常重要。

然而就我们所知道的,Transformer 是第一种完全依赖于自注意力以计算输入与输出表征的方法,这意味着它没有使用序列对齐的 RNN 或卷积网络。从 Transformer 的结构就可以看出,它并没有使用深度网络抽取序列特征,顶多使用几个线性变换对特征进行变换。

本文主要从模型架构、训练配置和两个实际翻译模型开始介绍 Ashish Vaswani 等人的原论文与 Harvard NLP 团队实现的代码。在模型架构中,我们将讨论编码器、解码器、注意力机制以及位置编码等关键组成部分,而训练配置将讨论如何抽取批量数据、设定训练循环、选择最优化方法和正则化器等。最后我们将跟随 Alexander Rush 等人的实现训练两个神经机器翻译系统,其中一个仅使用简单的合成数据,而另一个则是真实的 IWSLT 德语-英语翻译数据集。

模型架构

大多数神经序列模型都使用编码器-解码器框架,其中编码器将表征符号的输入序列 (x_1, …, x_n) 映射到连续表征 z=(z_1, …, z_n)。给定中间变量 z,解码器将会生成一个输出序列 (y_1,…,y_m)。在每一个时间步上,模型都是自回归的(auto-regressive),当生成序列中的下一个元素时,先前生成的元素会作为输入。

以下展示了一个标准的编码器-解码器框架,EncoderDecoder 类定义了先编码后解码的过程,例如先将英文序列编码为一个隐向量,在基于这个中间表征解码为中文序列。

Transformer 的整体架构也采用了这种编码器-解码器的框架,它使用了多层自注意力机制和层级归一化,编码器和解码器都会使用全连接层和残差连接。Transformer 的整体结构如下图所示:

如上所示,左侧为输入序列的编码器。输入序列首先会转换为词嵌入向量,在与位置编码向量相加后可作为 Multi-Head Attention 模块的输入,该模块的输出在与输入相加后将投入层级归一化函数,得出的输出在馈送到全连接层后可得出编码器模块的输出。这样相同的 6 个编码器模块(N=6)可构成整个编码器架构。解码器模块首先同样构建了一个自注意力模块,然后再结合编码器的输出实现 Multi-Head Attention,最后投入全连接网络并输出预测词概率。

这里只是简单地介绍了模型的大概过程,很多如位置编码、Multi-Head Attention 模块、层级归一化、残差链接和逐位置前馈网络等概念都需要读者详细阅读下文,最后再回过头理解完整的过程。

编码器与解码器堆栈

编码器由相同的 6 个模块堆叠而成,每一个模块都有两个子层级构成。其中第一个子层级是 Multi-Head 自注意机制,其中自注意力表示输入和输出序列都是同一条。第二个子层级采用了全连接网络,主要作用在于注意子层级的特征。此外,每一个子层级都会添加一个残差连接和层级归一化。

以下定义了编码器的主体框架,在 Encoder 类中,每一个 layer 表示一个编码器模块,这个编码器模块由两个子层级组成。layer 函数的输出表示经过层级归一化的编码器模块输出,通过 For 循环堆叠层级就能完成整个编码器的构建。

如编码器的结构图所示,每个子层级都会会添加一个残差连接,并随后传入层级归一化。上面构建的主体架构也调用了层级归一化函数,以下代码展示了层级归一化的定义。

层级归一化可以通过修正每一层内激活值的均值与方差而大大减少协方差偏离问题。简单来说,一个层级的均值可以通过计算该层所有神经元激活值的平均值而得出,然后再根据均值计算该层所有神经元激活值的方差。最后根据均值与方差,我们可以对这一层所有输出值进行归一化。

如上 LayerNorm 类所示,我们首先需要使用方法 mean 求输入 x 最后一个维度的均值,keepdim 为真表示求均值后的维度保持不变,并且均值会广播操作到对应的维度。同样使用 std 方法计算标准差后,该层所有激活值分别减去均值再除以标准差就能实现归一化,分母加上一个小值 eps 可以防止分母为零。

因此,每一个子层的输出为 LayerNorm(x+Sublayer(x)),其中 Sublayer(x) 表示由子层本身实现的函数。我们应用 Dropout 将每一个子层的输出随机失活,这一过程会在加上子层输入和执行归一化之前完成。

以下定义了残差连接,我们会在投入层级归一化函数前将子层级的输入与输出相加。为了使用这些残差连接,模型中所有的子层和嵌入层的输出维度都是 d_model=512。

在上述代码定义中,x 表示上一层添加了残差连接的输出,这一层添加了残差连接的输出需要将 x 执行层级归一化,然后馈送到 Multi-Head Attention 层或全连接层,添加 Dropout 操作后可作为这一子层级的输出。最后将该子层的输出向量与输入向量相加得到下一层的输入。

编码器每个模块有两个子层,第一个为 multi-head 自注意力层,第二个为简单的逐位置全连接前馈网络。以下的 EncoderLayer 类定义了一个编码器模块的过程。

以上代码叠加了自注意力层与全连接层,其中 Multi-Head Attention 机制的输入 Query、Key 和 Value 都为 x 就表示自注意力。

解码器也由相同的 6 个模块堆叠而成,每一个解码器模块都有三个子层组成,每一个子层同样会加上残差连接与层级归一化运算。第一个和第三个子层分别与编码器的 Multi-Head 自注意力层和全连接层相同,而第二个子层所采用的 Multi-Head Attention 机制使用编码器的输出作为 Key 和 Value,采用解码模块第一个子层的输出作为 Query。

我们同样需要修正编码器堆栈中的自注意力子层,以防止当前位置注意到后续序列位置,这一修正可通过掩码实现。以下的解码器的主体堆叠结构和编码器相似,只需要简单地堆叠解码器模块就能完成。

以下展示了一个解码器模块的架构,第一个 Multi-Head Attention 机制的三个输入都是 x,因此它是自注意力。第二个 Multi-Head 注意力机制输入的 Key 和 Value 是编码器的输出 memory,输入的 Query 是上一个子层的输出 x。最后在叠加一个全连接网络以完成一个编码器模块的构建。

对于序列建模来说,模型应该只能查看有限的序列信息。例如在时间步 i,模型能读取整个输入序列,但只能查看时间步 i 及之前的序列信息。对于 Transformer 的解码器来说,它会输入整个目标序列,且注意力机制会注意到整个目标序列各个位置的信息,因此我们需要限制注意力机制能看到的信息。

如上所述,Transformer 在注意力机制中使用 subsequent_mask 函数以避免当前位置注意到后面位置的信息。因为输出词嵌入是位置的一个偏移,因此我们可以确保位置 i 的预测仅取决于在位置 i 之前的已知输出。

以下为注意力掩码的可视化,其中每一行为一个词,每一列则表示一个位置。下图展示了每一个词允许查看的位置,训练中词是不能注意到未来词的。

注意力机制

谷歌在原论文中展示了注意力机制的一般化定义,即它和 RNN 或 CNN 一样也是一种编码序列的方案。一个注意力函数可以描述为将 Query 与一组键值对(Key-Value)映射到输出,其中 Query、Key、Value 和输出都是向量。输出可以通过值的加权和而计算得出,其中分配到每一个值的权重可通过 Query 和对应 Key 的适应度函数(compatibility function)计算。

在翻译任务中,Query 可以视为原语词向量序列,而 Key 和 Value 可以视为目标语词向量序列。一般的注意力机制可解释为计算 Query 和 Key 之间的相似性,并利用这种相似性确定 Query 和 Value 之间的注意力关系。

以下是点积注意力的结构示意图,我们称这种特殊的结构为「缩放点积注意力」。它的输入由维度是 d_k 的 Query 和 Key 组成,Value 的维度是 d_v。如下所示,我们会先计算 Query 和所有 Key 的点乘,并每一个都除上 squre_root(d_k) 以防止乘积结果过大,然后再馈送到 Softmax 函数以获得与 Value 对应的权重。根据这样的权重,我们就可以配置 Value 向量而得出最后的输出。

在上图中,Q 和 K 的运算有一个可选的 Mask 过程。在编码器中,我们不需要使用它限制注意力模块所关注的序列信息。而在解码器中,我们需要它限制注意力模块只能注意到当前时间步及之前时间步的信息。这一个过程可以很简洁地表示为函数 Attention(Q, K, V)。

Attention(Q, K, V) 函数在输入矩阵 Q、K 和 V 的情况下可计算 Query 序列与 Value 序列之间的注意力关系。其中 Q 的维度为 n×d_k,表示有 n 条维度为 d_k 的 Query、K 的维度为 m×d_k、V 的维度为 m×d_v。这三个矩阵的乘积可得出 n×d_v 维的矩阵,它表示 n 条 Query 对应注意到的 Value 向量。

上式中 Q 与 K 的点积会除上 squre_root(d_k) 以实现缩放。原论文作者发现,当每一条 Query 的维度 d_k 比较小时,点乘注意力和加性注意力的性能相似,但随着 d_k 的增大,加性注意力的性能会超过点乘注意力机制。不过点乘注意力有一个强大的属性,即它可以利用矩阵乘法的并行运算大大加快训练速度。

原论文作者认为点乘注意力效果不好的原因是在 d_k 比较大的情况下,乘积结果会非常大,因此会导致 Softmax 快速饱和并只能提供非常小的梯度来更新参数。所以他们采用了根号下 d_k 来缩小点乘结果,并防止 Softmax 函数饱和。

为了证明为什么点积的量级会变得很大,我们假设元素 q 和 k 都是均值为 0、方差为 1 的独立随机变量,它们的点乘 q⋅k=∑q_i*k_i 有 0 均值和 d_k 的方差。为了抵消这种影响,我们可以通过除上 squre_root(d_k) 以归一化点乘结果。

以下函数定义了一个标准的点乘注意力,该函数最终会返回匹配 Query 和 Key 的权重或概率 p_attn,以及最终注意力机制的输出序列。

在上述函数中,query 矩阵的列数即维度数 d_k。在计算点乘并缩放后,我们可以在最后一个维度执行 Softmax 函数以得到概率 p_attn。

两个最常见的注意力函数是加性注意力(additive attention)和点乘(乘法)注意力。除了要除上缩放因子 squre_root(d_k),标准的点乘注意力与原论文中所采用的是相同的。加性注意力会使用单隐藏层的前馈网络计算适应度函数,它们在理论复杂度上是相似的。点积注意力在实践中更快速且参数空间更高效,因为它能通过高度优化的矩阵乘法库并行地计算。

Multi-head Attention

下图展示了 Transformer 中所采用的 Multi-head Attention 结构,它其实就是多个点乘注意力并行地处理并最后将结果拼接在一起。一般而言,我们可以对三个输入矩阵 Q、V、K 分别进行 h 个不同的线性变换,然后分别将它们投入 h 个点乘注意力函数并拼接所有的输出结果。

Multi-head Attention 允许模型联合关注不同位置的不同表征子空间信息,我们可以理解为在参数不共享的情况下,多次执行点乘注意力。Multi-head Attention 的表达如下所示:

其中 W 为对应线性变换的权重矩阵,Attention() 就是上文所实现的点乘注意力函数。

在原论文和实现中,研究者使用了 h=8 个并行点乘注意力层而完成 Multi-head Attention。对于每一个注意力层,原论文使用的维度是 d_k=d_v=d_model/h=64。由于每一个并行注意力层的维度降低,总的计算成本和单个点乘注意力在全维度上的成本非常相近。

以下定义了 Multi-head Attention 模块,它实现了上图所示的结构:

在以上代码中,首先我们会取 query 的第一个维度作为批量样本数,然后再实现多个线性变换将 d_model 维的词嵌入向量压缩到 d_k 维的隐藏向量,变换后的矩阵将作为点乘注意力的输入。点乘注意力输出的矩阵将在最后一个维度拼接,即 8 个 n×64 维的矩阵拼接为 n×512 维的大矩阵,其中 n 为批量数。这样我们就将输出向量恢复为与词嵌入向量相等的维度。

前面我们已经了解到 Transformer 使用了大量的自注意力机制,即 Attention(X, X, X )。简单而言,Transformer 使用自注意力代替 RNN 或 CNN 抽取序列特征。对于机器翻译任务而言,自注意力输入的 Query、Key 和 Value 都是相同的矩阵,那么 Query 和 Key 之间的运算就相当于计算输入序列内部的相似性,并根据这种相似性或权重注意到序列自身(Value)的内部联系。

这种内部联系可能是主语注意到谓语和宾语的信息或其它隐藏在句子内部的结构。Transformer 在神经机器翻译和阅读理解等任务上的优秀性能,都证明序列内部结构的重要性。

Transformer 以三种不同的方式使用 multi-head Attention。首先在编码器到解码器的层级中,Query 来源于前面解码器的输出,而记忆的 Key 与 Value 都来自编码器的输出。这允许解码器中的每一个位置都注意输入序列中的所有位置,因此它实际上模仿了序列到序列模型中典型的编码器-解码器注意力机制。

其次,编码器包含了自注意力层,且该层中的所有 Value、Key 和 Query 都是相同的输入矩阵,即编码器的前层输出。最后,解码器中的自注意力层允许解码器中的每一个位置都注意到包括当前位置的所有合法位置。这可以通过上文定义的 Mask 函数实现,从而防止产生左向信息流来保持自回归属性。

逐位置的前馈网络

为了注意子层,每一个编码器和解码器模块最后都包含一个全连接前馈网络,它独立且相同地应用于每一个位置。这个前馈网络包含两个线性变换和一个非线性激活函数,且在训练过程中我们可以在两层网络之间添加 Dropout 方法:

如果我们将这两个全连接层级与残差连接和层级归一化结合,那么它就是每一个编码器与解码器模块最后所必须的子层。我们可以将这一子层表示为:LayerNorm(x + max(0, x*w1 + b1)w2 + b2)。

尽管线性变换在所有不同的位置上都相同,但在不同的层级中使用不同的参数,这种变换其实同样可以描述为核大小为 1 的两个卷积。输入和输出的维度 d_model=512,而内部层级的维度 d_ff=2018。

如下所示,前馈网络的定义和常规的方法并没有什么区别,不过这个网络没有添加偏置项,且对第一个全连接的输出实现了 Dropout 以防止过拟合。

词嵌入和 Softmax

与其它序列模型相似,我们可以使用学得的词嵌入将输入和输出的词汇转换为维度等于 d_model 的向量。我们还可以使用一般的线性变换和 Softmax 函数将解码器的输出转化为预测下一个词汇的概率。在愿论文的模型中,两个嵌入层和 pre-softmax 线性变换的权重矩阵是共享的。在词嵌入层中,我们将所有权重都乘以 squre_root(d_model)。

位置编码

位置编码是 Transformer 模型中最后一个需要注意的结构,它对使用注意力机制实现序列任务也是非常重要的部分。如上文所述,Transformer 使用自注意力机制抽取序列的内部特征,但这种代替 RNN 或 CNN 抽取特征的方法有很大的局限性,即它不能捕捉序列的顺序。这样的模型即使能根据语境翻译出每一个词的意义,那也组不成完整的语句。

为了令模型能利用序列的顺序信息,我们必须植入一些关于词汇在序列中相对或绝对位置的信息。直观来说,如果语句中每一个词都有特定的位置,那么每一个词都可以使用向量编码位置信息。将这样的位置向量与词嵌入向量相结合,那么我们就为每一个词引入了一定的位置信息,注意力机制也就能分辨出不同位置的词。

谷歌研究者将「位置编码」添加到输入词嵌入中,位置编码有和词嵌入相同的维度 d_model,每一个词的位置编码与词嵌入向量相加可得出这个词的最终编码。目前有很多种位置编码,包括通过学习和固定表达式构建的。

在这一项实验中,谷歌研究者使用不同频率的正弦和预先函数:

其中 pos 为词的位置,i 为位置编码向量的第 i 个元素。给定词的位置 pos,我们可以将词映射到 d_model 维的位置向量,该向量第 i 个元素就由上面两个式子计算得出。也就是说,位置编码的每一个维度对应于正弦曲线,波长构成了从 2π到 10000⋅2π的等比数列。

上面构建了绝对位置的位置向量,但词的相对位置同样非常重要,这也就是谷歌研究者采用三角函数表征位置的精妙之处。正弦与余弦函数允许模型学习相对位置,这主要根据两个变换:sin(α+β)=sinα cosβ+cosα sinβ 以及 cos(α+β)=cosα cosβ−sinα sinβ。

对于词汇间固定的偏移量 k,位置向量 PE(pos+k) 可以通过 PE(pos) 与 PE(k) 的组合表示,这也就表示了语言间的相对位置。

以下定义了位置编码,其中我们对词嵌入与位置编码向量的和使用 Dropout,默认可令_drop=0.1。div_term 实现的是分母,而 pe[:, 0::2] 表示第二个维度从 0 开始以间隔为 2 取值,即偶数。

以下将基于一个位置将不同的正弦曲线添加到位置编码向量中,曲线的频率和偏移量在每个维度上都不同。

谷歌等研究者在原论文中表示他们同样对基于学习的位置编码进行了实验,并发现这两种方法会产生几乎相等的结果。所以按照性价比,他们还是选择了正弦曲线,因为它允许模型在训练中推断更长的序列。

模型整体

下面,我们定义了一个函数以构建模型的整个过程,其中 make_model 在输入原语词汇表和目标语词汇表后会构建两个词嵌入矩阵,而其它参数则会构建整个模型的架构。

在以上的代码中,make_model 函数将调用上面我们定义的各个模块,并将它们组合在一起。我们会将 Multi-Head Attention 子层、全连接子层和位置编码等结构传入编码器与解码器主体函数,再根据词嵌入向量与位置编码向量完成输入与标注输出的构建。以下简单地示例了如何使用 make_model 函数构建模型:

训练

这一部分将描述模型的训练方案。首先需要介绍一些训练标准编码器解码器模型的工具,例如定义一个批量的目标以储存原语序列与目标语序列,并进行训练。前文的模型架构与函数定义我们主要参考的原论文,而后面的具体训练过程则主要参考了 Alexander 的实现经验。

批量和掩码

以下定义了保留一个批量数据的类,并且它会使用 Mask 在训练过程中限制目标语的访问序列。

我们下一步需要创建一般的训练和评分函数,以持续追踪损失的变化。在构建一般的损失函数后,我们就能根据它更新参数。

如下定义了训练中的迭代循环,我们使用 loss_compute() 函数计算损失函数,并且每运行 50 次迭代就输出一次训练损失,这有利于监控训练情况。

训练数据与分批

Alexander 等人的模型在标准的 WMT 2014 英语-德语数据集上进行训练,这个数据集包含 450 万条语句对。语句已经使用双字节编码(byte-pair encoding)处理,且拥有约为 37000 个符号的原语-目标语共享词汇库。对于英语-法语的翻译任务,. 原论文作者使用了更大的 WMT 2014 英语-法语数据集,它包含 3600 万条语句,且将符号分割为包含 32000 个 word-piece 的词汇库。

原论文表示所有语句对将一同执行分批操作,并逼近序列长度。每一个训练批量包含一组语句对,大约分别有 25000 个原语词汇和目标语词汇。

Alexander 等人使用 torch text 进行分批,具体的细节将在后面讨论。下面的函数使用 torchtext 函数创建批量数据,并确保批量大小会填充到最大且不会超过阈值(使用 8 块 GPU,阈值为 25000)。

batch_size_fn 将抽取批量数据,且每一个批量都抽取最大原语序列长度和最大目标语序列长度,如果长度不够就使用零填充增加。

硬件与策略

原论文在一台机器上使用 8 块 NVIDIA P100 GPU 训练模型,基本模型使用了论文中描述的超参数,每一次迭代大概需要 0.4 秒。基本模型最后迭代了 100000 次,共花了 12 个小时。而对于大模型,每一次迭代需要花 1 秒钟,所以训练 300000 个迭代大概需要三天半。但我们后面的真实案例并不需要使用如此大的计算力,因为我们的数据集相对要小一些。

优化器

原论文使用了 Adam 优化器,其中β_1=0.9、 β_2=0.98 和 ϵ=10^{−9}。在训练中,研究者会改变学习率为 l_rate=d−0.5model⋅min(step_num−0.5,step_num⋅warmup_steps−1.5)。

学习率的这种变化对应于在预热训练中线性地增加学习率,然后再与迭代数的平方根成比例地减小。这种 1cycle 学习策略在实践中有非常好的效果,一般使用这种策略的模型要比传统的方法收敛更快。在这个实验中,模型采用的预热迭代数为 4000。注意,这一部分非常重要,我们需要以以下配置训练模型。

使用不同模型大小和最优化超参数下的变化曲线:

正则化

在训练中,Alexander 等人使用了标签平滑的方法,且平滑值ϵ_ls=0.1。这可能会有损困惑度,因为模型将变得更加不确定它所做的预测,不过这样还是提升了准确度和 BLEU 分数。

Harvard NLP 最终使用 KL 散度实现了标签平滑,与其使用 one-hot 目标分布,他们选择了创建一个对正确词有置信度的分布,而其它平滑的概率质量分布将贯穿整个词汇库。

下面,我们可以了解到概率质量如何基于置信度分配到词。

标签平滑实际上在模型对某些选项非常有信心的时候会惩罚它。

简单的序列翻译案例

我们可以从简单的复制任务开始尝试。若从小词汇库给定输入符号的一个随机集合,我们的目标是反向生成这些相同的符号。

计算模型损失

贪婪解码

这些代码将简单地使用贪婪解码预测译文。

真实案例

现在,我们将使用 IWSLT 德语-英语数据集实现翻译任务。该任务要比论文中讨论的 WMT 任务稍微小一点,但足够展示整个系统。我们同样还展示了如何使用多 GPU 处理来令加速训练过程。

数据加载

我们将使用 torchtext 和 spacy 加载数据集,并实现分词。

我们希望有非常均匀的批量,且有最小的填充,因此我们必须对默认的 torchtext 分批函数进行修改。这段代码修改了默认的分批过程,以确保我们能搜索足够的语句以找到紧凑的批量。

数据迭代器

迭代器定义了分批过程的多项操作,包括数据清洗、整理和分批等。

多 GPU 训练

最后为了快速训练,我们使用了多块 GPU。这段代码将实现多 GPU 的词生成,但它并不是针对 Transformer 的具体方法,所以这里并不会具体讨论。多 GPU 训练的基本思想即在训练过程中将词生成分割为语块(chunks),并传入不同的 GPU 实现并行处理,我们可以使用 PyTorch 并行基元实现这一点。

下面,我们利用前面定义的函数创建了模型、度量标准、优化器、数据迭代器和并行化:

下面可以训练模型了,Harvard NLP 团队首先运行了一些预热迭代,但是其它的设定都能使用默认的参数。在带有 4 块 Tesla V100 的 AWS p3.8xlarge 中,批量大小为 12000 的情况下每秒能运行 27000 个词。

训练系统

一旦训练完成了,我们就能解码模型并生成一组翻译,下面我们简单地翻译了验证集中的第一句话。该数据集非常小,所以模型通过贪婪搜索也能获得不错的翻译效果。

实验结果

在 WMT 2014 英语到法语的翻译任务中,原论文中的大型的 Transformer 模型实现了 41.0 的 BLEU 分值,它要比以前所有的单模型效果更好,且只有前面顶级的模型 1/4 的训练成本。在 Harvard NLP 团队的实现中,OpenNMT-py 版本的模型在 EN-DE WMT 数据集上实现了 26.9 的 BLEU 分值。

THE END
0.机器翻译能达60个语种3000个方向,近日又夺全球五冠,这家牛企是谁?比赛的主要宗旨是评估机器翻译最新发展水平,传播通用测试数据集和公共训练数据,改进机器翻译评估评测方法。此次大赛共发布中文-英语、捷克语-英语、法语-德语、德语-英语、因纽特语-英语、泰米尔语-英语、日语-英语、普什图语-英语、波兰语-英语、俄语-英语、高棉语-英语等11个语言对、22个语言方向的机器翻译评测任务。jvzquC41pg}t0|npc0ipo7hp1e532;6/233198iqe/oj|wj|zv713?69:0yivvq
1.技术实践神经机器翻译不同于前面的越南语翻英语是基于已经处理好的语料,我们找的中英翻译用语料在训练和验证等使用前均需要先做预处理。根据GNMT作者在github上的推荐,我们直接修改repo上英德翻译预处理的文件 (wmt16_en_de.sh) 以实现相关的预处理如下: 数据集如果是sgm格式的先转换成raw text格式 jvzquC41yy}/lrvk|joykw3eqo5bt}nengy0ojhjkpkutjsunczjqw
2.docs/datasets.md·PaddlePaddle/PaddleNLPWMT14ENDE WMT14 EN-DE 经过BPE分词的英语-德语翻译数据集 paddlenlp.datasets.load_dataset('wmt14ende') 机器同传 数据集名称简介调用方法 BSTC 千言数据集:机器同传,包括transcription_translation和asr paddlenlp.datasets.load_dataset('bstc', 'asr') 文本生成 数据集名称简介调用方法 Poetry 中文诗歌古典文集jvzquC41ikzfg7hqo1vbfmqgrcjenn4RcfjmgWQR1drpd8igxgrpr8iqeu5ec}fugvy/om
3.如何从零开始开发神经机器翻译系统·MachineLearningMastery看一下,如果你想要更多的分步教程,在使用文本数据时充分利用深度学习方法。 如何在 Keras 中开发神经机器翻译系统BjörnGroß,保留一些权利。 教程概述 本教程分为 4 个部分;他们是: 德语到英语翻译数据集 准备文本数据 训练神经翻译模型 评估神经翻译模型 jvzquC41yy}/mjsenq{e0ls1crgdjnhp1or.ojxvgt.|q43;7818>
4.AttentionIsAllYouNeed翻译我们只进行了少量的实验来选择dropout,注意力(attention)和残差(residual)(第5.4节),在第22节开发数据集上的学习速率和束大小(beam size),所有其他参数从英语到德语的基础翻译模型保持不变。在推理过程中,我们将最大输出长度增加到输入长度+300。我们使用beam size 为21和 jvzquC41yy}/lrfpuj{/exr1r1j99o;29dgc5;
5.LANGUAGETRANSLATIONWITHTORCHTEXT三年一梦利用torchtext类来处理一个著名的数据集,包含了一些英文和德文句子。利用该数据处理sequence-to-sequence模型,通过注意力机制,可以将德语翻译成英语。基于this tutorialfrom PyTorch community memberBen Trevettand was created bySeth Weidmanwith Ben’s permission.在文末你会用torchtext类:jvzquC41yy}/ewgnqiy/exr1mkth/uuu1r524@7286=/j}rn
6.奇点临近,新研究使用数据多样性再次大幅提升神经网络翻译性能|一然后他们利用向后模型来翻译训练集的目标句子,获得了更多补充原始训练数据集的源句。他们还对向前的模型进行了类似的训练,以使用各种目标句子集来扩充训练数据集。之后,他们使用增强的数据再次训练了模型,并得到了最终的翻译模型。 这一新模型在WMT’14英语至德语的翻译任务中获得了有史以来最高的BLEU分数:30.7。它jvzquC41yy}/z~jskw4dqv487;=2997731747?58279
7.大语言模型常见任务及评测数据集汇总(一):70余个数据集!WMT’16 English-German:另一个广泛使用的英文-德语翻译数据集,包含了约40亿个词对。 WMT’17 English-Chinese:英文-中文翻译数据集,包含了约20亿个词对。 IWSLT:国际工作坊口语翻译评测(International Workshop on Spoken Language Translation)提供的数据集,包含多个语言对的翻译数据,其中包括英文-中文。 jvzquC41dnuh0lxfp0tfv8gpi€j|r4ctvodnn4fgvgjn|4359863:92
8.机器翻译方向数据集合集!机器翻译数据集本文将为您介绍经典、热门的数据集,希望对您在选择适合的数据集时有所帮助。 1 QUAK 发布方: Upstage·高丽大学 发布时间: 2022 韩英合成机器翻译质量预测数据 (韩英神经机器翻译的一个合成质量估计数据集,QUAK) 是指韩语句子和英语机器翻译句子,并且每个句子的机器翻译结果的质量是OK/这是一个机器翻译质量预测模型jvzquC41dnuh0lxfp0tfv8P{|{e2;:>1ctzjeuj1fgzbkux136744=98:
9.102个模型40个数据集,这是你需要了解的机器翻译SOTA论文为了探索当前最佳的 NMT 模型,我们选了几个常见的数据集,并看看在 Transformer 之后,还有哪些激动人心的研究成果。我们发现不同的 NMT 模型都有其侧重的数据集,但最常用的还是 WMT 英法数据集或英德数据集。除此之外,我们也特意找了中英数据集,看看适合翻译中文的模型又是什么样的。 jvzquC41fg|fnxugt0gmk‚zp0eun1jwvkerf1A6:646
10.学习常见相关公开数据集汇总(图像处理相关数据集、自然语言处理相关有很多种方式可以使用这些数据集。比如:你可以使用它们来锻炼你的各种深度学习方法技巧;你可以使用它们来磨练你的技能,了解如何识别和构建每个问题,思考独特的使用案例和公布你的新发现! 数据集分为三类:图像处理相关数据集,自然语言处理相关数据集和语音处理相关数据集。如下: jvzquC41dnuh0lxfp0tfv8|gkzooa<>7:;:678ftvkimg8igvcomu864:79869:
11.多语言图像描述数据集——Multi30k:开启多模态翻译新纪元教育与评测:作为标准数据集,Multi30k可用于评估不同算法性能,同时也是教学过程中引入机器学习概念的优秀案例。 项目特点 多语言支持:涵盖英语、德语、法语和捷克语,促进了多语言间的相互翻译研究。 精细的数据处理:附带的预处理工具和子词模型降低了入门门槛,加快了研究进程。 jvzquC41dnuh0lxfp0tfv8lkvdrpih5228;0c{ykenk0fnyckny03<>779=97
12.【校级一流本科立项课程】“德语翻译实践(1)”课程——知行合一自2004年北航设立德语本科专业以来,《德语翻译实践(1)》就是面向德语专业三年级本科生开设的专业核心课程。该课程已进行了十余年的教学实践,积累了较丰富的课堂教学经验。课程内容主要以对德语经典文本的试译与讲评为主。 课程将翻译实践放在首位,重视实用性与学术性文本的翻译选材。通过高标准的翻译文本的选择,增强教jvzquC41pg}t0kzcc0kew7hp1ktgq86227568;=40jzn
13.有声翻译(英语德语互译版)相似应用下载相关专题 最新专题 德语翻译app合集 英汉互译翻译软件免费 中英互译翻译app 德语翻译app 翻译英汉互译软件有哪些 翻译英汉互译app 翻译英汉互译软件 英语有声读物app推荐 有声翻译下载 中文德语翻译app下载 英语德语app下载 英汉互译翻译app 翻译英汉互译软件下载 中英互译翻译软件推荐 中英互译翻译软jvzquC41o0}bpmtwlkg/exr1crvt1>>48384