一、背景

Subword算法如今已经成为了一个重要的NLP模型性能提升方法。自从2018年BERT横空出世横扫NLP界各大排行榜之后,各路预训练语言模型如同雨后春笋般涌现,其中Subword算法在其中已经成为标配。
subword算法的目的是解决:OOV问题(Out-of-vocabulary)
bert使用:wordpiece
roberta、GPT-2:bpe
常用的subword算有两种:

  • 1.wordpiece
  • 2.BPE(Byte Pair Encoding)
    subword算法分为两个个步骤:

(1)词表的构建(主要的)
(2)编码-解码
subword算法的不同主要在构建词表的算法不同

二、BPE

1.subword词表构建

1.准备语料,分解成最小单元,比如英文中26个字母加上各种符号,作为原始词表
2.根据语料统计相邻字符对出现的频次
3.挑出频次最高的相邻字符对,比如"t"和"h",合并组成"th",加入词表,训练语料中所有该相邻字符对都进行融合
4.重复2和3操作,直至词表中单词的数量达到期望,或下一个最高频的字节对出现频率为1

2.编码和解码

1.将词典中的所有子词按照长度由大到小进行排序;
2.对于单词w,依次遍历排好序的词典。查看当前子词是否是该单词的子字符串,如果是,则输出当前子词,并对剩余单词字符串继续匹配。
3.如果遍历完字典后,仍然有子字符串没有匹配,则将剩余字符串替换为特殊符号输出,如”<unk>”。
4.单词的表示即为上述所有输出子词。
解码过程比较简单,如果相邻子词间没有中止符,则将两子词直接拼接,否则两子词之间添加分隔符。

三、wordpiece

基本思路和BPE一样,主要构建词表的方式不一样,使用了互信息
1.互信息:凝聚度(Pointwise mutual information)
互信息是:描述两个随机变量相互依赖性的度量,关系越强互信息值越大
公式:$PMI = \frac{P(x,y)}{P(x)*P(y)}$
如果x,y独立 ,那么pmi等于1。如果不独立,则PMI大于1,当PMI足够大的时候就表示凝固度足够高。拿 “知”、“乎” 这两个字来说,假设在 5000 万字的样本中, “知” 出现了 150 万次, “乎” 出现了 4 万次。那 “知” 出现的概率为 0.03, “乎” 出现的概率为 0.0008。如果两个字符出现是个独立事件的话,”知”、“乎” 一起出现的期望概率是 0.03 * 0.0008 = 2.4e-05. 如果实际上 “知乎” 出现了 3 万次, 则实际上”知”、“乎” 一起出现的概率是 6e-03, 是期望概率的 250 倍。也就是说两个字越相关,点间互信息越大。

参考文献:
1.https://zhuanlan.zhihu.com/p/86965595
2.https://zhuanlan.zhihu.com/p/191648421?utm_source=wechat_session
3.https://zhuanlan.zhihu.com/p/112444056

标签: none

添加新评论