word2vec原理(三) 基于Negative Sampling的模型

简介:

1. Hierarchical Softmax的缺点与改进

    在讲基于Negative Sampling的word2vec模型前,我们先看看Hierarchical Softmax的的缺点。的确,使用霍夫曼树来代替传统的神经网络,可以提高模型训练的效率。但是如果我们的训练样本里的中心词ww是一个很生僻的词,那么就得在霍夫曼树中辛苦的向下走很久了。能不能不用搞这么复杂的一颗霍夫曼树,将模型变的更加简单呢?

    Negative Sampling就是这么一种求解word2vec模型的方法,它摒弃了霍夫曼树,采用了Negative Sampling(负采样)的方法来求解,下面我们就来看看Negative Sampling的求解思路。

2. 基于Negative Sampling的模型概述

    既然名字叫Negative Sampling(负采样),那么肯定使用了采样的方法。采样的方法有很多种,比如之前讲到的大名鼎鼎的MCMC。我们这里的Negative Sampling采样方法并没有MCMC那么复杂。

    比如我们有一个训练样本,中心词是ww,它周围上下文共有2c2c个词,记为context(w)context(w)。由于这个中心词ww,的确和context(w)context(w)相关存在,因此它是一个真实的正例。通过Negative Sampling采样,我们得到neg个和ww不同的中心词wi,i=1,2,..negwi,i=1,2,..neg,这样context(w)context(w)和$$w_i$就组成了neg个并不真实存在的负例。利用这一个正例和neg个负例,我们进行二元逻辑回归,得到负采样对应每个词$w_i$对应的模型参数$\theta_{i}$,和每个词的词向量。

    从上面的描述可以看出,Negative Sampling由于没有采用霍夫曼树,每次只是通过采样neg个不同的中心词做负例,就可以训练模型,因此整个过程要比Hierarchical Softmax简单。

    不过有两个问题还需要弄明白:1)如果通过一个正例和neg个负例进行二元逻辑回归呢? 2) 如何进行负采样呢?

    我们在第三节讨论问题1,在第四节讨论问题2.

3. 基于Negative Sampling的模型梯度计算

    Negative Sampling也是采用了二元逻辑回归来求解模型参数,通过负采样,我们得到了neg个负例(context(w),wi)i=1,2,..neg(context(w),wi)i=1,2,..neg。为了统一描述,我们将正例定义为w0w0

    在逻辑回归中,我们的正例应该期望满足:

P(context(w0),wi)=σ(xTwiθwi),yi=1,i=0P(context(w0),wi)=σ(xwiTθwi),yi=1,i=0

    我们的负例期望满足:

P(context(w0),wi)=1σ(xTiθwi),yi=0,i=1,2,..negP(context(w0),wi)=1−σ(xiTθwi),yi=0,i=1,2,..neg

    我们期望可以最大化下式:

i=0negP(context(w0),wi)=σ(xTw0θw0)i=1neg(1σ(xTwiθwi))∏i=0negP(context(w0),wi)=σ(xw0Tθw0)∏i=1neg(1−σ(xwiTθwi))

    利用逻辑回归和上一节的知识,我们容易写出此时模型的似然函数为:

i=0negσ(xTwiθwi)yi(1σ(xTwiθwi))1yi∏i=0negσ(xwiTθwi)yi(1−σ(xwiTθwi))1−yi

    此时对应的对数似然函数为:

L=i=0negyilog(σ(xTwiθwi))+(1yi)log(1σ(xTwiθwi))L=∑i=0negyilog(σ(xwiTθwi))+(1−yi)log(1−σ(xwiTθwi))

    和Hierarchical Softmax类似,我们采用随机梯度上升法,仅仅每次只用一个样本更新梯度,来进行迭代更新得到我们需要的xwi,θwi,i=0,1,..negxwi,θwi,i=0,1,..neg, 这里我们需要求出xwi,θwi,i=0,1,..negxwi,θwi,i=0,1,..neg的梯度。

    首先我们计算θwiθwi的梯度:

Lθwi=yi(1σ(xTwiθwi))xwi(1yi)σ(xTwiθwi)xwi=(yiσ(xTwiθwi))xwi(1)(2)(1)∂L∂θwi=yi(1−σ(xwiTθwi))xwi−(1−yi)σ(xwiTθwi)xwi(2)=(yi−σ(xwiTθwi))xwi

    同样的方法,我们可以求出xwixwi的梯度如下:

Lxwi=(yiσ(xTwiθwi))θwi∂L∂xwi=(yi−σ(xwiTθwi))θwi

    有了梯度表达式,我们就可以用梯度上升法进行迭代来一步步的求解我们需要的xwi,θwi,i=0,1,..negxwi,θwi,i=0,1,..neg

