译文:统计机器翻译教程——正文一

原文 A Statistical MT Tutorial Workbook 由 Kevin Knight 于1999年完成。
原文及原作者链接:https://kevincrawfordknight.github.io/

本译文已获得原作者 Kevin Knight 的许可
我相信 阅读英语原文 是学习此内容的最佳方式

不知道这是啥?阅读本译文的前言

一、总体计划

我们想自动分析人类已存在的句子翻译语料,来建立通用的翻译规则。然后用这些规则来自动翻译新的内容!

我知道这本手册有点厚,但如果你花一天时间搞定它,你也会和其他人一样,了解统计机器翻译的绝大多数内容。

这本教程的基本内容是基于 Brown 等人于 1993 年通过期刊 Computational Linguistics 发表的文章 The Mathematics of Statistical Machine Translation。在这篇优秀的文章之上,我能做的仅仅是增加一些新的视角,然后,可能的话,为读者(你们什么都没做错)提供一些同情。

在整个教程中,重要的术语都会用 粗体 进行标注!(译者注:原文使用下划线进行标注)

二、基本的概率知识

我们认为,一个英语句子 e 可以被翻译成任意的一个法语句子 f。只不过一些翻译比另一些更好。这里是一些基本的符号,我们用这些符号来正式地表示“更好”:

  • P(e) — 先验概率(priori probability)。句子 e 发生的几率。比如,如果 e 是英语句子 “I like snakes”,那么 P(e) 就是某个人在某时刻可能说出 “I like snakes” 而不是说出其他句子的几率。
  • P(f|e) — 条件概率(conditional probability)。给定句子 e,句子 f 的几率。比如,如果 e 是英语句子 “ I like snakes“,如果 f 是法语句子 “maisson bleue”,那么 P(f|e) 就是翻译器把句子 e 翻译成句子 f 的几率。在这个例子中,完全不可能。
  • P(e, f) — 联合概率(joint probability)。e 和 f 同时发生的几率。如果 e 和 f 互不影响,我们可以写成 P(e,f) = P(e) * P(f)。比如,如果 e 代表 “the first roll of the die comes up 5”,如果 f 代表 “the second roll of the die comes up 3”,那么P(e,f) = P(e) ∗ P(f) = 1/6 * 1/6 = 1/36。如果 e 和 f 互相影响,则 P(e,f) = P(e) ∗ P(f|e)。意思是:“e 发生的几率”乘以“e 发生且 f 同时发生的几率”。如果 e 和 f 是互译的两串文本,那它们之间肯定是一定程度上相互影响的。

练习题:P(e,f) = P(f) ∗ ?

以上所有概率的值的范围都是 0 到 1 的闭区间。0.5 的概率意味着“有一半的几率”。

三、和与乘积

我们用以下方式来表示从 1 到 n 的整数之和:

《译文:统计机器翻译教程——正文一》

我们用以下方式来表示从 1 到 n 的整数之乘积:

《译文:统计机器翻译教程——正文一》

如果在求和过程中有因子,但它不依赖求和的元素,我们就可以把它放在外面:

《译文:统计机器翻译教程——正文一》

练习题:

《译文:统计机器翻译教程——正文一》

有时我们会对所有的句子 e 进行求和,以下是一些有用的概率公式:

《译文:统计机器翻译教程——正文一》

最后一个公式你可以这样读:“假设 f 是被一些其他事件影响的,那么对于每一个会影响 f 的事件 e,我们计算 e 发生的几率和 e 发生且 f 同时发生的几率。为了覆盖所有影响 f 的事件 e,我们把所有的几率加起来。”

四、统计机器翻译(Statistical Machine Translation)

对于一个法语句子 f,我们寻找一个英语句子 e,这个句子 e 的 P(e|f) 值是最大的(即最有可能的翻译)。有时我们这样写:

《译文:统计机器翻译教程——正文一》

argmax 可以这样读:“在所有的英语句子中,句子 e 的 P(e|f) 值是最大的”。如果你想用电脑程序的角度去思考它,你可以想象有这样一个程序,它接受一组句子 e 和 f,返回概率 P(e|f) 的值,稍后我们会看到这样的程序。

