Purely character-level models
对于英文来说,文字的粒度从细到粗依次是字符(character),子字符(subword),单词(word),character和word都很好理解,subword相当于英文中的词根、前缀、后缀等,它们都是有含义的。对于中文来说,只有两层,character和subword是同一层,表示单个的字,而word表示词语。
之前介绍的基于word的模型,存在out of vocabulary(OOV,未登录词)的问题。以英文为例,现存的英文单词数量太多了,随便加个前缀、后缀,变个时态什么的都变成新的单词了,所以英文单词的词典数量特别大,而且有很多低频稀疏词。很多模型在训练时都会去掉低频词,只保留高频词。那么这就存在一个问题,如果预测时遇到未登录词,则模型不认识,出现OOV的问题。
为了解决OOV问题,一开始用的是Purely character-level models,对英文来讲,直接计算26个字母的embedding向量,每个词由其字母的embedding拼接或者求平均得到。在以字符作为输入和输出的机器翻译系统中,这种纯基于字符级别的模型效果并没有比比原来基于word级别的模型效果好多少,且因为序列长度变为原来的数倍带来了更多的计算压力,而且梯度消失(爆炸)的问题也会更严重。
Sub-word models: two trends
人们想到两种使用subword办法解决OOV问题,第一种模型结构和word模型完全一样,只不过把word换成了subword;第二种是word和character的混合模型。
Byte Pair Encoding
使用第一种模型就需要得到subword,比如一个单词unbelievable,需要找出un,able和believ(e),如果对每一个单词都采用这种办法去分割会非常麻烦,可以引入BPE算法解决这个问题,此处引入文章一分钟搞懂的算法之BPE算法。
BPE,(byte pair encoder)字节对编码,也可以叫做digram coding双字母组合编码,主要目的是为了数据压缩,算法描述为字符串里频率最常见的一对字符被一个没有在这个字符中出现的字符代替的层层迭代过程。具体在下面描述。该算法首先被提出是在Philip Gage的C Users Journal的 1994年2月的文章“A New Algorithm for Data Compression”。
比如我们想编码:aaabdaaabac,我们会发现这里的aa出现的词数最高(我们这里只看两个字符的频率),那么用这里没有的字符Z来替代aa:ZabdZabac,此时,又发现ab出现的频率最高,那么同样的,Y来代替ab:ZYdZYac,同样的,ZY出现的频率大,我们用X来替代ZY:XdXac,最后,连续两个字符的频率都为1了,也就结束了。解码的时候,就按照相反的顺序更新替换即可。
第一种模型就是用BPE算法来得到高频subword的。一开始的词表种只有V={l,o,w,e,r,n,w,s,t,i,d},通过算法,我们会一步步将es,est,lo都加入到词表种,这样对于词典中未出现的一个单词west,就可以通过V中的w,est两个subword构成。这样的操作就把词典中的词汇扩大了。得到高频的subword作为V之后,后续在进行NLP任务时,encoder时查一下V,把char pair替换为新字符;decoder时查一下V,把新字符替换回原来的char pair。
Wordpiece/Sentencepiece model
Wordpiece字面理解是把word拆成一片一片,它的实现方法就是BPE,而Sentencepiece可以想做是预料中重复出现次数多的片断(它可以是多个词语组成,词语间的空格被保留为特殊标记)
BERT便使用了wordpiece模型的一个变体,它包含了:
- 在词汇表中的常用词
- 其他单词由wordpieces组成
如果你在一个基于单词的模型中使用BERT,你必须处理这个
Hybrid NMT
Hybrid NMT是第二类模型中比较经典的一种,这种思路大致思想是,当字典里面有这个word的时候,直接用word embedding,如果没有遇到过这个词,产生了OOV问题,则利用char embedding来学习word embedding来填充这些相对罕见的单词,并产生了超过2BLEU的改进。如下图,当遇到<unk>的时候开始字符级别的束搜索,其它的时候都是基于单词级别的束搜索。
混合模型与字符级模型相比:
- 纯粹的字符级模型能够非常有效地是用字符序列作为条件上下文
- 混合模型虽然提供了字符级的隐层表示,但并没有获得比单词级别更低的表示
FastText embeddings
它是一个类似于word2vecd的单词的表示库,但更适合于具有大量形态学的罕见单词和语言,本质上FastText是字符级别的CBOW和的n-gram的结合,所以fasttext也能解决OOV问题。
将单词表示为用边界符号和整词扩充的字符n-grams(下面例子$n=3$):
- $where=\lt wh,whe,her,ere,re\gt,\lt where \gt$
这里的$\lt her \gt$或者$\lt her$不等同于her(她),这些前缀(<)、后缀(>)和整个词都是独特的
- 将word表示为这些表示的和。上下文单词得分为:
当然与其获得所有单词的所有n-grams的表示,不如使用哈希表来持久化一些共同的表示,以此拥有固定数量的向量