![1125e906a52e825382d9692f06686f8c.png](https://i-blog.csdnimg.cn/blog_migrate/8d09182915549079b40576d11054492a.jpeg)
1. 引言
在自然语言处理任务中,文本向量化往往是任务中必不可少的基础工作,因此如何更好地将文本向量化就显得尤为重要。词是自然语言文本中最小的语义单元,自然语言文本是由词序列构成的,因此如果能够完成对词的向量化,那么文本向量化的任务也就迎刃而解了。
词袋模型(bag of words)是最早的以词为基本处理单元的文本向量化方法,词袋模型通过先构建一个包含语料库中所有词的词典,然后根据词典完成对每个词的向量化,进而完成文本向量化。例1给出了词袋模型的词项量化和文本向量化的流程。
例1 给定一个包含两个文本的语料库,文本内容分别如下:
1)John likes to watch movies, Mary likes too.
2)John also likes to watch football games.
通过这两个文本构建如表1的词典:
![a8349585ab4b9fc91bdb4bb66765cd00.png](https://i-blog.csdnimg.cn/blog_migrate/65ad98c821a2f01406e9937062242ad2.png)
通过表1的词典,就可以将所有的词向量化了,每个词的向量长度都是词典的大小,然后向量中元素全是0, 除了一个位置的元素是1,这个位置是词在词典中的index。以watch为例,watch在词典中的index是4,那么watch的向量中第四个位置是1,其余都是0,这种表示方法称为one-hot向量表示,如下:
watch = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
完成对所有词的向量化之后,就可以得出两个文本的向量化结果,每个文本的向量长度都是词典的大小,向量中的每个位置的元素代表词典中该位置的词在文本中出现的次数。以文本1为例,John出现了1次,likes出现了2次,football出现了0次等等,结果如下:
文本1 = [1, 2, 1, 1, 1, 0, 0, 0, 1, 1]
词袋模型的几个问题:
- 维度灾难:如果词典中有很多个词,那么每个词都是一个维度很高的向量
- 未保留词序:只将文本看成是一袋子词
- 语义鸿沟:通过向量表示无法体现两个词是否为同义词
为了解决词袋模型的问题,通过语言模型构建词向量的方式出现了。
2. 统计语言模型与神经网络语言模型
自然语言中,一个句子是由多个词语按顺序组合构成。简单地说,统计语言模型就是计算这个组合出现的概率。
假设有一个句子
利用贝叶斯公式,
那么问题就由计算概率
关于
n-gram语言模型
利用贝叶斯公式,有
再根据大数定律,用频数代替频率,有
公式
通过n-gram模型的简化之后,计算
神经网络语言模型
除了用n-gram模型计算概率
![ff413a0039a1ae24de5b71c4a8c92d0e.png](https://i-blog.csdnimg.cn/blog_migrate/93233cad9467df42d5ac109dafae7d92.jpeg)
图1的神经网络模型包含三层,第一层是输入层
在求解神经网络语言模型的时候,存储在表
3. word2vec(CBOW和Skip-Gram)
神经网络语言模型包含两个非线性层,求解起来复杂度很高,于是出现了两种更高效的神经网络模型CBOW和Skip-Gram。
CBOW
CBOW 是 Continuous Bag-of-Words 的缩写,与神经网络语言模型不同的是,CBOW去掉了最耗时的非线性隐藏层。
![c1fdfcacb7302ab7d4a9de3a7036687b.png](https://i-blog.csdnimg.cn/blog_migrate/efce73f1c9f2b3a05ad82c3840dd17ff.jpeg)
从图中可以看出,CBOW模型预测的是
输入层到隐藏层
以图2为例,输入层是四个词的one-hot向量表示,分别为
其实这里就是一个简单地求和平均。
隐藏层到输出层
记隐藏层到输出层的权重矩阵为
注意,输出层的向量
![3eff59fc79379c87445a2757c9a02098.png](https://i-blog.csdnimg.cn/blog_migrate/d3bde57895623705b0fd37e659468ee1.png)
向量y中的每个元素表示我用 I、like、eat、apple 四个词预测出来的词是当元素对应的词的概率,比如是like的概率为0.05,是to的概率是0.80。由于我们想让模型预测出来的词是to,那么我们就要尽量让to的概率尽可能的大,所以我们目标是最大化函数
有了最大化的目标函数,我们接下来要做的就是求解这个目标函数,首先求
Skip-Gram
Skip-Gram的模型图与CBOW恰好相反,如图4所示。
![19b7ca4b9df593a4e49293e97e38291c.png](https://i-blog.csdnimg.cn/blog_migrate/7d8ee0fdf18dac9732447ee097208331.jpeg)
从图中可以看出,Skip-Gram模型预测的是
输入层到隐藏层
以图2为例,输入层是词的one-hot向量表示,分别为
隐藏层到输出层
记隐藏层到输出层的权重矩阵为
注意,输出层的向量
有了最大化的目标函数,我们接下来要做的就是求解这个目标函数,首先求
4. 层次softmax和负采样
由于第3节中的softmax层非常昂贵,每次计算的复杂度为
层次softmax
首先,层次softmax是一棵huffman树,树的叶子节点是训练文本中所有的词,非叶子节点都是一个逻辑回归二分类器,每个逻辑回归分类器的参数都不同,分别用
以图3中的例子为基础,更改之后的模型如图5.1和图5.2所示。
![77e6361d34fcaa3240569b17fce3b6ef.png](https://i-blog.csdnimg.cn/blog_migrate/d30f99da58f43175d9c5bfba0f2c4796.jpeg)
![77e6361d34fcaa3240569b17fce3b6ef.png](https://i-blog.csdnimg.cn/blog_migrate/d30f99da58f43175d9c5bfba0f2c4796.jpeg)
从图5.1和图5.2可以看出,我们就是将隐藏层的向量
采样到 I 的概率
采样到 eat 的概率
采样到 to 的概率
采样到 like 的概率
采样到 apple 的概率
对于图5.1的CBOW模型或图5.2的Skip-Gram模型,如果我们要预测的词是 to ,那么我们就要让
负采样
负采样实际上是采样负例来帮助训练的手段,其目的与层次softmax一样,是用来提升模型的训练速度。我们知道,模型对正例的预测概率是越大越好,模型对负例的预测概率是越小越好。由于正例的数量少,很容易保证每个正例的预测概率尽可能大,而负例的数量特别多,所以负采样的思路就是根据某种负采样的策略随机挑选一些负例,然后保证挑选的这部分负例的预测概率尽可能小。所以,负采样策略是对模型的效果影响很大,word2vec常用的负采样策略有均匀负采样、按词频率采样等等。
CBOW
以“I like to eat apple”为例子,假设窗口的大小是2,即我们会用 I to 来预测 like,所以在这里我们就认为(I,like)和(to,like)都是正例,而(I,apple)、(to,apple)就是负例,因为(I,apple)、(to,apple)不会出现在正例中。那么,对于给定的正样本(Context(w),w)和采样出的负样本(NEG(w),w),有
这里的
我们需要最大化的目标函数为
简单来说,上述目标函数的含义就是让正例的概率更大,负例的概率更小
Skip-Gram
以“I like to eat apple”为例子,假设窗口的大小是2,即我们会用 like 来预测 I to,所以在这里我们就认为(like,I)和(like,to)都是正例,而(like,apple)就是负例,因为(like,apple)不会出现在正例中。那么,对于给定的正样本(w,context(w))和采样出的负样本(w,NEG(w)),有
我们需要最大化的目标函数为