《译文:统计机器翻译教程——正文一》

或者,你也可以想象这样一个程序,它接受一个句子 f 作为输入,返回所有可能的句子 ei 以及它的 P(e|f) 值。这样的程序会需要更长的运行时间,即使你把英语句子的长度控制在一定范围。

《译文:统计机器翻译教程——正文一》

五、噪声信道(The Noisy Channel)

记住贝叶斯公式(Bayes Rule),这非常重要!

《译文:统计机器翻译教程——正文一》

练习题:通过第二节提供的练习题,来证明这个公式

通过贝叶斯公式,我们可以重写刚刚关于寻找最有可能的翻译的表达式:

《译文:统计机器翻译教程——正文一》

练习题:P(f) 去哪了?

这个公式的意思是,最有可能的翻译,是以下两个值的乘积的最大值:1. 某人说出句子 e 的几率,2. 如果他说出了句子 e,他会把句子 e 翻译成句子 f 的几率。

噪声信道的原理大概是这样:我们想象某人的脑海里有句子 e,但是在它被正式说出来之前,它被“噪声”影响,从而变成了句子 f。为了恢复到最有可能的句子 e,我们推断:1. 人们会用英语说哪些句子,2. 英语是如何转换成法语的。这俩有时被称为源模型(souce modeling)和信道模型(channel modeling)。人们用噪声信道来隐喻很多的工程问题,比如电话传播中的真实噪声。

如果你想从电脑程序的角度去思考 P(e),你可以想象有一个程序,它接受一个任意的英语句子 e,返回一个概率 P(e)。我们很快就会见到这样的程序。

《译文:统计机器翻译教程——正文一》

或者,你也可以认为有一个程序,它返回一个很长的列表,包含了所有的英语句子 ei 和它们的 P(ei)。

《译文:统计机器翻译教程——正文一》

对于 P(e|f),想象另一个程序,它接受一组句子 e 和 f,返回 P(e|f)。

《译文:统计机器翻译教程——正文一》

同理,也可以是一个程序,它接受一个句子 e,返回所有可能的句子 fi,以及对应的 P(e|fi)。

《译文:统计机器翻译教程——正文一》

以上最后的两个程序和第四节中的程序很类似,除了 P(f|e) 和 P(e|f) 不一样。

你可以把源(souce)信道(channel)放在一起,像这样:

《译文:统计机器翻译教程——正文一》

对于同一个法语句子 f,有很多的方法可以产生。每一个方法对应着一个对句子 e 的不同选择。注意,两个部分由右箭头连接,这被称为生成模型(generative model)因为这个理论(theory)是关于法语句子 f 是如何被生成的。这个理论的意思是,首先一个英语句子 e 被生成,然后它被转换成了法语句子。这理论有点古怪。

六、贝叶斯推理

即使箭头是向右指向的,我们其实会用这套理论来把法语翻译回英语。

把句子 f 当成一个犯罪现场。我们想推理这犯罪现场是怎么来的。我们的生成模型差不多是这样一个东西:某人 e 决定去犯罪,然后他真的犯罪了。所以我们推理这两点:1. 哪些人可能会决定去犯罪(这里的 P(e) 可以认为是动机和人的性格),2. 他们可能会怎样实施犯罪(这里的 P(f|e) 可以认为是交通工具和武器),通常这两点会冲突,某人可能有很好的动机但却没有实施的条件,某人可能很轻易的实施犯罪但却没有动机。

或者说,把句子 f 当成一组医学症状。很多的疾病都可能有这些症状。如果我们来建立生成模型,我们就可以推理出任意疾病 e 发生的概率和疾病 e 会显示出症状 f 的概率。这又是 P(e) 和 P(f|e) 了。它们可能冲突:一些疾病很常见但可能没有症状 f,一些疾病很罕见但可能总是有症状 f。这问题是不是很艰难?

由于生物学家大概知道疾病是如何产生症状的,也就是 P(f|e) ,所以建立这样的电脑模型是可能的。但要建立一个模型,通过症状推理得出疾病就没有那么容易,也就是 P(e|f)。并且,我们可能有一些关于 P(e) 的孤立信息,比如医院的早期记录。

