本课模式:四步走——跑真实 tokenizer 看中文切分 → 对比中英文 token 效率 → 认识 SentencePiece → 用 Chinchilla 算自己的数据量。做完你就能回答「为什么中文模型要选 Qwen」。
📋 本课你将完成
- 用真实 tokenizer 切分过中文和英文
- 对比过中英文的 token 效率并记录数字
- 知道 SentencePiece 是什么、何时该自训 tokenizer
- 用 Chinchilla 公式算出自己目标模型的数据量
- 理解为什么「复用基座 tokenizer」是默认选择
步骤 1
用真实 tokenizer 切分文本(15 分钟)
未完成🎯 这一步的目标:跑 Qwen 的 tokenizer,亲眼看到「模型读的是 token 不是字符」。
pip3 install transformers▶ 预期输出(点开对照)
Collecting transformers... Successfully installed transformers-4.x.x
python3 -c 'from transformers import AutoTokenizer; t = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-0.5B-Instruct"); s = "火星的一天是 24 小时 37 分钟"; print(t.tokenize(s)); print(len(t.encode(s)), "tokens")'▶ 预期输出(点开对照)
['火星', '的一天', '是', ' ', '24', '小时', ' ', '37', '分钟'] 9 tokens
python3 -c 'from transformers import AutoTokenizer; t = AutoTokenizer.from_pretrained("meta-llama/Llama-3.2-1B-Instruct"); s = "The day on Mars is 24 hours and 37 minutes"; print(t.tokenize(s)); print(len(t.encode(s)), "tokens")'▶ 预期输出(点开对照)
(英文模型切中文会非常碎——每个汉字 1–3 个 token,token 数暴增。这正是中文效率差距的实证)
✅ 检查点:你亲眼看到了中文在两个 tokenizer 下的差异,并记录下数字。
步骤 2
对比中英文 token 效率(10 分钟)
未完成🎯 这一步的目标:量化「中文 token 效率天然低于英文」,理解它对训练成本和上下文长度的含义。
python3 -c 'from transformers import AutoTokenizer; t = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-0.5B-Instruct"); zh = "人工智能正在改变世界"; en = "Artificial intelligence is changing the world"; print("中文:", len(t.encode(zh)), "tokens"); print("英文:", len(t.encode(en)), "tokens")'▶ 预期输出(点开对照)
中文: 10 tokens 英文: 8 tokens (说明:同一语义,中文 token 更多——所以中文语料要加大配比,且 1 个 token 的成本对中英文一样)
✅ 检查点:你能解释「为什么中文模型要加大中文语料配比」。
步骤 3
认识 SentencePiece(10 分钟)
未完成🎯 这一步的目标:了解主流 tokenizer 训练工具,知道何时该自训、何时该复用。
▶ 预期输出(点开对照)
SentencePiece 是 Google 开源的 tokenizer 训练工具,支持 BPE / unigram 两种算法 主流中文模型(Qwen/GLM)的 tokenizer 都基于它,词表通常 32k–150k 关键:换 tokenizer = 换字母表,embedding 层对不上——所以微调时复用基座 tokenizer,除非从零预训练
✅ 检查点:你能说出「何时自训 tokenizer、何时复用」的判断标准。
步骤 4
用 Chinchilla 算你的数据量(10 分钟)
未完成🎯 这一步的目标:用「参数 ≈ 20 × token 数」经验法则,算出你目标模型需要多少数据——这是缩放定律的第一次实战。
python3 -c 'params = 0.5e9 # 你的目标参数(0.5B 示例)', 'tokens = params * 20', 'print(f"模型 {params/1e9:.1f}B 需要约 {tokens/1e9:.0f}B tokens")'▶ 预期输出(点开对照)
模型 0.5B 需要约 10B tokens
▶ 预期输出(点开对照)
(见下方「Chinchilla 计算器」)
✅ 检查点:你算出了自己目标模型的数据量,并知道数据不足时的对策(缩小模型或过采样)。
🧪 交互实验 · Chinchilla 计算器
拖动参数,看「计算最优」数据量。注意:这是「计算最优」不是「质量最优」——想榨干小模型可超配数据。
0.5B
对照:7B 模型 ≈ 140B tokens;50M 模型 ≈ 1B tokens。你现在条件能训的数据量,决定你该选多大的模型。
❓ 老师答疑(卡住了先看这里)
❓ 为什么中文 1 个汉字常是 1–2 个 token?
因为主流 tokenizer 是「字节级 BPE」训练的:先从字节开始合并,常用汉字或常用词会被合并成 1 个 token,生僻字/罕见词则拆成多个字节 token。中文的「常用度」分布比英文更分散,所以平均效率低。
❓ 我微调时能自训 tokenizer 吗?
不能直接换。微调(SFT/QLoRA)必须复用基座的 tokenizer——换了等于换字母表,embedding 层对不上。只有从零预训练时才能自训 tokenizer。
❓ 词表大小怎么选?
经验值:纯英文 32k–50k;中英混合 100k–150k(Qwen 用 151k)。词表太小 → 每 token 信息量低、序列长;太大 → embedding 层参数多、难训。
❓ 为什么说「中文模型要选 Qwen」?
Qwen 的 tokenizer 对中文做了优化(常用词合并高效),同样的中文文本 token 数比英文模型明显少——训练快、上下文省、成本低。这是选基座的真实技术理由之一。
📝 自测清单(全勾才算过)
- 用真实 tokenizer 切分过中文和英文
- 对比过中英文的 token 效率并记录数字
- 知道 SentencePiece 是什么、何时该自训 tokenizer
- 用 Chinchilla 公式算出自己目标模型的数据量
- 理解为什么「复用基座 tokenizer」是默认选择
全勾 → 节点 04 / 14 完成。未勾 → 回看对应步骤,别急着往前走。