Negative Sampling 负采样详解[通俗易懂]

Negative Sampling 负采样详解[通俗易懂]在word2vec中,为了简化训练的过程,经常会用到NegativeSampling负采样这个技巧,这个负采样到底是怎么样的呢?之前在我的博文word2vec算法理解和数学推导中对于word2vec有了很详细的数学推导,这里主要讲解一下负采样是如何降低word2vec的复杂度的。首先我们直接写出word2vec的目标函数,假设有一句话:query=w1,w2,w3,..,wnquery=…

大家好,又见面了,我是你们的朋友全栈君。

在word2vec中,为了简化训练的过程,经常会用到Negative Sampling负采样这个技巧,这个负采样到底是怎么样的呢?之前在我的博文 word2vec算法理解和数学推导 中对于word2vec有了很详细的数学推导,这里主要讲解一下负采样是如何降低word2vec的复杂度的。
首先我们直接写出word2vec的目标函数,假设有一句话: q u e r y = w 1 , w 2 , w 3 , . . , w n query = {w_1},{w_2},{w_3},..,{w_n} query=w1,w2,w3,..,wn,由n个词组成的一句话,我们需要最大化窗口中上下文词的概率:
arg ⁡ max ⁡ θ ∏ w ∈ q u e r y ∏ c ∈ c ( w ) P ( c ∣ w ; θ ) \arg \mathop {\max }\limits_\theta \prod\limits_{w \in query} {\prod\limits_{c \in c(w)} {P(c|w;\theta )} } argθmaxwquerycc(w)P(cw;θ)
这里的 c ( w ) c(w) c(w)表示中心词的context words,我们在计算的时候,可以把相乘的元素转换成对数函数:
arg ⁡ max ⁡ θ ∑ w ∈ q u e r y ∑ c ∈ c ( w ) log ⁡ P ( c ∣ w ; θ ) \arg \mathop {\max }\limits_\theta \sum\limits_{w \in query} {\sum\limits_{c \in c(w)} {\log P(c|w;\theta )} } argθmaxwquerycc(w)logP(cw;θ)
我们把概率函数可以进行展开就可以得到:
arg ⁡ max ⁡ θ ∑ w ∈ q u e r y ∑ c ∈ c ( w ) log ⁡ e u c ⋅ v w ∑ c ′ ∈ v o c a b e u c ′ ⋅ v w \arg \mathop {\max }\limits_\theta \sum\limits_{w \in query} {\sum\limits_{c \in c(w)} {\log \frac{
{
{e^{
{u_c} \cdot {v_w}}}}}{
{\sum\limits_{c’ \in vocab} {
{e^{
{u_{c’}} \cdot {v_w}}}} }}} }
argθmaxwquerycc(w)logcvocabeucvweucvw

这个式子可以表示成:
arg ⁡ max ⁡ θ ∑ w ∈ q u e r y ∑ c ∈ c ( w ) ( e u c ⋅ v w − log ⁡ ∑ c ′ ∈ v o c a b e u c ′ ⋅ v w ) \arg \mathop {\max }\limits_\theta \sum\limits_{w \in query} {\sum\limits_{c \in c(w)} {({e^{
{u_c} \cdot {v_w}}} – \log \sum\limits_{c’ \in vocab} {
{e^{
{u_{c’}} \cdot {v_w}}}} )} }
argθmaxwquerycc(w)(eucvwlogcvocabeucvw)

