返回 M01~M90 教材库
M16 · 预习教材教材已备 ≠ 学习已完成

M16:训练一个最小 Byte-level BPE

Byte-level BPE 从可覆盖任意文本的字节符号出发,反复合并语料中最常见的相邻对,形成更长且更高效的 token。

2026-09-08Byte-levelBPE、Merge、Vocabulary、Encode、Decode

内容类型:预习教材(不代表已完成)
日期:2026-09-08
阶段:P1 · AI Model Engineering 90
周次:W3 · Tokenization、Embedding 与表示学习
节奏:周二最小实现
状态:教材已备;学习未完成
标签:Byte-level BPE、Merge、Vocabulary、Encode、Decode

一句话定义

Byte-level BPE 从可覆盖任意文本的字节符号出发,反复合并语料中最常见的相邻对,形成更长且更高效的 token。

学习目标

  1. 能手工完成几轮 pair counting 与 merge。
  2. 理解训练词表与使用 tokenizer 是两个阶段。
  3. 能写出最小 encode/decode 流程并检查可逆性。
  4. 观察语料分布怎样塑造 merge 与领域效率。

核心知识

BPE 初始把文本表示为基本符号序列。byte-level 版本通常从 256 种字节值开始,因此任何 UTF-8 字符串都有表示,不需要未知词 token。训练时统计全部相邻 token 对,选择最高频的一对合并为新 token,更新序列并重复,直到达到词表大小或 merge 数上限。

合并规则有顺序。编码新文本时,不是简单寻找任意最长子串,而是按训练得到的 merge rank 应用规则;不同实现可用优先队列等方式提升效率。decode 把 token 对应的字节串连接,再按 UTF-8 解码。若处理正确,decode(encode(text)) 应回到原字符串,但可视化中单个 token 未必对应完整 Unicode 字符。

语料决定哪些片段变为单 token。金融语料可能让 “transaction”“AML” 或金额格式更紧凑;若训练语料几乎全英文,中文会更多以若干字节片段表示,序列显著变长。词表不是中立字典,而是数据频率的压缩结果。

机制与推导

考虑简化符号序列:low、lower、lowest。初始可拆为字符加词尾标记。统计相邻对后,“l-o”与“lo-w”等频率较高,合并一次会改变后续对的计数,所以每轮都需基于新序列重新统计。贪心选择只保证当轮最高频,不保证全局最优压缩,但实现简单且实践有效。

词表大小 V 与平均 token 数 n 存在取舍。扩大 V 通常降低 n,却增加 embedding/输出层参数约 V×d,并可能形成大量低频 token。tiny 模型尤其需要避免词表参数吞噬大部分容量。

最小练习

  1. 准备十几行公开或自写短文本,混合中文、英文、数字和一个假地址。
  2. 在纸上对三条短词执行 3 轮 pair count 与 merge。
  3. 跟随现有实现或写最小训练:统计对、选最高频、替换、保存规则。
  4. 实现 encode/decode,并计划检查 round-trip;运行结果保持空白直到实际执行。
  5. 观察前十条 merge 来自哪些语料模式,不把它们解释为语义知识。

常见误区

  • 认为 merge 次数越多一定越好,忽略参数和低频碎片。
  • 训练与编码采用不同 normalization,导致规则无法一致复现。
  • 把 UTF-8 字节片段显示异常当作数据损坏。
  • 只在训练语料检查压缩率,不看领域外文本。
  • 把高频片段当成模型已经理解其含义。

金融、Web3 与文档场景连接

银行卡掩码、ISO 日期、货币代码和 0x 地址可能形成不同 merge。地址被压缩得更短不代表可做语义检索;相反,tokenization 应保留精确还原能力,并让结构化解析承担身份判断。

自检问题

  1. Byte-level BPE 如何避免 OOV?
  2. 每次 merge 后为何要更新 pair 统计?
  3. 扩大词表对序列长度与模型参数分别有什么影响?
  4. round-trip 检查能证明什么,不能证明什么?

专业课程对齐

  • Hugging Face LLM Course:对应 Tokenizers 章节中的 BPE、训练 tokenizer 与 encode/decode 流程,是实现参照。
  • Stanford CS336:对应 tokenizer 构建和语言模型数据处理,关注效率、词表规模与可复现训练。
  • Stanford CS224N:选读 subword 表示背景,理解 BPE 在词级与字符级之间的取舍。

深入学习提示

先手工对小语料完成 pair frequency → 选择最高频 pair → merge → 重计频次的三轮,再精读 Hugging Face tokenizer 部分;随后参考 CS336 检查训练和编码是否共享同一 merge 顺序,CS224N 只补概念。观察公式不是复杂目标,而是每次贪心 merge 对语料 token 数和词表大小的影响。代码必须验证 decode(encode(text)) 的字节级可逆性、特殊 token 不参与错误合并、相同频次时规则确定。反例加入未见字符、emoji、中英混合、重复空格和截断字节;还要比较训练语料偏向英文时中文序列为何更长。不要从一个小语料的压缩率推断真实模型质量,BPE 优化频率结构而非语义正确性。

学后填写区

  • 语料范围:____
  • 三轮手算 merge:____
  • tokenizer 实现位置:____
  • 实际 merge/round-trip 观察:____
  • 实际学习日期与用时:____
学完后,请把自己的理解、练习结果和仍不确定的问题写入文末“学后填写区”,再到唯一进度账本更新状态。预先阅读后续教材不会自动增加完成数。