searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

三大Subword算法

2023-05-08 06:04:07
5
0

1、综述

在NLP任务中,神经网络模型的训练和预测都需要借助词表来对句子进行表示。传统构造词表的方法,是先对各个句子进行分词,然后再统计并选出频数最高的前N个词组成词表。
通常训练集中包含了大量的词汇,以英语为例,总的单词数量在17万到100万左右。出于计算效率的考虑,通常N的选取无法包含训练集中的所有词。因而,这种方法构造的词表存在着如下的问题:
  1. 实际应用中,模型预测的词汇是开放的,对于未在词表中出现的词(Out Of Vocabulary, OOV),模型将无法处理及生成;
  2. 词表中的低频词/稀疏词在模型训练过程中无法得到充分训练,进而模型不能充分理解这些词的语义;
  3. 一个单词因为不同的形态会产生不同的词,如由"look"衍生出的"looks", "looking", "looked",显然这些词具有相近的意思,但是在词表中这些词会被当作不同的词处理,一方面增加了训练冗余,另一方面也造成了大词汇量问题。
一种解决思路是使用字符粒度来表示词表,虽然能够解决OOV问题,但单词被拆分成字符后,一方面丢失了词的语义信息,另一方面,模型输入会变得很长,这使得模型的训练更加复杂难以收敛。
针对上述问题,Subword(子词)模型方法被提出。与传统空格分隔tokenization技术的对比,有以下优点:它的划分粒度介于词与字符之间,比如可以将”looking”划分为”look”和”ing”两个子词,而划分出来的"look",”ing”又能够用来构造其它词,如"look"和"ed"子词可组成单词"looked",因而Subword方法能够大大降低词典的大小,同时对相近词能更好地处理。
目前有三种主流的Subword算法,它们分别是:Byte Pair Encoding (BPE), WordPiece和Unigram Language Model。

2、Byte Pair Encoding (BPE)

BPE最早是一种数据压缩算法,由Sennrich等人于2015年引入到NLP领域并很快得到推广。该算法简单有效,因而目前它是最流行的方法。OpenAI 的GPT-2和Facebook的RoBERTa使用的Subword算法都是BPE。
BPE获得Subword的步骤如下:
  • 准备足够大的训练语料,并确定期望的Subword词表大小;
  • 将单词拆分为字符序列并在末尾添加后缀“ </ w>”,统计单词频率。 本阶段的subword的粒度是字符。 例如,“ low”的频率为5,那么将其改写为“ l o w </ w>”:5
  • 在语料上统计单词内相邻单元对的频数,选取频数最高的单元对合并成新的Subword单元;

重复第3步直到达到第1步设定的Subword词表大小或下一个最高频数为1;

2.1 算法过程
下面以一个例子来说明。假设有语料集经过统计后表示为{'low':5,'lower':2,'newest':6,'widest':3},其中数字代表的是对应单词在语料中的频数。
(1)拆分单词成最小单元,并初始化词表。这里,最小单元为字符,因而,可得到
语料 词表
'l o w </w>':5
'l o w e r </w>':2
'n e w e s t </w>':6
'w i d e s t </w>':3
'l','o','w', 'e',
'r','n','s','t','i',
'd','</w>'

(2)在语料上统计相邻单元的频数。这里,最高频连续子词对"e"和"s"出现了6+3=9次,将其合并成"es",有
语料 词表
'l o w </w>':5
'l o w e r </w>':2
'n e w es t </w>':6
'w i d es t </w>':3
'l','o','w','e',
'r','n','s','t','
i','d','</w>','es'
由于语料中不存在's'子词了,因此将其从词表中删除。同时加入新的子词'es'。一增一减,词表大小保持不变。
(3)继续统计相邻子词的频数。此时,最高频连续子词对"es"和"t"出现了6+3=9次, 将其合并成"est",有
语料 词表
'l o w </w>':5
'l o w e r </w>':2
'n e w est </w>':6
'w i d est  </w>':3
'l','o','w','e',
'r','n','t','i',
'd','</w>','es','est'
(4)接着,最高频连续子词对为"est"和"</w>",有
语料 词表
'l o w </w>':5
'l o w e r </w>':2
'n e w est</w>':6
'w i d est</w>':3
'l','o','w','e',
'r','n','i','d',
'est','est</w>'
(5)继续上述迭代直到达到预设的Subword词表大小或下一个最高频的字节对出现频率为1。
从上面的示例可以知道,每次合并后词表大小可能出现3种变化:
  • +1,表明加入合并后的新子词,同时原来的2个子词还保留(2个字词分开出现在语料中)。
  • +0,表明加入合并后的新子词,同时原来的2个子词中一个保留,一个被消解(一个子词完全随着另一个子词的出现而紧跟着出现)。
  • -1,表明加入合并后的新子词,同时原来的2个子词都被消解(2个字词同时连续出现)。