我们可以看到这个式子第二项,因为 c ′ c’ c要遍历整个词库,所以复杂度非常高,所以我们要简化这一步的计算,减小运算的复杂度。这里的 u c u_c uc表示 c c c的上下文向量, v w v_w vw表示中心词 w w w的向量。
为了减小上述表达式的复杂度,我们不妨改变一下上述概率的表达方式,原来的 p ( w i ∣ w j ) p({w_i}|{w_j}) p(wiwj) 表示以 w j w_j wj 为中心词的时候 w i w_i wi 出现的概率,这里我们用 p ( D = 1 ∣ w i , w j ; θ ) p(D = 1|{w_i},{w_j};\theta ) p(D=1wi,wj;θ) 表示 w i w_i wi w j w_j wj 作为上下文词出现的概率, p ( D = 0 ∣ w i , w j ; θ ) p(D = 0|{w_i},{w_j};\theta ) p(D=0wi,wj;θ) 表示 w i w_i wi w j w_j wj 不作为上下文词出现的概率。
由上述新的表达式可以写出新的目标函数:
arg ⁡ max ⁡ θ ∏ ( w , c ) ∈ D p ( D = 1 ∣ w , c ; θ ) ∏ ( w , c ) ∈ D ~ p ( D = 0 ∣ w , c ; θ ) \arg \mathop {\max }\limits_\theta \prod\limits_{(w,c) \in D} {p(D = 1|w,c;\theta )\prod\limits_{(w,c) \in \tilde D} {p(D = 0|w,c;\theta )} } argθmax(w,c)Dp(D=1w,c;θ)(w,c)D~p(D=0w,c;θ)
这里的 D D D 表示上下文词的集合, D ~ \tilde D D~ 表示非上下文的集合,我们来举一个例子,这里有一句话:“川建国同志是一名优秀的党员”,这句话分词去停之后变成: 川建国 同志 一名 优秀 党员。那么 D D D 表示上下文集合,我们假设 window size为1,那么可以写出:
D D D = {(川建国,同志),(同志,川建国),(同志,一名),(一名,同志),(一名,优秀),(优秀,一名),(优秀,党员)}
D ~ \tilde D D~ = {(川建国,一名),(川建国,优秀),(川建国,党员),(同志,优秀),(同志,党员),(一名,川建国),(一名,党员),(优秀,川建国),(优秀,同志),(党员,川建国),(党员,同志),(党员,一名)}。
上述的 D D D 表示正样本, D ~ \tilde D D~ 表示负样本。我们可以继续表示上述的目标函数,我们可以吧正负样本的概率表示成sigmoid的表达形式:
arg ⁡ max ⁡ θ ∏ ( w , c ) ∈ D 1 1 + e − u c ⋅ v w ∏ ( w , c ) ∈ D ~ ( 1 − 1 1 + e − u c ⋅ v w ) = arg ⁡ max ⁡ θ ∑ ( w , c ) ∈ D log ⁡ σ ( u c ⋅ v w ) + ∑ ( w , c ) ∈ D ~ log ⁡ σ ( − u c ⋅ v w ) \arg \mathop {\max }\limits_\theta \prod\limits_{(w,c) \in D} {\frac{1}{
{1 + {e^{ – {u_c} \cdot {v_w}}}}}\prod\limits_{(w,c) \in \tilde D} {(1 – \frac{1}{
{1 + {e^{ – {u_c} \cdot {v_w}}}}})} } = \arg \mathop {\max }\limits_\theta \sum\limits_{(w,c) \in D} {\log \sigma ({u_c} \cdot {v_w})} + \sum\limits_{(w,c) \in \tilde D} {\log \sigma ( – {u_c} \cdot {v_w})}
argθmax(w,c)D1+eucvw1(w,c)D~(11+eucvw1)=argθmax(w,c)Dlogσ(ucvw)+(w,c)D~logσ(ucvw)

