Tokenization and BPE

Tokenizer 是模型看到世界的第一层接口:它把字节或文本映射成整数 token IDs,再由 embedding 映射到向量。切分方式同时决定序列长度、训练 FLOPs、KV Cache 占用、跨语言公平性和生成时的边界,因此“词表只是预处理”是错误的低估。

一次编码经过什么

1
2
3
4
5
6
7
原始文本
→ normalization / byte 编码
→ pre-tokenization(空格、标点、特殊规则)
→ subword model(BPE/Unigram)
→ special tokens 与 role/template
→ token IDs
→ embedding

解码是反向过程,但不是简单字符串拼接:byte-level tokenizer 需要把 byte 序列恢复成 Unicode,chat template 还必须保留 system/user/assistant 的控制 token。训练和 serving 使用的 tokenizer、special token ID、模板版本不一致,会让同一条 prompt 变成不同的条件分布。

BPE 的最小机制

BPE 从字符或 byte 符号开始,统计训练语料中相邻符号对的频率;每次把最高频的一对合并成新符号,并把合并规则加入词表,直到达到目标词表大小。推理时按相同规则优先合并,得到最长可用的 subword 序列。

因果链是:合并规则改变 token 边界 → token 数量改变 → 每个样本的计算与上下文占用改变 → 高频模式更容易被模型复用,罕见模式则退回更细粒度 byte/subword。byte-level BPE 不要求词表覆盖所有 Unicode 字符,但可能把一个汉字、emoji 或代码符号拆成多个 token。

词表大小的真实取舍

选择 得到的收益 付出的代价
更大词表 平均序列更短,常见词边界更稳定 embedding/LM head 参数更大,低频 token 更稀疏
更小词表 组合能力强,词表参数较小 序列更长,attention、KV Cache 和带宽压力增大
byte/subword 对新词、代码和跨语言更鲁棒 语义边界可能不自然,单字符 token 成本不均

不能只用英文语料的平均 token/word 评估 tokenizer。应按语言、代码、数字、长 URL、表格、emoji 和领域术语分桶测量 token/char、序列长度 P95 以及下游任务表现。

训练目标与生成边界

自回归训练把 token IDs 右移形成输入/标签:输入 x_0...x_{T-1} 预测 x_1...x_T,交叉熵直接在词表 logits 上计算。不要为 x/y 重新建立随机 embedding;模型需要学习的是同一词表上的条件概率。生成时一个 token 可能对应半个词、空格、标点或 UTF-8 byte,停止条件通常依赖 EOS 或模板规定的 stop token,而不是“看到完整句号”。

常见失败与验证

  • 训练 tokenizer 与推理 tokenizer 不同:检查 vocab、merges、special token IDs 和 chat template 的 hash。
  • 把 token 数等同于字符数:用多语言和代码样本统计真实分布。
  • 忽略模板:裸 prompt 的 token 数不能代表对话请求的 token 数。
  • 用 token 数直接比较模型能力:还要控制数据内容、上下文长度、批大小和词表概率空间。

它向上连接 LLM Training Lifecycle,向下约束 Tensor ShapeAutoregressive Generation,横向与 Positional Encoding and RoPE 一起决定 token 序列如何进入模型。

参考资料

一个合并规则如何改变模型成本

假设预分词结果是 l o w e r,语料统计发现 e r 很常见,第一次合并得到 er;后续还可能把 lowlower 合并出来。推理时不是在所有可能切分中寻找“语言上最合理”的答案,而是按训练时固定的 merge rank 逐步执行。因此改动 merges 文件哪怕只动一行,也会改变所有后续 token 的边界和 ID 序列,不能把它当作无关紧要的资源文件升级。

词表大小也有一个具体的系统后果。更大的词表减少序列长度,却增大 embedding 和输出 LM head;如果输出层与 embedding 不共享,代价会出现两次。更小的词表让 Unicode、代码和新词退回更多 byte token,使同一个字符占用更多位置,进而缩短有效上下文并增加每次 decode 的 KV 读取。真正的选择应在目标语料上画出 token/byte 分布和 P95 长度,而不是引用英文 benchmark 的平均值。

Tokenizer 与 chat template 必须成对版本化

同一 base model 换成聊天模型后,输入不再只是用户字符串,而是带角色边界、工具调用和终止标记的序列。模板多一个换行、把 eos 放在 assistant 前后不同,都会改变训练目标和生成停止点。排查“模型突然复述 system prompt”时,优先保存渲染后的字符串、token IDs、assistant loss mask 和 special-token map 四份证据,单看最终 prompt 很难定位。

一个实用回归集应包含:中英文混合、数字和小数、代码缩进、长 URL、emoji、空字符串、工具 JSON 以及多轮截断。对每一类记录 token 数、解码是否 round-trip、特殊 token 是否只在预期位置出现;这同时连接 SFT 的数据管线和 Autoregressive Generation 的停止契约。