实际上,随着合并的次数增加,词表大小通常先增加后减小。
2.2 编码解码
在得到Subword词表后,针对每一个单词,我们可以采用如下的方式来进行编码:
  1. 将词典中的所有子词按照长度由大到小进行排序;
  2. 对于单词w,依次遍历排好序的词典。查看当前token是否是该单词的子字符串,如果是,则输出当前token,并对剩余单词字符串继续匹配。
  3. 如果遍历完字典后,仍然有子字符串没有匹配,则将剩余字符串替换为特殊符号输出,如”<unk>”。
  4. 单词的表示即为上述所有输出子词。

# 给定单词序列
[“the</w>”, “highest</w>”, “mountain</w>”]

# 假设已有排好序的subword词表
[“errrr</w>”, “tain</w>”, “moun”, “est</w>”, “high”, “the</w>”, “a</w>”]

# 迭代结果
"the</w>" -> ["the</w>"]
"highest</w>" -> ["high", "est</w>"]
"mountain</w>" -> ["moun", "tain</w>"]
解码过程比较简单,如果相邻子词间没有中止符,则将两子词直接拼接,否则两子词之间添加分隔符。

# 编码序列
[“the</w>”, “high”, “est</w>”, “moun”, “tain</w>”]

# 解码序列
“the</w> highest</w> mountain</w>”
3、WordPiece
Google的Bert模型在分词的时候使用的是WordPiece算法。与BPE算法类似,WordPiece算法也是每次从词表中选出两个子词合并成新的子词。与BPE的最大区别在于,如何选择两个子词进行合并:BPE选择频数最高的相邻子词合并,而WordPiece选择能够提升语言模型概率最大的相邻子词加入词表。
3.1 原理
假设句子S=(t1,t2,.....tn)由n个子词组成,ti表示子词,且假设各个子词之间是独立存在的,则句子S的语言模型似然值等价于所有子词概率的乘积。
BPE首先考察两个token并考察各token对出现的频次,然后合并拥有最高频次的两个token。在每一步中,它仅仅考虑最常出现的token对。
与BPE对比,WordPiece是考察合并特定对的token对整体的潜在影响,通过使用概率语言模型来实现,在每一步迭代中,选择合并能够使得整体似然获得最大提升的token对,(通过合并新的token对时的概率减去单个token时的概率)。
WordPiece每次选择合并的两个子词,他们具有最大的互信息值,也就是两子词在语言模型上具有较强的关联性,它们经常在语料中以相邻方式同时出现。
wordpiece直接根据上述公式的正负(正则代表了增益)来决定是否合并两个subword得到一个新的subword,其实这里和决策树的分裂过层非常类似,两个两个相邻字符或subword之间进行分裂判断分裂增益是否增大,增大则合并。
WordPiece获得Subword的步骤如下:
  • 准备足够大的训练语料
  • 确定期望的subword词表大小
  • 将单词拆分成字符序列
  • 基于第3步数据训练语言模型
  • 从所有可能的subword单元中选择加入语言模型后能最大程度地增加训练数据概率的单元作为新的单元
  • 重复第5步直到达到第2步设定的subword词表大小或概率增量低于某一阈值重复第3步直到达到第1步设定的Subword词表大小或下一个最高频数为1

4、Unigram Language Model (ULM)
与WordPiece一样,Unigram Language Model(ULM)同样使用语言模型来挑选子词。不同之处在于,BPE和WordPiece算法的词表大小都是从小到大变化,属于增量法。而Unigram Language Model则是减量法,即先初始化一个大词表,根据评估准则不断丢弃词表,直到满足限定条件。ULM算法考虑了句子的不同分词可能,因而能够输出带概率的多个子词分段。
5、总结
以上讨论仅针对英文场景,对于中文来说,并没有WordPiece、BPE这类切分法,因为中文最小单位就是字,并不能像英文一样,再把词切分成字母的组合,现在的中文预训练模型大多采用暂翻译为全词Mask,Whole Word Masking (wwm),首先以字为粒度进行切分,然后应用将全词Mask的方法,即对组成同一个词的汉字全部进行[MASK]。
 

0条评论
0 / 1000
曹****佳
6文章数
0粉丝数
曹****佳
6 文章 | 0 粉丝
原创