七、翻译中的单词重排序

如果我们直接用 P(e|f) 去推理得到翻译,那我们最好很擅长概率估计。另一方面,如果我们用贝叶斯公式把整个过程拆分,理论上,我们就可以得出一个不错的翻译结果,即使概率值不高。

比如,假设我们当句子 f 中的单词能被翻译成句子 e 中的单词时,才给 P(f|e) 很高的值,那句子 f 中的单词可以是任意的顺序:我们并不care。对于英语是如何被转换成法语来说,这个模型并不准确。可能对于英语是如何被转换成烂法语来说,这个模型是准确的。

现在,我们说说 P(e)。假设我们当英语句子 e 拥有正确的语法的时候,才给 P(e) 很高的值,这倒是挺合理的,即使实现起来很困难。

当我们观察句子 f,并努力找一个英语翻译句子 e 的时候,一个有趣的事情发生了。每一个句子 e 都有它的 P(e) ∗ P(f|e)。因子 P(f|e) 会保证一个不错的英语句子 e 含有指定的单词,这些单词基本上都可以翻译成法语句子 f 中的单词。很多的句子 e 都会通过这个测试,比如,“the boy runs”通过,“runs boy the”也通过,一些句子的语法正确,另一些不正确。然而,因子 P(e) 会把那些语法不正确的句子的值降低。

实际上,P(e) 在操心单词的顺序,让 P(f|e)不用干这事儿。这样 P(f|e) 就可以更容易被建立。它只需要决定一堆英语单词是否能被翻译成一堆法语单词。这可以用一些双语词典完成。或者从算法的角度来说,这部分模块需要把一堆法语单词翻译成一堆英语单词,并且给这两堆单词一个分数。

练习题:把这些单词按顺序排列,“have programming a seen never I language better”,这个任务叫做词袋生成(bag generation)

练习题:把这些单词按顺序排列,“actual the hashing is since not collision-free usually the is less perfectly the of somewhat capacity table”。

练习题:你运用了什么知识来完成以上任务?你是否认为机器可以完成这些任务?你能否想出一种方式来评估机器的完成水平,不需要大量的人为检查?

练习题:把这些单词按顺序排列,loves John Mary”。

最后一道题挺难的。看起来,P(f|e) 还是需要知道一些关于单词顺序的东西。它不能仅仅是推荐一堆无序单词就完了。但它只需要懂一点点词序,不是全部。

八、翻译中的单词选择

在为法语单词选择英语翻译的时候,P(e) 也是有用的。比如,一个法语单词可以被翻译成 “in” 或者 “on”。那就会有两个有相同 P(f|e) 值的英语句子:1. she is in the end zone, 2. she is on the end zone。第一个句子比第二个句子要好,所以它会获得更好的 P(e) 值,最终获得更好的 P(e) * P(f|e) 值。记住,最有可能的翻译就是拥有最高 P(e) * P(f|e) 值的句子。

练习题:写一句外语句子(译者注:这里的外语指非英语),把单词重新排列,让他们看起来像是英语单词的顺序。用一个双语词典把所有单词的所有可能翻译(译者注:这里的翻译指非英语单词对应的英语单词)都找出来。每个词的翻译写在它的下面组成一列。把最上面的非英语单词全都擦掉。喊一个朋友(敌人也可以)通过每一列中选一个词的方式来构造一个英语句子。

九、语言模型

这些概率值从何而来?

稍后我们再操心 P(f|e)。首先,我们需要建立一个程序,来给每一个英语句子 e 提供一个 P(e) 值。这被称为语言模型(language model)

我们可以建立一个程序,它熟悉这个世界,知道人们喜欢谈论什么,知道人们会用怎样的语法结构去描述特定的事情和物件等等。我们可以在程序里输入大量的数字,然后进行相加,乘积什么的。

另一个想法简单点,仅仅把所有人说过的英语句子记录下来就好了。假设你有十亿句子的语料库。如果句子 “how’s it going?” 在这个库中出现了 76413 次,那 P(how’s it going?) = 76413/1000000000 = 0.000076413。我们可以用网络或者在线的华尔街日报,如果我们不想自己做大量的记录的话。

