Tokenizer 与文本表示
Tokenizer(分词器)是大模型处理文本的第一道关卡——它将人类可读的文本转换为模型可处理的 token 序列。分词策略的选择直接影响模型的效率、多语言能力、上下文窗口利用率以及下游应用的表现。本章深入剖析主流的分词算法及其工程实践。
Tokenizer(分词器)是大模型处理文本的第一道关卡——它将人类可读的文本转换为模型可处理的 token 序列。分词策略的选择直接影响模型的效率、多语言能力、上下文窗口利用率以及下游应用的表现。本章深入剖析主流的分词算法及其工程实践。
建议先阅读第 01 章
为什么需要 Tokenizer、主流分词算法、三种算法的对比
技术地基 · 大模型核心原理
文章导航
点击图中节点可定位到对应正文。
引言
Tokenizer(分词器)是大模型处理文本的第一道关卡——它将人类可读的文本转换为模型可处理的 token 序列。分词策略的选择直接影响模型的效率、多语言能力、上下文窗口利用率以及下游应用的表现。本章深入剖析主流的分词算法及其工程实践。
1. 为什么需要 Tokenizer
1.1 文本到数字的桥梁
神经网络只能处理数字,不能直接理解文字。Tokenizer 的任务是将文本映射为整数序列(token IDs),每个 ID 对应模型词汇表中的一个条目:
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
"Hello, world!" → Tokenizer → [15496, 11, 995, 0]根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
词汇表(Vocabulary)示例:
ID 0 → "!"
ID 11 → ","
ID 995 → " world"
...
ID 15496 → "Hello"1.2 为什么不用字符或词?
| 方案 | 优点 | 缺点 |
|---|---|---|
| 字符级 | 词汇表小(~200),不会遇到未登录词 | 序列太长,训练效率低 |
| 词级 | 每个 token 有完整语义 | 词汇表巨大(100万+),无法处理新词 |
| 子词级 | 平衡了粒度和词汇表大小 | 分词结果对人类不直观 |
子词分词是当前的主流方案。
2. 主流分词算法
2.1 BPE(Byte Pair Encoding)
BPE 最初是一种数据压缩算法,被引入 NLP 用于分词。
训练过程:
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
第 1 轮:最高频对 ("t","h") 出现10000次 → 合并为 "th"
第 2 轮:最高频对 ("th","e") 出现8000次 → 合并为 "the"
第 3 轮:最高频对 ("i","n") 出现7000次 → 合并为 "in"
...重复直到词汇表达到目标大小(如 32K、50K、100K)使用 BPE 的代表模型: GPT-2、GPT-3、GPT-4、LLaMA 系列
2.2 WordPiece
由 Google 在 BERT 中使用,与 BPE 类似但合并策略不同:
- BPE:合并出现频率最高的 token 对
- WordPiece:合并使语言模型似然度增加最多的 token 对(互信息最高)
特殊标记: 使用 ## 前缀表示非词首子词:
"unhappiness" → ["un", "##happi", "##ness"]
"playing" → ["play", "##ing"]使用 WordPiece 的代表模型: BERT、DistilBERT
2.3 SentencePiece
Google 开发的开源实现,直接在原始字节流上训练,不需要预先分词。
核心优势:
- 不需要语言特定的预处理(不需要空格分词)
- 天然支持中文、日文等无空格语言
- 将空格视为特殊字符 ▁(U+2581)
英文:"I'm playing" → ["▁I", "'", "m", "▁playing"]
中文:"我喜欢人工智能" → ["▁我", "喜欢", "人工", "智能"]使用 SentencePiece 的代表模型: T5、LLaMA、Mistral、Qwen
2.4 Unigram 模型
与 BPE 的"自底向上合并"不同,Unigram 采用"自顶向下裁剪":
- 从大词汇表开始
- 计算删除每个 token 后对似然度的影响
- 删除影响最小的 token
- 重复直到达到目标词汇表大小
3. 三种算法的对比
| 维度 | BPE | WordPiece | SentencePiece |
|---|---|---|---|
| 合并策略 | 频率最高 | 似然度提升最大 | BPE 或 Unigram |
| 预处理 | 需要空格分词 | 需要空格分词 | 直接在字节流上训练 |
| 多语言支持 | 中等 | 中等 | 好 |
| 代表模型 | GPT 系列 | BERT 系列 | LLaMA、T5 |
| 词汇表大小 | 32K-100K | 30K | 32K-152K |
4. 词表大小对模型的影响
4.1 词表大小的权衡
把公式、变量和含义拆开呈现,便于对照阅读。
词表太小 → 序列变长、计算量增加、语义信息稀疏词表太大 → Embedding 层参数巨大、低频 token 训练不充分4.2 主流模型的词表大小
| 模型 | 词表大小 | 分词器 |
|---|---|---|
| GPT-2 | 50,257 | BPE (byte-level) |
| GPT-3/4 | ~100K | BPE (byte-level) |
| BERT | 30,522 | WordPiece |
| LLaMA 2 | 32,000 | SentencePiece (BPE) |
| LLaMA 3 | 128,256 | tiktoken (BPE) |
| Mistral | 32,000 | SentencePiece (BPE) |
| Qwen 2.5 | 152,064 | tiktoken (BPE) |
4.3 词表大小对中文的影响
中文字符在 BPE 分词中通常效率较低:
- 英文:1 token ≈ 4 字符 ≈ 0.75 个单词
- 中文:1 个中文字通常需要 1-2 个 token
这导致中文内容的上下文窗口利用率更低、API 调用成本更高。Qwen、DeepSeek 等模型通过扩大词表来改善这个问题。
5. Byte-level BPE
GPT-2 引入的 Byte-level BPE 是当前最常用的方案之一:
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
传统 BPE:
"café" → 基于 Unicode 字符分词
问题:词汇表需要覆盖所有 Unicode 字符根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
Byte-level BPE:
"café" → 先转为 UTF-8 字节 → [99, 97, 102, 195, 169]
→ 在字节上做 BPE
优势:基础词汇表只有 256 个,永远不会出现未登录字符6. 特殊 Token
| Token | 用途 |
|---|---|
<bos> / <s> | 序列开始 |
<eos> / </s> | 序列结束 |
<pad> | 填充(批量处理时补齐短序列) |
<mask> | 掩码(BERT 的 MLM 任务) |
[INST] / [/INST] | 指令标记(Mistral 对话格式) |
<|im_start|> | 消息开始(ChatML 格式) |
<|im_end|> | 消息结束(ChatML 格式) |
ChatML 格式示例:
<|im_start|>system
You are a helpful assistant.<|im_end|>
<|im_start|>user
What is AI?<|im_end|>
<|im_start|>assistant7. Token Embedding
7.1 从 ID 到向量
Token ID 通过 Embedding 层映射为高维稠密向量:
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
Token ID: 995 → Embedding 层 → [0.12, -0.34, 0.56, ..., 0.78] (d_model 维)7.2 Embedding 维度
| 模型 | Embedding 维度 (d_model) |
|---|---|
| GPT-2 Small | 768 |
| BERT Base | 768 |
| GPT-3 175B | 12,288 |
| LLaMA 2 70B | 8,192 |
| LLaMA 3 405B | 16,384 |
7.3 权重共享(Weight Tying)
许多模型(如 GPT-2、LLaMA)将 Embedding 层的权重与最终输出层共享:
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
Embedding: token_id → 向量 (矩阵 E: [vocab × d_model])
Output: 向量 → 概率分布 (矩阵 E^T: [d_model × vocab])8. 本章小结
| 要点 | 说明 |
|---|---|
| 分词策略 | 子词分词(BPE/WordPiece/SentencePiece)是主流 |
| 词表大小 | 30K-150K,越大越好但成本越高 |
| 中文效率 | 中文分词效率低于英文,需要更大的词表弥补 |
| Byte-level BPE | GPT 系列采用,零未登录词 |
| Embedding | 将 token ID 映射为高维向量,维度与模型大小匹配 |
相关章节
- Transformer 架构深度剖析 — token 序列进入的下游架构
- 什么是大语言模型 — 从整体理解 token 在 LLM 中的角色
- 多模态能力 — 图像、音频等多模态内容的 token 化
延伸阅读
- Sennrich, R. et al. (2016). "Neural Machine Translation of Rare Words with Subword Units". ACL
- Wu, Y. et al. (2016). "Google's Neural Machine Translation System". arXiv:1609.08144
- Kudo, T. & Richardson, J. (2018). "SentencePiece: A simple and language independent subword tokenizer". EMNLP