分享

Word2vec中的CBOW连续词袋模型原理及公式推导及基于gensim的源码走读

regan 发表于 2018-4-8 12:02:18 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 0 44308
本帖最后由 regan 于 2018-4-8 12:02 编辑

1.Word2vec中要到两个重要的模型,CBOW连续词袋模型和Skip-gram模型。两个模型都包含三层:输入层,投影层,输出层。CBOW模型是在已知当前词w(t)的上下文w(t-2),w(t-1),w(t+1),w(t+2)的前提下预测当前词w(t);而后者恰恰相反,是在已知当前词w(t)的前提下,预测上下文w(t-2),w(t-1),w(t+1),w(t+2)。
1.png 对于上面的两个模型的实现,word2vec中使用了两套策略来实现,分别是Hierarchical Softmax和Negative Sampling来设计。我们先来介绍基于Hierarchical Softmax策略实现的CBOW连续词袋模型。

2.上节我们讲到了基于神经网络的语言模型的目标函数通常取为对数似然函数:
2.png
word2vec中基于Hierarchical Softmax优化的目标也如上式。其中的关键是条件概率p(w|context(w))的构造上。CBOW模型网络结构如下:
3.png
包括三层:输入层、投影层、输出层。以(context(w),w)为例,其中context(w)由w前后各c个词构成。
输入层:包含context(w)中2c个词的词向量v(context(w)1),v(context(w)2),...,v(context(w)2c)。
投影层:将输入层的2c个向量做求和累加
4.png
输出层:对应一颗二叉树,以语料中出现过的词作为叶子节点,以各个词在语料中出现的次数当做权值构造出来的Huffman数。叶子节点共N=D词典大小个,分别对应词典D中的每个词,非叶子节点为N-1个。
5.png
神经概率语言模型:对比上节提到的神经概率语言模型,有如下的不同:
  • 输入层到投影层CBOW采用的是累加求和,而神经语言模型采用拼接
  • 神经语言模型有隐藏层,CBOW无隐藏层
  • 神经语言模型输出是线性结构,而CBOW是树型模型
CBOW模型成功的将集中在隐藏层和输出层之间的矩阵向量计算以及输出层上的softmax归一化操作省去了,使用Hierarchical softmax技术去掉了隐藏层,使输出层变层一颗Huffman树。


3.目标优化梯度计算
Hierarchical Softmax是word2vec中用于提高性能的关键技术,对于Huffman树中的某个叶子节点,假设对应词典D中的w词。由如下定义:

6.png


例如对于‘足球’的标记如下:
7.png
由4条红色边串起来的5个点构成路径p(w),其长度l(w) =  5,p(w1),p(w2),p(w3),p(w4),p(w5)为路径p(w)上的5个节点,其中p(w1)对应根节点,d(w2),d(w3),d(w4),d(w5)分别表示1,0,0,1,即词w的Huffman编码为1001。θ1,θ2,θ3,θ4分别表示路径p(w)上的4个非叶子节点对应的向量。
在如上的网络结构下,如何定义条件概率p(w|context(w))呢?如何用向量Xw和Huffman树来定义函数p(w|context(w))?
从根节点出发,到达‘足球’这个叶子节点,中间经历了4次分支,对于每一次分支都可以视为进行了一次二分类。从二分类的问题来考虑,对于每一个非叶子节点,就需要为其左右孩子节点指定一个类别,即指定那边是正类哪边是负类。Huffman树除了根节点外,每个节点都对应一个编码正好是两类:0和1。Huffman编码中约定左边为1,右边为0并约定标签和编码的对应关系如下:
8.png
简而言之,将一个节点进行分类时,分到左边的就是负类,分到右边就是正类。分类由逻辑回归来完成,一个节点被分为正类的概率,使用sigmod计算概率值为:
9.png
被分到负类的概率等于
10.png
上式中的θ向量,它是待定参数。非叶子节点对应的向量θ1,θ2....可以扮演θ的角色。从根节点出发到达‘足球’这个叶子节点,经历4词二分类,每次分类结果概率如下:
11.png
要求的目标p(足球|context(足球))和上面的4个概率值有什么关系呢?答案就是连乘!
12.png
总结:对于词典D中的任意词w,Huffman树中必存在一条从根节点到词w对应节点的路径p(w),并且这条路径是唯一的。路径p(w)上存在l(w)-1个分支,将每个分支看成一个二分类,每一次二分类就产生一个概率,将这些概率连乘起来,就得到最终的结果p(w|context(w))
13.png
将上式带入似然函数:
14.png
上式花括号的内容记为:Γ(w,j)如下:
15.png
要使得上面的目标函数最大化,word2vec中采用了随机梯度上升法求取目标函数的最大值。观察目标函数参数包括Xw,θ(j-1),w属于C,j=2,...l(w)。
先计算关于θ(j-1)的梯度,对其求偏导:
16.png
更新公式可写为:
17.png
其中η表示学习率。
求Xw的梯度
18.png
我们的最终目的是求词典中每个词的词向量,而这里的Xw表示的是Context(w)中各个词向量的累加,那如何用
19.png
来对V(w`),w`∈context(w)进行更新?word2vec做法很简单,直接取:
20.png
将梯度
21.png
贡献到每一个词的词向量上,Xw本身是context(w)中各词词向量的累加,求完梯度后很自然的将其贡献到每个分量上去。
下面给出伪代码:
22.png
和word2vec中参数的对应关系为:
syn0 -> v(.) #这是我们关心的词向量
syn1 -> θ(j-1)
neu1 -> Xw
neu1e ->e



源码追踪:
a1.png
a2.png



a3.png
a4.png

a5.png

a6.png
a7.png
a8.png
a9.png
a11.png
a12.png
a13.png
a14.png
a15.png
a16.png
a17.png
a18.png

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条