13.1 开放词表 437
使用 BPE 算法进行子词切分包含两个步骤。首先,通过统计的方法构造符号合
并表(见图??),具体的方式为:先对分过词的文本进行统计,得到词表和词频,同
时将词表中的单词分割为字符表示;其次统计词表中所有出现的二元组的频次,选
择当前频次最高的二元组加入符号合并表,并将所有词表中出现的该二元组合并为
一个单元;不断地重复上述过程,直到合并表的大小达到预先设定的大小,或没有二
元组可以被合并。图??给出了一个使用字符合并表对单词进行子词切分的实例。红
色单元为每次合并后得到的新符号,直至无法合并,或遍历结束,得到最终的合并
结果。其中每一个单元为一个子词。
符号合并表
(r,<e>), (e,s), (l,o), (es,t), (lo,w), (est,<e>), (e,r<e>)
(a) 符号合并表
l o w e r <e> l o w e r<e> lo w e r<e> low e r<e> low er<e>
l o w e s t <e> l o w es t <e> lo w es t <e> lo w est <e> low est <e> low est<e>
样例 1:
样例 2:
(b) 合并样例
图 13.3 BPE 中的子词切分过程
使用 BPE 方法后,翻译模型的输出也是子词序列,因此需要对最终得到的翻译
结果进行子词还原,即将子词形式表达的单元重新组合为原本的单词。这一步操作
也十分简单,只需要不断的将每个子词向后合并,直至遇到表示单词边界的终结符,
便得到了一个完整的单词。
使用 BPE 方法的策略有很多。不仅可以单独对源语言和目标语言句子进行子词
的切分,也可以联合两种语言,共同进行子词切分,被称作双字节联合编码(Joint-BPE)
[89]
。相比于单语 BPE,Joint-BPE 可以增加两种语言子词切分的一致性。对于相似语
系中的语言,如英语和德语,常使用 Joint-BPE 的方法联合构建词表。而对于汉语和
英语这些差异比较大的语种,则需要独立地进行子词切分。
BPE 还有很多变种方法。比如,可以设计更合理的符号合并优先级。这种方法
的出发点在于,在不考虑优先级的情况下,在对一个单词用同一个合并表切分子词
时,可能存在多种结果。如 hello,可以被切分为“hell”和“o”,也可以被切分为“h”
和“ello”。这种切分方式的多样性可以用来提高神经机器翻译系统的健壮性
[566]
。此
外,尽管 BPE 也被命名为双字节编码,但是在实践中该方法一般处理的是 Unicode
编码,而不是字节。相应的,在预训练模型 GPT2 中也探索了字节级别的 BPE,这种
方法在机器翻译、自动问答等任务中取得了很好的效果
[411]
。