为什么使用负采样技术(附详细求导过程)

word2vec的初心是什么,为什么使用负采样技术。后面看论文过程经常遇到负采样,如mepath2vec等等,对这个知识点不了解清楚,论文很多精华部分理解就会有偏差了。

看了很多博客和B站视频讲解,还是没有讲解清楚。

最后还是知乎大佬说清楚了。详见

 

1 用负采样带来的问题

  • 参数更新慢

其一 我们每次只对窗口中出现的几个单词参数进行更新,但是在计算梯度的过程中,是对整个参数矩阵进行运算,这样参数矩阵中的大部分值都是0。

  • 计算开销大

其二 是 导致计算效率低下
softmax函数激活,会导致计算全部的单词‘得分’(滑动窗口在滑动过程中,需要计算滑动窗口里面单词然后求和,效率低)



2. 使用负采样


负采样的核心思想是:

计算中心词和窗口中上下文词的真实“得分”,再加一些“噪声”,即词表中的随机词(滑动窗口以外)和中心词的“得分”。

目标方程

最大化 真实单词对“得分”+    “噪声”作为目标方程。)
采用上述公式解决了之前说的两个问题:

  • 仅对K个参数进行采样
  • 放弃softmax函数,采用sigmoid函数,这样就不存在先求一遍窗口中所有单词的‘“得分”的情况


3. 计算梯度

把最大化问题变为最小化问题:

\mathbf{J_{t }(\theta )= -log\delta (u_o^{T}u_c) - \sum_{i=1}^{k}\mathbb{E}_{jP(w)}[log\delta (-u_j^{T}u_c]}

里面涉及到的变量是u_0 , u_ju_c.分别进行求偏导即可。然后进行更新

u_c求偏导

其他参数为不管,看为常量。

其中里面的sigmoid函数(除log外)求导后为:\frac{\partial \delta (u_o^{T}u_c)} {\partial u_c} =\delta (u_o^{T}u_c)\cdot (1-\delta (u_o^{T}u_c))u_o

\frac{\partial J(\theta ) }{\partial u_c} =\frac{\partial -log\delta (u_o^{T}u_c) }{\partial u_c} - \frac{\partial \sum_{i=1}^{k}\mathbb{E}_{jP(w)}[log\delta (-u_j^{T}u_c)]} {\partial u_c}

= -\frac{1}{\delta (u_o^{T}u_c)}[\delta (u_o^{T}u_c)\cdot (1-\delta (u_o^{T}u_c))u_o] - \sum_{i=1}^{k}\frac{1}{\delta (-u_i^{T}u_c)}[\delta (-u_i^{T}u_c)\cdot (1-\delta (-u_i^{T}u_c))\cdot (-u_i)]

注意这里的log看着以e为底,T这个求和与u_c无关,k这个求和与u_c有关.

 

化简得:

\frac{\partial J(\theta ) }{\partial u_c} = (\delta (u_o^{T}u_c)-1)u_o - \sum_{i=1}^{k} (\delta (-u_i^{T}u_c)-1)u_i,前面知乎大佬没有进行最大化变最小化,直接就给出了答案,是错的。应该先最小化,在求导,结果才对。

u_o求偏导

其他参数为不管,看为常量。

按照u_c求导思路:

\frac{\partial J(\theta ) }{\partial u_o} =\frac{\partial -log\delta (u_o^{T}u_c) }{\partial u_o} = -\frac{1}{\delta (u_o^{T}u_c)}[\delta (u_o^{T}u_c)\cdot (1-\delta (u_o^{T}u_c))u_0]

化简得:

 \frac{\partial J(\theta ) }{\partial u_o} = (\delta (u_o^{T}u_c)-1)u_o

 

u_i求偏导

\frac{\partial J(\theta ) }{\partial u_i} =0 - \frac{\partial \sum_{i=1}^{k}\mathbb{E}_{jP(w)}[log\delta (-u_i^{T}u_c]} {\partial u_i}

= 0- \sum_{i=1}^{k}\frac{1}{\delta (-u_i^{T}u_c)}[\delta (-u_i^{T}u_c)\cdot (1-\delta (-u_i^{T}u_c))-u_c]

化简得:

\frac{\partial J(\theta ) }{\partial u_i} = - \sum_{i=1}^{k} (\delta (-u_i^{T}u_c)-1)u_c

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值