實算篇 · 接續〈切字積木三兄弟〉

拿《愛麗絲夢遊仙境》
真的算一次

不用編的數字了。把整本小說丟進去,讓三個方法各學 1,500 塊積木,看它們實際挑了什麼、怎麼切字。

27,427
詞次(全部小寫,只留 a–z)
2,575
不同的詞
1,500
每個方法學到的積木(詞片)數

語料:Project Gutenberg #11,公有領域,去掉前後的版權說明。

WordPiece · 第一輪

同一份語料,第一步就分道揚鑣

WordPiece 的分數 = 一起出現次數 ÷ (左邊次數 × 右邊次數)。
BPE 只看最左邊那個數字。

配對一起出現次數(BPE 看這個)黏性分數 ×10⁻⁵(WordPiece 看這個)
##h+##eBPE 選
3,118(h 5,805 · e 13,225)
4.1
t+##h
2,949(t 4,695 · h 5,805)
10.8
##n+##g
1,141(n 6,444 · g 1,955)
9.1
q+##u
188(q 188 · u 3,210)
31.2
e+##x
73(e 396 · x 146)
126.3
##z+##zWP 選
14(z 76 · z 76)
242.4

WordPiece 的單位:開頭的字母照寫(t、q),字中間的加 ##,所以字首的 t 和字中的 ##t 分開計數。zz 只在 puzzle、puzzling、puzzled 裡出現,共 14 次,排在 556 對裡的第 404 名;但 z 本身很少見,一出現就常常成雙。q 出現的 188 次全都接著 u。

BPE 前 10 次合併

hetheinanouiteratonre

全是英文裡最常見的字母組合。

WordPiece 前 10 次合併

##zzex##bjevupexpof##bbqu##uzz

稀有但分不開的組合:puzzle、subject、rabbit、queen…

真實語料的意外:在這麼小的語料上,WordPiece 太偏愛稀有組合,學完 1,500 塊後,常見的 wondering 反而被切成 7 塊(見最後的對照表)。BERT 用 30,000 塊、數十億詞的語料,才不會這樣。

Unigram LM · 切法比較

lowest 不在書裡,它怎麼切?

訓練完,每塊積木都有一個機率。一種切法的分數 = 每塊機率相乘。lowest 共有 20 種合法切法,挑最高的那一種。

lowest
1.02 × 10⁻⁷ ✔ 最高low 5.9e-4 × est 1.7e-4
lowest
5.44 × 10⁻⁸(約最高的一半)low × e 3.6e-2 × s 5.4e-2 × t 4.8e-2
lowest
1.31 × 10⁻⁸(最高的 1/8)low × e × st 6.2e-4
lowest
9.19 × 10⁻⁹(最高的 1/11)low × es 3.2e-4 × t
lowest
1.18 × 10⁻¹⁰(最高的 1/860)六個字母相乘

長條用對數尺度(10⁻¹¹ 到 10⁻⁷),不然只有第一條看得見。有趣的是 low e s t 只輸一半:單個字母的機率很高,所以多切幾塊不一定輸很多。

書裡常見的字:整塊贏

turtle出現 60 次 → 1.42 × 10⁻³
turtle→ 1.59 × 10⁻⁹

整塊的機率約是拆開的 89 萬倍。這就是為什麼常見字會自己變成一塊積木。

砍積木:誰最捨不得丟?

試著拿掉一塊,重新切整本書,看總 log 機率掉多少(自然對數)。

the
−10,084
and
−5,143
ing
−3,317
you
−3,082
rock
−0.06
wa
−0.04

拿掉 the,書裡 1,916 處用到它的地方都得改切(光是 the 本身就有 1,651 次,會變成 t+he);拿掉 rock,只有那 1 個 rock 改切成 r+ock。下一輪就先砍 rock 這一類。

學完 1,500 塊之後,同一個字三種切法

字書中次數BPEWordPieceUnigram LM
turtle60
turtle
turtl##e
turtle
queen76
queen
qu##e##e##n
queen
mushroom8
mushroom
mushroom
mushroom
dormouse40
dormouse
dormous##e
dormouse
wondering7
wondering
w##o##n##d##e##r##ing
wondering
playing2
playing
p##l##a##y##ing
playing
curiouser2
curiouser
curious##e##r
curiouser
beautifully2
beautifully
b##e##autiful##l##y
beautifully
impossible3
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 修剪過程。