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 ,它周围上下文共有 2 c 个词,记为 c o n t e x t ( w ) 。由于这个中心词 w ,的确和 c o n t e x t ( w ) 相关存在,因此它是一个真实的正例。通过Negative Sampling采样,我们得到neg个和 w 不同的中心词 w i , i = 1 , 2 , . . n e g ,这样 c o n t e x t ( 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个负例 ( c o n t e x t ( w ) , w i ) i = 1 , 2 , . . n e g 。为了统一描述,我们将正例定义为 w 0

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

P ( c o n t e x t ( w 0 ) , w i ) = σ ( x w i T θ w i ) , y i = 1 , i = 0

    我们的负例期望满足:

P ( c o n t e x t ( w 0 ) , w i ) = 1 σ ( x i T θ w i ) , y i = 0 , i = 1 , 2 , . . n e g

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

i = 0 n e g P ( c o n t e x t ( w 0 ) , w i ) = σ ( x w 0 T θ w 0 ) i = 1 n e g ( 1 σ ( x w i T θ w i ) )

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

i = 0 n e g σ ( x w i T θ w i ) y i ( 1 σ ( x w i T θ w i ) ) 1 y i

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

L = i = 0 n e g y i l o g ( σ ( x w i T θ w i ) ) + ( 1 y i ) l o g ( 1 σ ( x w i T θ w i ) )

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

    首先我们计算 θ w i 的梯度:

(1) L θ w i = y i ( 1 σ ( x w i T θ w i ) ) x w i ( 1 y i ) σ ( x w i T θ w i ) x w i (2) = ( y i σ ( x w i T θ w i ) ) x w i

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

L x w i = ( y i σ ( x w i T θ w i ) ) θ w i

    有了梯度表达式,我们就可以用梯度上升法进行迭代来一步步的求解我们需要的 x w i , θ w i , i = 0 , 1 , . . n e g

4. Negative Sampling负采样方法

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

l e n ( w ) = c o u n t ( w ) u v o c a b c o u n t ( u )

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

l e n ( w ) = c o u n t ( w ) 3 / 4 u v o c a b c o u n t ( u ) 3 / 4

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

    在word2vec中, M 取值默认为 10 8

5.  基于Negative Sampling的CBOW模型

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

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

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

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

    2. 对于每个训练样本 ( c o n t e x t ( w 0 ) , w 0 ) ,负采样出neg个负例中心词 w i , i = 1 , 2 , . . . n e g

    3. 进行梯度上升迭代过程,对于训练集中的每一个样本 ( c o n t e x t ( w 0 ) , w 0 , w 1 , . . . w n e g ) 做如下处理:

      a)  e=0, 计算 x w 0 = 1 2 c i = 1 2 c x i

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

f = σ ( x w i T θ w i )
g = ( y i f ) η
e = e + g θ w i
θ w i = θ w i + g x w i

              c) 对于 c o n t e x t ( w ) 中的每一个词向量 x j (共2c个)进行更新:

x j = x j + e

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

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

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

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

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

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

    2. 对于每个训练样本 ( c o n t e x t ( w 0 ) , w 0 ) ,负采样出neg个负例中心词 w i , i = 1 , 2 , . . . n e g

    3. 进行梯度上升迭代过程,对于训练集中的每一个样本 ( c o n t e x t ( w 0 ) , w 0 , w 1 , . . . w n e g ) 做如下处理:

      a)  for i =1 to 2c:

        i)  e=0

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

f = σ ( x w i T θ w i )
g = ( y i f ) η
e = e + g θ w i
θ w i = θ w i + g x w i

        iii)  对于 c o n t e x t ( w ) 中的每一个词向量 x j (共2c个)进行更新:

x j = x j + e

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

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

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

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

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

    另外,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,如需转载请自行联系原作者

