目录
- Chapter11 机器翻译与编码-解码模型 (Machine Translation and Encoder-Decoder Models)
- 11.1 语言差异与类型学 (Language Divergences and Typology)
- 11.2 编码-解码模型 (Encoder-Decoder Model)
- 11.3 编码-解码器与RNN (Encoder-Decoder with RNNs)
- 11.4 注意力 (Attention)
- 11.5 定向搜索 (Beam Search)
- 11.6 编码器-解码器与Transformer (Encoder-Decoder with Transformer)
- 11.7 构建机器翻译系统的一些实操细节 (Some practical details on building MT systems)
- 11.8 机器翻译评价 (MT Evaluation)
- 11.9 偏见与伦理问题 (Bias and Ethical Issues)
- 11.10 总结 (Summary)
原书:《Speech and Language Processing (3rd)》-- 斯坦福大学
章节:Chapter11 - Machine Translation and Encoder-Decoder Models
出版时间:第三版暂未出版,本章于2020年底在网络上公开
原文链接:https://web.stanford.edu/~jurafsky/slp3/11.pdf
在翻译过程中,译者会选择性省略部分内容;会重述部分内容;也会补充部分原书中未出现的内容。如有疏漏,烦请提出,不胜感激!
本博客是根据原书进行翻译整理得出,如有侵权,请联系删除。如需转载,请私信本人或在文章下方评论。
Chapter11 机器翻译与编码-解码模型 (Machine Translation and Encoder-Decoder Models)
本章节将介绍机器翻译 (machine translation MT)。目前,机器翻译的最常见的应用大概是信息访问 (information access),比如从网络上获取菜谱之类的。另外一个应用是帮助人们进行翻译工作。机器翻译系统通常用于产生翻译草稿,然后在后期由人工进行编辑与完善。这项任务通常被称为计算机辅助翻译(computer-aided translation)或CAT。CAT通常用作本地化的一部分:使内容或产品适应特定语言社区的任务。
标准的机器翻译算法是 编码-解码(Encoder-Decoder) 网络,也叫 序列到序列(sequence to sequence) 网络,其可以由RNN或者Transformer结构来实现。在前面的章节中,我们已经看到了RNN和Transformer结构被用作分类任务或打标签任务。
编码-解码模型或者叫序列到序列模型可以被用作不同种类的序列模型,序列模型是完整的输入序列的一个复杂函数;我们必须将输入的单词(words or tokens)序列映射到一个标签序列,这个标签序列并不是由单个的词语映射而来的。
机器翻译的任务并不要求输出序列的长度和顺序与输入序列一致,因为不同语言的表达顺序可能不同。这种语言之间的不同而让整个任务变得非常复杂。
Encoder-decoder网络在处理这种序列映射的复杂情况上非常成功。确实,encoder-decoder算法并不值用于机器翻译,它也是许多包括两个序列在内的复杂映射任务的前沿解决方案。这些任务包括 总结(summarization)(如写标题和摘要), 对话(dialogue)(如对话系统可以根据用户所说的进行恢复),语义解析(semantic parsing) (如从一系列类似于逻辑或SQL的语义表示去映射出句子),以及一些其它应用。
我们将在11.2节讲解这个算法,然后再后续小节中介绍这类模型的重要组件 定向搜索编码(beam search decoding),然后我们会讨论机器翻译如何被评估,包括非常流行的BLEU矩阵。
但是首先,在下一小节,我们将从总结机器翻译的语言背景开始:当思考翻译任务时,语言之间的关键差异是必须要考虑的因素。
11.1 语言差异与类型学 (Language Divergences and Typology)
尽管人类的语言看起来是 全球化的(universal) ,不同的语言在很多方面也是有差异的。理解这种 翻译差异(translation divergences) 将会帮助我们建立更好的机器翻译模型。我们经常区分 异质化(idiosyncratic) 和词汇差异:我们必须处理单词之间的差异(如 dog 这个词在不同的语言中表示的含义很可能不同);我们也要以一种普遍的方式处理系统化差异(如许多语言会将动词放在主语之前,而有的放在后面)。研究不同语言间的系统化相似性和差异也被称为 语言类型学(linguistic typology)。
11.1.1 词序类型 (Word Order Typology)
不同语言的单词语序是不一样的。举例来说,德语、法语、英语和普通话都是使用 主语-动词-宾语 SVO (Subject-Verb-Object) 结构;而北印度语和日文使用 SOV 结构;爱尔兰语和阿拉伯语使用 VSO 结构。两种使用同等基础单词语序类型的语言也会在其它方面有相似之处。比如 VO 语言通常有 介词(prepositions),而 OV 语言通常有 后置介词(postpositions)。
下图是英文,德文和普通话的例子,(a)上与(b)下是英文,(a)下式德文,(b)上是普通话:
11.1.2 词意差异 (Lexical Divergences)
同一个词在不同语境中的意思可能是不一样的。在有些语言中,语法的限制也会影响我们对一个词的选择。翻译过程中,由于单词会属于不同的概念空间,因此会出现一对多或者多对多的情况。此外, 词语间隙(lexical gap) 也是一个问题,即没有两个单词表达的意思是完全一致的。
11.1.3 形态类型学 (Morphological Typology)
从形态上看(Morphologically) ,语言的特征通常表现为两个维度的差异。第一个是每个单词的语素(morphemes)数量,从 独立(isolating) 的语言,如越南语和粤语,每个单词通常有一个语素,到多语素(polysynthetic) 语言,如西伯利亚尤皮克语(“爱斯基摩语”),一个单词可能有很多语素,相当于英语的整个句子。第二个维度是词素的可分割程度,从 聚合(agglutinative) 的语言,像土耳其语,其语素的相对边界是清晰的,融合(fusion) 语言,像俄罗斯语,一个词缀可以融合多个语素。
11.1.4 引用密度
最后,语言在与他们常常会忽略的事物相关的类型维度上会有变化。有些语言,比如英语,会要求我们在语言中在给定的指示物前使用显式代词。而在其它语言中,有时候会省略所有的代词,如西班牙语。
可以忽略代词的语言成为 代词省略(pro-drop) 语言,如日文,中文和西班牙文。这种跨语言的维度变化被称作引用密度的维度。我们说那些倾向于使用更多代词的语言是引用密度更大的。
引用稀疏的语言,如汉语或日语,要求听者做更多的推理工作来恢复前语,也称为冷语言。那些更明确、更容易让听者理解的语言被称为热语言。
11.2 编码-解码模型 (Encoder-Decoder Model)
Encoder-decoder 网络,或者叫做 sequence-to-sequence 网络,是一个能够生成文本化的任意长度的输出序列的模型。这样的网络的核心思想是使用一个 encoder 网络去接收输入序列然后去文本化表示它,这种表示也被称作上下文 context 。这样的表示会接着被传到 decoder 中,用来生成一个与任务相关的输出序列。下图是一个模型框架:
Encoder-decoder网络包括如下三个部分:
- 一个接受输入序列的编码器 encoder, x 1 n x_1^n x1n,它可以生成一个文本化表示的相关序列, h 1 n h_1^n h1n。LSTMs,GRUs,卷积网络和Transformer都可以被用来做编码器。
- 一个上下文向量 context vector, c c c,是 h 1 n h_1^n h1n 的一个方程,它携带需要传入到解码器的重要信息。
- 一个 解码器 decoder,它可以接收 c c c ,然后生成任意长度的隐藏状态 h 1 m h_1^m h1m 序列,然后我们就可以从中得到一个相关的输出状态序列 y 1 m y_1^m y1m。
11.3 编码-解码器与RNN (Encoder-Decoder with RNNs)
在第九章中,我们学习了条件RNN语言模型,一个序列 y y y 的概率可以被拆分为如下形式:
p ( y ) = p ( y 1 ) p ( y 2 ∣ y 1 ) p ( y 3 ∣ y 1 , y 2 ) … P ( y m ∣ y 1 , … , y m − 1 ) p(y)=p\left(y_{1}\right) p\left(y_{2} \mid y_{1}\right) p\left(y_{3} \mid y_{1}, y_{2}\right) \ldots P\left(y_{m} \mid y_{1}, \ldots, y_{m-1}\right) p(y)=p(y1)p(y2∣y1)p(y3∣y1,y2)…P(ym∣y1,…,ym−1)
设 g g g 为如 tanh 或 ReLU 的激活函数,设 f f f 为softmax 函数,则有:
h t = g ( h t − 1 , x t ) y t = f ( h t ) \begin{array}{l} h_{t}=g\left(h_{t-1}, x_{t}\right) \\ y_{t}=f\left(h_{t}\right) \end{array} ht=g(ht−1,xt)yt=f(ht)
我们只需要做一个小改变就可以将这种语言模型与自回归一代变成一个翻译模型,可以从源文本在一种语言翻译到目标文本在第二个:添加一个句子分离标记源文本的末尾,然后将目标文本与其结合起来。
如果加你个 x x x 设为源文本,将 y y y 设为目标文本,那么我们就需要计算概率 p ( y ∣ x ) p(y \mid x) p(y∣x):
p ( y ∣ x ) = p ( y 1 ∣ x ) p ( y 2 ∣ y 1 , x ) p ( y 3 ∣ y 1 , y 2 , x ) … P ( y m ∣ y 1 , … , y m − 1 , x ) p(y \mid x)=p\left(y_{1} \mid x\right) p\left(y_{2} \mid y_{1}, x\right) p\left(y_{3} \mid y_{1}, y_{2}, x\right) \ldots P\left(y_{m} \mid y_{1}, \ldots, y_{m-1}, x\right) p(y∣x)=p(y1∣x)p(y2∣y1,x)p(y3∣y1,y2,x)…P(ym∣y1,…,ym−1,x)
下图是一个 attention 机制(将在下一小节介绍)的一个编码解码模型:
上图展示了以英文文本为源文本,以西班牙文为目标文本,以 <s> 为句子分隔的翻译模型。为了翻译源文本,我们通过网络运行它,执行正向推理,生成隐藏状态,直到我们到达源文本的末尾。然后我们开始自动递减生成,从源输入的末尾和句子结束标记处请求隐含层上下文中的一个单词。后续的单词以前一个隐藏状态和上一个生成的单词嵌入为条件生成。
让我们在下图中更加形式化和一般化我们的模型。(使用上标 e e e 和 d d d 来区分Encoder的隐藏层和Decoder的隐藏层。)下图左侧部分是 encoder,其处理了一个输入 x x x。尽管这个图仅仅展示了一个encoder的简单网络层,但是这种堆叠结构是一种标准范式,这种结构将堆叠的最顶层输出作为最终的文本表示。一种更常用的编码器是使用堆叠的双向LSTM(biLSTMs),如第九章所述,其将来自前向和后向传递的顶层隐藏状态连接起来,为每个时间步骤提供上下文化的表示。
整个encoder的目的是生成一个输入的上下文化的表示。这样的表示在encoder的最后一个隐藏层 h n e h_n^e hne 中呈现。这个表示,也叫 上下文(context) c c c,被传入解码器(decoder)。
Decoder 网络在上图右侧展示,其获取到上文描述的表示,然后使用它进行decoder的第一个隐藏层状态的初始化。即,decoder的第一个RNN单元使用 c c c 作为其上一个隐含层状态 h 0 d h_0^d h0d。
解码器自回归地生成一系列输出,每一次生成一个元素,直到生成序列结束的标记。每一个隐藏层状态都是以签一个隐藏层状态和上一个状态的输出为条件。
上述过程的一个缺点正如之前提到的,上下文向量 c c c 的影响会随着输出序列的产生而衰退。一个解决方案是在解码过程中的每一步都加入上下文向量 c c c,使其作为当前隐藏层状态的一个输入参数。具体实现方式见下图:
我们通过如下公式实现这一点:
h t d = g ( y ^ t − 1 , h t − 1 d , c ) h_{t}^{d}=g\left(\hat{y}_{t-1}, h_{t-1}^{d}, c\right) htd=g(y^t−1,ht−1d,c)
这样,我们就有了如下解码器的基本公式。注意,下面的 g g g RNN 模型的某种替代品,并且 y ^ t − 1 \hat{y}_{t-1} y^t−1 是在前一个时间步经过softmax取样之后的输出的嵌入。具体公式如下:
c = h n e h 0 d = c h t d = g ( y ^ t − 1 , h t − 1 d , c ) z t = f ( h t d ) y t = softmax ( z t ) \begin{aligned} c &=h_{n}^{e} \\ h_{0}^{d} &=c \\ h_{t}^{d} &=g\left(\hat{y}_{t-1}, h_{t-1}^{d}, c\right) \\ z_{t} &=f\left(h_{t}^{d}\right) \\ y_{t} &=\operatorname{softmax}\left(z_{t}\right) \end{aligned} ch0dhtdztyt=hne=c=g(y^t−1,ht−1d,c)=f(htd)=softmax(zt)
最后,就像之前所展示的,在每一个时间步的输出 y y y 都包含一个在可能的输出中的softmax计算。我们通过argmax函数在softmax输出上的计算来得到我们最可能的输出:
y ^ t = argmax w ∈ V P ( w ∣ x , y 1 … y t − 1 ) \hat{y}_{t}=\operatorname{argmax}_{\mathrm{w} \in \mathrm{V}} P\left(w \mid x, y_{1} \ldots y_{t-1}\right) y^t=argmaxw∈VP(w∣x,y1…yt−1)
还有很多其它的办法可以让模型更强。距离来说,我们可以通过调节输出层 y y y ,让模型追踪下面三个输出:在隐藏层状态 h t d h_t^d htd 上,在上下文 c c c 上,以及在前一时间步的输出 y t − 1 y_{t-1} yt−1 上的已经生成和还未生成的输出:
y t = softmax ( y ^ t − 1 , z t , c ) y_{t}=\operatorname{softmax}\left(\hat{y}_{t-1}, z_{t}, c\right) yt=softmax(y^t−1,zt,c)
11.3.1 训练编码-解码模型 (Training the Encoder-Decoder Model)
编码-解码结构通过端到端(end-to-end)的方式进行训练,就像我们在第九章中在RNN语言模型中看到的一样。每一个训练例子是一个字符串对的元组,包括源文本和目标文本。
对于机器翻译来说,训练数据包含句子和他们的翻译的集合。一旦我们有了训练集,训练就会像以RNN为基础的语言模型一样进行。网络会首先被基于一个源文本,然后从分隔字符开始进行自回归地训练,去预测下一个单词。如下图所示:
解码器在推理过程中使用自己的输出 y y y 作为下一次时间步 x t + 1 x_{t+1} xt+1 的输入。因此,当解码器不断生成更多的输出时,它会越来越偏离目标句子。因此,在训练中,在解码器中使用教师强迫(teacher forcing) 更为常见。这意味着我们强制系统使用来自训练的目标单词作为下一个输入 x t + 1 x_{t+1} xt+1 ,而不是允许它依赖(可能是错误的)解码器输出 y ^ t \hat{y}_{t} y^t 。这样可以加快训练速度。
11.4 注意力 (Attention)
在上述描述的编码-解码器中,解码器的输入是编码器的最后一个隐藏层的输出,只有这一个文本向量 h n h_n hn,我们也将其称为瓶颈(bottleneck),它必须包含源文本的所有信息,但是这对于长句子来说是比较困难的。上述的图像表示见下图:
**注意力机制(attention mechanism)**是解决瓶颈问题的一个方式,其允许解码器从编码器的任意隐藏状态中获取信息,并不只是最后一个隐藏状态。
在注意力机制中,像在普通的编码器解码器模型中一样,上下文向量是一个单独的向量 c c c,其实编码器隐藏状态的一个函数,即 c = f ( h 1 n ) c=f\left(h_{1}^{n}\right) c=f(h1n)。因为编码器的隐藏层数量是变化的,我们不能使用一个完整的编码器隐藏状态向量的张量去作为一个解码器的上下文向量。因此注意力的想法是通过对所有的编码器的隐藏层状态进行加权求和而产生一个固定长度的向量 c c c。
这个权重可以去关注与解码器当前产生的单词相关的源文本的特定部分。因此,通过注意力机制产生的上下文向量是动态的,每一个在解码过过程中的单词都是不一样的。
我们通过下式实现对于每一个解码器,都加入不同的上下文向量 c i c_i ci :
h i d = g ( y ^ i − 1 , h i − 1 d , c i ) h_{i}^{d}=g\left(\hat{y}_{i-1}, h_{i-1}^{d}, c_{i}\right) hid=g(y^i−1,hi−1d,ci)
结构如下图:
计算 c i c_i ci 的第一步是计算需要关注每一个编码器多少程度,即每一个编码器状态跟 h i − 1 d h_{i-1}^d hi−1d (注意这里的下标是 i − 1 i-1 i−1)的解码器状态有多么的相关。我们通过 点乘注意力(dot-product attention) 将相关性近似为相似性,即衡量隐藏层状态有多相似于一个编码器隐藏状态:
score ( h i − 1 d , h j e ) = h i − 1 d ⋅ h j e \operatorname{score}\left(h_{i-1}^{d}, h_{j}^{e}\right)=h_{i-1}^{d} \cdot h_{j}^{e} score(hi−1d,hje)=hi−1d⋅hje
我们通过softmax函数的方式计算每一个编码器对解码器的权重:
α i j = softmax ( score ( h i − 1 d , h j e ) ∀ j ∈ e ) = exp ( score ( h i − 1 d , h j e ) ∑ k exp ( score ( h i − 1 d , h k e ) ) \begin{aligned} \alpha_{i j} &=\operatorname{softmax}\left(\operatorname{score}\left(h_{i-1}^{d}, h_{j}^{e}\right) \forall j \in e\right) \\ &=\frac{\exp \left(\operatorname{score}\left(h_{i-1}^{d}, h_{j}^{e}\right)\right.}{\sum_{k} \exp \left(\operatorname{score}\left(h_{i-1}^{d}, h_{k}^{e}\right)\right)} \end{aligned} αij=softmax(score(hi−1d,hje)∀j∈e)=∑kexp(score(hi−1d,hke))exp(score(hi−1d,hje)
由此,输入到解码器隐藏层 j j j 的上下文向量 c i c_i ci 为:
c i = ∑ j α i j h j e c_{i}=\sum_{j} \alpha_{i j} h_{j}^{e} ci=j∑αijhje
下图展示了一个上述attention结构:
当然,也可以在注意力模型中用更复杂的打分函数。如加入一个参数矩阵:
score ( h i − 1 d , h j e ) = h t − 1 d W s h j e \operatorname{score}\left(h_{i-1}^{d}, h_{j}^{e}\right)=h_{t-1}^{d} W_{s} h_{j}^{e} score(hi−1d,hje)=ht−1dWshje
矩阵 W s W_{s} Ws 会在整个模型训练过程中被训练,其是的这个网络有能力学习在解码器和编码器状态之间哪一个相似的方面对于当前的应用是重要的。这样的二元线性模型也允许解码器和编码器使用不同维度的向量,然而简单的点乘注意力机制必须要求他们两个具有同样的维度。
11.5 定向搜索 (Beam Search)
回顾解码算法,在解码的每一个时间步中,输出的 y t y_t yt 均由softmax函数得到,即:
y ^ t = argmax w ∈ V P ( w ∣ x , y 1 … y t − 1 ) \hat{y}_{t}=\operatorname{argmax}_{\mathrm{w} \in \mathrm{V}} P\left(w \mid x, y_{1} \ldots y_{t-1}\right) y^t=argmaxw∈VP(w∣x,y1…yt−1)
在每一个时间步选择最大可能的单词来生成,这样的算法叫做 贪婪(greedy) 解码算法;该算法每一次都选择一个局部最优解,并不关心最终是否生成的是最优秀的选择。因为这样的一种选择方式,并不能保证最终的结果是全局最优的。
比如在下图中我们看到,最优的选择应该是:”start OK OK </S>“。但是,如果按照贪婪算法,我们并不能得到这个结果,因为第一步我们会选择 ”yes“ 而不是 ”OK“。
当然,我们可以使用穷举法来找到全局最优解,但是这样太耗费时间和资源了。因此,在机器翻译和其它的序列生成的解码问题中,通常会使用一种叫做 **定向搜索(beam search)**的算法。在定向搜索算法中,并不是在每个时间步生成当前最好的词,而是会生成 k k k 个可能的词。这个固定大小的内存占用面积 k k k 被称作 波束宽度(beam width),就像手电筒的光束一样,可以参数化光束的宽度。
我们将每 k k k 个输出称作 假设(hypotheses),它们是搜索的前边界。一个假设是一个伴随着概率的输出的序列,即到目前为止的翻译。
每一步,我们都会计算 k ∗ V k*V k∗V 个假设的分数 P ( y i ∣ x , y < i ) P\left(y_{i} \mid x, y_{<i}\right) P(yi∣x,y<i),即当前词语选择的概率乘上之前路径的概率。计算完之后我们剪枝到 k k k 个假设,再进行下一步decoder。下展示了波束宽度为2的情形:
上述过程会一直持续到出现 </s> 符号,其意味着句子的结束。这时候会将 k k k 更新为 k − 1 k-1 k−1,即减掉一个宽度,然后继续搜寻,直到 k = 0 k=0 k=0。
每一个输出 y y y 的分数为:
score ( y ) = log P ( y ∣ x ) = log ( P ( y 1 ∣ x ) P ( y 2 ∣ y 1 , x ) P ( y 3 ∣ y 1 , y 2 , x ) … P ( y t ∣ y 1 , … , y t − 1 , x ) ) = ∑ i = 1 t log P ( y i ∣ y 1 , … , y i − 1 , x ) \begin{aligned} \operatorname{score}(y) &=\log P(y \mid x) \\ &=\log \left(P\left(y_{1} \mid x\right) P\left(y_{2} \mid y_{1}, x\right) P\left(y_{3} \mid y_{1}, y_{2}, x\right) \ldots P\left(y_{t} \mid y_{1}, \ldots, y_{t-1}, x\right)\right) \\ &=\sum_{i=1}^{t} \log P\left(y_{i} \mid y_{1}, \ldots, y_{i-1}, x\right) \end{aligned} score(y)=logP(y∣x)=log(P(y1∣x)P(y2∣y1,x)P(y3∣y1,y2,x)…P(yt∣y1,…,yt−1,x))=i=1∑tlogP(yi∣y1,…,yi−1,x)
下图展示了上述算法:
但我们会发现,最终产生的k个句子是长度不一的,如果用上述算法计算分数,算法会倾向于选择长度更短的句子。因此,我们会除以一个句子长度来进行标准化:
score ( y ) = − log P ( y ∣ x ) = 1 T ∑ i = 1 t − log P ( y i ∣ y 1 , … , y i − 1 , x ) \operatorname{score}(y)=-\log P(y \mid x)=\frac{1}{T} \sum_{i=1}^{t}-\log P\left(y_{i} \mid y_{1}, \ldots, y_{i-1}, x\right) score(y)=−logP(y∣x)=T1i=1∑t−logP(yi∣y1,…,yi−1,x)
定向搜索是在大样本机器翻译系统中常用的算法,通常将束波宽度 k k k 设为5或10。
下图展示了定向搜索解码的具体算法:
11.6 编码器-解码器与Transformer (Encoder-Decoder with Transformer)
原书尚未完成。
11.7 构建机器翻译系统的一些实操细节 (Some practical details on building MT systems)
11.7.1 词语切分 (Tokenization)
机器翻译系统经常使用一个固定的词表,这个词表通常是用 BPE 或者 wordpiece 算法来生成的(详情见第二章)。通常,源语言和目标语言使用共享词汇表,这使得将标记(如名称)从源语言复制到目标语言很容易,因此我们在包含源语言和目标语言数据的语料库上构建 wordpiece / BPE 词汇表。单词在每个标记的开头使用一个特殊的符号;以下是来自谷歌MT系统的结果标记化。如下图:
下面展示一些wordpiece算法的细节,其被给定一个训练预料库和一个期望词表大小,然后执行下面的过程:
- 用字符初始化wordpiece词典(例如unicode字符的子集,将所有剩余字符折叠为一个特殊的未知字符标记)。
- 重复直到有 V 个wordpieces:
- 在训练集上使用当前的wordpiece集训练一个n-gram语言模型。
- 考虑通过连接来自当前词典的两个词块生成的一组可能的新词块。选择最能增加训练语料库语言模型概率的新词。
通常使用8K到32K的词表。
11.7.2 机器翻译语料库 (MT corpora)
机器翻译模型是在 平行语料库(parallel corpus) (有时称为 bitext)上进行训练的,这种文本以两种(或更多)语言出现。
句子对其 (Sentence alignment)
机器翻译的标准训练语料库是成对对齐的句子。在创建新的语料库时,例如针对资源不足的语言或新的领域,必须创建这些语义对齐。下图给出了一个假设的句子排列示例。
给定两个互相翻译的文档,我们通常使用下面两个步骤创建句子对其:
- 一个损失函数,其获取一段源句子和一段目标句子,并返回一个分数,衡量这些句子被翻译的可能性有多大。
- 一种对齐算法,利用这些分数来找到文档之间的良好对齐。
因为可以诱导多语言句子嵌入,这种嵌入的余弦相似度提供了一个自然的评分函数。有学者提分别从源文档和目标文档给出了以下两个句子 x x x, y y y 之间的损失函数:
c ( x , y ) = 1 − cos ( x , y ) ) nSents ( x ) nSents ( y ) ∑ s = 1 S 1 − cos ( x , y s ) + ∑ s = 1 S 1 − cos ( x s , y ) c(x, y)=\frac{1-\cos (x, y)) \operatorname{nSents}(x) \operatorname{nSents}(y)}{\sum_{s=1}^{S} 1-\cos \left(x, y_{s}\right)+\sum_{s=1}^{S} 1-\cos \left(x_{s}, y\right)} c(x,y)=∑s=1S1−cos(x,ys)+∑s=1S1−cos(xs,y)1−cos(x,y))nSents(x)nSents(y)
其中, nSents \operatorname{nSents} nSents 给出了句子的数量(这将使度量偏向于单个句子的许多对齐,而不是对齐非常大的范围)。
分母有助于标准化相似性,所以 x 1 , … , x S , y 1 , … , y S x_{1}, \ldots, x_{S}, y_{1}, \ldots, y_{S} x1,…,xS,y1,…,yS 是从相应的文档中随机抽取的句子。
通常动态规划会在这种算法中使用。
最后,通过移除噪音句子对是一种有效地清晰一些预料库的方法。
11.7.3 回译 (Backtranslation)
回译(back translation) ,也叫反向翻译,是利用目标语言中的单语语料库,生成合成bittext的一种方法。在反向翻译中,我们在小bitext上训练一个中间目标到源的翻译系统,将单语目标数据翻译成源语言。
反向翻译有各种参数。一是我们如何生成反向翻译数据;我们可以在贪婪推理中运行解码器,也可以使用波束搜索。或者我们可以做抽样,或者 蒙特卡罗搜索(Monte Carlo search)。在蒙特卡罗解码中,在每个时间步,我们并不总是生成softmax概率最大的单词,而是掷一个加权的骰子,根据它的softmax概率来选择下一个单词。这就像我们在第三章中看到的抽样算法一样,从n-gram语言模型中生成随机句子。假设只有4个单词,t时刻的softmax概率分布为(the: 0.6, green: 0.2, a: 0.1, witch: 0.1)。我们掷一个加权的骰子,4个边的权重分别为0.6、0.2、0.1和0.1,然后根据出现的边选择单词。另一个参数是反向翻译数据与自然bitext数据的比率;我们可以选择对bitext数据进行上采样(包括每个句子的多个副本)。
11.8 机器翻译评价 (MT Evaluation)
机器翻译可以从两个维度上评价:充分性(adequacy) 和 流畅性(fluency)。
- 充分性:译文对源句子的准确理解程度如何。有时称为 诚信度(faithfulness) 或 忠诚度(fidelity)。
- 流畅性:翻译目标语言的流利程度(语法、清晰、易读、自然)。
11.8.1 使用人工评分人员评价机器翻译 (Using Human Raters to Evaluate MT)
可以让读者对翻译的句子进行打分;也可以准备很多个翻译的句子,让人工选择自己更倾向于哪一个。
11.8.2 自动评价:BLEU (Automatic Evaluation: BLEU)
最流行的机器翻译自动度量被称为 BLEU (双语评估替补)。BLEU(连同许多替代指标,例如,NIST , TER ,精度和召回(precision and recall) ,和 METEOR )是基于一个简单的直觉:一个好的机器翻译会包含单词和短语,这些单词和短语会出现在同一个句子的人工翻译之中。
考虑一个来自平行语料库的测试集,其中每个源句子都有一个人工目标翻译和一个我们想要评估的候选机器翻译。BLEU度量法根据人工翻译中和机器翻译的n-gram重叠的的数量对每个机器翻译句子进行排名。
下图展示了上段的思想:
虽然上图只显示了一个句子,但BLEU实际上不是一个句子的得分;而是对整个候选翻译句子的预料库的整体评分。更正式地说,候选翻译句子的语料库的BLEU分数,是 所有结合了在整体预料库上计算的惩罚函数 的句子的 n-gram精度(n-gram precision)。
那么什么是 n-gram 精度?考虑一个由单个句子组成的语料库。这个语料库的unigram精度是候选翻译中出现在参考翻译中的unigram标记的百分比,对于bigrams也是如此,最高可达4-gram。图11.16中的候选1有19个唯一的unigrams,其中一些unigrams出现多次,总共有26个单词。其中,16个独特的unigrams,总共23个单词,也出现在参考翻译中(3个没有出现:voice,deposit和actions)。因此候选1语料库的unigram精度为23/26 = .88。
我们将这种unigram度量扩展到由许多句子组成的完整语料库,如下所示。对于分子,我们将参考译文中出现的所有unigram类型对每个句子的计数相加,然后将所有句子的计数相加。分母是所有候选句子中所有unigrams的总数。我们计算unigrams、bigrams、trigrams和4-grams的n-gram精度。因此,整个候选句语料库的n-gram精度 p r e c n prec_n precn为:
prec n = ∑ C ∈ { C a n d i d a t e s } ∑ n-gram ∈ C Count match ( n-gram ) ∑ C ′ ∈ { C a n d i d a t e s } ∑ n-gram ′ ∈ C ′ Count ( n-gram ′ ) (11.23) \text{prec}_n = \frac{\sum_{C \in \{Candidates\}} \sum_{\textit{n-gram} \in C} \text{Count}_{\text{match}}(\textit{n-gram})}{\sum_{C' \in \{Candidates\}} \sum_{\textit{n-gram}' \in C'} \text{Count}(\textit{n-gram}')} \tag{11.23} precn=∑C′∈{Candidates}∑n-gram′∈C′Count(n-gram′)∑C∈{Candidates}∑n-gram∈CCountmatch(n-gram)(11.23)
BLEU 通过计算几何平均值结合了四个 n-gram 精度。
另外,BLEU 还会惩罚过短的翻译。如果一个翻译的句子是 ”for the“,我们可以看到,其总共有3个 n-gram,它的 p r e c n prec_n precn 将会是1!这并不是我们想要的。
因此,BLUE选择了如下方式进行改良:在整个语料库中增加一个简短惩罚,惩罚产生平均比参考译文短的翻译系统。设 sys_len 为所有候选翻译句长度之和,ref_len 为所有参考翻译句长度之和。如果候选翻译比引用短,我们分配一个简短惩罚BP,这是它们的比率的函数:
B P = min ( 1 , exp ( 1 − ref-len sys-len ) ) B L E U = B P × ( ∏ n = 1 4 prec n ) 1 4 \begin{aligned} \mathrm{BP} &=\min \left(1, \exp \left(1-\frac{\text {ref-len}}{\text { sys-len }}\right)\right) \\ \mathrm{BLEU} &=\mathrm{BP} \times\left(\prod_{n=1}^{4} \operatorname{prec}_{n}\right)^{\frac{1}{4}} \end{aligned} BPBLEU=min(1,exp(1− sys-len ref-len))=BP×(n=1∏4precn)41
BLEU 的高级细节(Advanced details of BLEU)
上述描述在很多方面进行了简化。实际上,BLEU 使用了n-gram 精度的一个简单变体。公式 11.23 有一个缺点,那就是其会鼓励那些有过多重复单词的候选翻译。下图的候选翻译说明了这个情况,其最终的unigram精度是 7/7!
为了避免这个问题,BLEU使用了 修改的n-gram精度(modified n-gram precision) 度量。我们首先计算一个单词在单个参考译文中使用的最大次数。然后,每个候选单词的计数被这个最大引用计数剪除,这意味着分子不会超过这个单词在参考译文中出现的最大次数。因此,在图11.17的例子中,修正后的unigram精度为2/7,因为参考文献1最大有2个thes。
为了计算在整个测试集的得分,BLEU 首先计算每个句子的 N-gram 匹配,然后对所有候选句子的修剪计数进行加总,然后除以测试集的所有候选翻译的N-grams总数。如果我们定义的函数 C o u n t m a t c h − c l i p p e d Count_{match-clipped} Countmatch−clipped ,其表示“所有匹配参考译文的修剪n-gram计数“,那么BLEU 真正使用的整个语料库的候选句子的真正 p r e c n prec_n precn为:
prec n = ∑ C ∈ { C a n d i d a t e s } ∑ n-gram ∈ C Count match-clipped ( n-gram ) ∑ C ′ ∈ { C a n d i d a t e s } ∑ n-gram ′ ∈ C ′ Count ( n-gram ′ ) (11.26) \text{prec}_n = \frac{\sum_{C \in \{Candidates\}} \sum_{\textit{n-gram} \in C} \text{Count}_{\text{match-clipped}}(\textit{n-gram})}{\sum_{C' \in \{Candidates\}} \sum_{\textit{n-gram}' \in C'} \text{Count}(\textit{n-gram}')} \tag{11.26} precn=∑C′∈{Candidates}∑n-gram′∈C′Count(n-gram′)∑C∈{Candidates}∑n-gram∈CCountmatch-clipped(n-gram)(11.26)
如果我们对一个源句子有多个人工参考翻译,BLEU也可以很好地工作。事实上,BLEU在这种情况下工作得更好,因为源句子可以以多种方式合法地翻译,因此n-gram的精度将更加健壮。我们只匹配n-gram,如果它出现在任何引用中。对于简短惩罚,我们为每个候选句子选择长度最接近的参考句子来计算ref len。但在实践中,大多数翻译语料库只有一个人翻译来进行比较。
最后,实现BLEU需要对平滑和标记化的许多细节进行标准化;因此,建议使用标准实现,如SACREBLEU (Post, 2018),而不是尝试从头实现BLEU。
BLEU的统计显著性测试 (Statistical Significance Testing for BLEU)
为了研究 BLEU 分数是否能够统计显著地反应两个翻译系统的不同,我们使用配对 bootstrap 测试,或类似的随机化测试。
为了利用 bootstrap 测试得到一个在单一 BLEU 分数的置信区间,我们通过反复放回抽样从原始测试集中得到测试集(或devset)和并且创造数千个 pseudo-testsets。我们现在计算每个 pseudo-testsets 的 BLEU 分数。如果把前2.5%和后2.5%的分数都去掉,剩下的分数将得到系统中blue分数的95%置信区间。
为了比较两个MT系统A和B,我们绘制了同一组伪测试集,并计算每个伪测试集的BLEU分数。然后我们计算A的BLEU分数高于B的伪测试集的百分比。
BLEU的限制 (BLEU: Limitations)
虽然像BLEU这样的自动指标很有用,但它们有重要的局限性。BLEU是非常局部的:一个大的短语被移来移去可能根本不会改变BLEU的分数,而且BLEU不能评估一个文档的跨句子属性——比如它的语篇连贯性(第22章)。BLEU和类似的自动度量方法在比较非常不同类型的系统时也做得很差,例如比较人工辅助翻译和机器翻译,或者不同的机器翻译架构之间的比较(Callison-Burch等人,2006)。当评估单个系统的变更时,这种自动的度量可能是最合适的。
11.8.3 自动评价:基于嵌入的方法 (Automatic Evaluation: Embedding-Based Methods)
BLEU度量是基于测量人类参考和候选机器翻译有共同之处的确切单词或n-gram。然而,这一标准过于严格,因为好的翻译可能会使用替换词或释义。在METEOR (Banerjee和Lavie, 2005)等早期指标中率先提出的一个解决方案是允许同义词在参考 x x x 和候选 x ~ x̃ x~ 之间匹配。最近的度量使用BERT或其他嵌入来实现这种思想。
例如,在某些情况下,我们的数据集可能需要人工评估翻译质量。这样的数据集包括一个元组 ( x , x ~ , r ) (x, \tilde{x}, r) (x,x~,r),其中 x = ( x 1 , … , x n ) x=\left(x_{1}, \ldots, x_{n}\right) x=(x1,…,xn) 是参考译文, x ~ = ( x ~ 1 , … , x ~ m ) \tilde{\boldsymbol{x}}=\left(\tilde{x}_{1}, \ldots, \tilde{x}_{m}\right) x~=(x~1,…,x~m) 是机器翻译候选译文,以及 r ∈ R r \in \mathbb{R} r∈R 是人工对 x ~ \tilde{x} x~ 关于 x x x 翻译质量的评分。给定这些数据,算法如BLEURT (Sellam et al ., 2020) 会训练一个在人工标注的数据集上的预测,通过将 x x x 和 x ~ \tilde{x} x~ 传入BERT(通过额外的预训练集进行训练,然后通过微调适应人工标注的句子),紧随其后的是一个线性层训练预测 r r r。这样的模型与人类的输出标签高度相关。
然而,在其他情况下,我们没有这样的人类标记数据集。在这种情况下,我们可以通过他们的嵌入的相似性,来衡量 x x x 和 x ~ \tilde{x} x~ 的相似性。BERTscore算法就是这样做的,设 x x x 和 x ~ \tilde{x} x~ 分别是参考译文和机器翻译候选译文的词嵌入,那么我们有:
R B E R T = 1 ∣ x ∣ ∑ x i ∈ x max x ~ j ∈ x ~ x i ⋅ x ~ j P B E R T = 1 ∣ x ~ ∣ ∑ x ~ j ∈ x ~ max x i ∈ x x i ⋅ x ~ j R_{\mathrm{BERT}}=\frac{1}{|x|} \sum_{x_{i} \in x} \max _{\tilde{x}_{j} \in \tilde{x}} x_{i} \cdot \tilde{x}_{j} \quad P_{\mathrm{BERT}}=\frac{1}{|\tilde{x}|} \sum_{\tilde{x}_{j} \in \tilde{x}} \max _{x_{i} \in x} x_{i} \cdot \tilde{x}_{j} RBERT=∣x∣1xi∈x∑x~j∈x~maxxi⋅x~jPBERT=∣x~∣1x~j∈x~∑xi∈xmaxxi⋅x~j
其中, R B E R T R_{\mathrm{BERT}} RBERT 是精度, P B E R T P_{\mathrm{BERT}} PBERT 是召回率。下图展示了这个过程:
11.9 偏见与伦理问题 (Bias and Ethical Issues)
机器翻译也会出现很多偏见与伦理问题。详情见原书章节。
11.10 总结 (Summary)
机器翻译(Machine translation) 是自然语言处理最广泛的应用之一,而最早为机器翻译开发的编码器-解码器模型(encoder-decoder model)是在自然语言处理中广泛应用的一个关键工具。
- 语言在结构和词汇上都有 差异(divergences),这使得翻译困难。
- 类型学(typology) 语言学领域研究这些差异;语言可以按照它们的位置沿着类型维度进行分类,比如动词是否在其对象之前。
- 编码器-解码器(Encoder-decoder) 网络包括一个 编码器(encoder) 网络,该网络接受一个输入序列并创建一个上下文化的表示,即上下文-文本。这个上下文表示之后被传递到一个 解码器(decoder),该解码器生成一个特定于任务的输出序列。
- 注意力机制(attention mechanism) 丰富了上下文向量,以允许解码器从编码器的所有隐藏状态查看信息,而不仅仅是最后的隐藏状态。
- 编码器-解码器架构可以通过 RNN 或 Transformers 实现。
- 对于解码器来说,选择一个最可能的单词在每一步生成被称为 贪婪(greedy) 解码。
- 在 定向搜索(beam search) 中,我们在每一步都保留k个可能的单词,而不是在每个时间步都选择最优的令牌来生成。这种固定大小的内存占用面积k称为 波束宽度(beam width) 。
- 机器翻译模型在 平行语料库(parallel corpus) 上进行训练,有时也称为 bitext ,一种出现在两种(或更多)语言中的文本。
- 反向翻译(backtranslation) 是一种利用目标语言中的单语语料库,通过运行一个试点机器翻译系统反向创建合成bitext的方法。
- 机器翻译的评估是通过衡量译文的 充分性(adequacy) (是否能很好地捕捉源语句子的意思)和 流利性(fluency) (在目标语言中流利程度或自然程度)。人工评价是黄金标准,但像 BLEU 这样的自动评价指标(它测量单词或n-gram与人工翻译的重叠),或基于嵌入相似性的更近期的指标,也很常用。