Word-Level Model
前面学习的 word2vec 和 glove 基本上都是基于word单词作为基本单位的模型,这种方式虽然能够很好的对词 库中每一个词进行向量表示。
但是也有很多不足,比如:
- OOV 问题
- 问题描述:容易出现单词不存在于词汇库中的情况;
- 解决方法:最佳语料规模,使系统能够获得更多的词汇量;
- 误拼障碍
- 问题描述:如果遇到了不正式的拼写, 系统很难进行处理;
- 解决方法:矫正或加规则约束;
- 做翻译问题时, 音译姓名比较难做到
Character-Level Model
研究表面,当训练大规模数据集的时候,深度卷积神经网络并不需要单词层面的意义(包括语言的语法和语义),可以将字符级的文本当做原始信号,并且使用一维的卷积神经网络来处理它。
这就是基于 字符(Character) 作为基本单位的模型,这种方式能够很好的对字库中每一个 Char 进行向量表示。
优点是:
- 能够解决 Word-level 所存在的 OOV 问题;
- 拼写类似的单词 具有类似的 embedding;
然而问题也有很多,比如:
- 序列变长
相比于 word-level , Character-level 的输入句子变长,使得数据变得稀疏,而且对于远距离的依赖难以学到,训练速度降低;
Subword Model
一种介于 word- level Model 和 Character-level 之间的 Model,
Subword Model 可以被分为 Byte Pair Encoding(BPE) 和 SentencePiece。
Byte Pair Encoding
基本思路
BPE 属于 压缩算法中一种,其主要思想就是将经常出现的byte pair用一个新的byte来代替,例如假设 ('A', ’B‘)经常顺序出现,则用一个新的标志'AB'来代替它们。具体操作
给定了文本库,我们的初始词汇库仅包含所有的单个的字符,然后不断的将出现频率最高的 n-gram pair 作为新的n-gram加入到词汇库中,直到词汇库的大小达到我们所设定的某个目标为止。举例说明
假设我们的文本库中出现的单词及其出现次数为:
{'l o w': 5, 'l o w e r': 2, 'n e w e s t': 6, 'w i d e s t': 3}
初始词汇库为:
{ 'l', 'o', 'w', 'e', 'r', 'n', 'w', 's', 't', 'i', 'd'}
出现频率最高的ngram pair是('e','s') 9次,所以我们将'es'作为新的词汇加入到词汇库中,由于'es'作为 一个整体出现在词汇库中,
此时,文本库可表示为
{'l o w': 5, 'l o w e r': 2, 'n e w es t': 6, 'w i d es t': 3}
这时出现频率最高的ngram pair是('es','t') 9次,将'est'加入到词汇库中,文本库更新为
{'l o w': 5, 'l o w e r': 2, 'n e w est': 6, 'w i d est': 3}
新的出现频率最高的ngram pair是('l','o')7次,将'lo'加入到词汇库中,文本库更新为
{'lo w': 5, 'lo w e r': 2, 'n e w est': 6, 'w i d est': 3}
以此类推,直到词汇库大小达到我们所设定的目标。这个例子中词汇量较小,对于词汇量很大的实际情 况,我们就可以通过BPE逐步建造一个较小的基于subword unit的词汇库来表示所有的词汇。
BPE 衍生物 wordpiece model
谷歌的NMT模型用了BPE的变种,称作wordpiece model,BPE中利用了n-gram count来更新词汇库, 而wordpiece model中则用了一种贪心算法来最大化语言模型概率,即选取新的n-gram时都是选择使 得perplexity减少最多的ngram。
sentencepiece model
- 基本思路
sentencepiece model 将词间的空白也当成一种标记,可以直接处理sentence,而不需要将其pre- tokenize成单词。
Hybrid Model
在大多数情况下我们还是采用word level模型,而只在遇到OOV的情况才采用character level模型。 其结构如下图所示,

对于句子中的 "cute",其属于 OOV 词汇,为了解决该问题,我们需要构建一个 Character-level 表示, 但在 decode 过程中遇到 OOV 的特殊符号表示 时,需要采用 character-level 的 decode 进行 解码。
该训练过程是end2end的,不过损失函数是word部分与character level部分损失函数的加权叠加。
FastText
FastText就是利用subword将word2vec扩充,有效的构建embedding。
基本思想
将每个 word 表示成 bag of character n-gram 以及单词本身的集合,例如对于where这个单词和n=3的 情况,它可以表示为 <wh,whe,her,ere,re>, ,其中"<",">"为代表单词开始与结束的特殊标记。
假设对于word ,其n-gram集合用
表示,每个n-gram的矢量表示为 ,则每个单词可以 表示成其所有n-gram的矢量和的形式,而center word
与context word
的分数就可表示成

之后就可以按照经典的word2vec算法训练得到这些特征向量。 这种方式既保持了word2vec计算速度快的优点,又解决了遇到training data中没见过的oov word的表
示问题,可谓一举两得。