词嵌入(word2vec)-CBOW原理通俗解释

目录

  1. CBOW原理解析
  2. CBOW:层次Softmax
  3. CBOW:负例采样
  4. word2vec + CNN做文本分类

1.CBOW原理解析

如果之前没有了解NNLM的话,可以戳这篇文章先简单了解下。词嵌入-NNLM原理

NNLM的基本原理是利用前N1个词预测第N个词,但CBOW是希望用前后N个词来预测中间这个词,这是他们的本质区别。

在上一篇文章中,我谈到了NNLM,其中的

C=(W1,W2,,Wv)=(W1)1(W1)2(W1)D(W2)1(W2)2(W2)D(Wv)1(Wv)2(Wv)D
的本质,不就是把一列向量拿出来吗?那我们能否基于此做一个简化呢?

基于此,Google的大牛就是设计了这样一个模型,原理如下:

词嵌入(word2vec)-CBOW原理通俗解释

我们干脆去掉了那个矩阵C,直接把这样一句话中的每个词初始化一个词向量,这个初始化的词向量就是模型要学习的。
其中呢?projection layer不是还要做一个拼接吗?那我们能否直接对他们求和呢?这样他们的维度就不用那么大了。假设“我喜欢观看巴西足球世界杯“这句话中的每个词都可以用一个500维的向量表示,那词向量之间加起来,最后表示一句话的向量依然是500维的。

事实上不会是500维的嘛,语料那么大,如果用全连接的隐藏层,计算量依然很大,干脆我们直接把隐藏层去掉,最后只要一个SoftMax来预测一下在知道前向词:“喜欢”,”观看”和后向词:“足球”,”世界杯”的情况,预测一下中间词是什么?

2.层次Softmax

虽然我们把隐藏层去掉了,但是Google随随便便就能拿出1000万的语料数据,把求一个1000万的概率向量,它的计算量依然很大呀?那还有什么办法可以优化呢?

大家应该都想到了,维度太高,最直接的想法就是把维度简化嘛?因此就提出了层次Softmax来简化?这1000万的语料,很多词都是不重要的,那我们能否只要那些重要的词呢?同时,这1000万是平铺的,那能否构成一个层次的结构呢?因此就有了层次的Softmax.

在机器学习中,如果要输出特征在预测结果中的重要性,大家应该都知道用树模型,因为树在选择分裂的时候,就是选择包含的信息量大的特征进行分裂的,在这里的原理也差不多:

词嵌入(word2vec)-CBOW原理通俗解释

他也希望在节点处的词是出现的频次比较多的,比较重要的词,也就是在构建树的时候能体现这样的频次的差别。

最典型的是使用Huffman Tree来编码输出层的词典,Huffman Tree的的想法也很简单,就是对每个词根据频次有个权重,然后根据两颗两颗子树进行拼接,使得最后离根节点越近的词,他们出现的频率会更高,而在叶子节点处出现的频率更低。

原来我们计算的是一个1000万的概率向量,但是现在就可以转换为一个二分类问题,二分类中最简单直接的就是LR模型的,假设Xw就是一个词向量表示,在每个非叶子节点处(图中黄色的圆点)还会有一个参数θwi,那我们的在LR中可以用一个sigmoid函数来映射,最后可以变成一个最小化损失函数

J=log sigmoid(Xw,θwi)
的优化问题。

3.CBOW:负例采样

上文说了,最后在softmax层时最大的问题就是计算那1000万语料的概率向量的计算量太大了,除了层次的Softmax之外,还有一种比较粗暴的做法,那就是负例采样。

在我们的例子中,预测“我喜欢观看巴西足球世界杯“这句话中的“巴西“这个词,是不是就是我们的标准答案呀?那其他的1000万-1个就都不是标准答案呀?既然这样,干脆就在这1000万-1个负样本中抽取负样本来计算就好了嘛。

我们把那1000万用字母V表示,这个V还可以指代其他的,由极大似然估计就可以得到:

g(w)=sigmoid(XTwθw)u[1sigmoid(XTwθu)=
其中,XTw是文本中词向量的和,θu是词u对应的一个辅助向量。
由此就可以构造出一个损失函数,对词库中的所有词w求和有
L=wClog(g(w))
但是,如果我们的负例采样随机采,有些词出现的额概率极低,有些词出现的概率极高,因此出现了这么一个工程小技巧:
词嵌入(word2vec)-CBOW原理通俗解释
我们不是有那1000万的词库嘛,其实这个概率向量代表的就是词库里每个词出现的概率:
len(w)=counter(w)u1000counter(u)
也就是说:这1000万维的概率相加最后一定会等于1。那他们的概率分布都是在0-1之间的,那词库中的每个词都可以用这0-1之间的线段表示。
把这0-1的线段中划分为N等分,如果要抽取50万的负样本, 就随机取50万个词,如果刚好碰到了标准答案那一个,就跳过。
其实word2vec的源码中取了counter(w)34,效果貌似更好。

应用
word2vec + CNN做文本分类
参考论文:Convolutional Neural Networks for Sentence Classification