练习题:哪一个有更高的概率:”I like snakes” 和 “I hate snakes”。在 Google 中输入它们,然后找出来。(搜索的时候用英文问号?来保证在搜索结果里这些词是一起并按顺序出现的)

练习题:“I hate baby poisonous snakes” 的概率是多少?

一个很大的问题是,很多非常棒的句子会得到概率 0,因为我们从未见过它们。这很糟糕。一个优秀的 P(f|e) 模块可能会给出一堆不错的单词,比如 “hate snakes poisonous I baby”。但不管我们如何进行排序,P(e) 总是等于 0。这意味着,“hate snakes poisonous I baby” 会被认为成和 “I hate baby poisonous snakes.” 是一样的翻译。

人们似乎可以判断一堆单词是否是一个英语句子,而无需准备语料库。(你真的听说过句子 “I hate baby poisonous snakes”?你确定?)我们似乎可以把句子拆分为更小的部分,然后只要这些小部分是合理地结合在一起的,我们就说这堆单词是一个英语句子。

十、N-grams

对于计算机来说,把一串文本(string)拆分为小部分最简单的方式就是子串文本(substring)。一个包含n个单词的子串文本被称为一个 n-gram。如果 n = 2,我们称为 bigram(译者注:bigram 可被译为二元模型)。如果 n = 3,我们称为 trigram(译者注:trigram 可被译为三元模型)。如果 n = 1,书呆子们称为 unigram(译者注:unigram 可被译为一元模型),正常人称为单词

如果一串文本有很多合理的 n-grams,那么这串文本可能就是一个合理的句子。这不一定,但可能是。

让 b(y|x) 为 单词 y 紧跟随单词 x 的概率。我们可以通过在线语料来估计这个概率。直接用短语 “xy” 出现的次数除以单词 “x” 出现的次数。这被称为一个条件 bigram 概率(conditional bigram probability)。每一个 b(y|x) 被称为一个 参数(parameter)

一个常用的 n-gram 估计量(estimator)看起来是这样:

《译文:统计机器翻译教程——正文一》 译者注:number-of-occcurences 的意思是出现次数

因此,P(I hate baby poisonous snakes) 就约等于:

《译文:统计机器翻译教程——正文一》

换句话说,你会用单词 “I” 作为句子开头的几率是多少?如果你用“I”开头,那么你会紧接着用单词 “like” 的几率是多少?如果你用了 “like”,那么 “snakes” 作为下一个单词的几率是多少?按同样的逻辑继续。

事实上,关于第五节中的生成模型,有另外一种情况。这个模型认为,人们虽然不断说出一个个单词,但除了最后一个词,人们啥都不记得了。这模型太疯狂了吧。这被称为一个 bigram 语言模型(bigram language model)。如果我们允许,也可以认为人们会记住最后的两个单词。这被称为一个 trigram 语言模型(trigram language model):

《译文:统计机器翻译教程——正文一》
《译文:统计机器翻译教程——正文一》

十一、平滑(Smoothing)

N-gram 模型不会把从未出现过的句子认为是概率 0。这是好事,正如 Martha Stewart 所说。

只有一种情况你会看到概率 0,那就是这个句子含有一个从未之前出现过的 bigram 或者 trigram。这是有可能的。对于这种情况,我们可以做一些平滑。如果在我们的语料库里,单词 “z” 从没紧跟随过 “xy”,我们可以看看 “z” 有没有紧跟随过 “y”。如果有,那词组 “xyz” 可能也不会差到哪去。如果没有,我们可以继续看看 “z” 是不是一个常用词。如果不是,那 “xyz” 应该给一个很低的概率值,相比较:

《译文:统计机器翻译教程——正文一》

我们可以写成这样:

《译文:统计机器翻译教程——正文一》

在不同情况下使用不同的平滑系数(smoothing coefficients)是很容易的。你可以给 “xyz” 系数设为 0.95,也可以给其他情况比如 “abc” 系数设为 0.85。比如,如果 “ab” 不太常出现,那么 “ab” 的出现次数和 “abc” 的出现次数就不是那么可靠。

