word2vec算法理解和数学推导

从字面意思就可以理解word2vec是把文本转换成向量,那么文本如何转换成向量呢,最简单的方法大家都会想到独热编码,但是独热编码的缺点也很明显,首先独热编码向量是正交的,任何两个独热编码相乘都等于0,所以无法通过任何的计算来得到两个词的相似度;还有一个原因就是维度过大,比如100000个词汇用独热编码表示成向量,就会有100000个维度,简直就是维度灾难。所以一般来说,在词语向量化的时候都不使用独热编码的方法,那么我们如何通过向量来表达词语的意思呢,我们可以通过调整一个单词和这个单词上下文单词的向量,使得根据两个向量来推测出两个词语的相似度,或者根据向量来推测上下文。
word2vec是一个最常见的转词向量的框架,里面包含了Skip-grams(SG)和Continuous Bag of Words(CBOW),这两种算法的最大区别就是Skip-grams(SG)算法是通过中心词汇推测上下文,而CBOW是通过上下文预测中心词。我们来看Christopher Manning教授的SG模型:
SG模型
我们可以看到中心词汇是banking,这个是我们的input word,m是我们词语窗口的长度,表示中心词语前后的m个词语,整个模型中只有一个条件分布,因为这是一个词袋模型,与位置是无关的,所以我们的目的就是最大化这些概率。首先我们来定义一个目标函数,我们把目标函数定义为我们预测结果的乘积:
J ′ ( θ ) = ∏ t = 1 T ∏ − m ⩽ j ⩽ m j ≠ 0 p ( w t + j ∣ w t ; θ ) J'(\theta ) = \prod\limits_{t = 1}^T {\prod\limits_{\mathop { - m \leqslant j \leqslant m}\limits_{j \ne 0} } {p({w_{t + j}}|{w_t};\theta )} } J(θ)=t=1Tj̸=0mjmp(wt+jwt;θ)
这里我们就需要优化这个目标函数使其最大化, T T T表示总的词数量,每一个词前后m个词的概率我们都要计算,为了方便计算,我们可以吧这个目标函数换一种形式,得到损失函数,这里我们用的是对数似然的相反数:
J ( θ ) = − 1 T ∑ t = 1 T ∑ − m ⩽ j ⩽ m j ≠ 0 log ⁡ P ( w t + j ∣ w t ) J(\theta ) = - \frac{1}{T}\sum\limits_{t = 1}^T {\sum\limits_{\mathop { - m \leqslant j \leqslant m}\limits_{j \ne 0} } {\log P({w_{t + j}}|{w_t})} } J(θ)=T1t=1Tj̸=0mjmlogP(wt+jwt)
在这个公式中,我们得到的 P ( w t + j ∣ w t ) P({w_{t + j}}|{w_t}) P(wt+jwt)是通过softmax得到的,那么我们将向量带入softmax公式可以得到:
P ( o ∣ c ) = exp ⁡ ( u o T ⋅ v c ) ∑ w = 1 V exp ⁡ ( u w T ⋅ v c ) P(o|c) = \frac{{\exp (u_o^T \cdot {v_c})}}{{\sum\limits_{w = 1}^V {\exp (u_w^T \cdot {v_c})} }} P(oc)=w=1Vexp(uwTvc)exp(uoTvc)
在这个公式中 o o o是指上下文中某一个词, c c c是指中心词; u u u是指对应的上下文词向量, v v v是指词向量,那么 u o {u_o} uo表示指定的那个词的上下文向量, v c {v_c} vc表示中心词的词向量,这么看来,损失函数就比较容易理解了。这里的softmax大家也是比较了解的,就是将得分的实数转换成一个归一化的概率分布。下图就是整个skip-grams的算法流程以及每一步的解释:
SG
由上图就可以清楚地知道SG算法每一步的流程以及意义了,里面向量的数字不代表真实意思,是瞎编的,重要的是流程,最终我们的损失函数就是比对真实向量与我们计算出来的答案的差距,要最小化损失函数,最大化输出概率。那么怎么去学习这个模型呢,怎么去最小化损失函数呢?肯定是梯度下降法了,所以对损失函数的Vc求偏导,把常数去掉之后,损失函数就可以表示成:
log ⁡ exp ⁡ ( u o T ⋅ v c ) ∑ w = 1 V exp ⁡ ( u w T ⋅ v c ) \log \frac{{\exp (u_o^T \cdot {v_c})}}{{\sum\limits_{w = 1}^V {\exp (u_w^T \cdot {v_c})} }} logw=1Vexp(uwTvc)exp(uoTvc)
接着我们对损失函数的Vc求偏导,就可以得到:
∂ ∂ v c J ( θ ) = ∂ ∂ v c log ⁡ exp ⁡ ( u o T ⋅ v c ) ∑ w = 1 V exp ⁡ ( u w T ⋅ v c ) \frac{\partial }{{\partial {v_c}}}J(\theta ) = \frac{\partial }{{\partial {v_c}}}\log \frac{{\exp (u_o^T \cdot {v_c})}}{{\sum\limits_{w = 1}^V {\exp (u_w^T \cdot {v_c})} }} vcJ(θ)=vclogw=1Vexp(uwTvc)exp(uoTvc)
对数内部的除法相当于对数外部的减法,那么这个式子可以表示成:
∂ ∂ v c log ⁡ exp ⁡ ( u o T ⋅ v c ) − ∂ ∂ v c log ⁡ ∑ w = 1 V exp ⁡ ( u w T ⋅ v c ) \frac{\partial }{{\partial {v_c}}}\log \exp (u_o^T \cdot {v_c}) - \frac{\partial }{{\partial {v_c}}}\log \sum\limits_{w = 1}^V {\exp (u_w^T \cdot {v_c})} vclogexp(uoTvc)vclogw=1Vexp(uwTvc)
然后我们再把这整个式子看成两个部分,首先是第一个部门,因为指数之后再求对数还是本身,所以第一项可以表示成:
∂ ∂ v c log ⁡ exp ⁡ ( u o T ⋅ v c ) = ∂ ( u o T ⋅ v c ) ∂ v c = u o \frac{\partial }{{\partial {v_c}}}\log \exp (u_o^T \cdot {v_c}) = \frac{{\partial (u_o^T \cdot {v_c})}}{{\partial {v_c}}} = {u_o} vclogexp(uoTvc)=vc(uoTvc)=uo
所以第一项就是 u o u_o uo,我们再来看第二部分的计算:
∂ ∂ v c log ⁡ ∑ w = 1 V exp ⁡ ( u w T ⋅ v c ) \frac{\partial }{{\partial {v_c}}}\log \sum\limits_{w = 1}^V {\exp (u_w^T \cdot {v_c})} vclogw=1Vexp(uwTvc)
对于这种复杂的复合函数求偏导,首先我们就会想到的是复合函数的链式求导法则,那么这个第二项求偏导可以有如下推导:
1 ∑ w = 1 V exp ⁡ ( u w T ⋅ v c ) ⋅ ∑ x = 1 V exp ⁡ ( u x T ⋅ v c ) ⋅ ∂ ( u x T ⋅ v c ) ∂ v c = 1 ∑ w = 1 V exp ⁡ ( u w T ⋅ v c ) ⋅ ∑ x = 1 V exp ⁡ ( u x T ⋅ v c ) ⋅ u x = ∑ x = 1 V exp ⁡ ( u x T ⋅ v c ) ∑ w = 1 V exp ⁡ ( u w T ⋅ v c ) ⋅ u x \frac{1}{{\sum\limits_{w = 1}^V {\exp (u_w^T \cdot {v_c})} }} \cdot \sum\limits_{x = 1}^V {\exp (u_x^T \cdot {v_c})} \cdot \frac{{\partial (u_x^T \cdot {v_c})}}{{\partial {v_c}}} \\ = \frac{1}{{\sum\limits_{w = 1}^V {\exp (u_w^T \cdot {v_c})} }} \cdot \sum\limits_{x = 1}^V {\exp (u_x^T \cdot {v_c})} \cdot {u_x} = \sum\limits_{x = 1}^V {\frac{{\exp (u_x^T \cdot {v_c})}}{{\sum\limits_{w = 1}^V {\exp (u_w^T \cdot {v_c})} }}} \cdot {u_x} w=1Vexp(uwTvc)1x=1Vexp(uxTvc)vc(uxTvc)=w=1Vexp(uwTvc)1x=1Vexp(uxTvc)ux=x=1Vw=1Vexp(uwTvc)exp(uxTvc)ux
然后这个式子中间的部分正好可以看成是softmax:
exp ⁡ ( u x T ⋅ v c ) ∑ w = 1 V exp ⁡ ( u w T ⋅ v c ) = P ( x ∣ c ) \frac{{\exp (u_x^T \cdot {v_c})}}{{\sum\limits_{w = 1}^V {\exp (u_w^T \cdot {v_c})} }} = P(x|c) w=1Vexp(uwTvc)exp(uxTvc)=P(xc)所以这么一来,整个第二项就可以看成是:
∑ x = 1 V P ( x ∣ c ) ⋅ u x \sum\limits_{x = 1}^V {P(x|c) \cdot {u_x}} x=1VP(xc)ux
这整个式子可以看成是x词在中心词出现的情况下出现的概率,然后乘以x词上下文的向量,这样就是上下文向量的期望了,所以整个第二项就是所有的上下问向量的平均期望。那么整个损失函数可以表示成:
J ( θ ) = u o − ∑ x = 1 V P ( x ∣ c ) ⋅ u x = o b s e r v e d − e x p e c t e d J(\theta ) = {u_o} - \sum\limits_{x = 1}^V {P(x|c) \cdot {u_x}} = observed - expected J(θ)=uox=1VP(xc)ux=observedexpected
就是观测值真实值减去期望值,所以我们就要最小化损失函数,让期望值和真实值尽可能接近,通过整个推导过程就很容易理解skip-grams的算法流程和数学推导,希望可以帮助大家对词向量算法的理解有所帮助,文中如有纰漏,也请各位朋友不吝指教,如有转载,也请标明出处,谢谢大家。

  • 8
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Word2Vec是一种用于将单词映射到向量的技术,它被广泛用于自然语言处理任务,例如文本分类、情感分析、机器翻译等。Word2Vec使用神经网络来学习单词之间的语义关系,它的基本思想是将单词表示为在高维空间中的向量,使得相似的单词在空间中距离更近。 下面是Word2Vec算法推导过程: 1. Skip-gram模型 Skip-gram模型的思想是给定一个中心词,预测它周围的上下文单词。我们用一个训练集D表示为{(w, c)}来表示单词和上下文单词的对应关系,其中w是中心词,c是上下文单词。Skip-gram模型的目标是最大化给定训练集D的条件概率: $$P(D|\theta)=\prod_{(w,c)\in D}P(c|w,\theta)$$ 其中$\theta$表示模型参数,即中心词和上下文单词之间的权重。 2. Softmax函数 为了计算条件概率$P(c|w,\theta)$,我们使用Softmax函数将向量转化为概率分布。假设我们有一个向量$z$,则Softmax函数的定义如下: $$Softmax(z)_i=\frac{e^{z_i}}{\sum_{j=1}^{k}e^{z_j}}$$ 其中$k$是向量$z$的维数。 3. 神经网络模型 Skip-gram模型使用一个神经网络来计算条件概率$P(c|w,\theta)$。假设我们有一个中心词$w$,我们将其表示为一个向量$x_w$。我们还有一个上下文单词$c$,我们将其表示为一个向量$y_c$。我们将$x_w$和$y_c$传递到一个神经网络中,该神经网络将它们组合起来,输出一个向量$z_{wc}$。我们使用Softmax函数将$z_{wc}$转换为概率分布,即: $$P(c|w,\theta)=Softmax(z_{wc})$$ 4. 目标函数 我们使用交叉熵作为目标函数,该函数度量了模型预测的概率分布与实际分布之间的差异。假设我们的训练集D包含n个样本,我们定义交叉熵损失函数如下: $$J(\theta)=-\frac{1}{n}\sum_{(w,c)\in D}\sum_{i=1}^{k}1(c=i)log(P(c|w,\theta))$$ 其中1(c=i)是一个指示函数,当上下文单词$c$等于第$i$个单词时为1,否则为0。 5. 梯度下降 我们使用梯度下降算法来最小化目标函数$J(\theta)$。我们需要计算损失函数对模型参数$\theta$的导数,然后使用该导数来更新参数。假设$z_{wc}$是神经网络的输出向量,我们可以计算损失函数对权重矩阵$W$和输入向量$x_w$的导数: $$\frac{\partial J}{\partial W}=(P(c|w,\theta)-1)y_c$$ $$\frac{\partial J}{\partial x_w}=W(P(c|w,\theta)-1)$$ 然后我们可以使用这些导数来更新模型参数: $$W\leftarrow W-\alpha\frac{\partial J}{\partial W}$$ $$x_w\leftarrow x_w-\alpha\frac{\partial J}{\partial x_w}$$ 其中$\alpha$是学习率。 6. Hierarchical Softmax 当词汇表很大时,计算Softmax函数的代价很高。为了解决这个问题,我们可以使用分层Softmax函数,它使用一棵哈夫曼树来表示每个单词的概率分布。这样,我们可以在树上进行逐层的二分类,从而减少计算量。 这就是Word2Vec算法推导过程。通过训练神经网络,我们可以得到每个单词的向量表示,从而用于自然语言处理任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值