4. Negative Sampling负采样方法

    现在我们来看看如何进行负采样,得到neg个负例。word2vec采样的方法并不复杂,如果词汇表的大小为VV,那么我们就将一段长度为1的线段分成VV份,每份对应词汇表中的一个词。当然每个词对应的线段长度是不一样的,高频词对应的线段长,低频词对应的线段短。每个词ww的线段长度由下式决定:

len(w)=count(w)uvocabcount(u)len(w)=count(w)∑u∈vocabcount(u)

    在word2vec中,分子和分母都取了3/4次幂如下:

len(w)=count(w)3/4uvocabcount(u)3/4len(w)=count(w)3/4∑u∈vocabcount(u)3/4

    在采样前,我们将这段长度为1的线段划分成MM等份,这里M>>VM>>V,这样可以保证每个词对应的线段都会划分成对应的小块。而M份中的每一份都会落在某一个词对应的线段上。在采样的时候,我们只需要从MM个位置中采样出negneg个位置就行,此时采样到的每一个位置对应到的线段所属的词就是我们的负例词。

    在word2vec中,MM取值默认为108108

5.  基于Negative Sampling的CBOW模型

    有了上面Negative Sampling负采样的方法和逻辑回归求解模型参数的方法,我们就可以总结出基于Negative Sampling的CBOW模型算法流程了。梯度迭代过程使用了随机梯度上升法:

    输入:基于CBOW的语料训练样本,词向量的维度大小MM,CBOW的上下文大小2c2c,步长ηη, 负采样的个数neg

    输出:词汇表每个词对应的模型参数θθ,所有的词向量xwxw

    1. 随机初始化所有的模型参数θθ,所有的词向量ww

    2. 对于每个训练样本(context(w0),w0)(context(w0),w0),负采样出neg个负例中心词wi,i=1,2,...negwi,i=1,2,...neg

    3. 进行梯度上升迭代过程,对于训练集中的每一个样本(context(w0),w0,w1,...wneg)(context(w0),w0,w1,...wneg)做如下处理:

      a)  e=0, 计算xw0=12ci=12cxixw0=12c∑i=12cxi

      b)  for i= 0 to neg, 计算:

f=σ(xTwiθwi)f=σ(xwiTθwi)
g=(yif)ηg=(yi−f)η
e=e+gθwie=e+gθwi
θwi=θwi+gxwiθwi=θwi+gxwi

              c) 对于context(w)context(w)中的每一个词向量xjxj(共2c个)进行更新:

xj=xj+exj=xj+e

      d) 如果梯度收敛,则结束梯度迭代,否则回到步骤3继续迭代。

6.  基于Negative Sampling的Skip-Gram模型

    有了上一节CBOW的基础和上一篇基于Hierarchical Softmax的Skip-Gram模型基础,我们也可以总结出基于Negative Sampling的Skip-Gram模型算法流程了。梯度迭代过程使用了随机梯度上升法:

    输入:基于Skip-Gram的语料训练样本,词向量的维度大小MM,Skip-Gram的上下文大小2c2c,步长ηη, , 负采样的个数neg。

    输出:词汇表每个词对应的模型参数θθ,所有的词向量xwxw

    1. 随机初始化所有的模型参数θθ,所有的词向量ww

    2. 对于每个训练样本(context(w0),w0)(context(w0),w0),负采样出neg个负例中心词wi,i=1,2,...negwi,i=1,2,...neg

    3. 进行梯度上升迭代过程,对于训练集中的每一个样本(context(w0),w0,w1,...wneg)(context(w0),w0,w1,...wneg)做如下处理:

      a)  for i =1 to 2c:

        i)  e=0

        ii)  for i= 0 to neg, 计算:

f=σ(xTwiθwi)f=σ(xwiTθwi)
g=(yif)ηg=(yi−f)η
e=e+gθwie=e+gθwi
θwi=θwi+gxwiθwi=θwi+gxwi

        iii)  对于context(w)context(w)中的每一个词向量xjxj(共2c个)进行更新:

xj=xj+exj=xj+e

      b)如果梯度收敛,则结束梯度迭代,算法结束,否则回到步骤a继续迭代。

7.  Negative Sampling的模型源码和算法的对应  

    这里给出上面算法和word2vec源码中的变量对应关系。

    在源代码中,基于Negative Sampling的CBOW模型算法在464-494行,基于Hierarchical Softmax的Skip-Gram的模型算法在520-542行。大家可以对着源代码再深入研究下算法。

    在源代码中,neule对应我们上面的ee, syn0对应我们的xwxw, syn1neg对应我们的θwiθwi, layer1_size对应词向量的维度,window对应我们的cc。negative对应我们的neg, table_size对应我们负采样中的划分数MM

    另外,vocab[word].code[d]指的是,当前单词word的,第d个编码,编码不含Root结点。vocab[word].point[d]指的是,当前单词word,第d个编码下,前置的结点。这些和基于Hierarchical Softmax的是一样的。

    以上就是基于Negative Sampling的word2vec模型,希望可以帮到大家,后面会讲解用gensim的python版word2vec来使用word2vec解决实际问题。


