word2vec原理| 基于Negative Sampling的模型

2020 年 4 月 16 日 AINLP

作者:刘建平Pinard
博客地址:https://www.cnblogs.com/pinard
原文链接,点击文末阅读全文直达:https://www.cnblogs.com/pinard/p/7249903.html

  • word2vec原理(一) CBOW与Skip-Gram模型基础

  • word2vec原理(二) 基于Hierarchical Softmax的模型

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

在上一篇中我们讲到了基于Hierarchical Softmax的word2vec模型,本文我们我们再来看看另一种求解word2vec模型的方法:Negative Sampling。

1. Hierarchical Softmax的缺点与改进

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

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

2. 基于Negative Sampling的模型概述

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

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

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

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

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

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

Negative Sampling也是采用了二元逻辑回归来求解模型参数,通过负采样,我们得到了neg个负例。为了统一描述,我们将正例定义为

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


我们的负例期望满足:


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


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


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


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

首先我们计算 的梯度:


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


有了梯度表达式,我们就可以用梯度上升法进行迭代来一步步的求解我们需要的

4. Negative Sampling负采样方法

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


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


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

在word2vec中, 取值默认为

5.  基于Negative Sampling的CBOW模型

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

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

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

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

2. 对于每个训练样本 ,负采样出neg个负例中心词

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

a)  e=0, 计算

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


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


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

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

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

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

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

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

2. 对于每个训练样本 ,负采样出neg个负例中心词

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

a)  for i =1 to 2c:

i)  e=0

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


iii)  词向量更新:


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

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

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

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

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

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

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

推荐阅读

AINLP年度阅读收藏清单

当当的羊毛,快薅,这一次要拼手速!

数学之美中盛赞的 Michael Collins 教授,他的NLP课程要不要收藏?

自动作诗机&藏头诗生成器:五言、七言、绝句、律诗全了

From Word Embeddings To Document Distances 阅读笔记

模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法

这门斯坦福大学自然语言处理经典入门课,我放到B站了

可解释性论文阅读笔记1-Tree Regularization

征稿启示 | 稿费+GPU算力+星球嘉宾一个都不少

关于AINLP

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。


登录查看更多
3

相关内容

自然语言处理领域中,判断两个单词是不是一对上下文词(context)与目标词(target),如果是一对,则是正样本,如果不是一对,则是负样本。采样得到一个上下文词和一个目标词,生成一个正样本(positive example),生成一个负样本(negative example),则是用与正样本相同的上下文词,再在字典中随机选择一个单词,这就是负采样(negative sampling)。
Transformer文本分类代码
专知会员服务
116+阅读 · 2020年2月3日
【CCL 2019】ATT-第19期:生成对抗网络 (邱锡鹏)
专知会员服务
49+阅读 · 2019年11月12日
面试题:Word2Vec中为什么使用负采样?
七月在线实验室
46+阅读 · 2019年5月16日
基于 Doc2vec 训练句子向量
AI研习社
6+阅读 · 2018年5月16日
不懂 word2vec,还敢说自己是做 NLP 的?
AI研习社
8+阅读 · 2018年5月4日
业界|基于Tensorflow Estimators的文本分类系列之一
全球人工智能
3+阅读 · 2018年4月19日
学习 | word2vec的前世今生
菜鸟的机器学习
14+阅读 · 2018年3月21日
干货|自然语言处理中的词向量 — word2vec!
全球人工智能
7+阅读 · 2018年1月25日
基础|Word2vec的原理介绍
全球人工智能
10+阅读 · 2018年1月4日
【原理】GAN的数学原理
GAN生成式对抗网络
8+阅读 · 2017年8月30日
基于LDA的主题模型实践(二 )MCMC--吉布斯采样
机器学习深度学习实战原创交流
25+阅读 · 2015年9月17日
基于LDA的主题模型实践(一)
机器学习深度学习实战原创交流
20+阅读 · 2015年9月9日
Arxiv
6+阅读 · 2019年7月11日
Arxiv
3+阅读 · 2018年3月5日
Arxiv
3+阅读 · 2018年2月12日
Arxiv
6+阅读 · 2018年2月6日
VIP会员
相关资讯
面试题:Word2Vec中为什么使用负采样?
七月在线实验室
46+阅读 · 2019年5月16日
基于 Doc2vec 训练句子向量
AI研习社
6+阅读 · 2018年5月16日
不懂 word2vec,还敢说自己是做 NLP 的?
AI研习社
8+阅读 · 2018年5月4日
业界|基于Tensorflow Estimators的文本分类系列之一
全球人工智能
3+阅读 · 2018年4月19日
学习 | word2vec的前世今生
菜鸟的机器学习
14+阅读 · 2018年3月21日
干货|自然语言处理中的词向量 — word2vec!
全球人工智能
7+阅读 · 2018年1月25日
基础|Word2vec的原理介绍
全球人工智能
10+阅读 · 2018年1月4日
【原理】GAN的数学原理
GAN生成式对抗网络
8+阅读 · 2017年8月30日
基于LDA的主题模型实践(二 )MCMC--吉布斯采样
机器学习深度学习实战原创交流
25+阅读 · 2015年9月17日
基于LDA的主题模型实践(一)
机器学习深度学习实战原创交流
20+阅读 · 2015年9月9日
Top
微信扫码咨询专知VIP会员