注意,只要我们最后有 0.002,那所有的 trigram 条件概率就不会是 0,所以 P(e) 就不会是 0。这意味着,对于任意的单词组,我们都有一个非 0 的正概率值,即使它们的语法是错误的。毕竟,人有时说话的语法都是错误的。

对于估计平滑系数,等会儿我们还会继续讨论一些。

n-gram 并不是整个统计机器翻译所必须的。你可以为语言提供各种各样的生成模型。比如,想象人们脑海里首先出现的是一个动词,然后他们在这个动词前面想到了一个名词,然后名词前面又想到了一个形容词,然后回到动词后面,想到一个名词。这样不断继续,直到整个句子形成,然后脱口而出。

十二、对模型进行评估

一个模型通常由一个生成理论(generative “story”,比如,人们根据最后两个词不断产生单词)和一组参数值(a set of parameter values,比如 b(z|xy) = 0.02)组成。通常来说,手动设置参数值是很困难的,所以我们想到训练数据(training data)。N-gram 是很容易训练的 — 基本上,我们只需要计算 n-gram 的出现次数然后使用除法。上一节最后描述的 名词-动词-形容词 模型可能不是那么容易训练。起码,你要找到训练句子的谓语动词,即使你能做到,这个模型是否比 n-gram 的效果要好也难说。

怎么去判断一个模型比另一个模型要好?一种方法是收集一堆语料库中不存在的英语测试数据,然后提问:这个模型(生成理论+参数值)给我们提供的测试数据的概率值是多少?我们可以用符号来描述:P(模型|测试数据)。

用贝叶斯公式:

《译文:统计机器翻译教程——正文一》 译者注:model即模型,test-data和data即测试数据

假设 P(模型) 对于所有模型来说都是一样的。那就意味着,如果不关心测试数据,我们是不知道对于不同模型来说 0.95 是否比 0.07 要好。因此,最佳的模型就是 P(测试数据|模型) 值最大的模型。

练习题:P(测试数据) 去哪了?

还好,P(测试数据|模型) 是比较容易计算的。和 P(e) 一样的,只不过这里的 e 变成了测试数据。

现在,任何能返回 P(e) 值的程序都可以,然后我们把它和其他程序比较。这蛮像赌博的,一个模型给所有的句子“下注”,也就是计算 P(e) 值。然后我们看这个模型给测试数据的 P(e) 值是多少。给得越多,这模型就越好。

相比 bigram,trigram 模型会给测试数据更高的值。为什么?bigram 模型会给句子 “I hire men who is good pilots” 一个比较高的值,因为这个句子由很合理的词组组成,bigram 模型会给这个句子“下极高的注”。但 trigram 模型就不会,因为 b(is|men who) 是极少出现的。也就是说, trigram 有更多的“钱”给那些测试数据中的合理但没出现过的的句子下注(比如,“I hire men who are good pilots”)。

所有给测试数据 0 概率值的模型都会被淘汰!但我们总是会做一些平滑,对吧?关于平滑系数 — 有很多方法可以设置平滑参数,使 P(测试数据|模型) 的值更高。但这不太公平,我们不应该给测试数据做任何的额外训练。更好的是,把原始测试数据分为两部分。第一部分用来收集 n-gram 出现次数。第二部分用来设置平滑系数。这样我们就可以用测试数据来评估所有的模型了。

十三、困惑度(Perplexity)

如果测试数据很长,那 n-gram 模型计算出的 P(e) 值是许多很小的值的乘积,一个值比一个值小。一些 n-gram 条件概率会非常的小。导致 P(e) 很难去阅读和理解。一个更常用的比较不同模型的方式是计算:

《译文:统计机器翻译教程——正文一》

这被称为模型的困惑度。N 是测试数据的单词量。除以 N 使最终的值更常规,不管测试数据的大小如何,一个模型总是有大致一样的困惑度。对数(logarithm)的基数(base)是 2。

