词嵌入(word2vec)-CBOW原理通俗解释
目录
- CBOW原理解析
- CBOW:层次Softmax
- CBOW:负例采样
- word2vec + CNN做文本分类
1.CBOW原理解析
如果之前没有了解NNLM的话,可以戳这篇文章先简单了解下。词嵌入-NNLM原理
NNLM的基本原理是利用前
在上一篇文章中,我谈到了NNLM,其中的
基于此,Google的大牛就是设计了这样一个模型,原理如下:
我们干脆去掉了那个矩阵C,直接把这样一句话中的每个词初始化一个词向量,这个初始化的词向量就是模型要学习的。
其中呢?projection layer不是还要做一个拼接吗?那我们能否直接对他们求和呢?这样他们的维度就不用那么大了。假设“我喜欢观看巴西足球世界杯“这句话中的每个词都可以用一个500维的向量表示,那词向量之间加起来,最后表示一句话的向量依然是500维的。
事实上不会是500维的嘛,语料那么大,如果用全连接的隐藏层,计算量依然很大,干脆我们直接把隐藏层去掉,最后只要一个SoftMax来预测一下在知道前向词:“喜欢”,”观看”和后向词:“足球”,”世界杯”的情况,预测一下中间词是什么?
2.层次Softmax
虽然我们把隐藏层去掉了,但是Google随随便便就能拿出1000万的语料数据,把求一个1000万的概率向量,它的计算量依然很大呀?那还有什么办法可以优化呢?
大家应该都想到了,维度太高,最直接的想法就是把维度简化嘛?因此就提出了层次Softmax来简化?这1000万的语料,很多词都是不重要的,那我们能否只要那些重要的词呢?同时,这1000万是平铺的,那能否构成一个层次的结构呢?因此就有了层次的Softmax.
在机器学习中,如果要输出特征在预测结果中的重要性,大家应该都知道用树模型,因为树在选择分裂的时候,就是选择包含的信息量大的特征进行分裂的,在这里的原理也差不多:
他也希望在节点处的词是出现的频次比较多的,比较重要的词,也就是在构建树的时候能体现这样的频次的差别。
最典型的是使用Huffman Tree来编码输出层的词典,Huffman Tree的的想法也很简单,就是对每个词根据频次有个权重,然后根据两颗两颗子树进行拼接,使得最后离根节点越近的词,他们出现的频率会更高,而在叶子节点处出现的频率更低。
原来我们计算的是一个1000万的概率向量,但是现在就可以转换为一个二分类问题,二分类中最简单直接的就是LR模型的,假设
3.CBOW:负例采样
上文说了,最后在softmax层时最大的问题就是计算那1000万语料的概率向量的计算量太大了,除了层次的Softmax之外,还有一种比较粗暴的做法,那就是负例采样。
在我们的例子中,预测“我喜欢观看巴西足球世界杯“这句话中的“巴西“这个词,是不是就是我们的标准答案呀?那其他的1000万-1个就都不是标准答案呀?既然这样,干脆就在这1000万-1个负样本中抽取负样本来计算就好了嘛。
我们把那1000万用字母
由此就可以构造出一个损失函数,对词库中的所有词w求和有
我们不是有那1000万的词库嘛,其实这个概率向量代表的就是词库里每个词出现的概率:
把这0-1的线段中划分为N等分,如果要抽取50万的负样本, 就随机取50万个词,如果刚好碰到了标准答案那一个,就跳过。
其实word2vec的源码中取了
应用
word2vec + CNN做文本分类
参考论文:Convolutional Neural Networks for Sentence Classification