WordPiece详解
1. 定义与背景
WordPiece 是一种子词分词算法,由谷歌于2012年提出,最初用于语音搜索系统,后广泛应用于机器翻译和BERT等预训练模型。其核心思想是将单词拆分为更小的子词单元(如词根、前缀/后缀),从而解决传统分词方法面临的词汇表过大和未知词(OOV)处理难题。例如,在BERT中,WordPiece通过子词拆分实现了对复杂词汇的灵活处理。
2. 核心原理与算法步骤
WordPiece 的流程可分为以下步骤:
a. 初始化与预分词
- 初始词汇表:从基础字符(如字母、汉字)开始,并添加特殊标记(如
[UNK]
表示未知词)。 - 预分词:将文本按空格或标点分割为单词,例如将句子“hugging face”拆分为
["hugging", "face"]
。
b. 子词拆分与合并规则
- 拆分前缀:每个单词的非首字符添加前缀(如
##
),例如“word”拆分为["w", "##o", "##r", "##d"]
。 - 合并策略:基于互信息分数选择合并的子词对,公式为:
score = 词对频率 首子词频率 × 次子词频率 \text{score} = \frac{\text{词对频率}}{\text{首子词频率} \times \text{次子词频率}} score=首子词频率×次子词频率词对频率
优先合并低频但共现频繁的子词对,以最大化训练数据的似然概率。
c. 迭代构建词表
重复合并最高得分的子词对,直至达到预设的词汇表大小或似然增益低于阈值。
3. 与BPE的对比
WordPiece 常与BPE(Byte-Pair Encoding)对比,二者关键差异如下:
特征 | BPE | WordPiece |
---|---|---|
合并标准 | 选择频率最高的子词对 | 选择使数据似然最大化的子词对 |
前缀处理 | 无特殊符号 | 非首字符添加## 标记 |
应用场景 | GPT-2、RoBERTa | BERT、多语言模型 |
语言模型依赖 | 无 | 需预训练语言模型辅助评分 |
示例:对于词对("un", "happy")
,若un
出现100次,happy
出现200次,且共现50次,则BPE直接合并(因共现频率高),而WordPiece计算得分为 50 / ( 100 × 200 ) = 0.0025 50/(100×200)=0.0025 50/(100×200)=0.0025,可能因分数低而不合并。
4. 实际应用案例
- BERT模型:WordPiece是BERT默认的分词器,通过处理长尾词汇(如“unhappiness”拆为
["un", "##happiness"]
)提升模型泛化能力。 - 机器翻译:将罕见词(如德语复合词“Donaudampfschifffahrtsgesellschaft”)拆分为子词,避免OOV问题。
- 多语言模型:mBERT使用WordPiece支持104种语言,通过共享子词实现跨语言迁移。
- 中文处理:虽然中文以字为单位,但WordPiece仍用于拆分专有名词(如“BACE1”拆为
["BA", "##CE", "##1"]
)。