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)是两种最常用的模型.更准确地说,词向量只能表征单个词,如果要表示文本,需要做一些额外 ...
随机推荐
- ViewModel从未如此清爽 - 轻量级WPF MVVM框架Stylet
Stylet是我最近发现的一个WPF MVVM框架, 在博客园上搜了一下, 相关的文章基本没有, 所以写了这个入门的文章推荐给大家. Stylet是受Caliburn Micro项目的启发, 所以借鉴 ...
- Eclipse中SVN设置文件为ignore后重新添加至版本控制
先前把需要版本控制的文件夹ignore了,用了很长时间找解决方法,结果发现竟如此简单,对eclipse的功能不熟悉啊. 方法如下: 在Window->Show View -> Naviga ...
- http服务器开发笔记(一)——先跑起来
做了很多年的web相关开发,从来也没有系统的学习http协议,最近正好工作不怎么忙,准备系统的学习一下. 接下来准备自己写一小型的http服务器来学习,因为现在对JavaScript比较熟悉,所以决定 ...
- 深入理解 JavaScript 事件循环(一)— event loop
引言 相信所有学过 JavaScript 都知道它是一门单线程的语言,这也就意味着 JS 无法进行多线程编程,但是 JS 当中却有着无处不在的异步概念 .在初期许多人会把异步理解成类似多线程的编程模式 ...
- CC2530入门教程-02】CC2530的通用I/O端口输入和输出控制
第2课 CC2530的通用I/O端口输入和输出控制 广东职业技术学院 欧浩源 一.CC2530的引脚概述 CC2530微控制器采用QFN40封装,有40 个引脚.其中,有21个数字I/O端口,其中 ...
- 如何远程调试zookeeper集群
我们在阅读一些源码的时候,如果能调试源代码将会大大的提高我们的阅读效率.最近在学习zookeeper源码,分享下如何调试zookeeper集群. zookeeper代码,调试环境搭建 1.下载zook ...
- yiic执行出现不是内部或外部命令的解决办法
右击我的电脑-->属性-->高级系统设置-->高级-->环境变量-->系统变量 设置为"D:\Program Files (x86)\wamp\bin\php\ ...
- 3.Smarty的基本语法
一.注释的方法是 {* 这里填注释 *} 二.在Smarty的输出赋值进来的变量 1.变量是字符串的时候 1)关联数组 $arr = array('a'=>'cai','b'=>'muqi ...
- Java基础(1) - 语法 & 概念
Java基础语法 基础 1. Java对大小写敏感 2. Java注释 //单行注释 这是一行注释 /* 这里是多行 注释 */ /** 这里是文档注释 @author 0o晓月メ */ 3. 访问修 ...
- Handlebars.js 模板引擎
介绍 Handlebars 是 JavaScript 一个语义模板库,通过对view和data的分离来快速构建Web模板.它采用"Logic-less template"(无逻辑模 ...