大模型分词技术以及相关的有趣现象:论文笔记
来源 PDF:大模型分词技术以及相关的有趣现象.pdf
0. 一句话总结
Tokenizer 不是简单的文本预处理模块,而是大模型效率、语义表达、多语言能力、生成稳定性和推荐系统建模方式的重要组成部分。词表大小、分词算法、低频 token 覆盖、输入/输出词表设计都会影响模型训练和推理表现。
0.1 结构化阅读卡片
解决什么问题?
这篇文章主要解决的是:为什么大模型必须分词,以及 tokenizer 会如何影响模型效率、训练成本、多语言能力和生成稳定性。
具体包括五类问题:
- 文本不能直接输入神经网络,必须先变成 token ID。
- 字符级切分序列太长,词级切分词表太大,因此需要子词分词。
- 不同 tokenizer 的词表大小不同,会导致压缩率、显存占用、推理速度差异。
- 大词表会带来低频 token 学习不足的问题,例如“马嘉祺”案例。
- 推荐系统中的用户行为序列也面临类似的 tokenization 问题,不能只用静态 item ID 表示。
用了什么方法?
文章主要介绍和串联了以下方法:
- 子词分词方法:BPE、WordPiece、Unigram、SentencePiece。
- 词表规模分析:通过压缩率、词表大小、embedding / LM Head 参数量分析 tokenizer 的效率和代价。
- Tokenizer Scaling Law:讨论模型规模、训练 FLOPs 和最优词表大小之间的关系。
- 输入/输出词表解耦:通过 Over-Tokenized Transformer 说明输入词表和输出词表的扩展收益不同。
- 案例 Debug:用“马嘉祺”案例解释低频 token 在 SFT、LM Head 和采样阶段可能出现的生成失败。
- 推荐系统迁移:用 ActionPiece 把 BPE 式 token 合并思想迁移到用户行为序列建模。
关键启发是什么?
关键启发是:
Tokenizer 是模型能力的一部分,不是无关紧要的预处理步骤。
具体启发包括:
- 词表越大,文本压缩率通常越高,但低频 token 更难训练好。
- tokenizer 一旦确定,就会绑定模型参数、训练数据和推理生态,所以大模型迭代时通常不轻易换词表。
- 多语言模型的效果不仅取决于训练数据,也取决于不同语言在 tokenizer 下被切得是否高效。
- 模型“知道但说不出”某个词,可能不是知识缺失,而是 token 生成概率、后训练覆盖和 LM Head 问题。
- 推荐系统也可以借鉴 tokenizer 思想,把 item ID 升级为上下文感知的行为 token。
作者想表达什么?
文章想表达的是:
分词器决定了模型如何“看见”和“生成”文本。它影响序列长度、计算成本、词表参数、低频词学习、多语言公平性和下游任务建模方式,因此应该被当成大模型系统设计的重要组成部分。
换句话说,tokenizer 不只是把字符串切一切,而是大模型输入输出空间的底层协议。
总结是什么?
可以总结为三句话:
- 大模型需要 tokenizer,是因为模型只能处理数字,而子词分词能在字符级和词级之间取得平衡。
- tokenizer 的词表大小会影响压缩率、训练成本和低频 token 稳定性,因此存在效率与模型容量之间的权衡。
- 从 LLM 到推荐系统,tokenization 的本质都是把原始对象转成更适合模型学习的离散语义单元。
1. 为什么需要分词?
自然语言原始形态是文本,但神经网络只能处理数值。因此文本进入模型前必须被转换成整数 ID 序列:
文本 → Tokenizer → Token 序列 → Token ID 序列 → Embedding → 模型
最直接的两种方式都有明显问题:
| 方式 | 做法 | 问题 |
|---|---|---|
| 字符级切分 | 每个字、字母、标点都是一个 token | 序列太长,计算成本高,单个字符语义弱 |
| 词级切分 | 每个完整词作为一个 token | 词表巨大,遇到未登录词会出现 OOV 问题 |
现代大模型主流采用 子词分词(Subword Tokenization):
- 高频词或常见片段保留为完整 token;
- 低频词、生僻词拆成更小的子词;
- 在词表大小、序列长度、语义表达和泛化能力之间取得折中。
核心目标是:
用有限词表表示开放词汇,同时尽量减少 token 数量。
2. 主流分词算法
现代 tokenizer 通常先把文本统一成 Unicode 字符序列,再进行子词学习。这样中文、英文、标点、emoji 等都能被统一处理,底层不需要依赖具体语言规则。
2.1 BPE:Byte Pair Encoding
BPE 的核心思想是:
从字符级开始,不断合并训练语料中出现频率最高的相邻 token 对。
基本流程:
- 初始化:每个字符都是一个 token;
- 统计所有相邻 token pair 的出现频率;
- 合并频率最高的 token pair;
- 更新语料中的 token 序列;
- 重复直到词表达到目标大小。
示例:
lower, lowest
可能学到:low, er, est
特点:
- 简单、高效;
- 贪心合并,只保证局部最优;
- 常用于 GPT 系列、RoBERTa 等模型。
2.2 WordPiece
WordPiece 和 BPE 类似,也从小词表逐步扩展,但合并依据不是单纯频率,而是:
选择能最大化训练数据似然的子词。
常见标记方式是用 ## 表示非词首子词:
playing → play + ##ing
特点:
- 相比 BPE 更强调语言模型概率;
- BERT、DistilBERT 等模型采用 WordPiece;
- 对英文词缀、词根结构比较友好。
2.3 Unigram Language Model
Unigram 的方向和 BPE / WordPiece 相反:
先构造一个很大的候选词表,再逐步剪枝,删除贡献较小的子词。
基本流程:
- 初始化一个尽可能完整的候选词表;
- 用语言模型和 EM 算法估计每个子词的重要性;
- 删除对整体似然影响最小的一批子词;
- 重复剪枝直到词表达到目标大小。
特点:
- 支持概率化切分;
- 同一句话可以有多种合理分词路径;
- 算法根据概率选择最优切分;
- T5、XLM 等模型采用过该类方法。
2.4 SentencePiece
传统 BPE 往往先做预分词,例如按空格切成单词,再在单词内部做 BPE。这对英语自然,但对中文、日文等无空格语言不友好。
SentencePiece 的核心创新是:
直接在原始文本上学习分词,不依赖空格作为词边界。
它还会把空格显式编码成普通字符,常见形式是 ▁。这样分词结果可以无损还原回原始文本。
特点:
- 不依赖语言特定规则;
- 对中文、日文、多语言混合更稳健;
- LLaMA、Mistral 等主流开源模型常用 SentencePiece 或类似思想。
2.5 四种算法对比
| 方法 | 核心思想 | 典型模型 | 优点 | 局限 |
|---|---|---|---|---|
| BPE | 高频相邻 token pair 合并 | GPT、RoBERTa | 简单高效,压缩率好 | 贪心合并,可能局部最优 |
| WordPiece | 最大化训练数据似然 | BERT | 概率目标更合理 | 实现和训练相对复杂 |
| Unigram | 大词表开始,逐步剪枝 | T5、XLM | 支持多路径概率切分 | 训练成本更高 |
| SentencePiece | 直接处理原始文本,不依赖空格 | LLaMA、Mistral | 语言无关,多语言友好 | 具体效果仍依赖语料和词表设计 |
3. 分词对大模型的影响
3.1 词表大小与压缩率
压缩率可以理解为:
\[\text{压缩率} = \frac{\text{原始文本字符数}}{\text{分词后 token 数}}\]同一段文本下:
Token 数越少 → 序列越短 → 压缩率越高
大词表通常能提高压缩率,因为它能收录更多常见长片段。
例如:
人工智能
小词表可能切成:
人 / 工 / 智 / 能
大词表可能切成:
人工智能
所以大词表的直观效果是:
词典更厚,常见词或短语可以直接查到,不必拆得太碎。
需要注意:原文中“更细粒度的常用词被整体保留”更准确应表述为“更粗粒度的常用片段被整体保留”。
3.2 大词表的代价
词表不是免费扩大的。词表大小为 (V),隐藏维度为 (d) 时,输入 embedding 参数约为:
\[V \times d\]输出层 LM Head 通常也与词表大小相关。词表越大:
- embedding 参数越多;
- LM Head 参数越多;
- softmax 输出维度越大;
- 训练通信和显存压力增加;
- 低频 token 更难被充分训练。
因此 tokenizer 设计本质上是在做权衡:
| 词表大小 | 优点 | 缺点 |
|---|---|---|
| 小词表 | 参数少,输出层便宜,低频 token 少 | 文本切得碎,序列更长 |
| 大词表 | 压缩率高,序列更短,多语言更友好 | 参数变多,低频 token 学习困难 |
3.3 PDF 中给出的模型词表大小
下表为 PDF 中的摘录,实际工程中建议以官方 tokenizer 配置为准。
| 模型 | 词表大小 | 备注 |
|---|---|---|
| Gemma | 256K | 大词表 |
| GPT-4o / o1 | 200K | 非英语语言压缩率提升 |
| Qwen 2.5 | 约 152K | 针对多语言优化 |
| Qwen 3.5 | 248K | PDF 中给出的数字 |
| DeepSeek-V3 | 约 129K | 比 V2 更大 |
| Llama 3 | 128K | 相比 Llama 2 的 32K 大幅提升 |
| GLM3 | 65,024 | PDF 中称相比早期 150K 缩小 |
| GLM4 | 151,328 | 大词表 |
| GLM5.1 | 154,880 | PDF 中给出的数字 |
3.4 为什么大模型迭代时通常不迭代词表?
主要原因有两个。
第一,生态惯性。
Tokenizer 绑定了:
- token-id 映射;
- embedding 参数;
- LM Head 参数;
- 预处理后的训练数据;
- LoRA / adapter;
- 推理引擎;
- 量化和部署工具链。
换词表相当于改变模型底层接口。
第二,收益边际递减。
当词表已经达到 100K 以上时,继续扩大词表带来的压缩率提升有限,但参数、训练、兼容性和低频 token 问题仍然存在。
所以大模型一般在预训练前确定 tokenizer,后续版本尽量沿用。少量追加特殊 token 可以做,但大规模换词表通常只会发生在新一代模型重新训练时。
3.5 分词与多语言能力:Token Tax
Token Tax 指不同语言在同一个 tokenizer 下会被切成不同数量的 token,从而承担不同计算成本。
例如:
- 英语、拉丁文字语言通常 tokenization 效率较高;
- 非拉丁文字语言、形态复杂语言可能需要更多 token;
- token 数越多,同样语义表达需要更长序列,训练和推理成本更高。
相关概念:
Token Fertility:平均每个词被切成多少 token。
Token Fertility 越高,说明一种语言被切得越碎,模型处理成本越高,效果也可能下降。
4. Tokenizer 也有 Scaling Law 吗?
这一部分的核心问题是:
模型变大时,词表大小和 tokenizer 设计是否也应该一起 scaling?
答案是:应该考虑,而且不能只看模型参数量,还要看输入词表、输出词表和训练 FLOPs。
4.1 Scaling Laws with Vocabulary
核心观点:
更大的模型通常需要更大的词表。
传统 scaling law 主要关注:
- 模型参数量;
- 训练数据量;
- 训练 FLOPs。
但这篇工作把词表大小也纳入 scaling law,认为在给定 FLOPs 预算下存在一个最优词表大小。
词表太小:
- 文本切得碎;
- 序列变长;
- 上下文窗口被浪费;
- 计算效率下降。
词表太大:
- embedding / LM Head 参数增加;
- 输出 softmax 更贵;
- 低频 token 训练不足。
所以最优词表大小取决于计算预算和模型规模。
4.2 Over-Tokenized Transformer
这篇工作的关键洞察是:
输入词表和输出词表的作用不同,应该解耦分析。
| 位置 | 作用 | 扩大词表的影响 |
|---|---|---|
| 输入词表 | 把文本编码为 embedding | 主要增加 embedding lookup,成本相对小 |
| 输出词表 | 预测下一个 token 概率分布 | 增加 LM Head 和 softmax 成本,代价更高 |
因此,大输入词表通常更划算,而大输出词表不一定总是有益,尤其对小模型可能有害。
Over-Encoding
扩大输入词表,例如加入更多 n-gram 输入 token,让输入表示更紧凑。
作用:
- 缩短序列;
- 提升输入信息密度;
- 成本相对可控。
Over-Decoding
扩大输出侧监督,例如预测 n-gram token 或引入更丰富的输出监督。
作用:
- 给模型更细粒度或更高阶的生成信号;
- 对大模型可能有效;
- 对小模型可能增加学习难度。
4.3 Visual Tokenizer 的 Scaling Law
图像生成模型中也存在 tokenizer,只是它不是文本 BPE,而是 visual tokenizer,例如 VAE、VQ-VAE 或 latent encoder。
它的作用是:
图像像素 → latent token → 生成模型建模
普通 visual tokenizer 如果只优化重建,容易过度关注低层像素细节,而生成模型更需要高层语义。
MiniMax 相关工作强调:
- 图文对比学习;
- 自监督学习;
- 重建损失;
- 面向生成任务的 latent 表示。
核心结论:
tokenizer 训练本身也值得 scale;更好的 latent token 会提升后续生成模型效果。
5. 新闻热点:为什么大模型不认识马嘉祺?
这一部分讲的是一个典型 tokenizer 案例:
模型知道一个实体,但生成时打不出对应文字。
5.1 现象
模型能够讲清楚马嘉祺的履历,却可能无法稳定输出“嘉祺”两个字。
这说明问题未必是知识缺失,而可能是:
语义知识存在,但 token 生成通道出了问题
5.2 Minimax Debug 的关键发现
“嘉祺”被分词为一个独立 token。
如果模型生成“马嘉祺”时实际路径是:
马 / 嘉祺
而不是:
马 / 嘉 / 祺
那么“嘉祺”这个整体 token 的训练覆盖就非常关键。
PDF 中提到:
- 预训练阶段该 token 的 embedding 和 LM Head norm 看起来正常;
- 相似 token 包括“亚轩、千禧、祺、耀文、嘉”等;
- 说明预训练阶段可能学到了一定语义;
- 问题主要出在后训练 SFT 阶段。
如果 SFT 数据中“嘉祺”出现极少,低频中文 token 的输出权重可能被挤压,导致生成概率很低。
5.3 top-p 采样会放大低频 token 问题
生成时如果使用 top-p,例如 (p=0.95),模型只保留累计概率前 95% 的候选 token。
如果“嘉祺”概率过低,即使模型有一定知识,也可能在采样前就被过滤掉。
表现就是:
模型知道这个人,但打不出这个名字
5.4 解决方案
PDF 中给出两个方向。
方案一:复读全词表
把全词表切成若干份,例如每份约 8K token,构造简单监督任务:
请重复以上内容:<一批 token>
输出就是相同 token。
目的:
保证 SFT 阶段每个 token 至少被覆盖,防止低频 token 生成能力退化。
方案二:删除尾部分布 token
对于后训练和实际使用中几乎没有场景的尾部 token,可以考虑不放入词表,避免训练不足的整体 token 干扰生成。
本质上,这是 BPE 合并结果和训练数据分布不匹配导致的问题。
5.5 LM Head 梯度瓶颈
PDF 关联到论文《Lost in Backpropagation: The LM Head is a Gradient Bottleneck》。
语言模型最后通常有一层 LM Head:
\[\mathbb{R}^D \rightarrow \mathbb{R}^V\]其中:
- (D):hidden size;
- (V):词表大小。
当 (V) 远大于 (D) 时,梯度通过 LM Head 反向传播会被压缩。低频 token 本来梯度就少,再经过这个瓶颈后更难学到稳定表示。
这解释了为什么大词表里的尾部 token 容易出现:
- 训练慢;
- 生成概率低;
- 输出区分度差;
- 生僻中文、人名、外语 token 生成失败。
6. 对推荐系统的启发
第六部分讨论的是将 NLP 分词思想迁移到推荐系统,代表方法是 ActionPiece。
6.1 传统生成式推荐的问题
生成式推荐通常把用户行为序列看成:
item_1, item_2, item_3, ...
然后像语言模型预测下一个词一样预测下一个 item。
问题是:
同一个 item 在不同用户上下文中可能有不同语义。
例如同一件 T 恤:
运动鞋 → 健身裤 → T恤
更像“运动穿搭”语义。
而:
项链 → 半身裙 → T恤
更像“时尚搭配”语义。
如果始终用固定 item ID 表示该商品,就会忽略上下文语义。
6.2 ActionPiece 的核心思想
ActionPiece 不直接把 item 当成单一 token,而是把一个用户行为表示成特征集合:
{品牌: Nike, 类目: T恤, 颜色: 白色, 价格: 中等, 风格: 运动}
然后借鉴 BPE:
频繁共现的特征或行为片段 → 合并成更高层 token
这样可以学习:
- item 内部特征组合;
- 相邻行为之间的转移模式;
- 用户行为上下文中的高阶语义。
6.3 两类 token pair 合并
ActionPiece 统计两类共现。
第一,同一行为内部的特征共现:
Nike + 运动鞋
白色 + T恤
高价 + 奢侈品牌
第二,相邻行为之间的特征共现:
运动鞋 → 健身裤
手机 → 手机壳
奶粉 → 纸尿裤
这样得到的 token 不只是商品 ID,而是有上下文含义的行为片段。
6.4 SPR:Set Permutation Regularization
Set Permutation Regularization 可译为:
集合排列正则化 / 集合内元素随机重排正则化
原因是一个行为的特征集合本身无序:
{品牌: Nike, 类目: T恤, 颜色: 白色}
和:
{颜色: 白色, 品牌: Nike, 类目: T恤}
语义相同。
SPR 会随机打乱集合内部特征顺序,生成多个等价训练样本,避免模型错误依赖特征排列顺序。
6.5 训练与推理
训练阶段:
- 把用户行为序列转换成特征集合序列;
- 使用 ActionPiece 做上下文感知 tokenization;
- 通过 SPR 构造多个等价序列;
- 用 Transformer 做自回归训练。
推理阶段:
- 对同一输入生成多个 SPR 版本;
- 分别推理;
- ensemble 得到更稳定的推荐结果。
6.6 对推荐系统的核心启发
| NLP 分词 | 推荐系统 ActionPiece |
|---|---|
| 字符、子词 | 商品特征 |
| 单词、短语 | 特征组合 |
| 句子上下文 | 用户行为上下文 |
| BPE 合并高频子词 | 合并高频行为特征组合 |
| 预测下一个 token | 预测下一个 item / action |
核心思想:
推荐系统的 tokenization 不应该只是静态 item ID 映射,而应该考虑上下文、属性组合和行为转移模式。
7. 关键概念速查
| 概念 | 含义 |
|---|---|
| Token | 模型处理文本的基本单位,可以是字符、子词、词、符号或特殊标记 |
| Vocabulary / 词表 | tokenizer 能识别的所有 token 集合 |
| Token ID | token 在词表中的整数编号 |
| OOV | Out-of-Vocabulary,词表外词 |
| Subword | 子词单元,介于字符和完整词之间 |
| 压缩率 | 原始文本字符数 / token 数 |
| Token Tax | 不同语言因 tokenization 效率不同而承担不同计算成本 |
| Token Fertility | 平均每个词被切成多少 token |
| LM Head | 把隐藏状态映射到词表 logits 的输出层 |
| SPR | 集合排列正则化,随机重排无序特征集合以增强鲁棒性 |
8. 个人整理版结论
-
分词器决定了模型看世界的基本单位。
它不是无关紧要的预处理,而是模型架构和训练体系的一部分。 -
大词表能提高压缩率,但也会带来尾部 token 学习问题。
压缩率、参数量、softmax 成本、低频 token 覆盖必须同时考虑。 -
词表通常在预训练开始前确定。
后续小版本一般不改 tokenizer,最多追加少量特殊 token。 -
多语言模型的 tokenizer 直接影响语言公平性。
被切得越碎的语言,训练和推理成本越高,模型效果也可能更差。 -
Tokenizer 存在 scaling 问题。
大模型可能需要更大词表,但输入词表和输出词表应分别设计。 -
低频 token 生成失败不一定是知识缺失。
也可能是 SFT 覆盖不足、LM Head 梯度瓶颈和采样策略共同导致。 -
推荐系统可以借鉴分词思想。
用户行为不一定只能表示为 item ID,也可以构造成上下文感知的行为 token。
Tokenizer 是大模型的“输入输出接口层”:它既决定文本如何被压缩成序列,也决定模型输出空间如何组织。一个好的 tokenizer 需要在压缩率、词表规模、多语言公平性、低频 token 学习和下游生态兼容性之间取得平衡。