概率剪刀手:Unigram 如何从海量碎片中“剪”出大模型的最优词表
Unigram 语言模型分词(Unigram Language Model Tokenization)是 SentencePiece 库中除 BPE 之外的另一核心算法,也是当前大模型分词的另一大流派。与 BPE 的自底向上合并不同,Unigram 采用自顶向下的概率剪枝策略,从庞大候选词表中逐步剔除“不重要”的子词,最终得到一个兼顾效率与概率最优的词表。以下从原理、训练、编码、优化、对比到实际应用,深入拆解 Unigram 方法。
1. 从 BPE 到 Unigram:统计频率 vs. 概率建模
BPE 是纯频率驱动:每次贪婪地合并最频繁的相邻符号对,没有对“分割质量”建立明确的全局目标。这可能导致并非最优的分割(例如把 “unrelated” 切成u n related)。Unigram 则绕开了这种局部贪心,转而采用全概率框架:
假设每个子词的出现是独立的(即 Unigram 假设),文本由一串子词序列生成:
对一个单词(或整段文本)而言,其概率等于所有可能子词分割路径的概率之和(边缘似然)。
训练目标:寻找一个词表以及每个子词的概率,使得训练语料的似然函数最大化,同时满足词表大小限制。
这种方法让每个分割决策都受全局概率指导,不仅可以给出“最优分割”,还能实现子词正则化(Subword Regularization),即对同一文本随机采样不同的子词序列,极大提升模型鲁棒性。
2. 核心算法:期望最大化(EM)与迭代剪枝
Unigram 的训练是一个逐步瘦身的过程,步骤概览如下:
构建初始超大词表
通常从语料中抽取所有出现的字符,并枚举所有长度不超过某个阈值(如 16)的频繁子串;或直接使用 BPE 产生的较高合并次数词表作为种子。这个初始词表往往远大于目标词表(例如几十万甚至上百万)。初始化概率
一般采用启发式方法,比如用子词频率除以总频率,或均匀赋值,然后进入 EM 迭代。E 步(Expectation):计算期望计数
对语料中每个单词(附带其频次):利用动态规划计算该单词所有可能分割的路径概率总和,得到每个子词在该词内的后验概率(即该子词出现在最优/所有分割中的概率)。
累加每个子词的期望出现次数(单词频次 × 后验概率 × 该子词在路径中的出现次数)。
这一步充分利用 Unigram 假设,通过前向-后向算法高效完成,复杂度随词长线性增长。
M 步(Maximization):更新子词概率
将每个子词的期望计数除以所有子词的总期望计数,得到新的概率值:这一步骤保证整个词表概率和为 1。
计算损失并剪枝
对于词表中的每个子词,计算将其移除后的损失增益(Loss Reduction)。具体来说,比较当前带有该子词的全概率模型与去掉它(并将受影响的分割重新用剩余子词表示)后的模型对数似然差异。某个子词的 loss reduction 越小,说明它对似然贡献越小,越可以被安全删去。
按照 loss reduction 排序,一次性删除比例(如 20%)最低贡献的子词。重复 EM 与剪枝
剪枝后词表缩小,再用剩余子词继续 EM 迭代并再次评估 loss reduction,直到词表收缩到预设大小(如 32,000)。最后,保留此时的子词及它们的概率。
这一系列操作始终保持似然函数在受控下降范围内最大化,使得最终词表里的每个子词都是“概率刚需”。
3. 编码阶段:Viterbi 解码与子词正则化
有了训练好的词表和子词概率,对一段新文本进行分词时:
最优分割(Viterbi 算法)
将文本看成以字符为节点的有向图,每条边代表一个子词(从字符 i 到 j 的切片),边权重为-log p(subword)。用动态规划找出总代价最小的路径,即概率最大的子词序列。这是确定性的默认行为。子词正则化(Subword Regularization)
训练时,对同一文本按分割概率分布进行采样,而非固定使用最优路径。具体做法是在动态规划时进行随机游走(如根据后验概率选择边)。这相当于一种数据增强,让模型看到多种合理的子词组合,显著提升对噪声、拼写错误及未登录词汇的泛化能力。XLNet、T5 等模型的成功部分归因于这种正则化。
4. 一个直观的例子
假设语料仅包含单词 “unhappiness” 频次 3,单词 “unhappy” 频次 4。初始词表极大,包含['un', 'h', 'a', 'p', 'i', 'n', 'e', 's', 'y', 'unh', 'hap', 'pp', ...]等。
EM 迭代会根据“unhappiness”的所有可能分割(如
un + hap + pi + ness或un + h + a + ...等)动态调整概率。概率高的分割会在计数中占更大比重,进而使un、ness、happy等有意义的子词概率上升。剪枝阶段,比如
hap如果存在于词表中,但其 loss reduction 很低(因为happy整体概率更高且能覆盖),就会被淘汰;而ness因为出现在 “unhappiness” 的唯一合理分割中,贡献大,得以保留。最终词表可能稳定为
['un', 'happ', 'i', 'ness', 'y']之类,并能把 “unhappiness” 最优切分为un + happ + i + ness。
这种概率权衡使得 Unigram 能自然捕捉词根词缀,且避免像 BPE 那样过早合并不合理的子词。
5. 关键参数与训练技巧
目标词表大小:通常是 8,000~64,000,对多语言模型建议更大。
初始词表构建:常见方法有全字符 + 所有频繁子串,或基于 BPE 生成一个较大的种子词表。SentencePiece 默认使用 BPE 种子 + 扩展的字符 n-gram。
剪枝比例:每次迭代删除多少子词,典型值为 20%。激进剪枝会更快但可能丢失有用单元。
EM 迭代次数:剪枝后通常重新进行若干轮 EM,比如 5~10 轮,让概率重新稳定。
字符覆盖率(character coverage):必须保证所有字符都在词表中,否则会出现 OOV。通常将基础 Unicode 字符集预纳入词表。
Byte fallback:与 SentencePiece 结合时,可启用 byte fallback,将未识别的字符回退到 UTF-8 字节编码,达到彻底零 OOV。
6. Unigram 的优缺点
优点
全局概率最优:整个词表和概率是统一优化出来的,分割更符合统计规律,避免了局部贪心的副作用。
子词正则化:天然支持采样多种分割,可显著增强模型的鲁棒性和对低资源语言的泛化能力。
灵活的粒度:由于基于概率而非固定合并规则,可以对不同词给出不同粒度的分割,高频词倾向保持完整,低频词切得更细。
语言无关:SentencePiece 实现将空格视为普通字符,无需预分词,适合所有语言。
缺点
训练成本高:需维护超大初始词表并进行多轮 EM + 剪枝,时间和内存开销远超 BPE。
对初始词表敏感:如果初始种子不包含某些重要子串,后续剪枝无法恢复,最终词表可能次优。
分割稳定性差:概率训练中的随机性可能导致不同运行结果有微小差异;采样模式也引入非确定性。
可能过度切分高频词:为了整体似然,有时一些高频短词也会被切开,而不像 BPE 那样绝对保持完整。
7. 与其他主流分词方法的对比
| 方法 | 原理 | 训练方向 | 解码策略 | 正则化 | 代表应用 |
|---|---|---|---|---|---|
| BPE | 迭代合并高频相邻对 | 自底向上 | 固定规则 | 需额外机制(BPE-Dropout) | GPT-1/2(部分),RoBERTa |
| WordPiece | 按语言模型概率增益合并 | 自底向上 | 最长匹配 | 无(确定性) | BERT, DistilBERT |
| Unigram | 最大化语料似然,剪枝低贡献子词 | 自顶向下 | Viterbi 最优或概率采样 | 原生支持(Subword Regularization) | XLNet, T5, ALBERT, DeBERTaV3 |
注意:LLaMA 系列使用的是 SentencePiece BPE + byte fallback,并非 Unigram。但 SentencePiece 库本身同时实现了 BPE 和 Unigram,且 Unigram 是它的默认分词模式。
8. 典型应用与变体
SentencePiece Unigram:Google 的 SentencePiece 对 Unigram 进行了工程优化,包括用内存高效的 lattice 表示所有分割、加速 EM、集成 byte fallback 及 NFKC 归一化。它被 T5、XLNet、ALBERT、T5、Flan-T5 等模型直接使用。
Unigram 与 BPE 混合:一些工作尝试先 BPE 后 Unigram 剪枝,或结合两种策略,以兼具速度与质量。
多语言扩展:Unigram 在多语言模型中表现突出,因为概率建模能更好地共享跨语言子词,减少词表膨胀。
9. 总结
Unigram 分词方法将词表构建转化为一个概率模型的训练与压缩问题。它从海量子词候选中通过 EM 算法学习概率分布,再利用损失驱动的剪枝留下最小必要单元,最终得到一部“概率词典”。在推理时,不仅可以给出最优分割,还能按概率采样不同分割,实现优雅的子词正则化。这使得它在许多注重鲁棒性和多语言能力的模型中成为首选,并和 BPE 一起构成了当代大模型分词技术的两大基石。