# WordPiece 标记化
WordPiece 是 Google 为预训练 BERT 而开发的标记化算法。此后,它在不少基于 BERT 的 Transformer 模型中得到重用,例如 DistilBERT、MobileBERT、Funnel Transformers 和 MPNET。它在训练方面与 BPE 非常相似,但实际标记化的方式不同。
# 训练算法
Google 从未开源 WordPiece 训练算法的实现,因此以下是我们基于已发表文献的最佳猜测。它可能不是 100% 准确的。
与 BPE 一样,WordPiece 从一个小词汇表开始,包括模型使用的特殊标记和初始字母表。因为它通过添加前缀来识别子词 (如同 ## 对于 BERT), 每个单词最初是通过将该前缀添加到单词内的所有字符来拆分的。所以,例如 "word" , 像这样拆分:
w ##o ##r ##d |
因此,初始字母表包含出现在单词开头的所有字符以及出现在单词内部的以 WordPiece 前缀开头的字符。
然后,再次像 BPE 一样,WordPiece 学习合并规则。主要区别在于选择要合并的对的方式。WordPiece 不是选择最频繁的对,而是使用以下公式计算每对的分数:
score=(freq_of_pair)/(freq_of_first_element×freq_of_second_element)
通过将配对的频率除以其每个部分的频率的乘积,该算法优先合并单个部分在词汇表中频率较低的对。例如,它不一定会合并 ("un", "##able") 即使这对在词汇表中出现的频率很高,因为 "un" 和 "##able" 很可能每个词都出现在很多其他词中并且出现频率很高。相比之下,像 ("hu", "##gging") 可能会更快地合并 (假设 “hugging” 经常出现在词汇表中), 因为 "hu" 和 "##gging" 这两个词单独出现地频率可能较低。