從詞表到子詞:Tokenizer 的“進化樹”
我們常說“語言模型是理解人類語言的工具”,但事實上,模型能不能“理解”,關鍵要看它接收到了什么樣的輸入。而 Tokenizer,就是這一輸入階段的設計者。
在 NLP 的發展歷程中,從詞級到子詞級、再到字符級和字節級,Tokenizer 的變化不僅是技術演化的軌跡,更體現了我們對語言結構理解方式的不斷革新。
1. 詞級 Tokenizer:早期的起點與硬性邊界
詞級分詞曾是 NLP 世界的黃金標準。以 Word2Vec 和 GloVe 為代表,這些模型首先基于大量語料,建立起一個固定的“詞表”(Vocabulary),每個詞就是一個最小處理單元。
例如,“natural language processing” 這句話就會被視作三個 token。
優點:
- 粒度直觀,符合人類語言認知
- 訓練速度快,易于構建詞向量
局限:
- 無法處理未登錄詞(Out-of-Vocabulary, OOV),比如“ChatGPTify”就無法表示。
- 對多語言、混合語言、拼寫錯誤極其不友好
- 無法建模詞形變化(dogs/dogged/dogging被視為完全不同的詞)
中文、日文等沒有自然詞邊界的語言,在詞級分詞中面臨極大困難,往往依賴規則/統計分詞器(如jieba、THULAC)作為前處理,造成額外偏差。
這也是“開放詞匯建模”(Open Vocabulary Modeling)成為研究新方向的原因。
2. 子詞級 Tokenizer:開啟開放詞匯建模新時代
為了兼顧詞表大小、語義表達能力與泛化能力,NLP 社區引入了“子詞建模”思路。它的核心是將詞切成常見的片段組合,這些片段可以是詞根、前綴、后綴,也可以是無意義但頻繁出現的字串。
2.1 BPE(Byte Pair Encoding)
BPE 最初是用于壓縮編碼的技術,Sennrich 等人于2015年首次將其用于神經機器翻譯中,解決未登錄詞問題。
核心思想:
- 初始詞表為所有字符
- 統計所有相鄰字符對的頻率,合并出現最頻繁的一對
- 重復步驟2直到達到預設詞表大小
例如:
- 輸入詞:“unbelievable” → 初始 token 序列:[u, n, b, e, l, i, e, v, a, b, l, e]
- 合并“e” + “l” → “el”,再合并“el” + “i” → “eli”,最終形成 [un, believ, able]
優點:
- 簡單、高效,可用于任意語言
- 沒有 UNK,新詞總能被切分
缺點:
- 貪心合并:容易忽略語義結構,切分不穩定
- 對高資源語言效果好,但在語言形態多樣性高時表現欠佳
2.2 WordPiece:統計驅動的語言建模方法
WordPiece 最早由 Google 用于語音識別(Schuster & Nakajima, 2012),后在 BERT 中廣泛使用。
與 BPE 不同,WordPiece 合并子詞對時的目標是最大化整個訓練語料的語言模型概率。
即每次選擇合并那一對子詞,使得合并后對數似然增加最多:
argmax A , B log ? P ( A + B ) ? [ log ? P ( A ) + log ? P ( B ) ] \text{argmax}_{A,B} \log P(A+B) - [\log P(A) + \log P(B)] argmaxA,B?logP(A+B)?[logP(A)+logP(B)]
優點:
- 合并更有“語言感知”,效果穩定
- BERT tokenizer 中,子詞帶有“##”前綴用于表示續接(如:##able)
缺點:
- 需要預訓練語言模型支持
- 實現更復雜,計算成本高于 BPE
2.3 SentencePiece:語言無關的統一分詞框架
Kudo 提出的 SentencePiece 徹底打破了“先分詞再建模”的傳統,直接對原始字符流進行建模(空格也作為 token 學習)。
支持兩種模式:
- BPE(與傳統 BPE 類似)
- Unigram Language Model(如下)
適用于中、日等無空格語言,同時還提供了“子詞正則化”技術:訓練中允許多個切分方式,提高魯棒性。
額外特點:
- 使用特殊字符“▁”表示詞的起始,相當于“空格”顯式化處理
- 支持子詞概率采樣/維特比解碼
2.4 Unigram Language Model(子詞剪枝)
Unigram 模型是從一個冗余的大詞表開始,然后反復移除對語料概率貢獻最小的 token。
其建模目標是最大化每句話的 token 序列的總概率:
P ( w ) = ∏ i = 1 n P ( t i ) P(w) = \prod_{i=1}^{n} P(t_i) P(w)=∏i=1n?P(ti?)
通過 EM 訓練得到 token 概率后,逐步剪枝,留下最優子詞表。
優點:
- 保留多種切分路徑
- 支持訓練時采樣,增強泛化能力
缺點:
- 訓練代價高,需優化動態規劃
3. 字符級與字節級:從建模單位回歸信號粒度
研究者逐漸意識到,復雜的 tokenizer 也可能帶來誤差。尤其是在處理拼寫錯誤、多語言、emoji 等情況時,子詞方法仍然存在局限。
于是,部分研究回歸“字符”或“字節”粒度輸入,讓模型完全自己學:
ByT5(2021)
- 直接使用 UTF-8 字節作為 token,詞表大小 = 256
- 訓練 Transformer 模型直接建模字節序列
- 提供強大跨語言能力,對噪聲、拼寫錯誤更魯棒
CANINE
- 用字符作為輸入 token,再通過下采樣壓縮為較短序列以降低計算成本
- 優化了字符模型計算瓶頸,實現與 BERT 相近的效果
優劣權衡:
粒度 | 優點 | 缺點 |
---|---|---|
子詞 | 語義強、長度短 | 易出錯,詞表限制 |
字節 | 無語言限制,容錯性強 | 長度暴漲,建模更難 |
4. Tokenizer 與預訓練模型協同演化
Tokenizer 不再只是“工具”,而變成了模型訓練任務的一部分設計:
- T5 設計了特殊 token(extra_id_0 ~ extra_id_99)用于“span-infilling”任務,這些 token 被納入 tokenizer 的靜態詞表
- GPT 系列 使用 byte-level BPE,對 emoji、拼音、標點處理能力大大增強
- mBERT / XLM-R 使用跨語言共享詞表(WordPiece / BPE),幫助模型學習不同語言的統一表示空間
研究還在探索 動態 Tokenizer,例如 TLM(Token Learner Module),讓 Transformer 模塊本身決定如何分割/聚合 token,從而實現更加自適應的輸入建模。
Tokenizer 演化時間線小結
年代 | 代表技術 | 粒度 | 策略類型 | 應用代表 |
---|---|---|---|---|
2013前后 | Word2Vec / GloVe | 詞級 | 固定詞表 | Word2Vec, GloVe |
2015 | BPE | 子詞級 | 貪心合并 | OpenNMT, RoBERTa |
2018 | WordPiece | 子詞級 | 最大似然合并 | BERT, mBERT |
2018 | SentencePiece+BPE | 子詞級 | 無預處理 + 合并 | ALBERT, T5 |
2018 | SentencePiece+Unigram | 子詞級 | 無預處理 + 剪枝 | XLNet, T5 |
2019 | Byte-level BPE | 字節級 | 字節合并 | GPT-2, GPT-3 |
2021 | ByT5 | 字節級 | 無分詞 | ByT5 |
2021 | CANINE | 字符級 | 下采樣壓縮 | CANINE |
寫在最后:Tokenizer 是“理解單位”的科學
Tokenizer 不只是為了節省長度、提升效率,更是為了讓模型對語言有更深入、系統的建模方式。
今天的 tokenizer,已經從“靜態規則”演進到“可學習模塊”;從“輔助工具”升級為“認知中介”。
而隨著語言模型不斷演進,我們也逐漸意識到:Tokenizer 不應當是障礙,而應當是助力。
下一篇,我們將走進多模態時代的 tokenizer:圖像、音頻、視頻、表格……這些非文本的輸入,又是如何“被切”的?又如何與文本 token 融為一體?
敬請期待。