Word2Vec介绍: 为什么使用负采样(negtive sample)?

Word2Vec介绍: 为什么使用负采样(negtive sample)?

目录

  1. 随机梯度下降法有什么问题?
  2. 负采样
  3. 计算梯度

1. 随机梯度下降法有什么问题?

通过对代价函数求权重的梯度,我们可以一次性对所有的参数 \theta 进行优化,但是如果每次等全部计算完成再优化升级,我们将等待很长时间(对于很大的语料库来说)。

所以我们采用随机梯度下降( Stochastic Gradient Descent),也就是说每次完成一次计算就进行升级。

但是,还有两个问题导致目前的模型效率低下!

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

计算效率低下!

第二个问题:我们使用的目标函数是softmax函数 softmax(u_o^Tv_c) = p(o|c) = \hat y_o = \frac {e^{u_o^Tv_c}}{\sum _{w=1}^W e^{u_w^Tv_c}} ,我们观察分母,分母需要把窗口中所有单词的“得分”都算出来再求和,效率低下!


2. 使用负采样

负采样的核心思想是:计算目标单词和窗口中的单词的真实单词对“得分”,再加一些“噪声”,即词表中的随机单词和目标单词的“得分”。

真实单词对“得分”和“噪声”作为代价函数。

每次优化参数,只关注代价函数中涉及的词向量。

下面给出公式:

J(\theta) = \frac{1}{T}\sum _{t=1}^TJ_t(\theta)

J_t(\theta) =log \sigma(u_o^Tv_c)+\sum_{i=1}^{k}\mathbb{E}_{j~P(w)}[log\sigma(-u_j^Tv_c)]

采用上述公式解决了之前说的两个问题:

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


3. 计算梯度

既然代价函数已经更新了,那么我们需要对梯度进行更新。

首先考虑一下,我们想要求导的目标,也就是对谁求导?

答案是,对我们想要优化的参数求导,前面说了,负采样的目的是不需要对整个向量矩阵 UV 进行优化,而是仅对求代价过程中涉及的词向量进行优化,因此,求导对象是目标向量 v_c ,窗口中的其他词向量 v_o 和负采样时随机选取的词向量 u_k

此篇文章关注的问题不是求导的过程,因此下面直接给出梯度:

\frac {\partial J}{\partial v_c} = (\sigma(u_o^Tv_c)-1)u_o-\sum _{k=1}^K(\sigma (-u_k^Tv_c)-1)u_k

\frac {\partial J}{\partial u_o} = (\sigma(u_o^Tv_c)-1)v_c

\frac {\partial J}{\partial u_k} = -(\sigma(-u_k^Tv_c)-1)v_c,\space for \space all \space k = 1,2,\dots,K

编辑于 2018-01-31

文章被以下专栏收录

    本专栏专注于介绍深度学习方面的基础知识,主要包括神经网络基础概念和,深度学习中的python,深度学习中的线性代数,深度学习工具箱,深度学习中的微积分,深度学习中的概率论与数理统计。除此之外,还有一些著名网络课程的学习笔记,主要包括斯坦福大学CS224n课程、coursera吴恩达深度学习课程等