DL4NLP——词表示模型(三)word2vec(CBOW/Skip-gram)的加速:Hierarchical Softmax与Negative Sampling
上篇博文提到,原始的CBOW / Skip-gram模型虽然去掉了NPLM中的隐藏层从而减少了耗时,但由于输出层仍然是softmax(),所以实际上依然“impractical”。所以接下来就介绍一下如何对训练过程进行加速。
paper中提出了两种方法,一种是Hierarchical Softmax,另一种是Negative Sampling。
本文简述了以下内容:
CBOW / Skip-gram模型的加速策略(一):Hierarchical Softmax
CBOW / Skip-gram模型的加速策略(二):Negative Sampling
这篇写的很不好,太简略了,大家还是直接看文末的参考文章吧。。。
CBOW / Skip-gram模型的加速策略(一):Hierarchical Softmax
拿原始模型来说,计算 $\hat{\boldsymbol y}$ 的一个分量 $\hat{y_{\underline i}}=P(w_{\underline i}|w_{t-m},...,w_{t-1},w_{t+1},...,w_{t+m})=\text{softmax}(z_{\underline i})$ 时,由于使用的是softmax()函数,时间复杂度为 $O(|\mathbb V|)$ ,因此计算代价很大,对大规模的训练语料来说,非常impractical。
Hierarchical Softmax是一种对输出层进行优化的策略,输出层从原始模型的利用softmax计算概率值改为了利用Huffman树计算概率值。
以词表中的全部词作为叶子节点,词频作为节点的权,构建Huffman树,作为输出。Huffman树是二叉树,在叶子节点及叶子节点的权给定的情况下,该树的带权路径长度最短(一个节点的带权路径长度指根节点到该节点的路径长度乘以该节点的权,树的带权路径长度指全部叶子节点的带权路径长度之和)。直观上可以看出,叶子节点的权越大,则该叶子节点就应该离根节点越近。因此对于模型来说就是,词频越高的词,距离根节点就越近。
从根节点出发,到达指定叶子节点的路径是唯一的。Hierarchical Softmax正是利用这条路径来计算指定词的概率,而非用softmax来计算。

图片来源:[2],记号改成和本文一致
上图是一个已根据词频构建好的Huffman树,各叶子节点代表词表中的各个词,非叶子节点共 $|\mathbb V|-1$ 个。以词 $w_{\underline 2}$ 为例,从根节点到该叶子节点的路径长度 $L(w_{\underline 2})=4$ ,各个节点依次被记为 $n(w_{\underline 2},1)$ 、$n(w_{\underline 2},2)$ 、$n(w_{\underline 2},3)$ 和 $n(w_{\underline 2},L(w_{\underline 2}))$ 。对于每个非叶子节点 $n(w,j)$ ,虽然不是词表中的词,但也引入所谓的“输出词向量” $\boldsymbol u_{n(w,j)}$ ,是需要学习的参数,为什么要引入它?下面讲述。
从根节点出发,走到指定叶子节点 $w$ 的过程,就是一个进行 $L(w)-1$ 次二分类的过程:路径上的每个非叶子节点都拥有两个孩子节点,从当前节点 $n(w,j)$ 向下走时共有两种选择,走到左孩子节点 $\text{ch}(n(w,j))$ 就定义为分类到了正类,走到右孩子节点就定义为分类到了负类。
以CBOW模型为例,即输入层是 $\hat{\boldsymbol v}_t$ 。用二项Logistic回归模型对每一次分类过程建模:从当前节点 $n(w,j)$ 走到下一节点,那么走到左孩子节点的概率为
$$ \sigma(\boldsymbol u_{n(w,j)}^\top \hat{\boldsymbol v}_t) $$
走到右孩子节点的概率为
$$1-\sigma(\boldsymbol u_{n(w,j)}^\top \hat{\boldsymbol v}_t)=\sigma(-\boldsymbol u_{n(w,j)}^\top \hat{\boldsymbol v}_t)$$
将上面两个式子统一起来,那就是

(双线括号的意思是,当括号内为真则输出1,为假则输出-1。因为这个符号渲染不出来,就用截图代替了)
现在计算输出词为 $w$ 的概率:这对应于一条从根节点 $n(w,1)$ 走到叶子节点 $n(w,L(w))$ 的路径,概率计算式为下式:

平均时间复杂度为 $O(\log |\mathbb V|)$ ,相比于使用softmax()函数有很大提高。
对于Skip-gram模型,表达式类似:

