一句话定义:Unigram 分词(Unigram language model tokenization)是一种子词(subword)切分方法——先准备一个超大的候选词表,再一轮轮按概率把“最没用”的条目删掉,直到词表缩到目标大小;切分新句子时,选整体概率最高的那种切法。
打个比方:裁员。公司一开始把几乎所有可能出现的字符串都招进来(连同全部单字),然后每轮评估“裁掉这个人,公司业绩会损失多少”,损失最小的先走,每轮固定砍掉一个比例(比如 20%),直到人数达标。单字是“关键岗位”,永远不裁——这样任何生僻词、错别字、新造词都能被拼出来,不会出现“未知词”(OOV)。
训练的三步
1. 造大名单:从语料里收集高频子串,再加上所有单字。SentencePiece 直接在原始文本上工作,空格也会被当成一个符号(通常写作 ▁),所以中文、日文这种不靠空格分词的语言也能处理。
2. 估概率:假设一个句子切成 x₁…x_M 的概率,等于各碎片概率相乘——这就是“Unigram”这个名字的由来,即一元语言模型假设:碎片之间互不影响。用 EM 反复迭代:先按当前概率算出每个碎片大致被用了多少次,再据此更新概率。
3. 裁员:算每个碎片“删掉之后整体似然掉多少”,按损失排序,保留损失大的一批(比如前 80%),其余删掉,然后回到第 2 步,直到词表达标。具体比例和实现细节以论文与官方文档为准。
怎么切新句子:每个碎片都带一个概率,把“切分”看成一条路径,用 Viterbi 算法(动态规划)找总代价 −log p 最低的那条。因为产物是概率而不是“合并规则”,还能按概率随机采样出多种切法,拿去做数据增强——这就是子词正则化(subword regularization)。
和邻居的区别
| BPE | WordPiece | Unigram | |
|---|---|---|---|
| 起点 | 单字 | 单字 | 大候选词表(含全部单字) |
| 方向 | 自底向上合并 | 自底向上合并 | 自顶向下裁剪 |
| 每步依据 | 最高频相邻符号对 | 合并后语料似然增益最大 | 删除后似然损失最小 |
| 产物 | 有序合并规则 + 词表 | 合并规则 + 词表 | 词表 + 每个子词的概率 |
| 切分 | 按规则顺序套用 | 贪心/最长匹配 | 求概率最大路径 |
| 多种切法 | 基本唯一 | 基本唯一 | 可按概率采样 |
一句话记:BPE 是“从小到大拼”,Unigram 是“从大到小删”。
对从业者的意义:词表更紧凑,对形态丰富的语言和中文更友好;切分带概率,可以直接算一个句子的似然,也能做采样增强。公开资料里 T5、ALBERT 这类模型的词表走的就是这条路线(具体配置以官方页面为准)。SentencePiece 同时支持 BPE 和 Unigram,选哪个看任务。对普通人来说,词表小一点,模型在手机上的内存和速度就友好一点——你手机里的翻译和多语言模型,很可能就悄悄用了这套“裁员”算法。
