大模型修炼秘籍 第一卷灵气采集 第三章:化气为形——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】
fromtransformersimportGPT2Tokenizer# 加载预训练的tokenizertokenizer=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】
fromtokenizersimportTokenizerfromtokenizers.modelsimportBPEfromtokenizers.trainersimportBpeTrainerfromtokenizers.pre_tokenizersimportWhitespace# 创建tokenizertokenizer=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架构、规模法则、分布式训练等核心内容。这是大模型修炼最关键、最耗资源的阶段。
