大模型修炼秘籍 第一卷灵气采集 第三章:化气为形——Tokenization之秘
第三章:化气为形——Tokenization之秘
分词之道在平衡,子词切分显神功。

【本章导读】
数据清洗后,仍是人类语言的形态,模型无法直接理解。Tokenization,便是将文本切分为模型可处理的基本单元——Token。如同将灵气凝练为丹药,便于吸收修炼。
一、何为Tokenization?
【Token之理】
Token是模型处理文本的最小单元:
- 英文中,一个Token通常是一个词或词的一部分
- 中文中,一个Token通常是一个字或词
- Token是文本与模型之间的桥梁
【为何需要Tokenization?】
- 统一表示:将不同语言的文本统一为数字序列
- 高效编码:用有限的词表覆盖无限的文本
- 灵活切分:平衡词表大小和序列长度
二、分词方法演进
第一代:词级分词
最简单的方法,按空格切分:
"大模型修炼秘籍" → ["大", "模型", "修炼", "秘籍"]
"Hello World" → ["Hello", "World"]
问题:
- 词表太大(百万级)
- 无法处理未登录词(OOV)
- 不适合中文等无空格语言
第二代:字符级分词
将文本切分为单个字符:
"Hello" → ["H", "e", "l", "l", "o"]
"大模型" → ["大", "模", "型"]
问题:
- 序列太长,计算效率低
- 字符本身无语义
第三代:子词分词(主流方法)
结合词级和字符级的优点:
"unhappiness" → ["un", "happiness"]
"tokenizer" → ["token", "izer"]
优点:
- 词表大小适中(3万-10万)
- 能处理未登录词
- 保留语义信息
三、BPE算法:字节对编码之术
【BPE心法】
BPE(Byte Pair Encoding)是最常用的子词分词算法,如同武学中的基础内功,简单而强大。
【BPE原理】
BPE的核心思想:不断合并最高频的相邻字节对,直到达到目标词表大小。
BPE训练过程
第一步:初始化
将所有单词拆分为字符:
语料: ["low", "lower", "newest"]
初始状态:
"low" → ["l", "o", "w"]
"lower" → ["l", "o", "w", "e", "r"]
"newest" → ["n", "e", "w", "e", "s", "t"]
第二步:统计频率
统计所有相邻字节对的出现频率:
字节对 频率
─────────────
(l, o) 2
(o, w) 2
(w, e) 2
(e, r) 1
(n, e) 1
(e, s) 1
(s, t) 1
第三步:合并最高频对
最高频的是(l,o)、(o,w)、(w,e),任选一个合并:
合并 (l, o) → "lo"
更新:
"low" → ["lo", "w"]
"lower" → ["lo", "w", "e", "r"]
"newest" → ["n", "e", "w", "e", "s", "t"]
第四步:重复合并
继续统计、合并,直到达到目标词表大小:
合并 (lo, w) → "low"
合并 (e, s) → "es"
合并 (es, t) → "est"
...
最终词表: {l, o, w, e, r, n, s, t, lo, low, es, est, ...}
BPE编码过程
训练好词表后,对新文本进行编码:
输入: "lowest"
步骤1: 拆分为字符 ["l", "o", "w", "e", "s", "t"]
步骤2: 应用合并规则
- (l, o) → "lo" → ["lo", "w", "e", "s", "t"]
- (lo, w) → "low" → ["low", "e", "s", "t"]
- (e, s) → "es" → ["low", "es", "t"]
- (es, t) → "est" → ["low", "est"]
输出: ["low", "est"]
四、其他分词算法
WordPiece
与BPE类似,但合并标准不同:
- BPE:基于频率
- WordPiece:基于概率提升
用于BERT等模型。
Unigram Language Model
从大到小,逐步删减:
- 初始词表包含所有可能的子词
- 根据语言模型概率逐步删减
- 保留对整体概率贡献最大的子词
用于T5、ALBERT等模型。
SentencePiece
将文本视为原始字节流,无需预分词:
- 支持任意语言
- 空格也作为特殊字符处理
- 适合多语言模型
【算法对比】
| 算法 | 合并策略 | 优点 | 代表模型 |
|---|---|---|---|
| BPE | 频率最高 | 简单高效 | GPT系列 |
| WordPiece | 概率提升 | 语义更好 | BERT |
| Unigram | 概率贡献 | 多种分法 | T5 |
| SentencePiece | 字节级 | 语言无关 | 多语言模型 |
五、词表构建:建立武学根基
【词表大小选择】
| 词表大小 | 优点 | 缺点 |
|---|---|---|
| 小(1万) | 模型小,速度快 | 序列长,覆盖差 |
| 中(3-5万) | 平衡性好 | - |
| 大(10万+) | 序列短,覆盖好 | 模型大,训练慢 |
主流模型词表大小:
| 模型 | 词表大小 |
|---|---|
| GPT-2 | 50,257 |
| GPT-3/4 | 约100,000 |
| LLaMA | 32,000 |
| DeepSeek | 128,000 |
| Qwen | 152,000 |
【特殊Token】
词表中需要包含特殊Token:
| Token | 用途 |
|---|---|
<pad> |
填充序列 |
<unk> |
未知Token |
<bos> |
序列开始 |
<eos> |
序列结束 |
<sep> |
分隔符 |
<cls> |
分类标记 |
六、Tokenization实战
【使用HuggingFace Tokenizers】
from transformers import GPT2Tokenizer
# 加载预训练的tokenizer
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
# 编码
text = "Hello, 大模型修炼秘籍!"
tokens = tokenizer.encode(text)
print(f"Tokens: {tokens}")
print(f"Token文本: {tokenizer.convert_ids_to_tokens(tokens)}")
# 解码
decoded = tokenizer.decode(tokens)
print(f"解码: {decoded}")
输出示例:
Tokens: [15496, 11, 32668, 108, 36283, 109, 10541, 0]
Token文本: ['Hello', ',', '大', '模', 'å', 'ľ', '¿', '!']
解码: Hello, 大模型修炼秘籍!
【训练自己的Tokenizer】
from tokenizers import Tokenizer
from tokenizers.models import BPE
from tokenizers.trainers import BpeTrainer
from tokenizers.pre_tokenizers import Whitespace
# 创建tokenizer
tokenizer = Tokenizer(BPE(unk_token="[UNK]"))
tokenizer.pre_tokenizer = Whitespace()
# 训练
trainer = BpeTrainer(
vocab_size=30000,
special_tokens=["[UNK]", "[CLS]", "[SEP]", "[PAD]", "[MASK]"]
)
files = ["data/train.txt"]
tokenizer.train(files, trainer)
# 保存
tokenizer.save("tokenizer.json")
七、Tokenization的影响
【对模型性能的影响】
| 影响方面 | 说明 |
|---|---|
| 序列长度 | 好的分词减少序列长度,提高效率 |
| 未登录词 | 好的分词减少OOV,提高覆盖率 |
| 多语言 | 好的分词支持多语言,扩大应用范围 |
| 领域适应 | 领域特定词表提升专业能力 |
【中文Tokenization的特殊性】
中文没有天然的分隔符,分词更具挑战:
方法1: 字级分词
"大模型修炼" → ["大", "模", "型", "修", "炼"]
方法2: 词级分词
"大模型修炼" → ["大模型", "修炼"]
方法3: 子词分词(推荐)
"大模型修炼" → ["大", "模型", "修炼"]
主流中文模型的策略:
- 字级+子词混合
- 大词表覆盖常见词
- 支持繁简转换
八、本章心法总结
【口诀】
分词之道在平衡,子词切分显神功。
BPE算法最常用,词表构建根基成。
【要点回顾】
| 要点 | 说明 |
|---|---|
| Token | 模型处理文本的最小单元 |
| 子词分词 | 当今主流方法,平衡词表大小和序列长度 |
| BPE算法 | 不断合并高频字节对,构建词表 |
| 词表大小 | 3-10万为宜,需平衡效率和覆盖 |
| 特殊Token | 包含pad、unk、bos、eos等 |
第一卷总结
第一卷"灵气采集篇"到此结束。我们学习了:
- 数据采集:从互联网海量数据中采集训练素材
- 数据清洗:去重、去劣、过滤有害内容
- Tokenization:将文本转化为模型可处理的Token
这三步完成后,我们便拥有了修炼大模型的"灵气"。
【下一卷预告】
第二卷"内功筑基篇",我们将深入预训练之道,学习Transformer架构、规模法则、分布式训练等核心内容。这是大模型修炼最关键、最耗资源的阶段。
更多推荐



所有评论(0)