Byte Pair Encoding · BPE
整個演算法只有一條規則,而且你三秒就懂。難的是它跑了幾萬次以後,長出來的東西出乎意料地像語言學。
找出最常相鄰的兩個 → 合成一個新符號 → 回頭再找一次 → 重複。
要把文字餵給模型,得先切成一塊一塊。兩個最直覺的切法,兩邊都不能用。
下面是九個英文詞和它們的出現次數。一開始全部拆成單一字母,· 代表詞的結尾。每按一次,就合併當下最常相鄰的那一對。
「總共幾塊」= 把這九個詞按出現次數全部攤開來要用掉幾個 token。
跑完 14 步,這些東西自己浮出來 — 沒有人告訴過它英語有詞綴。
詞幹和詞尾,分得乾乾淨淨。純粹是因為它們常常黏在一起,不是因為它懂構詞。
newest 太常出現,整個詞被吞成一塊;widest 卻還是 wid + est·。同樣是「形容詞+最高級」,切法完全不同 — 因為 BPE 只看次數。wide 最後長這樣:wid + e + ·。對人來說這是把詞根砍了一刀,對 BPE 來說完全合理。英文靠空格分詞,中文沒有。所以現在的做法更暴力:直接在 UTF-8 的位元組上跑 BPE,根本不管什麼是字。
一個漢字是 3 個位元組。常見的字在訓練時被合併成 1 塊,罕見的字就得花上 2、3 塊拼出來。同樣一句話,中文用掉的 token 常常比英文多 — 這也是為什麼中文用 API 有時候比較貴。
一條「把常見的黏起來」的規則,
跑上幾萬次,就長成了一整套詞彙表。