什么是 ULM 分词算法?
一、背景介绍
ULM 分词算法,全称为 Unigram Language Model 分词(基于一元语言模型的子词切分),是由 Google 提出的分词算法,广泛用于 自然语言处理中的子词(subword)建模,并由其开源工具 SentencePiece 实现。
ULM 分词常用于:
- 预训练模型(如 T5、ALBERT、mBART)
- 多语言模型(因其无语言假设)
- 数据混合任务(中英、emoji、符号等)
二、ULM 分词的核心思想
ULM 将分词视为最大化句子概率的一种建模问题。
不同于基于频率合并的 BPE 和 WordPiece,ULM 分词基于如下假设:
一个句子是由若干个子词(subword)组成的,每个子词是独立生成的(即一元语言模型),目标是找到 最大概率的子词组合方式。
三、形式化定义(Unigram Language Model)
给定一个句子 x x x,它可以被切分为不同的子词序列 s 1 , s 2 , . . . , s n s_1, s_2, ..., s_n s1,s2,...,sn。ULM 分词的目标是:
max ( s 1 , . . . , s n ) ∈ segmentations ( x ) ∏ i = 1 n P ( s i ) \max_{(s_1, ..., s_n) \in \text{segmentations}(x)} \prod_{i=1}^n P(s_i) (s1,...,sn)∈segmentations(x)maxi=1∏nP(si)
其中:
- P ( s i ) P(s_i) P(si):是每个子词的概率(从训练语料中学习)
- 分词目标是选择使整个句子概率最大的子词序列
四、训练过程概述
ULM 分词器的训练流程如下:
-
初始化词表:
- 从训练语料中提取所有可能的子词片段(最大长度一般为 4-8 字)。
- 构建一个大词表(初始词表)。
-
估计子词概率:
- 用 EM 算法(Expectation-Maximization)估计每个子词的概率。
-
删除低概率子词:
- 每次删除得分最低的子词片段,更新词表。
- 不断精简词表到预设大小(如 32,000 或 16,000)。
-
完成分词模型训练:
- 得到最终的子词概率分布,作为分词模型。
五、ULM 分词的解码(分词)过程
解码时,ULM 分词使用动态规划或前向搜索,找到使句子概率最大的子词切分方式:
output = arg max s 1 , . . . , s n ∏ i P ( s i ) \text{output} = \arg\max_{s_1, ..., s_n} \prod_i P(s_i) output=args1,...,snmaxi∏P(si)
例如:
原始文本:
internationalization
ULM 分词结果:
['▁inter', 'nation', 'al', 'ization']
- “▁” 表示空格,用于表示词首
- 每个子词都有概率,组合成最高概率的分词结果
六、与 BPE/WordPiece 对比
对比维度 | ULM(Unigram Language Model) | BPE | WordPiece |
---|---|---|---|
核心算法 | 基于子词概率建模 | 按频率合并字符对 | 按似然合并字符对 |
是否贪心 | 否(全局优化) | 是 | 是 |
是否允许多个分词方式 | 是(概率建模) | 否 | 否 |
解码策略 | 动态规划搜索最大概率路径 | 贪心合并 | 贪心合并 |
词表训练 | EM 算法 | 频率统计 | 最大似然估计 |
特点 | 分词灵活、支持多个路径 | 实现简单 | 泛化性强 |
七、ULM 分词示例(使用 SentencePiece)
1. 安装 SentencePiece
pip install sentencepiece
2. 训练模型(命令行)
spm_train --input=data.txt --model_prefix=ulm --vocab_size=8000 --model_type=unigram
3. 使用分词器
import sentencepiece as spm
sp = spm.SentencePieceProcessor()
sp.load("ulm.model")
text = "internationalization"
tokens = sp.encode(text, out_type=str)
print(tokens) # 输出类似:['▁inter', 'nation', 'al', 'ization']
八、ULM 分词的优点与缺点
✅ 优点
- 全局最优解,不是贪心策略
- 支持多个分词路径(可用于采样、数据增强)
- 支持多语言、Unicode、特殊字符等场景
- 可以生成高质量子词词表
❌ 缺点
- 训练复杂度比 BPE 高(使用 EM 算法)
- 解码开销略高(需要搜索)
九、总结
项目 | 内容 |
---|---|
名称 | ULM 分词(Unigram Language Model Tokenization) |
实现 | Google SentencePiece 中的 --model_type=unigram |
原理 | 基于概率的一元语言模型,选取最优子词组合 |
训练算法 | EM(Expectation-Maximization) |
解码策略 | 动态规划或前向搜索 |
应用模型 | T5、mBART、XLM-R、ALBERT(部分) |
ULM 分词是一种强大而灵活的子词建模方法,适用于多语言预训练、机器翻译、低资源场景等任务。