三大Subword算法

2023-05-08 06:04:07
5
0

1、综述

在NLP任务中,神经网络模型的训练和预测都需要借助词表来对句子进行表示。传统构造词表的方法,是先对各个句子进行分词,然后再统计并选出频数最高的前N个词组成词表。
通常训练集中包含了大量的词汇,以英语为例,总的单词数量在17万到100万左右。出于计算效率的考虑,通常N的选取无法包含训练集中的所有词。因而,这种方法构造的词表存在着如下的问题:
  1. 实际应用中,模型预测的词汇是开放的,对于未在词表中出现的词(Out Of Vocabulary, OOV),模型将无法处理及生成;
  2. 词表中的低频词/稀疏词在模型训练过程中无法得到充分训练,进而模型不能充分理解这些词的语义;
  3. 一个单词因为不同的形态会产生不同的词,如由"look"衍生出的"looks", "looking", "looked",显然这些词具有相近的意思,但是在词表中这些词会被当作不同的词处理,一方面增加了训练冗余,另一方面也造成了大词汇量问题。
一种解决思路是使用字符粒度来表示词表,虽然能够解决OOV问题,但单词被拆分成字符后,一方面丢失了词的语义信息,另一方面,模型输入会变得很长,这使得模型的训练更加复杂难以收敛。
针对上述问题,Subword(子词)模型方法被提出。与传统空格分隔tokenization技术的对比,有以下优点:它的划分粒度介于词与字符之间,比如可以将”looking”划分为”look”和”ing”两个子词,而划分出来的"look",”ing”又能够用来构造其它词,如"look"和"ed"子词可组成单词"looked",因而Subword方法能够大大降低词典的大小,同时对相近词能更好地处理。
目前有三种主流的Subword算法,它们分别是:Byte Pair Encoding (BPE), WordPiece和Unigram Language Model。

2、Byte Pair Encoding (BPE)

BPE最早是一种数据压缩算法,由Sennrich等人于2015年引入到NLP领域并很快得到推广。该算法简单有效,因而目前它是最流行的方法。OpenAI 的GPT-2和Facebook的RoBERTa使用的Subword算法都是BPE。
BPE获得Subword的步骤如下:
  • 准备足够大的训练语料,并确定期望的Subword词表大小;
  • 将单词拆分为字符序列并在末尾添加后缀“ </ w>”,统计单词频率。 本阶段的subword的粒度是字符。 例如,“ low”的频率为5,那么将其改写为“ l o w </ w>”:5
  • 在语料上统计单词内相邻单元对的频数,选取频数最高的单元对合并成新的Subword单元;

重复第3步直到达到第1步设定的Subword词表大小或下一个最高频数为1;

2.1 算法过程
下面以一个例子来说明。假设有语料集经过统计后表示为{'low':5,'lower':2,'newest':6,'widest':3},其中数字代表的是对应单词在语料中的频数。
(1)拆分单词成最小单元,并初始化词表。这里,最小单元为字符,因而,可得到
语料 词表
'l o w </w>':5
'l o w e r </w>':2
'n e w e s t </w>':6
'w i d e s t </w>':3
'l','o','w', 'e',
'r','n','s','t','i',
'd','</w>'

(2)在语料上统计相邻单元的频数。这里,最高频连续子词对"e"和"s"出现了6+3=9次,将其合并成"es",有
语料 词表
'l o w </w>':5
'l o w e r </w>':2
'n e w es t </w>':6
'w i d es t </w>':3
'l','o','w','e',
'r','n','s','t','
i','d','</w>','es'
由于语料中不存在's'子词了,因此将其从词表中删除。同时加入新的子词'es'。一增一减,词表大小保持不变。
(3)继续统计相邻子词的频数。此时,最高频连续子词对"es"和"t"出现了6+3=9次, 将其合并成"est",有
语料 词表
'l o w </w>':5
'l o w e r </w>':2
'n e w est </w>':6
'w i d est  </w>':3
'l','o','w','e',
'r','n','t','i',
'd','</w>','es','est'
(4)接着,最高频连续子词对为"est"和"</w>",有
语料 词表
'l o w </w>':5
'l o w e r </w>':2
'n e w est</w>':6
'w i d est</w>':3
'l','o','w','e',
'r','n','i','d',
'est','est</w>'
(5)继续上述迭代直到达到预设的Subword词表大小或下一个最高频的字节对出现频率为1。
从上面的示例可以知道,每次合并后词表大小可能出现3种变化:
  • +1,表明加入合并后的新子词,同时原来的2个子词还保留(2个字词分开出现在语料中)。
  • +0,表明加入合并后的新子词,同时原来的2个子词中一个保留,一个被消解(一个子词完全随着另一个子词的出现而紧跟着出现)。
  • -1,表明加入合并后的新子词,同时原来的2个子词都被消解(2个字词同时连续出现)。