在词库数量级为 1 0 5 10^5 105的时候,正样本加负样本 D ~ \tilde D D~的数量级可以达到 1 0 10 10^{10} 1010左右,里面绝大部分都是负样本,所以我们需要降低负样本计算中的时间复杂度,这就是Negative Sampling 负采样的核心。负采样就是对于一个中心词,我们从中心词对应的负样本中随机抽取几组来做梯度下降。还是川建国的例子,对于正样本(川建国,同志),我们随机抽取负样本(川建国,一名),(川建国,党员)来做训练,不用全部的负样本都拿来训练,这就是负采样,减小了计算的复杂度。所以,上述的目标函数可以写成:
≈ arg ⁡ max ⁡ θ ∑ ( w , c ) ∈ D [ log ⁡ σ ( u c ⋅ v w ) + ∑ c ′ ∈ N ( w ) log ⁡ σ ( − u c ′ ⋅ v w ) ] \approx \arg \mathop {\max }\limits_\theta \sum\limits_{(w,c) \in D} {[\log \sigma ({u_c} \cdot {v_w}) + \sum\limits_{c’ \in N(w)} {\log \sigma ( – {u_{c’}} \cdot {v_w})} ]} argθmax(w,c)D[logσ(ucvw)+cN(w)logσ(ucvw)]
从上述表达式可以看出,负样本我们不需要取所有的都拿来训练,我们只需要每个中心词抽几个负样本就可以了,这样可以大大降低计算的复杂度。这就是word2vec训练过程中的Negative Sampling 负采样技巧,可以大大减小梯度下降的时间复杂度,这就有点像SGD随机梯度下降,就是随机一个样本进行梯度下降,大体的方向还是朝着最低点下降。
接着我来解答一下上述这个表达式,一起来看看是如何进行梯度下降的,首先我们假设:
L ( θ ) = log ⁡ σ ( u c ⋅ v w ) + ∑ c ′ ∈ N ( w ) log ⁡ σ ( − u c ′ ⋅ v w ) L(\theta ) = \log \sigma ({u_c} \cdot {v_w}) + \sum\limits_{c’ \in N(w)} {\log \sigma ( – {u_{c’}} \cdot {v_w})} L(θ)=logσ(ucvw)+cN(w)logσ(ucvw)
接下来我们需要对该表达式求偏导:
∂ L ( θ ) ∂ u c = σ ( u c ⋅ v w ) [ 1 − σ ( u c ⋅ v w ) ] ⋅ v w σ ( u c ⋅ v w ) = [ 1 − σ ( u c ⋅ v w ) ] ⋅ v w \frac{
{\partial L(\theta )}}{
{\partial {u_c}}} = \frac{
{\sigma ({u_c} \cdot {v_w})[1 – \sigma ({u_c} \cdot {v_w})] \cdot {v_w}}}{
{\sigma ({u_c} \cdot {v_w})}} = [1 – \sigma ({u_c} \cdot {v_w})] \cdot {v_w}
ucL(θ)=σ(ucvw)σ(ucvw)[1σ(ucvw)]vw=[1σ(ucvw)]vw

∂ L ( θ ) ∂ u c ′ = σ ( − u c ′ ⋅ v w ) [ 1 − σ ( − u c ′ ⋅ v w ) ] ⋅ ( − v w ) σ ( − u c ′ ⋅ v w ) = [ σ ( u c ′ ⋅ v w ) − 1 ] ⋅ v w \frac{
{\partial L(\theta )}}{
{\partial {u_{c’}}}} = \frac{
{\sigma ( – {u_{c’}} \cdot {v_w})[1 – \sigma ( – {u_{c’}} \cdot {v_w})] \cdot ( – {v_w})}}{
{\sigma ( – {u_{c’}} \cdot {v_w})}} = [\sigma ({u_{c’}} \cdot {v_w}) – 1] \cdot {v_w}
ucL(θ)=σ(ucvw)σ(ucvw)[1σ(ucvw)](vw)=[σ(ucvw)1]vw

∂ L ( θ ) ∂ v w = σ ( u c ⋅ v w ) [ 1 − σ ( u c ⋅ v w ) ] ⋅ u c σ ( u c ⋅ v w ) + ∑ c ′ ∈ N ( w ) ∂ ( − u c ′ ⋅ v w ) [ 1 − σ ( − u c ′ ⋅ v w ) ] ⋅ ( − u c ′ ) ∂ ( − u c ′ ⋅ v w ) = [ 1 − σ ( u c ⋅ v w ) ] ⋅ u c + ∑ c ′ ∈ N ( w ) [ σ ( − u c ′ ⋅ v w ) − 1 ] ⋅ u c ′ \frac{
{\partial L(\theta )}}{
{\partial {v_w}}} = \frac{
{\sigma ({u_c} \cdot {v_w})[1 – \sigma ({u_c} \cdot {v_w})] \cdot {u_c}}}{
{\sigma ({u_c} \cdot {v_w})}} + \sum\limits_{c’ \in N(w)} {\frac{
{\partial ( – {u_{c’}} \cdot {v_w})[1 – \sigma ( – {u_{c’}} \cdot {v_w})] \cdot ( – {u_{c’}})}}{
{\partial ( – {u_{c’}} \cdot {v_w})}} = [1 – \sigma ({u_c} \cdot {v_w})] \cdot {u_c} + \sum\limits_{c’ \in N(w)} {[\sigma ( – {u_{c’}} \cdot {v_w}) – 1] \cdot {u_{c’}}} }
vwL(θ)=σ(ucvw)σ(ucvw)[1σ(ucvw)]uc+cN(w)(ucvw)(ucvw)[1σ(ucvw)](uc)=[1σ(ucvw)]uc+cN(w)[σ(ucvw)1]uc

