不用編的數字了。把整本小說丟進去,讓三個方法各學 1,500 塊積木,看它們實際挑了什麼、怎麼切字。
語料:Project Gutenberg #11,公有領域,去掉前後的版權說明。
WordPiece 的分數 = 一起出現次數 ÷ (左邊次數 × 右邊次數)。
BPE 只看最左邊那個數字。
WordPiece 的單位:開頭的字母照寫(t、q),字中間的加 ##,所以字首的 t 和字中的 ##t 分開計數。zz 只在 puzzle、puzzling、puzzled 裡出現,共 14 次,排在 556 對裡的第 404 名;但 z 本身很少見,一出現就常常成雙。q 出現的 188 次全都接著 u。
全是英文裡最常見的字母組合。
稀有但分不開的組合:puzzle、subject、rabbit、queen…
真實語料的意外:在這麼小的語料上,WordPiece 太偏愛稀有組合,學完 1,500 塊後,常見的 wondering 反而被切成 7 塊(見最後的對照表)。BERT 用 30,000 塊、數十億詞的語料,才不會這樣。
lowest 不在書裡,它怎麼切?訓練完,每塊積木都有一個機率。一種切法的分數 = 每塊機率相乘。lowest 共有 20 種合法切法,挑最高的那一種。
長條用對數尺度(10⁻¹¹ 到 10⁻⁷),不然只有第一條看得見。有趣的是 low e s t 只輸一半:單個字母的機率很高,所以多切幾塊不一定輸很多。
整塊的機率約是拆開的 89 萬倍。這就是為什麼常見字會自己變成一塊積木。
試著拿掉一塊,重新切整本書,看總 log 機率掉多少(自然對數)。
拿掉 the,書裡 1,916 處用到它的地方都得改切(光是 the 本身就有 1,651 次,會變成 t+he);拿掉 rock,只有那 1 個 rock 改切成 r+ock。下一輪就先砍 rock 這一類。
| 字 | 書中次數 | BPE | WordPiece | Unigram LM |
|---|---|---|---|---|
turtle | 60 | turtle | turtl##e | turtle |
queen | 76 | queen | qu##e##e##n | queen |
mushroom | 8 | mushroom | mushroom | mushroom |
dormouse | 40 | dormouse | dormous##e | dormouse |
wondering | 7 | wondering | w##o##n##d##e##r##ing | wondering |
playing | 2 | playing | p##l##a##y##ing | playing |
curiouser | 2 | curiouser | curious##e##r | curiouser |
beautifully | 2 | beautifully | b##e##autiful##l##y | beautifully |
impossible | 3 | impossible | impossibl##e | impossible |
lowest | 沒出現 | lowest | low##e##s##t | lowest |
unhappiness | 沒出現 | unhappiness | unhapp##i##n##e##s##s | unhappiness |
怎麼讀這張表:BPE 和 Unigram 都學到了 play+ing、beautiful+ly 這種像詞素的切法。WordPiece 在小語料上常把字尾拆成一個個字母(##e ##r)。Unigram 偶爾切得很怪(d+ormous+e):它只在乎機率,不懂詞素。
BPE 和 WordPiece 用自己寫的 Python,逐步合併 1,500 次;WordPiece 的分數公式照 Hugging Face 教材的寫法,切新字用「從左貪心抓最長」。Google 原版 WordPiece 是用語言模型的概似度挑選,細節不同。Unigram 用 Hugging Face tokenizers 0.19.1 的 UnigramTrainer 訓練到 1,500 塊;機率取自訓練出的模型,切法用 Viterbi 找最高分。「砍積木」的損失是另外算的:每次只拿掉一塊、重新正規化機率、重切受影響的詞,只算一輪,不是完整的 EM 修剪過程。