当 P(e) 增加时,困惑度降低。一个好的模型有相对高的 P(e) 值,以及相对小的困惑度。困惑度越小越好。

练习题:假设一个语言模型给一个含有3个单词的测试数据的 n-gram 条件概率值是 1/4, 1/2, 1/4。那么 P(测试数据) = 1/4 * 1/2 * 1/4 = 0.03125。困惑度是多少?假设另一个模型给一个含有6个单词的测试数据的 n-gram 条件概率值是 1/4, 1/2, 1/4, 1/4, 1/2, 1/4。P(测试数据) 是多少?困惑度是多少?

练习题:如果 P(测试数据) = 0,这个模型的困惑度是多少?你觉得它为什么被称为“困惑度”?

十四、计算对数概率(Log Probability Arithmetic)

P(e) 的另一个问题是很小的值会很容易导致浮点数下溢(underflow floating point scheme)。假设 P(e) 是很多因子 f1, f2, f3, …, fn 的乘积,每个因子都比上一个的值要小。有一个技巧是:

《译文:统计机器翻译教程——正文一》

如果我们保存并使用概率的对数值,那我们就避免了下溢的问题。相比较直接把两个概率值相乘,我们把每个概率的对数值相加。用下面的表格熟悉一下对数概率:

《译文:统计机器翻译教程——正文一》

(0.5 * 0.5 * 0.5 * … * 0.5 = 0.5
n) 可能导致最终值太小,但是 (-1-1-1- … -1 = -n) 就相对可控多了。

记住对数的一个有效方式是:log2(x) = log10(x)/ log10(2)。

至此,对于概率值,我们只是把它们乘了起来,后面我们需要把他们加起来。用对数的形式来做相加是很机智的。我们需要一个函数 g,使得 g(log(p1), log(p2)) = log(p1+p2)。因为这样的话,我们就可以很简单地先把概率的原始值加起来(而不是先取对数),再取对数。但第一步就让整个想法终止了,因为原始的概率值太小了,保存时可能导致浮点数下溢。有一个不错的近似方式去实现,我把这作为练习题吧。(提示:如果两个对数概率值相差很大,在实际操作中,其中一个值是可以被忽略的。)

十五、翻译模型(Translation Modeling)

P(e) 讨论得差不多了。现在我们可以为任意的英语句子 e 计算概率值。

接下来,我们来看看 P(f|e) ,给定英语句子 e,法语句子 f 出现的几率。这被称为翻译模型。我们需要告诉“生成模型”英语句子是如何变成法语句子的。记住,P(f|e) 会作为贯穿整个法语到英语的机器翻译系统的模块。当我们看到一个法语句子 f,我们想反向推理:1. 说出的英语句子可能是什么?2. 哪些英语句子可能被翻译成 f ?我们寻找一个英语句子,它的 P(e) * P(f|e) 值是最大的。

英语如何变成法语?一个不错的理论认为英语句子被转换成谓词逻辑(predicate logic),或者是原子逻辑断言的结合(conjunction of atomic logical assertions)。这些理论将语言中的“非逻辑”部分全部剔除。比如,“John must not go”被转换成

OBLIGATORY(NOT(GO(JOHN)))

“John may not go”被转换成

NOT(PERMITTED(GO(JOHN)))

注意,尽管这两个句子的句法相似,NOT 运算符的使用却非常不同。这个理论的另一部分是谓词逻辑是如何转换成法语的。我喜欢这个理论。

另一个理论是说,英语句子被进行句法分析(parsed syntactically)。具体说,一个二叉树图(binary tree diagram)用来表示这个句子,描述了主体(head)和修饰语(modifier)之间的句法关系。比如,主语/动词,形容词/名词,介词短语/动词短语,等等。这个树图紧接着被转化成另一个代表法语句法关系的树图。这个过程中,短语被互换,英语单词被法语对应的单词替代。这个理论称为句法迁移(syntactic transfer)

还有一个理论,认为英语句子中的单词被法语单词替换,然后它们在那混乱地移动位置。这算个什么鬼理论?然而本教程的后续内容就会使用这个理论。我们将这个理论称为 IBM Model 3(译者注:此术语不进行翻译)