然后整体的梯度下降可以表示成:
u c : = u c + η ∂ L ( θ ) ∂ u c {u_c}: = {u_c} + \eta \frac{
{\partial L(\theta )}}{
{\partial {u_c}}}
uc:=uc+ηucL(θ)

u c ′ : = u c ′ + η ∂ L ( θ ) ∂ u c ′ {u_{c’}}: = {u_{c’}} + \eta \frac{
{\partial L(\theta )}}{
{\partial {u_{c’}}}}
uc:=uc+ηucL(θ)

v w : = v w + η ∂ L ( θ ) ∂ v w {v_w}: = {v_w} + \eta \frac{
{\partial L(\theta )}}{
{\partial {v_w}}}
vw:=vw+ηvwL(θ)

这就是word2vec训练过程中的负采样技巧,希望可以通过细致的讲解能够帮助大家深刻地理解负采样,码字不易,如有转载请注明出处,文中如有纰漏,也请各位读者不吝指教,谢谢。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/148749.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • nps是什么、怎么计算、有什么用

    nps是什么、怎么计算、有什么用前言NPS中文为净推荐值,全名为NetPromoterScore,由美国贝恩咨询提出。用一个简单的问题,了解客户是不是愿意推荐你的产品,评估口碑。也可以用来评估用户体验和客户满意度。通过了解客户的反馈,你也可以迭代、优化自己的产品。做好NPS可以让客户裂变,让每个客户都变成你的自来水、产品代言人。NPS是什么我们经常看到下面的问题,“你向朋友推荐XXX产品的可能性有多大?”,“我们可以如何提高”或者”是什么让你愿意向朋友推荐我们的产品”Windows10的NPS调查..

  • portraiture 3 for mac(PS人像磨皮滤镜插件)激活成功教程教程

    portraiture 3 for mac(PS人像磨皮滤镜插件)激活成功教程教程Portraiture3forMac是PS中优秀的人像磨皮滤镜插件,portraiture3mac激活成功教程版可以对皮肤、头发、眉毛、睫毛等部位进行磨皮润色处理,还能自由调整锐度、柔软度、亮度、对比度等,这里为大家带来portraiture滤镜的激活成功教程教程,赶紧来看看吧!portraiture激活成功教程步骤下载好Portraiture安装包后,点击打开Portraiture.dmg,双击【…

  • python实现各大视频网站电影下载

    python实现各大视频网站电影下载一、前期准备有时候我们想下载自己喜欢的电影,但很多时候要么需要安装客户端才能下载,或者干脆不提供下载的服务,很是不爽,因此这里我们介绍使用python来实现网站的电影下载功能,凡是能在线观看的,都

  • 基于WDM的专用USB设备的驱动程序开发[通俗易懂]

    基于WDM的专用USB设备的驱动程序开发[通俗易懂]1引言目前对于诸如USB鼠标、键盘等这样的计算机标准外设,Windows系统已经提供了标准的驱动程序,用户无需再进行任何开发工作。而开发专用USB设备,需要开发专用的驱动程序。Windows2000/XP操作系统不允许用户程序直接访问硬件设备。为了实现对硬件设备的访问和控制,必须通过操作系统所认可的驱动程序对硬件设备实现间接访问和控制。驱动程序通常被认为是操作系统的组成部分,所以,开发驱动程序有严

  • 百度网站打不开了,只有百度首页跟搜索页打不开其它能正常打开怎么解决?

    百度网站打不开了,只有百度首页跟搜索页打不开其它能正常打开怎么解决?写在开头补充:1.如果出现“您连接的不是私密连接”请点击【高级】或者【详细】;(针对火狐浏览器与谷歌浏览器)2.如果是访问“http://www.baidu.com”不行,请替换“https://www.baidu.com”试试;打不开百度首页问题,只有百度打不开其他能打开怎么办?问题汇总描述1.谷歌Chrome浏览器有时候打不开百度,其它网站表示能够正常访问;2.360浏览器打开…

  • 随笔

    随笔

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号