实际上,随着合并的次数增加,词表大小通常先增加后减小。
2.2 编码解码
在得到Subword词表后,针对每一个单词,我们可以采用如下的方式来进行编码:
  1. 将词典中的所有子词按照长度由大到小进行排序;
  2. 对于单词w,依次遍历排好序的词典。查看当前token是否是该单词的子字符串,如果是,则输出当前token,并对剩余单词字符串继续匹配。
  3. 如果遍历完字典后,仍然有子字符串没有匹配,则将剩余字符串替换为特殊符号输出,如”<unk>”。
  4. 单词的表示即为上述所有输出子词。

# 给定单词序列
[“the</w>”, “highest</w>”, “mountain</w>”]

# 假设已有排好序的subword词表
[“errrr</w>”, “tain</w>”, “moun”, “est</w>”, “high”, “the</w>”, “a</w>”]

# 迭代结果
"the</w>" -> ["the</w>"]
"highest</w>" -> ["high", "est</w>"]
"mountain</w>" -> ["moun", "tain</w>"]
解码过程比较简单,如果相邻子词间没有中止符,则将两子词直接拼接,否则两子词之间添加分隔符。

# 编码序列
[“the</w>”, “high”, “est</w>”, “moun”, “tain</w>”]

# 解码序列
“the</w> highest</w> mountain</w>”
3、WordPiece
Google的Bert模型在分词的时候使用的是WordPiece算法。与BPE算法类似,WordPiece算法也是每次从词表中选出两个子词合并成新的子词。与BPE的最大区别在于,如何选择两个子词进行合并:BPE选择频数最高的相邻子词合并,而WordPiece选择能够提升语言模型概率最大的相邻子词加入词表。
3.1 原理
假设句子S=(t1,t2,.....tn)由n个子词组成,ti表示子词,且假设各个子词之间是独立存在的,则句子S的语言模型似然值等价于所有子词概率的乘积。
BPE首先考察两个token并考察各token对出现的频次,然后合并拥有最高频次的两个token。在每一步中,它仅仅考虑最常出现的token对。
与BPE对比,WordPiece是考察合并特定对的token对整体的潜在影响,通过使用概率语言模型来实现,在每一步迭代中,选择合并能够使得整体似然获得最大提升的token对,(通过合并新的token对时的概率减去单个token时的概率)。
WordPiece每次选择合并的两个子词,他们具有最大的互信息值,也就是两子词在语言模型上具有较强的关联性,它们经常在语料中以相邻方式同时出现。
wordpiece直接根据上述公式的正负(正则代表了增益)来决定是否合并两个subword得到一个新的subword,其实这里和决策树的分裂过层非常类似,两个两个相邻字符或subword之间进行分裂判断分裂增益是否增大,增大则合并。
WordPiece获得Subword的步骤如下:
  • 准备足够大的训练语料
  • 确定期望的subword词表大小
  • 将单词拆分成字符序列
  • 基于第3步数据训练语言模型
  • 从所有可能的subword单元中选择加入语言模型后能最大程度地增加训练数据概率的单元作为新的单元
  • 重复第5步直到达到第2步设定的subword词表大小或概率增量低于某一阈值重复第3步直到达到第1步设定的Subword词表大小或下一个最高频数为1

4、Unigram Language Model (ULM)
与WordPiece一样,Unigram Language Model(ULM)同样使用语言模型来挑选子词。不同之处在于,BPE和WordPiece算法的词表大小都是从小到大变化,属于增量法。而Unigram Language Model则是减量法,即先初始化一个大词表,根据评估准则不断丢弃词表,直到满足限定条件。ULM算法考虑了句子的不同分词可能,因而能够输出带概率的多个子词分段。
5、总结
以上讨论仅针对英文场景,对于中文来说,并没有WordPiece、BPE这类切分法,因为中文最小单位就是字,并不能像英文一样,再把词切分成字母的组合,现在的中文预训练模型大多采用暂翻译为全词Mask,Whole Word Masking (wwm),首先以字为粒度进行切分,然后应用将全词Mask的方法,即对组成同一个词的汉字全部进行[MASK]。
 

文章来自个人专栏
自然语言处理
6 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0