原文 A Statistical MT Tutorial Workbook 由 Kevin Knight 于1999年完成。
原文及原作者鏈接:https://kevincrawfordknight.github.io/
本譯文已獲得原作者 Kevin Knight 的許可
我相信 閱讀英語(yǔ)原文 是學(xué)習(xí)此內(nèi)容的最佳方式
不知道這是什么?閱讀本譯文的前言
一、總體計(jì)劃
我們想自動(dòng)分析人類(lèi)已存在的句子翻譯語(yǔ)料,來(lái)建立通用的翻譯規(guī)則。然后用這些規(guī)則來(lái)自動(dòng)翻譯新的內(nèi)容!
我知道這本手冊(cè)有點(diǎn)厚,但如果你花一天時(shí)間搞定它,你也會(huì)和其他人一樣,了解統(tǒng)計(jì)機(jī)器翻譯的絕大多數(shù)內(nèi)容。
這本教程的基本內(nèi)容是基于 Brown 等人于 1993 年通過(guò)期刊 Computational Linguistics 發(fā)表的文章 The Mathematics of Statistical Machine Translation。在這篇優(yōu)秀的文章之上,我能做的僅僅是增加一些新的視角,然后,可能的話,為讀者(你們什么都沒(méi)做錯(cuò))提供一些同情。
在整個(gè)教程中,重要的術(shù)語(yǔ)都會(huì)用 粗體 進(jìn)行標(biāo)注!(譯者注:原文使用下劃線進(jìn)行標(biāo)注)
二、基本的概率知識(shí)
我們認(rèn)為,一個(gè)英語(yǔ)句子 e 可以被翻譯成任意的一個(gè)法語(yǔ)句子 f。只不過(guò)一些翻譯比另一些更好。這里是一些基本的符號(hào),我們用這些符號(hào)來(lái)正式地表示“更好”:
- P(e) — 先驗(yàn)概率(priori probability)。句子 e 發(fā)生的幾率。比如,如果 e 是英語(yǔ)句子 “I like snakes”,那么 P(e) 就是某個(gè)人在某時(shí)刻可能說(shuō)出 “I like snakes” 而不是說(shuō)出其他句子的幾率。
- P(f|e) — 條件概率(conditional probability)。給定句子 e,句子 f 的幾率。比如,如果 e 是英語(yǔ)句子 “ I like snakes“,如果 f 是法語(yǔ)句子 “maisson bleue”,那么 P(f|e) 就是翻譯器把句子 e 翻譯成句子 f 的幾率。在這個(gè)例子中,完全不可能。
- P(e, f) — 聯(lián)合概率(joint probability)。e 和 f 同時(shí)發(fā)生的幾率。如果 e 和 f 互不影響,我們可以寫(xiě)成 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 發(fā)生的幾率”乘以“e 發(fā)生且 f 同時(shí)發(fā)生的幾率”。如果 e 和 f 是互譯的兩串文本,那它們之間肯定是一定程度上相互影響的。
練習(xí)題:P(e,f) = P(f) ? ?
以上所有概率的值的范圍都是 0 到 1 的閉區(qū)間。0.5 的概率意味著“有一半的幾率”。
三、和與乘積
我們用以下方式來(lái)表示從 1 到 n 的整數(shù)之和:

我們用以下方式來(lái)表示從 1 到 n 的整數(shù)之乘積:

如果在求和過(guò)程中有因子,但它不依賴(lài)求和的元素,我們就可以把它放在外面:

練習(xí)題:

有時(shí)我們會(huì)對(duì)所有的句子 e 進(jìn)行求和,以下是一些有用的概率公式:

最后一個(gè)公式你可以這樣讀:“假設(shè) f 是被一些其他事件影響的,那么對(duì)于每一個(gè)會(huì)影響 f 的事件 e,我們計(jì)算 e 發(fā)生的幾率和 e 發(fā)生且 f 同時(shí)發(fā)生的幾率。為了覆蓋所有影響 f 的事件 e,我們把所有的幾率加起來(lái)?!?/p>
四、統(tǒng)計(jì)機(jī)器翻譯(Statistical Machine Translation)
對(duì)于一個(gè)法語(yǔ)句子 f,我們尋找一個(gè)英語(yǔ)句子 e,這個(gè)句子 e 的 P(e|f) 值是最大的(即最有可能的翻譯)。有時(shí)我們這樣寫(xiě):

argmax 可以這樣讀:“在所有的英語(yǔ)句子中,句子 e 的 P(e|f) 值是最大的”。如果你想用電腦程序的角度去思考它,你可以想象有這樣一個(gè)程序,它接受一組句子 e 和 f,返回概率 P(e|f) 的值,稍后我們會(huì)看到這樣的程序。

或者,你也可以想象這樣一個(gè)程序,它接受一個(gè)句子 f 作為輸入,返回所有可能的句子 ei 以及它的 P(e|f) 值。這樣的程序會(huì)需要更長(zhǎng)的運(yùn)行時(shí)間,即使你把英語(yǔ)句子的數(shù)量控制在一定范圍。

五、噪聲信道(The Noisy Channel)
記住貝葉斯公式(Bayes Rule),這非常重要!

練習(xí)題:通過(guò)第二節(jié)提供的練習(xí)題,來(lái)證明這個(gè)公式
通過(guò)貝葉斯公式,我們可以重寫(xiě)剛剛關(guān)于尋找最有可能的翻譯的表達(dá)式:

練習(xí)題:P(f) 去哪了?
這個(gè)公式的意思是,最有可能的翻譯,是以下兩個(gè)值的乘積的最大值:1. 某人說(shuō)出句子 e 的幾率,2. 如果他說(shuō)出了句子 e,他會(huì)把句子 e 翻譯成句子 f 的幾率。
噪聲信道的原理大概是這樣:我們想象某人的腦海里有句子 e,但是在它被正式說(shuō)出來(lái)之前,它被“噪聲”影響,從而變成了句子 f。為了恢復(fù)到最有可能的句子 e,我們推斷:1. 人們會(huì)用英語(yǔ)說(shuō)哪些句子,2. 英語(yǔ)是如何轉(zhuǎn)換成法語(yǔ)的。這倆有時(shí)被稱(chēng)為源模型(source modeling)和信道模型(channel modeling)。人們用噪聲信道來(lái)隱喻很多的工程問(wèn)題,比如電話傳播中的真實(shí)噪聲。
如果你想從電腦程序的角度去思考 P(e),你可以想象有一個(gè)程序,它接受一個(gè)任意的英語(yǔ)句子 e,返回一個(gè)概率 P(e)。我們很快就會(huì)見(jiàn)到這樣的程序。

或者,你也可以認(rèn)為有一個(gè)程序,它返回一個(gè)很長(zhǎng)的列表,包含了所有的英語(yǔ)句子 ei 和它們的 P(ei)。

對(duì)于 P(e|f),想象另一個(gè)程序,它接受一組句子 e 和 f,返回 P(e|f)。

同理,也可以是一個(gè)程序,它接受一個(gè)句子 e,返回所有可能的句子 fi,以及對(duì)應(yīng)的 P(e|fi)。

以上最后的兩個(gè)程序和第四節(jié)中的程序很類(lèi)似,除了 P(f|e) 和 P(e|f) 不一樣。
你可以把源(source)和信道(channel)放在一起,像這樣:

