赞
踩
目录
4 基于Negative Sampling的Skip-gram模型
前一篇文章中,我们介绍了基于Hierarchical Softmax的模型,在word2vec中还提出了一个叫做Negative Sampling的方法,本文对Negative Sampling进行一个介绍。
首先我们先介绍一些Hierarchical Softmax存在的一些缺陷,因为Hierarchical Softmax是基于哈夫曼树的算法,相对于传统的神经网络来说,Hierarchical Softmax的确可以很大效率的提升模型的速度和效率,但是如果对于某些比较生僻的词来说,因为我们知道哈夫曼树是根据词频来进行建树的,所以对于那些词典中比较生僻的词来说,寻找的深度和时间就会比较长一些,所以就会想有没有其他的方法呢,来避免进行这么深层的查找呢?
Negative Sampling就是这样的一种方法,它直接舍弃了Hierarchical Softmax的哈夫曼树的思想,而是取而代之采用的是一种采样的方式来进行求解,我们接下来就对Negative Sampling进行一个详细的讲解。
因为Negative Sampling叫做负采样,根据名字我们就可以知道是通过一种”负“的采样方式来进行参数的更新的,所以我们在这里需要关注的点在于两部分,
① “负”是什么意思,怎样才叫做“负”?
② 采样是什么样的形式,怎样的采样方式才是我们所需要的呢?
我们带着这样两个疑问进行学习,就可以对算法逻辑结构有个比较清晰的认识。
对于“负”的定义, 我们通过一个例子来进行讲解,比如我们存在一些训练样本,然后取出其中一个词,设置它为中心词 ,那么它的周围2c个词,就为它的context,记作context(
),因为我们知道
和 context(
)之间的确是存在上下文的紧密联系的,是真的存在关系的词,因此这里我们给(context(
),
) 这样的组合取个名字,称其为正例。 然后我们通过Negative Sampling进行负采样,采样出neg个和
不同的中心词
(i = 1,2,....,neg) ,因为这neg个词和
是不一样的词,所以它们和
的上下文context(
)之间是不存在关系的,所以我们称 (context(
),
),i = 1,2,....,neg 为并不真实存在的负例子。我们利用一个正例和neg个负例 ,进行二元逻辑回归,从而获得每个词
对应的模型参数
和每个词的词向量。 对于如何进行二元逻辑回归,我们会在数学推导的部分进行介绍。
那么对于上面所说的负采样,我们是如何进行的呢,是如何采样到neg个负样本的呢?
在word2vec中,所采用的方式其实比较简单。假设词典的大小为V,那么我们将一个长度为1的线段分成 段, 每段就对应着词典中的一个词。又因为词典中的词出现频率各不相同,因此各段的大小也不相同,高频的词就相对更长一些,低频的词就更短一些。对于每个词
的线段长度定义如下:
在word2vec中,分子和分母都取了 次幂如下:
然后再进行采样的时候,我们将这个长度为1的线段分成M等份, > >
, 这样的做法是可以保证每个词对应的线段都能够被分成若干个部分,而
中的每一份都会落在某一个词对应的线段上。
在采样的时候,我们就直接从 个位置上采样出 neg 个位置就行了,此时所采样到的每一个位置对应的线段所属的词就是我们的负例词。在word2vec中,M取值默认为
。
前面讲到是采用二元逻辑回归的方式来求解模型参数的,前面我们通过负采样得到了 neg 个 负例 (context(),
),i = 1,2,....,neg 。 这里为了统一描述更方便,我们将正例定义为
。
在逻辑回归中,我们的正例应该期望满足:
我们的负例应该期望满足:
然后我们期望最大化下面的式子:
我们将上式写成似然函数:
此时对应的对数似然函数为:
和Hierarchical Softmax类似,这里采用的是随机梯度上升法,每次仅仅只用一个样本更新梯度,来迭代更新我们的需要的参数 ,
,
= 0,1,2,...neg,这里我们需要求出
,
,
= 0,1,2,...,neg 的梯度。
首先计算 的梯度:
然后同样的方式,计算出 的梯度:
有了梯度表达式,我们就可以利用梯度上升法进行迭代来一步步求解我们需要的 ,
,
= 0,1,2,...,neg 。
有了上面Negative Sampling负采样的方法和逻辑回归求解模型参数的方法,我们就可以总结出基于Negative Sampling的CBOW模型算法流程了。梯度迭代过程使用了随机梯度上升法:
输入:基于CBOW的语料训练样本,词向量的维度大小 ,CBOW的上下文大小 2c ,步长
, 负采样的个数 neg
输出:词汇表每个词对应的模型参数 ,所有的词向量
1. 随机初始化所有的模型参数 ,所有的词向量
2. 对于每个训练样本(context(),
),负采样出neg个负例中心词
,i = 1,2,...neg
3. 进行梯度上升迭代过程,对于训练集中的每一个样本 (context(),
,
(1) e = 0,计算
(2) for i = 0 to neg,计算:
(3) 对于context() 中的每一个词向量
(共2c个)进行更新:
=
+
(4) 如果梯度收敛,则结束梯度迭代,否则回到步骤3继续迭代。
有了上一节CBOW的基础和上一篇基于Hierarchical Softmax的Skip-Gram模型基础,我们也可以总结出基于Negative Sampling的Skip-Gram模型算法流程了。梯度迭代过程使用了随机梯度上升法:
输入:基于Skip-gram的语料训练样本,词向量的维度大小 ,Skip-gram的上下文大小 2c ,步长
, 负采样的个数 neg
输出:词汇表每个词对应的模型参数 ,所有的词向量
1. 随机初始化所有的模型参数 ,所有的词向量
2. 对于每个训练样本(context(),
),负采样出neg个负例中心词
,i = 1,2,...neg
3. 进行梯度上升迭代过程,对于训练集中的每一个样本 (context(),
,
(1) for i = 1 to 2c :
a) e = 0
b) for j = 0 to neg ,计算:
c) 词向量更新:
=
+
(2) 如果梯度收敛,则结束梯度迭代,算法结束,否则回到步骤(1)继续迭代。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。