1.3 分词:把文字切成模型认识的积木
模型的第一个难题:它不认识字
前面两节反复说,语言模型在「预测下一个词」。但有个问题被我们悄悄跳过了:
模型是个数学函数,它的输入输出只能是数字。「你好」这两个字,它根本看不见——必须先把文字变成编号,比如「你 → 59 号,好 → 60 号 」。
那么按什么单位编号?这个看似不起眼的选择,直接决定了模型的「视力」:
- 切得太碎(英文按字母、中文按笔画):
understanding变成 13 个字母。每个编号几乎不带意义,一句话变成超长序列,模型算起来又慢,又得费劲从碎渣里拼出意思。 - 按整词编号:英文有几十万个词,而且新词永远造不完——「显眼包」「city 不 city」进不了旧词表,模型见到就抓瞎。这种词表里没有的词叫未登录词。更糟的是,
run、running、ran会被当成三个毫无关系的编号,明明是一家人却互不相认。 - 折中方案:子词(subword)——常见的组合(「学习」「人工智能」)合成一块大积木,罕见的词拆成小积木去拼。词表大小可控,又永远不会拼不出来。
主流大模型全部采用第三种。而造出这份「积木清单」的最经典算法,就是字节对编码(BPE)。它简单得让人意外:
一句话定义
BPE 的训练 = 在语料上反复做同一件事:数一数哪两个相邻积木最常一起出现,把 它们粘成一块新积木。
别背定义,直接开工——下面是一份一百来字的小语料,你来当一次「造词表的人」:
亲手训练一个 BPE 分词器
BPE 的全部秘密:数一数语料里哪两个相邻 token 最常一起出现,把它们合并成一个新 token,然后不断重复。点「合并一次」慢慢看,或「自动训练」。
已学到的合并规则
0 条
词表大小
46 字 + 0 新词
语料 token 数
113 → 113
压缩率
100%
训练语料的当前切分(彩色 = 合并出的新 token):
深度学习需要大量数据,深度学习需要大量计算。机器学习是人工智能的核心,深度学习是机器学习的一个分支。大模型用深度学习的方法,从大量数据里学习语言的规律。学习机器学习,先要学习数学。人工智能正在改变世界,大模型正在改变人工智能。
✂️ 用刚训练好的分词器切你的句子
我❓要5学2习3机14器15学2习3和❓深0度1学2习3
13 个字 → 13 个 token;带 ❓ 的字不在训练语料里——对这个小词表来说它是未登录词(真实分词器用字节级词表兜底,任何文字都能切)
推荐玩法:
- 先点几次「🔗 合并一次」,按钮上会实时显示当前出现最多的那对组合——第一条规则几乎必然是「学」+「习」,因为这对搭档在语料里出现得最多;
- 点「▶ 自动训练到 20 条」,盯着「语料 token 数」和「压缩率」一路下降,「深度学习」「人工智能」这样的四字积木会自己长出来;
- 到下面的输入框切一切自己的句子。注意默认句子里的「我」和「和」带着 ❓——语料里从没出现过这两个字,它们就是这个小词表的未登录词。
训练一次,切用万次
玩完实验,BPE 的全貌其实就两句话:
- 训练阶段(造积木清单,只做一次):从单个字出发,重复「数频率 → 合并最高频的相邻对」,每合并一次就往词表里添一块新积木,直到词表达到预定大小。
- 使用阶段(切句子,每次输入都做):拿到新句子, 先拆成单字,再把当年学到的合并规则按学习时的先后顺序重放一遍。语料里常见的组合自然被粘成大块。
所以「分词器切出来的结果」完全是训练语料的镜子:语料里「学习」常见,它就是一块积木;语料里没有「我」,「我」就只能当散件处理。
这个实验在哪里不准确?
实验为了看得清,做了三处简化。① 真实分词器不在「汉字」层面工作,而在字节层面——任何语言、任何符号在计算机里都是字节,所以真实词表永远不会有 ❓(详见下方深入层);② 规模差了好几个数量级:我们用一百字语料学 20 条规则,真实分词器用 TB 级语料学出几万到二十几万块积木;③ 一个真实的副作用值得知道:以 2024-2026 年主流分词器为例,训练语料里英文占大头,英文常见词往往独占一块积木,而不少汉字会被拆成 2~3 个字节碎片——同样的内容,中文常常比英文更费 token(也就更费钱、更快占满上下文窗口)。
小结
本节要点
- 模型只认编号不认字;按什么单位编号是「太碎」与「词表爆炸 + 未登录词」之间的权衡,子词是折中答案。
- BPE 训练 = 反复合并语料里最高频的相邻对;使用 = 把学到的规则按顺序重放。
- 分词器是训练语料的镜子:常见组合成为大积木,没见过的内容只能拆碎兜底。
- 真实分词器在字节级工作、词表几万到二十几万;中文常比英文费 token(以 2024-2026 年主流分词器为例)。
📝 动手自测0/3
1. BPE 训练时,每一步做的事情是什么?
2. 为什么主流大模型不直接用「一个词一个编号」的整词词表?
3. 实验里输入「我要学习机器学习和深度学习」,「我」和「和」下面显示 ❓,原因是什么?
延伸阅读
- Tiktokenizer 在线工具——把同一句话丢给 GPT-4、Llama 等真实分词器,直观对比中英文的 token 消耗。
- Karpathy:Let's build the GPT Tokenizer——两小时从零手写一个和 GPT 同款的字节级 BPE 分词器。
- 下一节 1.4 词向量:让意思住进空间里:编号只是身份证号,「意思」怎么装进数字里?