至少,这个理论很简单。我们可以实现将任何英语句子转换成任何法语句子,等会儿我们就会知道这是非常重要的。在其他理论里,我们并不清楚如何把句子进行转换。另一点,P(f|e) 是不需要把英语转换成优秀的法语句子的。第七节和第八节中已经讨论过,独立训练的 P(e) 模块会操心这个事情。

这个理论是这样的:

  1. 对于英语句子(i = 1 … l)中的每一个单词 ei,我们选择一个繁衍值(fertility)φi(读作 “phi”,第二十一个希腊字母)。繁衍值的选择仅仅取决于当前句子中的单词,不依赖于其他英语句子中的英语单词以及它们的繁衍值。
  2. 对于每一个单词 ei,我们生成 φi 个法语单词。法语单词的翻译仅仅依赖于生成这个法语单词的英语单词,不依赖于英语单词的上下文含义,也不依赖于其他通过当前英语句子或其他英语句子已经生成的任何法语单词。
  3. 生成好的法语单词被重新排列。每个法语单词被给予在目标法语句子中的绝对“位置编号”。比如,一个单词可能被给予位置 3,另一个可能被给予位置 2 — 因此在最终的法语句子中,第二个单词会排在第一个单词的前面。法语单词的位置选择仅仅取决于生成它的英语单词的绝对位置。

这个理论是不是很滑稽?

十六、把重写句子当做翻译

你可以把这个生成理论当做一种重写句子的方式。首先你写一个英语句子:

Mary did not slap the green witch

然后给繁衍值。对于第一个繁衍值,你可以简单地复制第一个单词。对于第二个繁衍值,复制第二个单词两次。对于繁衍值 0,直接把原单词扔掉。比如,我们可能给 “did” 为 0 的繁衍值。产生的新句子:

Mary not slap slap slap the the green witch

注意,“slap” 的繁衍值给了 3。接下来,用法语单词替换英语单词(这里我用西班牙语吧,因为我会西班牙语)。这一步就一对一的做替换:

Mary no daba una botefada a la verde bruja

最后,我们重新排列单词:

Mary no daba una botefada a la bruja verde

练习题:通过上面的生成理论把句子 “my child, you must go home” 用一门外语进行翻译。

十七、Model 3

在语言模型中,我们用理论 “人们基于最后说的一个单词来产生新单词” 开头,加上大量类似 b(snakes|like) 的参数来确定了一个模型。这些参数可以通过语料库来取得。现在,我们来做类似的事情。

在思考应该拥有哪些参数的时候,我们只需要看看这个生成理论依赖了什么东西。比如,生成哪些法语单词依赖了当前的英语单词。所以很容易可以想象出一个参数 t(maison|house),它计算英语单词 “house” 生成法语单词 “maison” 的概率。繁衍值也一样的,我们可以有一个参数 n(1|house),它计算只要 “house” 出现时,法语句子中就刚好有一个(不多不少)对应的单词的概率。被称为失真参数(distortion parameter)的东西也一样,比如,d(5|2) 计算位于位置 2 的英语单词生成的法语单词刚好位于位置 5 的概率。事实上,Model 3 使用了一个略微优化后的失真机制(distortion scheme),目标位置会取决于英语句子和法语句子的长度。因此这个参数看起来会是这样 d(5|2, 4, 6),和 d(5|2) 的区别仅仅是多接受了英语句子的长度 4 和法语句子的长度 6。记住,失真参数不需要把每个法语单词摆放成语法正确的。即使这个模型产生了烂法语也可以接受。

Model 3 有另一个优化,真是“阴险”。想象一些法语单词是“伪造的”。就是说,他们神奇地出现在了最终的法语句子里,但却没有英语单词对他们“负责”。比如,功能性单词。想想上一节例子中的西班牙单词 “a”。我给英语单词 “the” 的繁衍值是 2,它最终产生了西班牙语里的 “a”。更好的做法可能是给 “the” 的繁衍值为 1,然后让 “a” 被“伪造地”生成。