本文转自刘建平Pinard博客园博客,原文链接:http://www.cnblogs.com/pinard/p/7249903.html,如需转载请自行联系原作者

相关文章
|
16天前
|
机器学习/深度学习 自然语言处理 Python
|
5月前
|
机器学习/深度学习 自然语言处理 C++
[Dict2vec]论文实现:Dict2vec : Learning Word Embeddings using Lexical Dictionaries
[Dict2vec]论文实现:Dict2vec : Learning Word Embeddings using Lexical Dictionaries
33 2
[Dict2vec]论文实现:Dict2vec : Learning Word Embeddings using Lexical Dictionaries
|
5月前
|
机器学习/深度学习 自然语言处理 ice
[GloVe]论文实现:GloVe: Global Vectors for Word Representation*
[GloVe]论文实现:GloVe: Global Vectors for Word Representation*
38 2
[GloVe]论文实现:GloVe: Global Vectors for Word Representation*
|
5月前
|
机器学习/深度学习 算法 定位技术
神经网络epoch、batch、batch size、step与iteration的具体含义介绍
神经网络epoch、batch、batch size、step与iteration的具体含义介绍
312 1
|
机器学习/深度学习 自然语言处理 运维
Word2Vec:一种基于预测的方法
Word2Vec:一种基于预测的方法
270 0
|
机器学习/深度学习 计算机视觉
Faster R-CNN : end2end 和 alternative 训练
Faster R-CNN 实际上就是由 Fast R-CNN 和 RPN 两个网络结合的,可以使用 end2end 和 alternative 两种方式来训练,两种方法训练出来的网络准确度基本没有多大的区别,但是使用 end2end 训练,即端到端训练可以节省很多时间。这篇文章参考 Ross' Girshick 在 ICCV15 上的演讲报告,主要讲 end2end 方法。
171 0
|
机器学习/深度学习 自然语言处理 Python
Word2Vec教程-Negative Sampling 负采样
这篇word2vec教程2中(教程1 Word2Vec教程-Skip-Gram模型),作者主要讲述了skip-gram 模型优化的策略-Negative Sampling,使得模型更加快速地训练。通过教程1,我们了解到word2vec它是一个庞大的神经忘网络! 例如,有一个包含10000个单词的词汇表,向量特征为300维,我们记得这个神经网络将会有两个weights矩阵----一个隐藏层和一个输出层。这两层都会有一个300x10000=3000000的weight矩阵。 在如此大的神经网络上进行梯度下降是非常慢的,更加严重的是,我们需要大量训练数据去调整weights和避免over-fitti
700 0
Word2Vec教程-Negative Sampling 负采样
|
机器学习/深度学习 自然语言处理 算法
Word2Vec教程-Skip-Gram模型
这篇教程主要讲述了Word2Vec中的skip gram模型,主要目的是避免普遍的浅层介绍和抽象观点,而是更加详细地探索Word2Vec。现在我们开始研究skip gram模型吧
474 0
Word2Vec教程-Skip-Gram模型
|
机器学习/深度学习 数据采集 自然语言处理
End to End Sequence Labeling via Bidirectional LSTM-CNNs-CRF论文
传统改机的序列标注系统,需要大量的针对特定任务的手工特征和经过预处理的数据。在这篇文章中,作者引入了一种创新的神经网络结果,使用Bi-LSTM、CNN和CRF相结合的网络结果,使模型能够从词和字级别表示中学习和收益。作者指出他们的系统是真正意义上的端到端结果,不需要任何特征工程或者数据预处理工作,因此可以广泛应用于各种序列标注任务。该模型在PennTreebank WSJ词性标注任务和CoNLL 2003 词性标注数据集上取得优异的成绩,前者97.55%的准确率,后者取得91.21%的F1值。
128 0
End to End Sequence Labeling via Bidirectional LSTM-CNNs-CRF论文
|
自然语言处理 算法 Python
Gensim实现Word2Vec的Skip-Gram模型
gensim是一个开源的Python库,用于便捷高效地提取文档中的语义话题。它用于处理原始的、非结构化的电子文本(“纯文本”),gensim中的一些算法,如 Latent Semantic Analysis(潜在语义分析)、 Latent Dirichlet Allocation(潜在Dirichlet分布)、Random Projections(随机预测)通过检查训练文档中的共现实体来挖掘语义结构。
281 0