Subword三大算法
一、 概述
SubWord算法如今已成为一个重要的NLP模型的提升算法。其主要优势如下:
- 传统词表示方法无法很好地处理未知和罕见词汇
- 传统的tokenization不利于模型学习词缀之间的关系
- Character embedding作为OOV的解决方案粒度太细
- Subword粒度在词与字符之间,能很好地平衡OOV问题
二、 BPE
- 优缺点
- 优点:可以有效平衡词汇表大小和步数
- 缺点:基于贪婪和确定的符号替换,不能提供带概率的多个分片结果
- 算法
- 准备足够大的训练语料
- 确定subword词表大小
- 将单词拆分为字符序列并在末尾添加后缀“”,统计单词频率。本阶段的subword的粒度是单词。例如,“ low”的频率为5,那么我们将其改写为“ l o w </ w>”:5
- 统计每个连续字节对的出现频率,选择最高频率者合并成新的subword
- 重复上一步直到达到第二步设定的subword字表大小或下一个最高频的字节对出现频率为1
-
编码
在之前的算法中,我们已经得到了subword的词表,对该词表按照子词长度由大到小排序。编码时,对于每个单词,遍历排好序的字词词表寻找是否有token是当前单词的子字符串,如果有,则该token是表示单词的tokens之一。我们从最长的token迭代到最短的token,尝试将每个单词中的子字符串替换为token。最终,我们将迭代所有tokens,并将所有子字符串替换为tokens。如果仍然有子字符串没被替换但所有token都已迭代完毕,则将剩余的子词替换为特殊token,如<unk>。实例如下:
编码的计算量很大,在实践中,我们可以pre-tokenize所有单词,并在词典中保存单词的tokenize的方式。如果我们看到字典中不存的未知单词,我们应采用以上编码方式对单词进行tokenize,然后将新单词的tokenization添加到字典中备用
-
解码
将所有的tokens拼在一起,实例如下:
三、WordPieceWordPiece算法可以看做是BPE的变种。不同点在于,WordPiece基于概率生成新的subword而不是最高频字对。算法如下:
- 准备足够大的训练语料
- 确定期望的subword词表大小
- 将单词分成字符序列
- 基于第三步训练语言模型
- 将所有可能得subword单元选择加入语言模型后最大程度地增加训练数据概率的单元作为新的单元
- 重复第二步设定的subword此表大小或概率量低于某一阈值
四、Unigram Language Model
-
解释
ULM是另外一种subword分隔算法,他能够输出带概率的多个子词分段,他引入了一个假设:所欲的subword的出现是独立的,并且subword序列由subword出现概率的乘机产生。WordPiece和ULM都利用语言模型建立subword词表
-
算法
- 准备足够大的训练语料
- 确定期望的subword词表大小
- 给定词序列化下一个词出现的概率
- 计算每个subword的损失
- 基于损失对subword排序并保留钱X%,为了避免OOV,建议保留字符级的单元
- 重复第3至第5步直到达到第2步设定的subword词表大小或第5步的结果不再变化