从词表到子词: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,BlogP(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=1nP(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 融为一体?
敬请期待。