1.传统构建方法(字/词粒度)
构建过程
- 对数据集中的所有句子进行分词,通过jieba、ltp等分词工具将句子粒度缩小到词粒度。
- 对切分出来的词进行统计,统计并选出频数最高的前N个词组成词表,对低频词舍弃。
举例: 词粒度:我/爱/算法
存在问题
- 通常N的选取无法包含训练集中的所有词,但也会舍弃掉很多词。并且对于未在词表中出现的词(Out Of Vocabulary,OOV),模型将无法处理及生成;
- 词表中的低频词/稀疏词在模型训练过程中无法得到充分训练,进而模型不能充分理解这些词的语义;
- 一个单词的不同的形态问题,如由"look"以及其他形态的"looks", “looking”,“looked”,显然这些词具有相近的意思,但是在词表中这些词会被当作不同的词处理,一方面增加了训练冗余,另一方面也造成了大词汇量问题。
2.Subword 粒度
2.1字节对编码(Byte pair encoding,BPE)
常用模型:GPT-2和RoBERTa
BPE步骤:
1.给定的数据集中抽取单词以及相应的频次,并确定词表大小;
2.将单词拆分为字符序列,比如英文中26个字母加上各种符号,这些作为初始词表;
3.将所有字符序列中的字符不重复地添加到词表中,选择并合并频次最高的相邻字符对;
4.重复步骤3直到满足词表大小。
2.2WordPiece (Character-Level BPE)
常用模型:Bert
与BPE算法类似,WordPiece算法也是每次从词表中选出两个子词合并成新的子词。与BPE的最大区别在于,如何选择两个子词进行合并:BPE选择频数最高的相邻子词合并,而WordPiece选择能够提升语言模型概率最大(似然概率)的相邻子词加入词表。所以我们合并在给定训练集上训练的语言模型中具有最高概率的字符对。
WordPiece 步骤:
1. 准备足够大的语料,并确定期望的词汇表大小(subword大小);
2. 将语料中的单词,拆分成字符序列;
3. 基于第2步的数据训练语言模型
4. 从所有可能的subword 候选单元中,选择能似然值变化最大 或 最大程度增加训练数据概率的新子词插入词汇表中;
5. 重复第4步,直到达到第一步中设定的subword词表大小 ,或概率/似然值 增量低于某一阈值。
2.3Unigram Language Model (ULM)
与WordPiece一样,Unigram Language Model(ULM)同样使用语言模型来挑选子词。不同之处在于,BPE和WordPiece算法的词表大小都是从小到大变化,属于增量法。而Unigram Language Model则是减量法,即先初始化一个大词表,根据评估准则不断丢弃词表,直到满足限定条件。ULM算法考虑了句子的不同分词可能,因而能够输出带概率的多个子词分段。
ULM步骤:
1.初始时,建立一个足够大的词表。一般,可用语料中的所有字符加上常见的子字符串初始化词表,也可以通过BPE算法初始化。
2.针对当前词表,用EM算法求解每个子词在语料上的概率。
3.对于每个子词,计算当该子词被从词表中移除时,总的loss降低了多少,记为该子词的loss。
4.将子词按照loss大小进行排序,丢弃一定比例loss最小的子词(比如20%),保留下来的子词生成新的词表。这里需要注意的是,单字符不能被丢弃,这是为了避免OOV情况。
5.重复步骤2到4,直到词表大小减少到设定范围。
3三种方法的比较
分词方法 | 训练 | 规则 | 结果 | 编码 |
---|---|---|---|---|
BPE | 从小的基础词表开始不断学习规则以扩充词表 | 合并出现频率最高的pair | 词表+合并规则 | 先将单词拆成字符,然后不断应用合井 |
WordPiece | 和BPE相同 | 合井互信息最大的pair | 仅有词表 | 在词表中找到单词的最长前缀,对单词的剩余部分递归执行上述操作 |
ULM | 从大的词表开始不断学习规则以缩滅 | 移除使得语料库的loss增加最小的子词 | 带有loss的词表 | 选取损失最小的分词方案 |