先记住这个答案
大语言模型先用预分词器把文本按空格等切分,然后用 BPE 等算法学习合并规则,将高频字符对逐步合并成子词。推理时,文本按这些规则切分成词表内的 token,每个 token 对应一个整数 ID,输入模型。子词切分平衡了词表大小与序列长度,并用字节级基础词表避免未知词。
- BPE 从字符开始迭代合并高频对
- 子词让模型能组合表示未见词
- 字节级基础保证无未知 token
BPE 如何从字符构建子词
BPE 先用预分词器把文本按空格或标点切成临时词,并统计每个词出现频率。例如训练语料中有 “hug” 10 次、“pug” 5 次、“hugs” 5 次,初始词表只含字符 b、g、h、n、p、s、u。接着算法反复统计相邻字符对的出现次数,把最高频的对合并成一个新子词,加入词表。
以上例来说,’u’ 和 ’g’ 在 hug、pug、hugs 中频繁相邻,合并成 “ug”;之后 “u” 和 “n” 在 pun、bun 中高频,合并成 “un”。合并重复进行直到达到预定词表大小。最终词表包含部分子词,例如 “hug” 可能被切成 [“h”,”ug”] 或 [“hug”] 取决于合并规则。新词若不在词表中,会被逐层拆成存在的子词,从而避免直接丢弃。
在标准 BPE 中,基础词表只含训练语料中出现过的字符,若遇到新字符则映射为 <unk>。实际中,字节级 BPE 把 256 个字节值当作基础词表,任何 Unicode 字符都可拆成若干字节,因此训练后几乎不产生未知 token。GPT-2 使用的就是 256 字节加 50,000 次合并得到约 50k 词表。
句子 “unhug” 的 token 化过程
假设词表只包含步骤中见过的子词:b、g、h、u、n、ug、un。推理时给定文本 “unhug”,预分词器按空格切出一个词 “unhug”。由于整个词不在词表,BPE 按最长匹配或按学习到的合并顺序反向切分:先看 “un” 存在,剩 “hug”,而 “hug” 未被合并,需进一步拆为 “h” 和 “ug”。这样最终得到 token 序列 [“un”,”h”,”ug”]。
实际使用时 tokenizer 对每个子词查词表得到整数 ID,例如假设 “un”=312,“h”=75,“ug”=204,则输出 [312,75,204]。模型只消费这些 ID。如果语料中没有 “unhug” 作为整词,此切分让模型仍能用已知子词表示它,这便是子词切分处理 OOV 的典型方式。
BPE 的失效条件与应对
BPE 依赖训练语料中的统计频率,当语料分布与推理输入严重不匹配时,合并规则可能不佳。例如在代码或表情符号丰富的文本中,如果预分词器基于空格切分,会破坏代码缩进或表情序列,导致 token 碎片化。英语中常见的做法是用正则保留换行和空格前缀,但中文、日文没有空格,需依赖 SentencePiece 这类先以字符流处理。
另一个边界是词表大小与模型容量。词表过大导致嵌入层参数膨胀,影响训练速度;过小则每 token 信息量低,序列变长。BPE 难以高效处理需要连续字符组合的新造语言模式,比如测试时输入纯数字串,每个数字独立,模型效率下降。实际工程中,可针对任务微调 tokenizer 的预分词规则或使用 Unigram 等概率切分模型,但这需要重新训练适配。
容易答错的地方
- BPE 一定能拆出完整单词
- 并非总是如此。子词切分是按合并规则进行,同一个词在同一个词表下会得到固定的切分,不同词表可能切成不同子词。例如 “hugs” 可能为 [“hug”,”s”] 或 [“h”,”ug”,”s”],取决于词表。BPE 的具体切分是确定的,但并非语义边界。
- 未知词被当作 `<unk>` 丢弃
- 现代大模型普遍使用字节级 BPE,基础词表包含所有字节值,因此任何字符都能拆解成已知子词或字节 token,不会出现
<unk>。早期按字符表构建的 BPE 才可能产生未登录字符,但如今很少见。
面试官还会怎么问?
BPE 与 WordPiece 的选择依据是什么?
BPE 合并频率最高的相邻对,WordPiece 则选择使训练似然增量最大的对,后者更偏重信息量。实践中 BPE 在 GPT、Llama 中占主流,WordPiece 多见于 BERT。BPE 和 Unigram 可用 SentencePiece 实现,WordPiece 需要专门实现。
为什么字节级 BPE 能处理所有 Unicode 字符?
因为 UTF-8 编码下任何字符都是一到四个字节,字节级 BPE 以 256 个字节值为基础,训练时把常见多字节序列也合并成子词。未知字符仍由字节组合表示,所以没有未登录 token。
token 化与模型性能有什么关系?
token 化影响序列长度与信息密度。若切分太细,序列变长,注意力计算成本上升;若太粗,词表膨胀。此外,不同语言 token 效率差异大,例如英语一个词常为一个 token,中文可能一个字拆成多个字节 token,导致推理速度慢。
参考资料
示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。