有很多方法都可以產(chǎn)生出同一個(gè)法語(yǔ)句子 f。每一種方法都對(duì)應(yīng)著對(duì)源句子 e 的不同選擇。注意,兩個(gè)部分由右箭頭連接,這被稱(chēng)為生成模型(generative model)因?yàn)檫@個(gè)模型是關(guān)于法語(yǔ)句子 f 是如何被生成的。這個(gè)理論的意思是,首先一個(gè)英語(yǔ)句子 e 被生成,然后它被轉(zhuǎn)換成了法語(yǔ)句子。挺奇怪的一個(gè)理論。
六、貝葉斯推理
即使箭頭是向右指向的,我們其實(shí)會(huì)用這套理論來(lái)把法語(yǔ)翻譯回英語(yǔ)。
把句子 f 當(dāng)成一個(gè)犯罪現(xiàn)場(chǎng)。我們想推理這犯罪現(xiàn)場(chǎng)是怎么來(lái)的。我們的生成模型差不多是這樣一個(gè)東西:某人 e 決定去犯罪,然后他真的犯罪了。所以我們推理這兩點(diǎn):1. 哪些人可能會(huì)決定去犯罪(這里的 P(e) 可以認(rèn)為是動(dòng)機(jī)和人的性格),2. 他們可能會(huì)怎樣實(shí)施犯罪(這里的 P(f|e) 可以認(rèn)為是交通工具和武器),通常這兩點(diǎn)會(huì)沖突,某人可能有很好的動(dòng)機(jī)但卻沒(méi)有實(shí)施的條件,某人可能很輕易的實(shí)施犯罪但卻沒(méi)有動(dòng)機(jī)。
或者說(shuō),把句子 f 當(dāng)成一組醫(yī)學(xué)癥狀。很多的疾病都可能有這些癥狀。如果我們來(lái)建立生成模型,我們就可以推理出任意疾病 e 發(fā)生的概率和疾病 e 會(huì)顯示出癥狀 f 的概率。這又是 P(e) 和 P(f|e) 了。它們可能沖突:一些疾病很常見(jiàn)但可能沒(méi)有癥狀 f,一些疾病很罕見(jiàn)但可能總是有癥狀 f。這問(wèn)題是不是很艱難?
由于生物學(xué)家大概知道疾病是如何產(chǎn)生癥狀的,也就是 P(f|e) ,所以建立這樣的電腦模型是可能的。但要建立一個(gè)模型,通過(guò)癥狀推理得出疾病就沒(méi)有那么容易,也就是 P(e|f)。并且,我們可能有一些關(guān)于 P(e) 的孤立信息,比如醫(yī)院的早期記錄。
七、翻譯中的單詞重排序
如果我們直接用 P(e|f) 去推理得到翻譯,那我們最好很擅長(zhǎng)概率估計(jì)。另一方面,如果我們用貝葉斯公式把整個(gè)過(guò)程拆分,理論上,我們就可以得出一個(gè)不錯(cuò)的翻譯結(jié)果,即使概率值不高。
比如,假設(shè)我們當(dāng)句子 f 中的單詞能被翻譯成句子 e 中的單詞時(shí),才給 P(f|e) 很高的值,那句子 f 中的單詞可以是任意的順序:我們并不care。對(duì)于英語(yǔ)是如何被轉(zhuǎn)換成法語(yǔ)來(lái)說(shuō),這個(gè)模型并不準(zhǔn)確。可能對(duì)于英語(yǔ)是如何被轉(zhuǎn)換成爛法語(yǔ)來(lái)說(shuō),這個(gè)模型是準(zhǔn)確的。
現(xiàn)在,我們說(shuō)說(shuō) P(e)。假設(shè)我們當(dāng)英語(yǔ)句子 e 擁有正確的語(yǔ)法的時(shí)候,才給 P(e) 很高的值,這倒是挺合理的,即使實(shí)現(xiàn)起來(lái)很困難。
當(dāng)我們觀察句子 f,并努力找一個(gè)英語(yǔ)翻譯句子 e 的時(shí)候,一個(gè)有趣的事情發(fā)生了。每一個(gè)句子 e 都有它的 P(e) ? P(f|e)。因子 P(f|e) 會(huì)保證一個(gè)不錯(cuò)的英語(yǔ)句子 e 含有指定的單詞,這些單詞基本上都可以翻譯成法語(yǔ)句子 f 中的單詞。很多的句子 e 都會(huì)通過(guò)這個(gè)測(cè)試,比如,“the boy runs”通過(guò),“runs boy the”也通過(guò),一些句子的語(yǔ)法正確,另一些不正確。然而,因子 P(e) 會(huì)把那些語(yǔ)法不正確的句子的值降低。
實(shí)際上,P(e) 在操心單詞的順序,讓 P(f|e)不用干這事兒。這樣 P(f|e) 就可以更容易被建立。它只需要決定一堆英語(yǔ)單詞是否能被翻譯成一堆法語(yǔ)單詞。這可以用一些雙語(yǔ)詞典完成?;蛘邚乃惴ǖ慕嵌葋?lái)說(shuō),這部分模塊需要把一堆法語(yǔ)單詞翻譯成一堆英語(yǔ)單詞,并且給這兩堆單詞一個(gè)分?jǐn)?shù)。
練習(xí)題:把這些單詞按順序排列,“have programming a seen never I language better”,這個(gè)任務(wù)叫做詞袋生成(bag generation)。
練習(xí)題:把這些單詞按順序排列,“actual the hashing is since not collision-free usually the is less perfectly the of somewhat capacity table”。
練習(xí)題:你運(yùn)用了什么知識(shí)來(lái)完成以上任務(wù)?你是否認(rèn)為機(jī)器可以完成這些任務(wù)?你能否想出一種方式來(lái)評(píng)估機(jī)器的完成水平,不需要大量的人為檢查?
練習(xí)題:把這些單詞按順序排列,“l(fā)oves John Mary”。
最后一道題挺難的??雌饋?lái),P(f|e) 還是需要知道一些關(guān)于單詞順序的東西。它不能僅僅是推薦一堆無(wú)序單詞就完了。但它只需要懂一點(diǎn)點(diǎn)詞序,不是全部。
八、翻譯中的單詞選擇
在為法語(yǔ)單詞選擇英語(yǔ)翻譯的時(shí)候,P(e) 也是有用的。比如,一個(gè)法語(yǔ)單詞可以被翻譯成 "in" 或者 "on"。那就會(huì)有兩個(gè)有相同 P(f|e) 值的英語(yǔ)句子:1. she is in the end zone, 2. she is on the end zone。第一個(gè)句子比第二個(gè)句子要好,所以它會(huì)獲得更好的 P(e) 值,最終獲得更好的 P(e) * P(f|e) 值。記住,最有可能的翻譯就是擁有最高 P(e) * P(f|e) 值的句子。
練習(xí)題:寫(xiě)一句外語(yǔ)句子(譯者注:這里的外語(yǔ)指非英語(yǔ)),把單詞重新排列,讓他們看起來(lái)像是英語(yǔ)單詞的順序。用一個(gè)雙語(yǔ)詞典把所有單詞的所有可能翻譯(譯者注:這里的翻譯指非英語(yǔ)單詞對(duì)應(yīng)的英語(yǔ)單詞)都找出來(lái)。每個(gè)詞的翻譯寫(xiě)在它的下面組成一列。把最上面的非英語(yǔ)單詞全都擦掉。喊一個(gè)朋友(敵人也可以)通過(guò)每一列中選一個(gè)詞的方式來(lái)構(gòu)造一個(gè)英語(yǔ)句子。
九、語(yǔ)言模型
這些概率值從何而來(lái)?
稍后我們?cè)俨傩?P(f|e)。首先,我們需要建立一個(gè)程序,來(lái)給每一個(gè)英語(yǔ)句子 e 提供一個(gè) P(e) 值。這被稱(chēng)為語(yǔ)言模型(language model)。
我們可以建立一個(gè)程序,它熟悉這個(gè)世界,知道人們喜歡談?wù)撌裁?,知道人們?huì)用怎樣的語(yǔ)法結(jié)構(gòu)去描述特定的事情和物件等等。我們可以在程序里輸入大量的數(shù)字,然后進(jìn)行相加,乘積什么的。
另一個(gè)想法簡(jiǎn)單點(diǎn),僅僅把所有人說(shuō)過(guò)的英語(yǔ)句子記錄下來(lái)就好了。假設(shè)你有十億句子的語(yǔ)料庫(kù)。如果句子 “how's it going?” 在這個(gè)庫(kù)中出現(xiàn)了 76413 次,那 P(how’s it going?) = 76413/1000000000 = 0.000076413。我們可以用網(wǎng)絡(luò)或者在線的華爾街日?qǐng)?bào),如果我們不想自己做大量的記錄的話。
練習(xí)題:哪一個(gè)有更高的概率:"I like snakes" 和 "I hate snakes"。在 Google 中輸入它們,然后找出來(lái)。(搜索的時(shí)候用英文問(wèn)號(hào)?來(lái)保證在搜索結(jié)果里這些詞是按順序一起出現(xiàn)的)
練習(xí)題:“I hate baby poisonous snakes” 的概率是多少?
一個(gè)很大的問(wèn)題是,很多非常棒的句子會(huì)得到概率 0,因?yàn)槲覀儚奈匆?jiàn)過(guò)它們。這很糟糕。一個(gè)優(yōu)秀的 P(f|e) 模塊可能會(huì)給出一堆不錯(cuò)的單詞,比如 “hate snakes poisonous I baby”。但不管我們?nèi)绾芜M(jìn)行排序,P(e) 總是等于 0。這意味著,“hate snakes poisonous I baby” 會(huì)被認(rèn)為成和 “I hate baby poisonous snakes.” 是一樣的翻譯。
人們似乎可以判斷一堆單詞是否是一個(gè)合理的英語(yǔ)句子,而無(wú)需準(zhǔn)備語(yǔ)料庫(kù)。(你真的聽(tīng)說(shuō)過(guò)句子 “I hate baby poisonous snakes”?你確定?)我們似乎可以把句子拆分為更小的部分,然后只要這些小部分是合理地結(jié)合在一起的,我們就說(shuō)這堆單詞是一個(gè)合理的英語(yǔ)句子。
十、N-grams
對(duì)于計(jì)算機(jī)來(lái)說(shuō),把一串文本(string)拆分為小部分的最簡(jiǎn)單方式就是子串文本(substring)。一個(gè)包含 n 個(gè)單詞的子串文本被稱(chēng)為一個(gè) n-gram。如果 n = 2,我們稱(chēng)為 bigram(譯者注:bigram 可被譯為二元模型)。如果 n = 3,我們稱(chēng)為 trigram(譯者注:trigram 可被譯為三元模型)。如果 n = 1,書(shū)呆子們稱(chēng)為 unigram(譯者注:unigram 可被譯為一元模型),正常人稱(chēng)為單詞。
如果一串文本有很多合理的 n-grams,那么這串文本可能就是一個(gè)合理的句子。這不一定,但可能是。
讓 b(y|x) 為 單詞 y 緊跟隨單詞 x 的概率。我們可以通過(guò)在線語(yǔ)料來(lái)估計(jì)這個(gè)概率。直接用短語(yǔ) “xy” 出現(xiàn)的次數(shù)除以單詞 “x” 出現(xiàn)的次數(shù)。這被稱(chēng)為一個(gè)條件 bigram 概率(conditional bigram probability)。每一個(gè) b(y|x) 被稱(chēng)為一個(gè) 參數(shù)(parameter)。
一個(gè)常用的 n-gram 估計(jì)量(estimator)看起來(lái)是這樣:

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

