第三章:化气为形——Tokenization之秘

分词之道在平衡,子词切分显神功。

在这里插入图片描述

【本章导读】

数据清洗后,仍是人类语言的形态,模型无法直接理解。Tokenization,便是将文本切分为模型可处理的基本单元——Token。如同将灵气凝练为丹药,便于吸收修炼。


一、何为Tokenization?

【Token之理】

Token是模型处理文本的最小单元:

  • 英文中,一个Token通常是一个词或词的一部分
  • 中文中,一个Token通常是一个字或词
  • Token是文本与模型之间的桥梁

【为何需要Tokenization?】

  1. 统一表示:将不同语言的文本统一为数字序列
  2. 高效编码:用有限的词表覆盖无限的文本
  3. 灵活切分:平衡词表大小和序列长度

二、分词方法演进

第一代:词级分词

最简单的方法,按空格切分:

"大模型修炼秘籍" → ["大", "模型", "修炼", "秘籍"]
"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等

第一卷总结

第一卷"灵气采集篇"到此结束。我们学习了:

  1. 数据采集:从互联网海量数据中采集训练素材
  2. 数据清洗:去重、去劣、过滤有害内容
  3. Tokenization:将文本转化为模型可处理的Token

这三步完成后,我们便拥有了修炼大模型的"灵气"。

【下一卷预告】

第二卷"内功筑基篇",我们将深入预训练之道,学习Transformer架构、规模法则、分布式训练等核心内容。这是大模型修炼最关键、最耗资源的阶段。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