Subword Tokenization · ELI5

電腦讀字前,
要先把字切成積木

太大塊(整個單字)→ 字典爆炸;太小塊(一個字母)→ 句子太長。
三兄弟都想找「剛剛好」的積木,只是挑積木的規則不一樣。

unhappiness
11 塊,太碎 😵
↓
unhappiness
3 塊,剛剛好 👍  沒看過的字也拼得出來

一張圖看懂:往哪個方向長?

BPE 由小黏大 ⬆ 看誰最常站一起
WordPiece 由小黏大 ⬆ 看誰意外地黏很緊
Unigram LM 由大砍小 ⬇ 先拿一大堆,砍掉最沒用的
① BPE · Byte-Pair Encoding

「誰最常手牽手?黏起來!」

數一數:哪兩塊積木最常貼在一起?就把它們黏成一塊。重複做,直到積木數量夠了。

範例語料:low ×5、lower ×2、newest ×6、widest ×3

開始:全是字母
newestlow
第 1 黏:e+s(9 次)
newestlow
第 2 黏:es+t(9 次)
newestlow
第 3、4 黏:l+o → lo+w(7 次)
newestlow

切新字時:照「黏的順序」重播一次。GPT 系列用的是 byte-level BPE(從位元組開始黏,所以任何字都切得動,包括中文和 emoji)。

② WordPiece

「不是最常見,是最分不開」

跟 BPE 一樣往上黏,但打分方式不同:兩塊很常一起出現,而且各自單獨時很少見,才值得黏。

以下數字來自《愛麗絲夢遊仙境》全書(27,427 個詞次,全部小寫)。

BPE 的眼光:只看次數

h+e 一起 3,118 次
q+u 一起 188 次

→ 選 he(3,118 > 188)

WordPiece 的眼光:看「黏性」

h+e 3,118 ÷ (h 5,805 × e 13,225) = 0.000041
q+u 188 ÷ (q 188 × u 3,210) = 0.00031

→ 選 qu(黏性約 7.7 倍;書裡 188 個 q 全都接著 u)

切新字時:貪心從左邊抓最長的
turtl##elow##e##s##t

## =「我是接在前面那塊後面的」。BERT 家族就是用這個。這是在《愛麗絲》上學 1,500 塊後的真實切法:語料太小,WordPiece 常把字尾拆成單個字母。

③ Unigram Language Model

「先拿一大堆,再丟掉最沒用的」

反方向!先準備一個超大積木箱,每塊有「常見機率」。每一輪丟掉「丟了也最不心疼」的積木,直到箱子夠小。

它切字時會比較好幾種切法,挑整體機率最高的那個(每塊機率相乘):

lowest
0.00059 × 0.00017 ≈ 1.0 × 10⁻⁷ ✔
lowest
≈ 5.4 × 10⁻⁸(約一半)
lowest
≈ 1.2 × 10⁻¹⁰(1/860)

機率是在《愛麗絲》上訓練 1,500 塊後的真實值。lowest 不在書裡,共有 20 種切法。長條用對數尺度(10⁻¹¹ 到 10⁻⁷)。

因為手上有「每種切法的機率」,它還能故意偶爾換一種切法訓練模型(subword regularization),讓模型更耐打。T5、ALBERT、XLNet 用它(透過 SentencePiece)。

三兄弟對照表

方向挑積木的規則切新字的方式代表模型
BPE小 → 大(黏)一起出現次數最多照黏的順序重播GPT-2/3/4、RoBERTa、LLaMA
WordPiece小 → 大(黏)次數 ÷ 各自次數(黏性)從左貪心抓最長,## 標接續BERT、DistilBERT、ELECTRA
Unigram LM大 → 小(砍)砍掉後總機率掉最少的比較所有切法,挑機率最高T5、ALBERT、XLNet、mBART

小提醒:SentencePiece 不是第四種演算法,而是一個工具箱,裡面可以選 BPE 或 Unigram;它把空白也當成一般字元(▁),所以中文、日文這種不用空白分詞的語言也能直接用。