換句話說(shuō),你會(huì)用單詞 “I” 作為句子開(kāi)頭的幾率是多少?如果你用“I”開(kāi)頭,那么你會(huì)緊接著用單詞 “l(fā)ike” 的幾率是多少?如果你用了 “l(fā)ike”,那么 “snakes” 作為下一個(gè)單詞的幾率是多少?按同樣的邏輯繼續(xù)。
事實(shí)上,關(guān)于第五節(jié)中的生成理論,有另外一種情況。這個(gè)理論認(rèn)為,人們雖然不斷說(shuō)出一個(gè)個(gè)單詞,但除了前一個(gè)單詞,人們啥都不記得。這模型太瘋狂了吧。這被稱(chēng)為一個(gè) bigram 語(yǔ)言模型(bigram language model)。如果我們開(kāi)心,也可以允許人們記住前兩個(gè)單詞。這被稱(chēng)為一個(gè) trigram 語(yǔ)言模型(trigram language model):


十一、平滑(Smoothing)
N-gram 模型不會(huì)把從未出現(xiàn)過(guò)的句子認(rèn)為是概率 0。這是好事,正如 Martha Stewart 所說(shuō)。
只有一種情況你會(huì)看到概率 0,那就是這個(gè)句子含有一個(gè)從未之前出現(xiàn)過(guò)的 bigram 或者 trigram。這是有可能的。對(duì)于這種情況,我們可以做一些平滑。如果在我們的語(yǔ)料庫(kù)里,單詞 “z” 從沒(méi)緊跟隨過(guò) “xy”,我們可以看看 “z” 有沒(méi)有緊跟隨過(guò) “y”。如果有,那詞組 “xyz” 可能也不會(huì)差到哪去。如果沒(méi)有,我們可以繼續(xù)看看 “z” 是不是一個(gè)常用詞。如果不是,那 “xyz” 應(yīng)該給一個(gè)很低的概率值,相比較:

我們可以寫(xiě)成這樣:

在不同情況下使用不同的平滑系數(shù)(smoothing coefficients)是很容易的。你可以給 “xyz” 系數(shù)設(shè)為 0.95,也可以給其他情況比如 “abc” 系數(shù)設(shè)為 0.85。比如,如果 “ab” 不太常出現(xiàn),那么 “ab” 的出現(xiàn)次數(shù)和 “abc” 的出現(xiàn)次數(shù)就不是那么可靠。
注意,只要我們最后有 0.002,那所有的 trigram 條件概率就不會(huì)是 0,所以 P(e) 就不會(huì)是 0。這意味著,對(duì)于任意的單詞組,我們都有一個(gè)非 0 的正概率值,即使它們的語(yǔ)法是錯(cuò)誤的。畢竟,人有時(shí)說(shuō)話的語(yǔ)法都是錯(cuò)誤的。
對(duì)于估計(jì)平滑系數(shù),等會(huì)兒我們還會(huì)繼續(xù)討論一些。
n-gram 并不是整個(gè)統(tǒng)計(jì)機(jī)器翻譯所必須的。你可以為語(yǔ)言模型提供各種各樣的生成理論。比如,想象人們腦海里首先出現(xiàn)的是一個(gè)動(dòng)詞,然后他們?cè)谶@個(gè)動(dòng)詞前面想到了一個(gè)名詞,然后名詞前面又想到了一個(gè)形容詞,然后回到動(dòng)詞后面,想到一個(gè)名詞。這樣不斷繼續(xù),直到整個(gè)句子形成,然后脫口而出。
十二、對(duì)模型進(jìn)行評(píng)估
一個(gè)模型通常由一個(gè)生成理論(generative "story",比如,人們根據(jù)前兩個(gè)說(shuō)出的單詞來(lái)產(chǎn)生新單詞)和一組參數(shù)值(a set of parameter values,比如 b(z|xy) = 0.02)組成。通常來(lái)說(shuō),手動(dòng)設(shè)置參數(shù)值是很困難的,所以我們想到訓(xùn)練數(shù)據(jù)(training data)。N-gram 是很容易訓(xùn)練的,基本上我們只需要計(jì)算 n-gram 的出現(xiàn)次數(shù)然后使用除法。上一節(jié)最后描述的 名詞-動(dòng)詞-形容詞 模型可能不是那么容易訓(xùn)練。起碼,你要找到訓(xùn)練句子的謂語(yǔ)動(dòng)詞,即使你能做到,這個(gè)模型是否比 n-gram 的效果要好也難說(shuō)。
怎么去判斷一個(gè)模型比另一個(gè)模型要好?一種方法是收集一堆語(yǔ)料庫(kù)中不存在的英語(yǔ)測(cè)試數(shù)據(jù),然后提問(wèn):這個(gè)模型(生成理論+參數(shù)值)給我們提供的測(cè)試數(shù)據(jù)的概率值是多少?我們可以用符號(hào)來(lái)描述:P(模型|測(cè)試數(shù)據(jù))。
用貝葉斯公式:

假設(shè) P(模型) 對(duì)于所有模型來(lái)說(shuō)都是一樣的。那就意味著,如果不關(guān)心測(cè)試數(shù)據(jù),我們是不知道對(duì)于不同模型來(lái)說(shuō) 0.95 是否比 0.07 要好。因此,最佳的模型就是 P(測(cè)試數(shù)據(jù)|模型) 值最大的模型。
練習(xí)題:P(測(cè)試數(shù)據(jù)) 去哪了?
還好,P(測(cè)試數(shù)據(jù)|模型) 是比較容易計(jì)算的。和 P(e) 一樣的,只不過(guò)這里的 e 變成了測(cè)試數(shù)據(jù)。
現(xiàn)在,任何能返回 P(e) 值的程序都可以,然后我們把它和其他程序比較。這蠻像賭博的,一個(gè)模型給所有的句子“下注”,也就是計(jì)算 P(e) 值。然后我們看這個(gè)模型給測(cè)試數(shù)據(jù)的 P(e) 值是多少。給得越多,這模型就越好。
相比 bigram,trigram 模型會(huì)給測(cè)試數(shù)據(jù)更高的值。為什么?bigram 模型會(huì)給句子 “I hire men who is good pilots” 一個(gè)比較高的值,因?yàn)檫@個(gè)句子由很合理的詞組組成,bigram 模型會(huì)給這個(gè)句子“下極高的注”。但 trigram 模型就不會(huì),因?yàn)?b(is|men who) 是極少出現(xiàn)的。也就是說(shuō), trigram 有更多的“錢(qián)”給那些測(cè)試數(shù)據(jù)中的合理但沒(méi)出現(xiàn)過(guò)的的句子下注(比如,“I hire men who are good pilots”)。
所有給測(cè)試數(shù)據(jù) 0 概率值的模型都會(huì)被淘汰!但我們總是會(huì)做一些平滑,對(duì)吧?關(guān)于平滑系數(shù) — 有很多方法可以設(shè)置平滑參數(shù),使 P(測(cè)試數(shù)據(jù)|模型) 的值更高。但這不太公平,我們不應(yīng)該給測(cè)試數(shù)據(jù)做任何的額外訓(xùn)練。更好的是,把原始測(cè)試數(shù)據(jù)分為兩部分。第一部分用來(lái)收集 n-gram 出現(xiàn)次數(shù)。第二部分用來(lái)設(shè)置平滑系數(shù)。這樣我們就可以用測(cè)試數(shù)據(jù)來(lái)評(píng)估所有的模型了。
十三、困惑度(Perplexity)
如果測(cè)試數(shù)據(jù)很長(zhǎng),那 n-gram 模型計(jì)算出的 P(e) 值是許多很小的值的乘積,一個(gè)值比一個(gè)值小。一些 n-gram 條件概率會(huì)非常的小。導(dǎo)致 P(e) 很難去閱讀和理解。一個(gè)更常用的比較不同模型的方式是計(jì)算:

這被稱(chēng)為模型的困惑度。N 是測(cè)試數(shù)據(jù)的單詞量。除以 N 使最終的值更常規(guī),不管測(cè)試數(shù)據(jù)的大小如何,一個(gè)模型總是有大致一樣的困惑度。對(duì)數(shù)(logarithm)的基數(shù)(base)是 2。
當(dāng) P(e) 增加時(shí),困惑度降低。一個(gè)好的模型有相對(duì)高的 P(e) 值,以及相對(duì)小的困惑度。困惑度越小越好。
練習(xí)題:假設(shè)一個(gè)語(yǔ)言模型給一個(gè)含有3個(gè)單詞的測(cè)試數(shù)據(jù)的 n-gram 條件概率值是 1/4, 1/2, 1/4。那么 P(測(cè)試數(shù)據(jù)) = 1/4 * 1/2 * 1/4 = 0.03125。困惑度是多少?假設(shè)另一個(gè)模型給一個(gè)含有6個(gè)單詞的測(cè)試數(shù)據(jù)的 n-gram 條件概率值是 1/4, 1/2, 1/4, 1/4, 1/2, 1/4。P(測(cè)試數(shù)據(jù)) 是多少?困惑度是多少?
練習(xí)題:如果 P(測(cè)試數(shù)據(jù)) = 0,這個(gè)模型的困惑度是多少?你覺(jué)得它為什么被稱(chēng)為“困惑度”?
十四、計(jì)算對(duì)數(shù)概率(Log Probability Arithmetic)
P(e) 的另一個(gè)問(wèn)題是很小的值會(huì)很容易導(dǎo)致浮點(diǎn)數(shù)下溢(underflow floating point scheme)。假設(shè) P(e) 是很多因子 f1, f2, f3, ..., fn 的乘積,每個(gè)因子都比上一個(gè)的值要小。有一個(gè)技巧是:

如果我們保存并使用概率的對(duì)數(shù)值,那我們就避免了下溢的問(wèn)題。相比較直接把兩個(gè)概率值相乘,我們把每個(gè)概率的對(duì)數(shù)值相加。用下面的表格熟悉一下對(duì)數(shù)概率:

(0.5 * 0.5 * 0.5 * ... * 0.5 = 0.5n) 可能導(dǎo)致最終值太小,但是 (-1-1-1- ... -1 = -n) 就相對(duì)可控多了。
記住對(duì)數(shù)的一個(gè)有效方式是:log2(x) = log10(x)/ log10(2)。
至此,對(duì)于概率值,我們只是把它們乘了起來(lái),后面我們需要把他們加起來(lái)。用對(duì)數(shù)的形式來(lái)做相加是很機(jī)智的。我們需要一個(gè)函數(shù) g,使得 g(log(p1), log(p2)) = log(p1+p2)。因?yàn)檫@樣的話,我們就可以很簡(jiǎn)單地先把概率的原始值加起來(lái)(而不是先取對(duì)數(shù)),再取對(duì)數(shù)。但第一步就讓整個(gè)想法終止了,因?yàn)樵嫉母怕手堤×?,保存時(shí)可能導(dǎo)致浮點(diǎn)數(shù)下溢。有一個(gè)不錯(cuò)的近似方式去實(shí)現(xiàn),我把這作為練習(xí)題吧。(提示:如果兩個(gè)對(duì)數(shù)概率值相差很大,在實(shí)際操作中,其中一個(gè)值是可以被忽略的。)
十五、翻譯模型(Translation Modeling)
P(e) 討論得差不多了?,F(xiàn)在我們可以為任意的英語(yǔ)句子 e 計(jì)算概率值。
接下來(lái),我們來(lái)看看 P(f|e) ,給定英語(yǔ)句子 e,法語(yǔ)句子 f 出現(xiàn)的幾率。這被稱(chēng)為翻譯模型。我們需要一個(gè)生成理論,來(lái)解釋英語(yǔ)句子是如何變成法語(yǔ)句子的。記住,P(f|e) 是整個(gè)法語(yǔ)到英語(yǔ)的機(jī)器翻譯系統(tǒng)的模塊。當(dāng)我們看到一個(gè)法語(yǔ)句子 f,我們會(huì)反向推理:1. 說(shuō)出的英語(yǔ)句子可能是什么?2. 其中哪些可能被翻譯成 f ?我們尋找一個(gè)英語(yǔ)句子,它的 P(e) * P(f|e) 值是最大的。
英語(yǔ)如何變成法語(yǔ)?一個(gè)不錯(cuò)的理論認(rèn)為英語(yǔ)句子被轉(zhuǎn)換成謂詞邏輯(predicate logic),或者是原子邏輯斷言的邏輯并(conjunction of atomic logical assertions)。這些理論將語(yǔ)言中的“非邏輯”部分全部剔除。比如,“John must not go”被轉(zhuǎn)換成
OBLIGATORY(NOT(GO(JOHN)))
“John may not go”被轉(zhuǎn)換成
NOT(PERMITTED(GO(JOHN)))
注意,盡管這兩個(gè)句子的句法相似,NOT 運(yùn)算符的使用卻非常不同。這個(gè)理論的另一部分是謂詞邏輯是如何轉(zhuǎn)換成法語(yǔ)的。我喜歡這個(gè)理論。
另一個(gè)理論是說(shuō),英語(yǔ)句子被進(jìn)行句法分析(parsed syntactically)。具體說(shuō),一個(gè)二叉樹(shù)(binary tree diagram)用來(lái)表示這個(gè)句子,描述了主體(head)和修飾語(yǔ)(modifier)之間的句法關(guān)系。比如,主語(yǔ)/動(dòng)詞,形容詞/名詞,介詞短語(yǔ)/動(dòng)詞短語(yǔ),等等。這個(gè)樹(shù)緊接著被轉(zhuǎn)化成另一個(gè)代表法語(yǔ)句法關(guān)系的樹(shù)。這個(gè)過(guò)程中,短語(yǔ)被互換,英語(yǔ)單詞被法語(yǔ)對(duì)應(yīng)的單詞替代。這個(gè)理論稱(chēng)為句法遷移(syntactic transfer)。
還有一個(gè)理論,認(rèn)為英語(yǔ)句子中的單詞被法語(yǔ)單詞替換,然后它們?cè)谀腔靵y地移動(dòng)位置。這算個(gè)什么鬼理論?然而本教程的后續(xù)內(nèi)容就會(huì)使用這個(gè)理論。我們將這個(gè)理論稱(chēng)為 IBM Model 3(譯者注:此術(shù)語(yǔ)不進(jìn)行翻譯)。
至少,這個(gè)理論很簡(jiǎn)單。我們可以實(shí)現(xiàn)將任何英語(yǔ)句子轉(zhuǎn)換成任何法語(yǔ)句子,等會(huì)兒我們就會(huì)知道這是非常重要的。在其他理論里,我們并不清楚如何把句子進(jìn)行轉(zhuǎn)換。另一點(diǎn),P(f|e) 是不需要把英語(yǔ)轉(zhuǎn)換成優(yōu)秀的法語(yǔ)句子的。第七節(jié)和第八節(jié)中已經(jīng)討論過(guò),獨(dú)立訓(xùn)練的 P(e) 模塊會(huì)操心這個(gè)事情。
這個(gè)理論是這樣的:
- 對(duì)于英語(yǔ)句子(i = 1 ... l)中的每一個(gè)單詞 ei,我們選擇一個(gè)繁衍值(fertility)φi(讀作 “phi”,第二十一個(gè)希臘字母)。繁衍值的選擇僅僅取決于當(dāng)前句子中的單詞,不依賴(lài)于其他英語(yǔ)句子中的英語(yǔ)單詞以及它們的繁衍值。
- 對(duì)于每一個(gè)單詞 ei,我們生成 φi 個(gè)法語(yǔ)單詞。法語(yǔ)單詞的翻譯僅僅依賴(lài)于生成這個(gè)法語(yǔ)單詞的英語(yǔ)單詞,不依賴(lài)于英語(yǔ)單詞的上下文含義,也不依賴(lài)于其他通過(guò)當(dāng)前英語(yǔ)句子或其他英語(yǔ)句子已經(jīng)生成的任何法語(yǔ)單詞。
- 生成好的法語(yǔ)單詞被重新排列。每個(gè)法語(yǔ)單詞被給予在目標(biāo)法語(yǔ)句子中的絕對(duì)“位置編號(hào)”。比如,一個(gè)單詞可能被給予位置 3,另一個(gè)可能被給予位置 2 — 因此在最終的法語(yǔ)句子中,第二個(gè)單詞會(huì)排在第一個(gè)單詞的前面。法語(yǔ)單詞的位置選擇僅僅取決于生成它的英語(yǔ)單詞的絕對(duì)位置。
這個(gè)理論是不是很 funny?
十六、把翻譯當(dāng)成句子重寫(xiě)
你可以把這個(gè)生成理論當(dāng)做一種重寫(xiě)句子的方式。首先你寫(xiě)一個(gè)英語(yǔ)句子:
Mary did not slap the green witch
然后給繁衍值。對(duì)于第一個(gè)繁衍值,你可以簡(jiǎn)單地復(fù)制第一個(gè)單詞。對(duì)于第二個(gè)繁衍值,復(fù)制第二個(gè)單詞兩次。對(duì)于繁衍值 0,直接把原單詞扔掉。比如,我們可能給 “did” 為 0 的繁衍值。產(chǎn)生的新句子:
Mary not slap slap slap the the green witch
注意,“slap” 的繁衍值給了 3。接下來(lái),用法語(yǔ)單詞替換英語(yǔ)單詞(這里我用西班牙語(yǔ)吧,因?yàn)槲視?huì)西班牙語(yǔ))。這一步就一對(duì)一的做替換:
Mary no daba una botefada a la verde bruja
最后,我們重新排列單詞:
Mary no daba una botefada a la bruja verde
練習(xí)題:通過(guò)上面的生成理論把句子 “my child, you must go home” 用一門(mén)外語(yǔ)進(jìn)行翻譯。
十七、Model 3
在語(yǔ)言模型中,我們用生成理論 “人們基于上一個(gè)說(shuō)出的單詞來(lái)產(chǎn)生下一個(gè)新單詞”,和大量類(lèi)似 b(snakes|like) 的參數(shù)來(lái)確定了一個(gè)完整的模型。這些參數(shù)可以通過(guò)語(yǔ)料庫(kù)來(lái)取得?,F(xiàn)在,我們來(lái)做相同的事情。
在思考應(yīng)該擁有哪些參數(shù)的時(shí)候,我們只需要看看這個(gè)生成理論依賴(lài)了什么東西。比如,生成哪些法語(yǔ)單詞依賴(lài)了當(dāng)前的英語(yǔ)單詞。所以很容易可以想象出一個(gè)參數(shù) t(maison|house),它計(jì)算英語(yǔ)單詞 “house” 生成法語(yǔ)單詞 “maison” 的概率。繁衍值也一樣的,我們可以有一個(gè)參數(shù) n(1|house),它計(jì)算只要 “house” 出現(xiàn)時(shí),法語(yǔ)句子中就剛好有一個(gè)(不多不少)對(duì)應(yīng)的單詞的概率。被稱(chēng)為失真參數(shù)(distortion parameter)的東西也一樣,比如,d(5|2) 計(jì)算位于位置 2 的英語(yǔ)單詞生成的法語(yǔ)單詞剛好位于位置 5 的概率。事實(shí)上,Model 3 使用了一個(gè)略微優(yōu)化后的失真機(jī)制(distortion scheme),目標(biāo)位置會(huì)取決于英語(yǔ)句子和法語(yǔ)句子的長(zhǎng)度。因此這個(gè)參數(shù)看起來(lái)會(huì)是這樣 d(5|2, 4, 6),和 d(5|2) 的區(qū)別僅僅是多接受了英語(yǔ)句子的長(zhǎng)度 4 和法語(yǔ)句子的長(zhǎng)度 6。記住,失真參數(shù)不需要把每個(gè)法語(yǔ)單詞擺放成語(yǔ)法正確的。即使這個(gè)模型產(chǎn)生了爛法語(yǔ)也可以接受。
Model 3 有另一個(gè)優(yōu)化,真是“陰險(xiǎn)”。想象一些法語(yǔ)單詞是“偽造的”。就是說(shuō),他們神奇地出現(xiàn)在了最終的法語(yǔ)句子里,但卻沒(méi)有英語(yǔ)單詞對(duì)他們“負(fù)責(zé)”。比如,功能性單詞。想想上一節(jié)例子中的西班牙單詞 “a”。我給英語(yǔ)單詞 “the” 的繁衍值是 2,它最終產(chǎn)生了西班牙語(yǔ)里的 “a”。更好的做法可能是給 “the” 的繁衍值為 1,然后讓 “a” 被“偽造地”生成。
為了給這個(gè)現(xiàn)象建模,我們假定每一個(gè)英語(yǔ)句子在初始時(shí)都有一個(gè)不可見(jiàn)的單詞 NULL,它位于位置 0。我們給一個(gè)參數(shù) t(maison|NULL),它計(jì)算由 NULL 生成“偽造”單詞 maison 的概率。
我們也可以給類(lèi)似 n(3|NULL) 的參數(shù),它計(jì)算在最終的法語(yǔ)句子中有 3 個(gè)(不多不少)“偽造”單詞的概率。但是,Model 3 擔(dān)心長(zhǎng)句子會(huì)有更多的“偽造”單詞。這突如其來(lái)的顧慮,看不懂。但不管怎樣,相比于 n(0|NULL) ... n(25|NULL),我們可以只有一個(gè)浮點(diǎn)數(shù)參數(shù),稱(chēng)為 p1。你可以這樣理解 p1:在我們給所有“真正的”英語(yǔ)單詞(除了 NULL)設(shè)置繁衍值之后,我們就可以生成比如 z 個(gè)法語(yǔ)單詞。當(dāng)我們生成每個(gè)法語(yǔ)單詞時(shí),我們選擇性地通過(guò)概率 p1 把“偽造”單詞塞進(jìn)去。對(duì)于不把“偽造”單詞塞進(jìn)去的概率,我們用 p0 = 1 - p1 來(lái)表示。
練習(xí)題:如果一個(gè)英語(yǔ)單詞的繁衍值的最大值是 2,對(duì)于一個(gè)長(zhǎng)度為 l 的英語(yǔ)句子,對(duì)應(yīng)的法語(yǔ)句子的最大長(zhǎng)度是多少?(別忘記 NULL 生成的“偽造”單詞)
最后,我們來(lái)看看 NULL 生成的“偽造”單詞的失真概率。我擔(dān)心用參數(shù) d(5|0, 4, 6) 來(lái)計(jì)算太簡(jiǎn)單了,d(5|0, 4, 6) 的意思是 NULL 會(huì)生成位于位置 5 而不是其他位置的法語(yǔ)單詞的幾率。這些可是“偽造”的單詞啊,朋友!他們可以出現(xiàn)在任何位置!去預(yù)測(cè)它沒(méi)有意義的!相反,我們使用正常單詞的失真概率來(lái)選擇被正常生產(chǎn)的法語(yǔ)單詞的位置,然后把 NULL 生成的“偽造”單詞放在剩余的空位。如果 NULL 生成了 三個(gè)單詞,有三個(gè)空位,那就有 3!(3 的階乘),6 種方式去填充它們。我們給每一種方式 1/6 的概率。
我們現(xiàn)在可以完整地梳理模型 Model 3 了:
- 通過(guò)繁衍值概率 n(φi|ei),給每個(gè)英語(yǔ)單詞 ei,i = 1, 2, ..., l,提供一個(gè)繁衍值 φi。
- 通過(guò) p1 概率以及上一步中的所有繁衍值 ei 的總和,給由 e0 = NULL 生成的“偽造”單詞,也提供一個(gè)繁衍值 φ0。
- 讓 m 等于所有單詞的繁衍值的和,包括 NULL。
- 對(duì)于每一個(gè) i = 0, 1, 2, ..., l, k = 1, 2, ..., φi,通過(guò)概率 t(τik|ei),提供一個(gè)法語(yǔ)單詞 τik。( τ(譯者注:不是英語(yǔ)字母 T) 讀作 “tau”,第十九個(gè)希臘字母)。
- 對(duì)于每一個(gè) i = 1, 2, ..., l,k = 1, 2, ..., φi,通過(guò)概率 d(πik|i,l,m),提供法語(yǔ)句子中的目標(biāo)位置 πik(讀作 “pi”,第十六個(gè)希臘字母)。(譯者注:m 指目標(biāo)法語(yǔ)句子的長(zhǎng)度)。
- 對(duì)于每一個(gè) k = 1, 2, ..., φ0,通過(guò) 1/(φ0!) 的概率,從一共 m 個(gè)位置中的 φ0 - k + 1 個(gè)剩余空位中選出一個(gè)位置 π0k。
- 通過(guò)位于位置 πik 的法語(yǔ)單詞 Tik ,輸出整個(gè)法語(yǔ)句子。(0 ≤ i ≤ l, 1 ≤ k ≤ φi)。
如果你想從句子重寫(xiě)的角度來(lái)思考,參考下面的步驟:
- Mary did not slap the green witch (輸入)
- Mary not slap slap slap the green witch (提供繁衍值)
- Mary not slap slap slap NULL the green witch (提供“偽造”單詞的個(gè)數(shù))
- Mary no daba una botefada a la verde bruja (提供替代的單詞)
- Mary no daba una botefada a la bruja verde (提供目標(biāo)句子中的位置)
十八、Model 3 的參數(shù)
看得出來(lái),這個(gè)模型有四種參數(shù):n,t,p 和 d。n 和 t 是由浮點(diǎn)數(shù)組成的二維表。d 是由浮點(diǎn)數(shù)組成的一維表。p 是一個(gè)單獨(dú)的浮點(diǎn)數(shù)。這個(gè)模型沒(méi)有任何魔法:它幾乎只是一堆數(shù)字而已!
練習(xí)題:如果每一個(gè)浮點(diǎn)數(shù)占用 4 字節(jié)(bytes)的內(nèi)存,要存儲(chǔ)所有的表,你認(rèn)為需要多少的空間?
譯者:
第一部分正文結(jié)束
繼續(xù)第二部分正文(最后一部分)