论文笔记之Distributed Representations of Words and Phrases and their Compositionality
这篇文章是用于解决skip-gram和CBOW两种模型在计算softmax
时因为语料库V太大导致计算复杂度偏高的问题。为了降低复杂度,提高运算效率,论文作者提出了层次softmax以及负采样的方式去解决(负采样会比层次softmax用的更多些)。此外,作者还提出了一种重采样方式去使得采样更偏重一些含重要信息的词。
参考:
①B站视频
②论文
③Word2vec的两种原模型
④Word2vec 中的数学原理详解
⑤Word2Vec-知其然知其所以然
Distributed Representations of Words and Phrases and their Compositionality
- 1 Hierarchical Softmax
- 1.1 Skip-gram HS构建
- 1.2 CBOW HS的构建
- 2 Negative Sampling
- 2.1 Skip-gram中的NS
- 2.2 CBOW中的NS
- 3 Subsampling of Frequent Words
- 4 实战演练
- 4.1 PTB数据集
- 4.2 模型训练
- 5 Conclusion
文章介绍了2种可以简化skip-gram和CBOW两种模型中softmax部分的计算复杂度,即Hierarchical Softmax(HS)和Negative Sampling(NS)。这两种技巧均可用于上述2种模型,故HS和NS的目标就是改变softmax的表达式:
p(o∣c)=exp(uoTvc)∑w=1Vexp(uwTvc)(1)p(o|c) = \frac{exp(u_o^Tv_c)}{\sum^V_{w=1}exp(u^T_wv_c)}\tag{1} p(o∣c)=∑w=1Vexp(uwTvc)exp(uoTvc)(1)
从式(1)中可以看出,计算一次概率需要经过VVV(语料库大小)次的指数运算,那么自然HS和NS就要想办法在保证求出概率p(o∣c)p(o|c)p(o∣c)的情况下,减小uwTvcu^T_wv_cuwTvc的运算次数。因此原skip-gram以及CBOW的softmax需要做出改进。
1 Hierarchical Softmax
层次softmax的核心思想就是通过引出二叉树结构(Huffmax 二叉树)将求softmax的计算转为求sigmoid的计算,从而将计算复杂度从VVV降到log2Vlog_2Vlog2V以下,即从原来的需要求VVV次关于uwTvcu_w^Tv_cuwTvc的指数运算降低到求小于log2Vlog_2Vlog2V次的sigmoid运算(sigmoid:σ(x)=11+e−xsigmoid: \sigma(x) = \frac{1}{1+e^{-x}}sigmoid:σ(x)=1+e−x1)。
为了便于理解,我们中间加入满二叉树过程而不是直接到Huffman树过程。
上图是一个满二叉树(V=8),可以看到,每次计算一个词aaa的概率需要进行log2V=3log_2V=3log2V=3次的二分类过程,也就是说需要进行3次的sigmoid计算。
那么满二叉树达到了log2Vlog_2Vlog2V的优化程度,那么有没有更快的方式呢?——引入Huffman树
。
哈夫曼树是带权重路径最短二叉树,它基于将权值小的节点放的位子深(越小越接近叶子节点),权值大的节点放的位子浅(越大越靠近根节点)的原则来实现比满二叉树更小的路径和。
Note:
- 在层次softmax的CBOW和skip-gram模型中,你无法采用W+W∗2\frac{W+W^*}{2}2W+W∗的形式来做,因为在skip-gram模型中,只有一组完整的中心词向量矩阵WWW,而中心词向量矩阵是由θ\thetaθ组成的,其维度势必小于VVV,故WWW和W∗W^*W∗是size不同的两个矩阵。同理,在CBOW模型中,只有一组完整的周围词向量矩阵WWW,而W∗W^*W∗的size是比WWW要小的,故不能相加。
- 对于HS,有的词概率计算用的sigmoid次数可能小于log2Vlog_2Vlog2V,有的可能要大于log2Vlog_2Vlog2V,平均下来是log2Vlog_2Vlog2V。
1.1 Skip-gram HS构建
Skip-gram中哈夫曼树的构建:
- 输出层是一课Huffman树。
- 叶子节点是语料库中的词。
- 将某个词出现的频率作为叶子节点的权值,频率越大的层数越浅,频率越小的层数越深。
如上图所示,比如说我们要去求"词I"的概率,我们用HS技巧来取代softmax计算,设c为中心词:
p(I∣c)=σ(θ0Tvc)⋅σ(θ1Tvc)⋅(1−σ(θ2Tvc))=σ(θ0Tvc)⋅σ(θ1Tvc)⋅σ(−θ2Tvc)(2)p(I|c) = \sigma(\theta_0^Tv_c)\cdot\sigma(\theta_1^Tv_c)\cdot(1-\sigma(\theta_2^Tv_c))\\ = \sigma(\theta_0^Tv_c)\cdot\sigma(\theta_1^Tv_c)\cdot\sigma(-\theta_2^Tv_c)\tag{2} p(I∣c)=σ(θ0Tvc)⋅σ(θ1Tvc)⋅(1−σ(θ2Tvc))=σ(θ0Tvc)⋅σ(θ1Tvc)⋅σ(−θ2Tvc)(2)
- θ\thetaθ参数的个数一定是小于VVV的,其没有具体意义,实在要一个意义的话,可以理解为该节点以下整一簇的上下文词向量。
- θ\thetaθ的个数大约有log2Vlog_2Vlog2V个,比VVV要略大。
- 树的高度大约是O(log2V)O(\log_2V)O(log2V)。
上图的意思大概就是:从根节点出发,以一半一半的概率走向两个子节点,需要注意的是同一层的两个结点之和为1。然后一半一半的概率继续往下走,当第三次分开走的时候就遇到了我们要求的“词I”,我们把它拿出来做反向传播就行了。具体写成公式如下:
p(w∣wI)=∏j=1L(w)−1σ(δ(n(w,j+1)==ch(n(w,j)))⋅θn(w,j)TvwI)(3)p(w|w_I) = \prod_{j=1}^{L(w)-1}\sigma(\delta(n(w,j+1)==ch(n(w,j)))\cdot \theta_{n(w,j)}^Tv_{w_I})\tag{3} p(w∣wI)=j=1∏L(w)−1σ(δ(n(w,j+1)==ch(n(w,j)))⋅θn(w,j)TvwI)(3)
Note:
- n(w,j)n(w,j)n(w,j)表示词www在树上的第j个节点,比如n(w,1)n(w,1)n(w,1)就是根节点。
- δ(n(w,j+1)==ch(n(w,j)))\delta(n(w,j+1)==ch(n(w,j)))δ(n(w,j+1)==ch(n(w,j)))表示当节点n(w,j)n(w,j)n(w,j)的右儿子节点是词www的下一个节点的时候,那么就取正号,否则就取负号。
- 公式(3)中vwIv_{w_I}vwI表示中心词向量。
1.2 CBOW HS的构建
在CBOW中HS和skip-gram中差不多,只是公式上略微有点变化。因为和skip-gram相反,CBOW要改变中心词向量矩阵W∗W^*W∗,具体如下:
- 如上图所示,θ\thetaθ在CBOW中的含义大概是中心词向量,而非skip-gram中的上下文词向量。
对应skip-gram中的公式3,CBOW也要略微进行修改:
p(w∣wI)=∏j=1L(w)−1σ(δ(n(w,j+1)==ch(n(w,j)))⋅uwITθn(w,j))(4)p(w|w_I) = \prod_{j=1}^{L(w)-1}\sigma(\delta(n(w,j+1)==ch(n(w,j)))\cdot u_{w_I}^T \theta_{n(w,j)})\tag{4} p(w∣wI)=j=1∏L(w)−1σ(δ(n(w,j+1)==ch(n(w,j)))⋅uwITθn(w,j))(4)
2 Negative Sampling
负采样的核心思想就是将多分类(V类)问题转为二分类问题。Softmax之所以慢,是因为它涉及一个多分类问题,且和词表大小VVV相关的。负采样就是舍弃多分类,转为二分类来提升速度。
2.1 Skip-gram中的NS
既然是二分类,正样本由中心词以及窗口内上下文词组成;负样本由中心词和词库中随意采样的样本组成。
先给出负采样的核心公式,即目标函数:
Jneg−sample(θ)=logσ(uoTvc)+∑k=1KEk∼P(w)[logσ(−ukTvc)](5)J_{neg-sample}(\theta) = log\sigma(u_o^Tv_c) + \sum^K_{k=1}\mathbb{E}_{k\sim P(w)}[log\sigma(-u_k^Tv_c)]\tag{5} Jneg−sample(θ)=logσ(uoTvc)+k=1∑KEk∼P(w)[logσ(−ukTvc)](5)
- vcv_cvc是中心词向量;uou_ouo是窗口内上下文词向量;uku_kuk是负采样上下文词向量。
- 我们的目标是最大化式(5),即正样本的uoTvcu_o^Tv_cuoTvc概率越大越好;负样本ukTvcu_k^Tv_cukTvc越小越好。这也是二分类的核心思想:增大正样本概率,减小负样本概率。
- 对于每个词,一次要输出K+1K+1K+1个概率,一般也不大(3~10),所以会比Hierarchical Softmax需要计算大约log2Vlog_2Vlog2V个概率或者原模型需要的VVV个概率要高效很多。
- 我们之所以取期望E\mathbb{E}E以及采取多个负样本,就是因为负样本是采样得来的,需要多采样几份求平均。
- NS里面还是需要完整的WWW和W∗W^*W∗,故总的参数比HS要多,但是每次的计算量不多。
2.2 CBOW中的NS
大多数和skip-gram中的NS类似,除了正负样本的定义以及目标函数。
正样本由中心词及其窗口内上下文词的平均组成;负样本窗口内上下文词的平均和随机采样的词组成。
其目标函数为:
Jneg−sample(θ)=logσ(uoTvc)+∑k=1KEk∼P(w)[logσ(−uoTvk)](6)J_{neg-sample}(\theta) = log\sigma(u_o^Tv_c) + \sum^K_{k=1}\mathbb{E}_{k\sim P(w)}[log\sigma(-u_o^Tv_k)]\tag{6} Jneg−sample(θ)=logσ(uoTvc)+k=1∑KEk∼P(w)[logσ(−uoTvk)](6)
Note:
- uou_ouo是窗口内上下文词向量;vcv_cvc是正确的中心词向量;vkv_kvk是错误的中心词向量。
如何采样呢?
- 采样的核心思想就是减小频率大的词的采样概率,增加概率小的词的采样概率。之所以这么做,是因为概率小的词往往比较重要,反之概率大的词不太重要,如“the、a、to、的”。
3 Subsampling of Frequent Words
自然语言共识:在语料库中出现频率高的词往往不太重要,所含信息较少,如“a、and、the”;在语料中出现频率低的词往往比较重要,所含信息比较多。
重采样的原因:
- 更多地训练重要的词对,比如训练“Chinese”和“HangZhou”的关系,少训练“Chinese”和“the”之间的关系。
- 高频词很快就训练好了,而低频词需要训练更多的轮次。
重采样方式:
P(wi)=max(0,1−tf(wi)).P(w_i) = max(0, 1-\sqrt{\frac{t}{f(w_i)}}).P(wi)=max(0,1−f(wi)t).
- 其中f(wi)f(w_i)f(wi)为词wiw_iwi在数据集中出现的概率。文中选取t=10−5t=10^{-5}t=10−5,训练集中的词wiw_iwi会以P(wi)P(w_i)P(wi)的概率删除。
- 词频越大,f(wi)f(w_i)f(wi)越大,P(wi)P(w_i)P(wi)越大,那么词wiw_iwi就有更大的概率被删除。
- 实验表明,重采样可以加加速训练,得到更好的词向量。
4 实战演练
实战部分基于Negative Sampling的Skip-gram模型。
Pytorch库
4.1 PTB数据集
语料库:PTB数据集
PTB数据集主要是三个.txt文件:ptb_test.txt、ptb_train.txt、ptb_valid.txt。其中ptb_train.txt文件部分截图如上所示,其每一行都是一句话,便于直接读取。其中句尾符为,生僻词为,数字则用N表示。
训练部分我们将读取ptb_train.txt文件,其中共有887521个单词。
4.2 模型训练
数据预处理:
由于窗口的大小是随机选取的,因此不同中心词对应的上下文词的长度是不一样的,但是负采样值的长度和上下文词是一样的,这样就导致了训练过程中数据不对齐,我们可以采用补0的形式,然后用掩码去解决0带来的影响,让补0部分不参与训练。
其中前向推断如下:
中心词:(batch,1)
上下文词+负采样值:(batch,S)
Embding层:(词表大小N,D)——调用nn.Embding类
中心词向量:(batch,1, D)
周围词向量矩阵:(batch, S,D)
Label和来自中心词向量和周围词向量的乘积做二分类交叉熵Loss。
Note:
- 在batch个中心词向量中,每一个中心词对应一个长度为S的,由周围词和负采样值以及掩码组成,因此这就相当于一个中心词对应窗口内的周围词都做了运算。
- 这里和之前写的那篇Word2Vec笔记中不一样的一点是,并没有从索引到one-hot,再用矩阵乘法输出中心词向量,而是直接将索引通过Embding层挑选出指定索引对应的中心词向量。
- 最后我们所想要的就是上图绿色Embding层的weight参数。
5 Conclusion
从模型复杂度理论对比以及实验来看:
- CBOW和skip-gram都比NNLM或者RNNLM要快。
- CBOW要比skip-gram计算要快一些。
- 当KKK不超过14时候,负采样要比层次softmax要高效。
论文笔记之Distributed Representations of Words and Phrases and their Compositionality相关推荐
- 论文翻译解读:Distributed Representations of Words and Phrases and their Compositionality【Word2Vec优化】
文章目录 Distributed Representations of Words and Phrases and their Compositionality 简要信息 重点内容概括 摘要 1 介绍 ...
- Word2Vec 与《Distributed Representations of Words and Phrases and their Compositionality》学习笔记
什么是Word2Vec 目录 词嵌入 ( w o r d (word (word e m b e d d i n g ) embedding) embedding) 词嵌入的特点 嵌入矩阵 S k i ...
- NLP论文解读《Distributed Representations of Words and Phrasesand their Compositionality》
目录 词和短语的分布式表示以及他们的表示 1.介绍 2 Skip - gram模型 2.1 分层的Softmax(Hierarchical Softmax) 2.2 负样本(Negative Sam ...
- (2013 Distribute Representations of Words and Phrases and their Compositionality)词和短语的分布式表示和组成
Distribute Representations of Words and Phrases and their Compositionality 摘要 介绍 模型介绍 The Skip-gram( ...
- 对象上下文语义分割:OCR论文笔记(Object-Contextual Representations for Semantic Segmentation )
对象上下文语义分割:OCR 原文:Object-Contextual Representations for Semantic Segmentation 论文链接: https://arxiv.org ...
- 综述:基于图学习的推荐系统;论文笔记
文章目录 摘要 1. 介绍 1.1 图如何表达推荐任务? 1.2 图学习对推荐系统有效吗? 1.3 基于图学习的推荐系统符号化(Formalization) 2. 数据特征和挑战 2.1 一般交互数据 ...
- Question Retrieval with Distributed Representations and Participant Reputation in Community QA论文笔记
原文下载地址 摘要 社区问题的难点在于:重复性问题 解决上述问题要采用Query retrieval(QR),QR的难点在于:同义词汇 本文算法:1)采用continuous bag-of-words ...
- NLP论文 -《Distributed Representations of Sentences and Documents》-句子和文档的分布式表示学习(二)
Distributed Representations of Sentences and Documents(句子和文档的分布式表示学习) 作者:Quoc Le and Tomas Mikolov 单 ...
- NLP论文 -《Distributed Representations of Sentences and Documents》-句子和文档的分布式表示学习
Distributed Representations of Sentences and Documents(句子和文档的分布式表示学习) 作者:Quoc Le and Tomas Mikolov 单 ...
最新文章
- 生产路由跳转报错找不到js路径问题
- 证券业震荡,数字化智能化变革、升级与突破或是新生力量(附案例)
- 蓝牙小电池图标_提高MacBook电池寿命的15个技巧
- 赢在 CSDN:我在 CSDN 的成长,“长风破浪会有时”,如何保证自己有持续写作的动力?
- MyEclipse断点调试不可用解决办法
- CSS3 响应式布局之响应式图片
- 允许活动内容在我的计算机上,然后就看到选项允许活动内容在我的计算机上的文件中运行...
- [技巧心得] 嵌套选择器优先级
- NVIDIA TX2 安裝pytorch1.8
- 定点 浮点 神经网络 量化_定点量化
- 数据挖掘-朴素贝叶斯算法的R实现
- 关于PEP8报too long问题的解决方式
- mysql入库出库触发器_oracle 触发器 实现出入库
- python 常用转义字符对照表 键盘各键对应的ASCII码值
- 已声明“XXX”,但从未读取其值,vscode 如何关闭ts报错
- The method xxx of type xxx must override a superclass method
- 苹果开放降级_iOS 彻底不能降级了,凉凉~
- android自动测试2:使用android studio实现设备循环自动重启
- 微机原理和计算机硬件基础知识,微机原理与接口技术
- 搭建机器人电控系统——通信协议——串口通信USART/UART、RS232、RS485及其实例
热门文章
- PriviledgedActionException as:Administrator cause:java.io.IOException
- 盛业首席战略官原野:产业数字化时代,连接比拥有更重要
- Android仿打字机打字效果
- 如何在龙芯3B4000上部署基于.Net Core 开发的物联网平台IoTSharp
- 龙芯1B:串口通信例程
- map与area--在实际项目中的运用
- 职场路上,你如何抉择
- 9000万美元的天价酬劳!马斯克起诉撮合推特收购的律所“趁火打劫”
- python用tkinter听音乐(25行)V.1.0
- 畅游云南、迷恋丽江、爱在泸沽湖