相关文章
|
存储 应用服务中间件 数据安全/隐私保护
2022红帽RHCSA考题解析
2022红帽RHCSA考题解析
4755 0
2022红帽RHCSA考题解析
|
10月前
|
SQL 关系型数据库 分布式数据库
夺冠在即 | PolarDB数据库创新设计赛(天池杯)决赛答辩通知
2024年全国大学生计算机系统能力大赛PolarDB数据库创新设计赛(天池杯)于8月21日启动,吸引了200多所高校近千支队伍参赛。经过激烈角逐,60支队伍晋级决赛第一阶段,36支队伍脱颖而出进入现场答辩,将于12月29日在武汉大学争夺最终奖项。决赛要求选手基于PolarDB-PG开源代码部署集群并优化TPCH查询性能。完赛率超90%,成绩表现出明显梯度,前20名均在500秒内完成。评委来自学术界和工业界,确保评选公正。预祝选手们取得优异成绩!
|
10月前
|
人工智能 前端开发 Linux
github是怎么用的,如何下载仓库
github是怎么用的,如何下载仓库
|
11月前
|
数据中心
交换机的电口和光口到底是个啥东东,做网络的这个常识得懂
在网络通信中,交换机的电口和光口是关键组件。电口使用电信号和RJ45接口,适用于短距离传输,成本低,安装简单;光口使用光信号和光纤线缆,适用于长距离、高速传输,抗干扰能力强,但成本较高。本文详细介绍了电口和光口的工作原理、特点、应用场景及选择方法,帮助读者更好地理解和应用这两种接口。
1523 5
|
10月前
|
API 数据安全/隐私保护 UED
探索鸿蒙的蓝牙A2DP与访问API:从学习到实现的开发之旅
在掌握了鸿蒙系统的开发基础后,我挑战了蓝牙功能的开发。通过Bluetooth A2DP和Access API,实现了蓝牙音频流传输、设备连接和权限管理。具体步骤包括:理解API作用、配置环境与权限、扫描并连接设备、实现音频流控制及动态切换设备。最终,我构建了一个简单的蓝牙音频播放器,具备设备扫描、连接、音频播放与停止、切换输出设备等功能。这次开发让我对蓝牙技术有了更深的理解,也为未来的复杂项目打下了坚实的基础。
389 58
探索鸿蒙的蓝牙A2DP与访问API:从学习到实现的开发之旅
|
10月前
|
存储 人工智能 运维
内附源码|头部基模企业信赖之选——DMS+Lindorm智能搜索方案
本文为数据库「拥抱Data+AI」系列连载第6篇,针对企业构建智能搜索服务的痛点,介绍如何利用阿里云Data+AI解决方案构建一站式AI搜索服务,深入分析了DMS+Lindorm的智能搜索解决方案。
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
Granite 3.1:IBM 开源新一代可商用大语言模型,支持 128K 上下文长度、多语言和复杂任务处理
IBM 推出的 Granite 3.1 是一款新一代语言模型,具备强大的性能和更长的上下文处理能力,支持多语言和复杂任务处理。
528 0
Granite 3.1:IBM 开源新一代可商用大语言模型,支持 128K 上下文长度、多语言和复杂任务处理
|
Java Linux 开发工具
IDEA中git提交前如何关闭code analysis以及开启格式化代码
【10月更文挑战第12天】本文介绍了在 IntelliJ IDEA 中关闭代码分析和开启代码格式化的步骤。关闭代码分析可通过取消默认启用检查或针对特定规则进行调整实现,同时可通过设置 VCS 静默模式在提交时跳过检查。开启代码格式化则需在 `Settings` 中配置 `Code Style` 规则,并通过创建 Git 钩子实现提交前自动格式化。
4068 3
|
弹性计算 Oracle 固态存储
阿里云ESSD云盘性能级别PL0、PL1、PL2和PL3怎么选?
阿里云服务器ESSD云盘性能级别PL0、PL1、PL2和PL3怎么选择?不同性能级别对应的单盘IOPS性能上限、IO和吞吐量都不同,ESSD云盘容量越大可选择的PL级别越高,性能级别PL越高价格也越贵,阿里云百科来详细说下阿里云ESSD云盘不同性能级别区别以及选择方法:
4781 0
阿里云ESSD云盘性能级别PL0、PL1、PL2和PL3怎么选?