0%

Tokenization:BPE 原理

Tokenization:BPE 原理

一句话定位:BPE(Byte Pair Encoding)是子词切分的奠基算法——用”频率贪心合并”在字符与词之间找折中,同时解决 OOV 与词表爆炸两个老问题。

1. 算法原理:频率贪心合并

训练过程:

  1. 从字符起始:初始词表就是语料中出现的全部基础字符(字节级 BPE 则以 256 个字节为基),每个词被拆成字符序列;
  2. 统计相邻符号对频率:扫描语料,统计所有相邻 symbol pair 的出现次数;
  3. 合并频率最高的一对:把出现频率最高的相邻对合并为一个新 symbol,加入词表,并记录该合并规则;
  4. 重复 2~3,直到词表大小达到预设目标(如 32k、50k)。

推理(编码)时,按训练阶段记录的合并规则顺序对输入文本逐步合并,得到子词序列。

本质:这是一个频率驱动的贪心过程——高频组合被合并成整体(常见词最终成为单个 token),低频组合保持为更小的片段。

2. 解决的两个问题

  • OOV(未登录词):传统词级词表遇到没见过的词只能映射为 <UNK>,信息完全丢失。BPE 的词表包含字符/字节级单元,任何词都能被拆成已知子词的组合,因此不存在真正的 OOV(字节级 BPE 可覆盖任意 Unicode 输入)。
  • 词表爆炸:若用完整词表,自然语言的词形变化(时态、复数、派生、复合词)会让词表膨胀到百万级,嵌入矩阵与 softmax 层开销不可接受。BPE 用固定预算(几万)的子词表覆盖开放词汇,把词表大小控制住。

核心权衡:词表越大 → 序列越短(推理更快)但嵌入层越大;词表越小 → 嵌入层小但同样文本被切成更多 token(序列变长、计算变多)。

3. 与 SentencePiece 的关系

BPE 通常需要预分词(先按空格切词再做子词合并),这对中日韩等无空格语言不友好;SentencePiece 直接在原始文本上训练并支持 Unigram 概率化切分,是对该局限的改进(见 2.8)。

参考:论文《Neural Machine Translation of Rare Words with Subword Units》(Sennrich et al., 2016)