为了给这个现象建模,我们假定每一个英语句子在初始时都有一个不可见的单词 NULL,它位于位置 0。我们给一个参数 t(maison|NULL),它计算由 NULL 生成“伪造”单词 maison 的概率。

我们也可以给类似 n(3|NULL) 的参数,它计算在最终的法语句子中有 3 个(不多不少)“伪造”单词的概率。但是,Model 3 担心长句子会有更多的“伪造”单词。这突如其来的顾虑,看不懂。但不管怎样,相比于 n(0|NULL) … n(25|NULL),我们可以只有一个浮点数参数,称为 p1。你可以这样理解 p1:在我们给所有“真正的”英语单词(除了 NULL)设置繁衍值之后,我们就可以生成比如 z 个法语单词。当我们生成每个法语单词时,我们选择性地通过概率 p1 把“伪造”单词塞进去。对于不把“伪造”单词塞进去的概率,我们用 p0 = 1 – p1 来表示。

练习题:如果一个英语单词的繁衍值的最大值是 2,对于一个长度为 l 的英语句子,对应的法语句子的最大长度是多少?(别忘记 NULL 生成的“伪造”单词)

最后,我们来看看 NULL 生成的“伪造”单词的失真概率。我担心用参数 d(5|0, 4, 6) 来计算太简单了,d(5|0, 4, 6) 的意思是 NULL 会生成位于位置 5 而不是其他位置的法语单词的几率。这些可是“伪造”的单词啊,朋友!他们可以出现在任何位置!去预测它没有意义的!相反,我们使用正常单词的失真概率来选择被正常生产的法语单词的位置,然后把 NULL 生成的“伪造”单词放在剩余的空位。如果 NULL 生成了 三个单词,有三个空位,那就有 3!(3 的阶乘),6 种方式去填充它们。我们给每一种方式 1/6 的概率。

我们现在可以完整地梳理模型 Model 3 了:

  1. 通过繁衍值概率 n(φi|ei),给每个英语单词 ei,i = 1, 2, …, l,提供一个繁衍值 φi
  2. 通过 p1 概率以及上一步中的所有繁衍值 ei 的总和,给由 e0 = NULL 生成的“伪造”单词,也提供一个繁衍值 φ0
  3. 让 m 等于所有单词的繁衍值的和,包括 NULL。
  4. 对于每一个 i = 0, 1, 2, …, l, k = 1, 2, …, φi,通过概率 t(τik|ei),提供一个法语单词 τik。( τ(译者注:不是英语字母 T) 读作 “tau”,第十九个希腊字母)。
  5. 对于每一个 i = 1, 2, …, l,k = 1, 2, …, φi,通过概率 d(πik|i,l,m),提供法语句子中的目标位置 πik(读作 “pi”,第十六个希腊字母)。(译者注:m 指目标法语句子的长度)。
  6. 对于每一个 k = 1, 2, …, φ0,通过 1/(φ0!) 的概率,从一共 m 个位置中的 φ0 – k + 1 个剩余空位中选出一个位置 π0k
  7. 通过位于位置 πik 的法语单词 Tik ,输出整个法语句子。(0 ≤ i ≤ l, 1 ≤ k ≤ φi)。

如果你想从句子重写的角度来思考,参考下面的步骤:

  1. Mary did not slap the green witch (输入)
  2. Mary not slap slap slap the green witch (提供繁衍值)
  3. Mary not slap slap slap NULL the green witch (提供“伪造”单词的个数)
  4. Mary no daba una botefada a la verde bruja (提供替代的单词)
  5. Mary no daba una botefada a la bruja verde (提供目标句子中的位置)

十八、Model 3 的参数

看得出来,这个模型有四种参数:n,t,p 和 d。n 和 t 是由浮点数组成的二维表。d 是由浮点数组成的一维表。p 是一个单独的浮点数。这个模型没有任何魔法:它几乎只是一堆数字而已!

练习题:如果每一个浮点数占用 4 字节(bytes)的内存,要存储所有的表,你认为需要多少的空间?

译者:
第一部分正文结束
继续第二部分正文(最后一部分)

    原文作者:卢瑞
    原文地址: https://www.jianshu.com/p/a7a2d910305f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