可以证明,这样计算的结果满足概率和为1:
$$\sum_{i=1}^{|\mathbb V|}P(w_{\underline i}|w_{t-m},...,w_{t-1},w_{t+1},...,w_{t+m})=1$$
模型对语料中的全部词串计算概率值做连乘得到似然函数,再取对数得到对数似然 $\mathcal L$ ,进而用极大似然估计来求取参数。使用SGD更新参数(求取梯度时,由于是SGD,所以 $\mathcal L$ 的求和号可以去掉)。易知在Hierarchical Softmax的情况下每个词只会得到一个词表示(输入词向量)。梯度求取比较简单,[3] 写的非常详细并给出了参数更新过程的伪代码(Skip-gram部分写反了,应改为“各个周围词预测中心词再做连乘”,而非“中心词预测各个周围词再做连乘”)。
CBOW / Skip-gram模型的加速策略(二):Negative Sampling
第二种加速策略是Negative Sampling(简写NEG,负采样),这是Noise-Contrastive Estimation(简写NCE,噪声对比估计)的简化版本:把语料中的一个词串的中心词替换为别的词,构造语料 $\mathbb D$ 中不存在的词串作为负样本。因此在这种策略下,优化目标变为了:最大化正样本的概率,同时最小化负样本的概率。对于一个词串 $(w,c)$ ( $c$ 表示 $w$ 的上下文),用二项Logistic回归模型对其是正样本的概率建模:
$$P(\mathbb D=1|w,c)=\sigma(\boldsymbol u_{(w)}^\top \boldsymbol v_{(c)})$$
所以全部正样本的似然函数为
$$\prod_{(w,c)\in\mathbb D}P(\mathbb D=1|w,c)$$
同理,全部负样本的似然函数为
$$\prod_{(w,c)\notin\mathbb D}P(\mathbb D=1|w,c)$$
需要最大化前者同时最小化后者,也就是最大化下式:
$$\prod_{(w,c)\in\mathbb D}P(\mathbb D=1|w,c)\prod_{(w,c)\notin\mathbb D}(1-P(\mathbb D=1|w,c))$$
取对数得到对数似然:
$$\begin{aligned}\mathcal L=&\log\Biggr (\prod_{(w,c)\in\mathbb D}P(\mathbb D=1|w,c)\prod_{(w,c)\notin\mathbb D}(1-P(\mathbb D=1|w,c))\Biggr )\\=&\log\Biggr (\prod_{(w,c)\in\mathbb D}\sigma(\boldsymbol u_{(w)}^\top \boldsymbol v_{(c)})\prod_{(w,c)\notin\mathbb D}\sigma(-\boldsymbol u_{(w)}^\top \boldsymbol v_{(c)})\Biggr )\\=&\sum_{(w,c)\in\mathbb D}\log\sigma(\boldsymbol u_{(w)}^\top \boldsymbol v_{(c)})+\sum_{(w,c)\notin\mathbb D}\log\sigma(-\boldsymbol u_{(w)}^\top \boldsymbol v_{(c)})\end{aligned}$$
由于使用SGD,所以只需要知道对一个正样本 $(w,c)$ 的目标函数。式中 $NEG(w)$ 指 $(w,c)$ 的负样本的中心词集合:
$$ L=\log\sigma(\boldsymbol u_{(w)}^\top \boldsymbol v_{(c)})+\sum_{w_-\in NEG(w)}\log\sigma(-\boldsymbol u_{(w_-)}^\top \boldsymbol v_{(c)})$$
求梯度的过程依旧可以参照 [3]。
行文仓促,后面有机会再修正。
参考资料:
[1] Distributed Representations of Words and Phrases and their Compositionality, NIPS2013
[2] word2vec Parameter Learning Explained
[3] word2vec中的数学原理 - peghoty
DL4NLP——词表示模型(三)word2vec(CBOW/Skip-gram)的加速:Hierarchical Softmax与Negative Sampling的更多相关文章
- DL4NLP——词表示模型(二)基于神经网络的模型:NPLM;word2vec(CBOW/Skip-gram)
本文简述了以下内容: 神经概率语言模型NPLM,训练语言模型并同时得到词表示 word2vec:CBOW / Skip-gram,直接以得到词表示为目标的模型 (一)原始CBOW(Continuous ...
- DL4NLP——词表示模型(一)表示学习;syntagmatic与paradigmatic两类模型;基于矩阵的LSA和GloVe
本文简述了以下内容: 什么是词表示,什么是表示学习,什么是分布式表示 one-hot representation与distributed representation(分布式表示) 基于distri ...
- 机器学习入门-文本特征-word2vec词向量模型 1.word2vec(进行word2vec映射编码)2.model.wv['sky']输出这个词的向量映射 3.model.wv.index2vec(输出经过映射的词名称)
函数说明: 1. from gensim.model import word2vec 构建模型 word2vec(corpus_token, size=feature_size, min_count ...
- 词表征 2:word2vec、CBoW、Skip-Gram、Negative Sampling、Hierarchical Softmax
原文地址:https://www.jianshu.com/p/5a896955abf0 2)基于迭代的方法直接学 相较于基于SVD的方法直接捕获所有共现值的做法,基于迭代的方法一次只捕获一个窗口内的词 ...
- 词向量模型word2vector详解
目录 前言 1.背景知识 1.1.词向量 1.2.one-hot模型 1.3.word2vec模型 1.3.1.单个单词到单个单词的例子 1.3.2.单个单词到单个单词的推导 2.CBOW模型 3.s ...
- word2vec原理(三) 基于Negative Sampling的模型
word2vec原理(一) CBOW与Skip-Gram模型基础 word2vec原理(二) 基于Hierarchical Softmax的模型 word2vec原理(三) 基于Negative Sa ...
- [Algorithm & NLP] 文本深度表示模型——word2vec&doc2vec词向量模型
深度学习掀开了机器学习的新篇章,目前深度学习应用于图像和语音已经产生了突破性的研究进展.深度学习一直被人们推崇为一种类似于人脑结构的人工智能算法,那为什么深度学习在语义分析领域仍然没有实质性的进展呢? ...
- tensorflow在文本处理中的使用——CBOW词嵌入模型
代码来源于:tensorflow机器学习实战指南(曾益强 译,2017年9月)——第七章:自然语言处理 代码地址:https://github.com/nfmcclure/tensorflow-coo ...
- 词袋模型bow和词向量模型word2vec
在自然语言处理和文本分析的问题中,词袋(Bag of Words, BOW)和词向量(Word Embedding)是两种最常用的模型.更准确地说,词向量只能表征单个词,如果要表示文本,需要做一些额外 ...
随机推荐
- SQL SERVER 自动生成 MySQL 表结构及索引 的建表SQL
SQL SERVER的表结构及索引转换为MySQL的表结构及索引,其实在很多第三方工具中有提供,比如navicat.sqlyog等,但是,在处理某些数据类型.默认值及索引转换的时候,总有些 ...
- SQL储存过程
基本语法 创建存储过程 create procedure sp_name @[参数名] [类型],@[参数名] [类型] as begin ......... end 以上格式还可以简写成: crea ...
- 文件描述符与FILE
1. 文件描述符(重点) 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件.链接文件和设备文件.文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创 ...
- mysql字符编码设置
1.显示当前编码信息 mysql>show variables like '%character%' +--------------------------+------------------ ...
- 自动适配H5容器(UIViewView/WKWebView),生成长图,防微信进度条
前段时间撸代码猥琐发育的时候,设计师老王给了张截图某宝APP上一个生成长图分享的功能,正好公司有这个需求,于是在立马开始操练起来!在万能的度娘上搜集整理资料后发现很多文章介绍的方案对WKWebView ...
- GA代码中的细节
GA-BLX交叉-Gaussion变异 中的代码细节: 我写了一个GA的代码,在2005测试函数上一直不能得到与实验室其他同学类似的数量级的结果.现在参考其他同学的代码,发现至少有如下问题: 1.在交 ...
- ubuntu16.04-x64系统中Jexus web server部署.NetCore和端口分析引发的猜想!
您有这样的牢骚么? 有一周没更新博客了,简单说下在干什么吧:主要是公司安排对接某旅游大公司的接口,接口数量倒也就10个左右,对接完后还需要加入到业务系统中和App端,因此还是需要花点时间的:时间上来说 ...
- Python操作redis系列之 列表(list) (四)
# -*- coding: utf- -*- import redis r =redis.Redis(host=,password="ZBHRwlb1608") 1. Lpush ...
- 各开放平台API接口通用SDK序列文章 前言
最近两年一直在做API接口相关的工作,在平时工作中以及网上看到很多刚接触API接口调用的新人一开始会感到很不适应,要看的文档一大堆,自己要调用的接口找不着,或都找着了不知道怎么去调用,记得包括自己刚开 ...
- 【原】无脑操作:eclipse + maven搭建SSM框架
网上看到一些Spring + Spring MVC + MyBatis框架的搭建教程,不是很详细或是时间久远了,自己动手整一个简单无脑的! 0.系统环境 1)Windows 10 企业版 2)JDK ...