Skip-gram CBOW 的一些理解
Skip-gram & CBOW 的一些理解
文章目录
- Skip-gram & CBOW 的一些理解
- 〇、前言
- 一、背景
- 二、基础结构
- 2.1 One-hot投影成隐向量
- 2.2 利用一个词预测一个词
- 2.3 损失函数的计算
- 三、CBOW
- 四、Skip-gram
- 五、一些训练时用到的tricks
- 5.1 HierarchicalSoftmaxHierarchical\ SoftmaxHierarchical Softmax
- 5.2 NegativeSamplingNegative\ SamplingNegative Sampling
- 六、文中的一些细节
- 6.1 对学习到的结构和语义上联系的实验
- 6.2 对短语的学习
- 6.3 学习到的向量的联系
- 6.4 一些结果的讨论
- 6.4.1 HierarchicalSoftmaxHierarchical\ SoftmaxHierarchical Softmax和NegativeSamplingNegative\ SamplingNegative Sampling的对比
- 6.4.2 CBOW和Skip-gram的对比
- 七、一些我的想法
- 7.1 关于多义词
- 7.2 关于社会计算
- 八、引用
〇、前言
如果要列举近些年来的机器学习的突破进展,Skip-gram的提出一定在近20年里能排到前20。在近两年的文章中,依然可以看到它的各种变种在各种领域的应用。因此就想去深入的了解一下这个算法,根据[4]的推荐,我读了三篇文章,它们分别是:
1.EfficientEstimationofWordRepresentationsinVectorSpace,ICLR20131.\ Efficient\ Estimation\ of\ Word\ Representations\ in\ Vector\ Space\ , ICLR \ 20131. Efficient Estimation of Word Representations in Vector Space ,ICLR 2013[1], 这一篇是提出Skip-gram的文章。
2.DistributedRepresentationsofWordsandPhrasesandtheirCompositionality,NIPS20132.\ Distributed\ Representations\ of\ Words\ and\ Phrases\ and\ their\ Compositionality,\ NIPS\ 20132. Distributed Representations of Words and Phrases and their Compositionality, NIPS 2013[2], 这一篇是Skip-gram作者为了解释原文中没有详细解释的一些tricks。
3.word2vecParameterLearningExplained,DBLP20163.\ word2vec\ Parameter\ Learning\ Explained\ ,DBLP\ 20163. word2vec Parameter Learning Explained ,DBLP 2016[3], 这篇文章是另外一个人较为详细的解释了Skip-gram和CBOW中的一些细节,对于理解Skip-gram 和 CBOW我觉得非常有用。
后面的段落会简单写一些我对这三篇文章的理解,而非简单的翻译。
本文在完成前仅参考了[4]进行相关文章的调研,没有读其他的中文博客,对同一个单词,可能会有一些表达上的差异,敬请谅解。
一、背景
我感觉自然语言处理领域,非常重要的一个内容就是学习到基础单元的表征,而且这种表征往往需要融合进上下文的信息。比如在做文本翻译时,学习到一个单词或者短语的表征对于文本翻译非常重要,而往往要通过一个词在一段话中的位置来进行学习;在做商品推荐时,学习到一个商品或者一筐商品的表征也非常重要,而往往需要通过一个购买者的多次购买行为进行学习;甚至在图上,由于Random Walk出的序列在一定意义上也具有语义上的信息,可以拿Random Walk出的结果进行学习,得到每个点的表征。
但是传统的机器学习做法主要有以下的问题:
- 计算开销过大,训练一次花费时间和资源过多,导致训练难度极大
- 很难同时学到 语言的结构 syntactic和 语义semantic上的关系。如[1]中提到RNN能很好的学习到结构上的关系,但是较难学习到语义上的关系。
因此呢,在我看来,为了解决这两个问题,作者提出了CBOW和Skip-gram两个模型。
二、基础结构
简单来说CBOW是以多预测一,Skip-gram是以一预测多,为了便于理解,结合了[3]文章的一些思路,我觉得可以通过先构建一个简化的CBOW和与Skip-gram即一个一预测一的模型,从而理解CBOW和Skip-gram的原始思路。
图一一个简单的一预测一模型图一\ 一个简单的一预测一模型 图一 一个简单的一预测一模型
其实可以把这个一预测一模型再拆成了两个,一个是将one hot编码投影成一个隐向量,另外一个是通过隐向量来进行预测,我也会分为两个部分进行解释。
2.1 One-hot投影成隐向量
图二one−hot编码投影成隐向量图二\ one-hot编码投影成隐向量 图二 one−hot编码投影成隐向量
首先,对每个词肯定只能将它进行one-hot编码,即如果总共有VVV个词,则将每个词编码成一个长度为VVV的向量,其中第iii个位为1,其他位为0。
既然这样,为了学到每个单词的表征,可以将它通过一个全连接层,即乘上一个V×NV \times NV×N的矩阵,这样本来每一个单词是1×V1\times V1×V的one-hot编码,现在变成了了一个1×N1\times N1×N的向量。
这样看起来对于每一个词得到它的向量复杂度O(VN)O(VN)O(VN)的,其实假设要第kkk个向量的表征,由于它只有第kkk位为1,它乘一个V×NV \times NV×N 的矩阵,这样得到的结果其实刚好是这个矩阵的第kkk行,因此可以O(N)O(N)O(N)得到它的表征,记作vkv_kvk。
指的一提的是NNN一般可选50到600。
2.2 利用一个词预测一个词
图三利用一个词来预测另外一个词图三\ 利用一个词来预测另外一个词 图三 利用一个词来预测另外一个词
由于这里的任务是通过一个词预测一个词(虽然看起来比较没有道理),我们首先需要要得到已知这个词的表征,通过2.1的结构,可以得到这个词的表征vkv_kvk,也记作h\textbf hh它是一个1×N1\times N1×N的向量 。
得到这个词的表征之后,可以将它通过一个全连接层,即乘上一个N×VN\times VN×V的矩阵W′W'W′,可以得到一个1×V1\times V1×V 的向量 u\textbf uu,我们将它第iii维的意义定义为预测结果是第iii个词的置信,即设W′W'W′的第iii列为vi′\textbf v'_ivi′,则有vi′h=ui\textbf v'_i\textbf h = u_ivi′h=ui,接着用一个softmaxsoftmaxsoftmax进行归一化即可得到第k个词预测出每个词的概率,即
P(第j个词∣第k个词)=yj=exp(uj)∑j′=1Vexp(uj′)P(第j个词|第k个词) = y_j = \frac{\exp(u_j)}{\sum_{j'=1}^V\exp(u_{j'})} P(第j个词∣第k个词)=yj=∑j′=1Vexp(uj′)exp(uj)
2.3 损失函数的计算
由于我们的目标显然是要最大化P(第k个词应该预测出的词∣第k个词)P(第k个词应该预测出的词|第k个词)P(第k个词应该预测出的词∣第k个词),由于log\loglog函数是单调的,即可最大化log(P(第k个词应该预测出的词∣第k个词))\log(P(第k个词应该预测出的词|第k个词))log(P(第k个词应该预测出的词∣第k个词)),假设第kkk个词应该预测出的词是第ooo个词,即有
log(P(第o个词∣第k个词))=log(exp(uo)∑j′=1Vexp(uj′))=uo−log∑j′=1Vexp(uj′)=−E\log(P(第o个词|第k个词)) = \log(\frac{\exp(u_o)}{\sum_{j'=1}^V\exp(u_{j'})})=\\ u_o - \log\sum_{j'=1}^V\exp(u_{j'}) = -E log(P(第o个词∣第k个词))=log(∑j′=1Vexp(uj′)exp(uo))=uo−logj′=1∑Vexp(uj′)=−E
即目标是最小化E=−uo+log∑j′=1Vexp(uj′)E= -u_o + \log\sum_{j'=1}^V\exp(u_{j'})E=−uo+log∑j′=1Vexp(uj′)
由于过程中所有式子都是可导的,因此显然是可以反向传播的,就可以train起来了。
三、CBOW
图四CBOW的结构图四\ CBOW的结构 图四 CBOW的结构
CBOW如上图所示,是通过综合第ttt个时间的上下文信息,来预测第ttt个时间的单词的一种模型,目前依照我的理解,应该没必要有下文,只要是多预测一即可,但是原文写得确实是进行对称的时间区间的预测,因此我觉得这样结果可能会好一些。
对于本文第二部分的基础结构来说,
- CBOW对2.1这一部分没有变化;
- CBOW对2.2这一部分改为了利用多个词来预测一个词,思路也很简单,假设用CCC个词分别为j1,j2,⋯,jCj_1,j_2,\cdots ,j_Cj1,j2,⋯,jC进行预测,先分别和2.2类似,求得他们的表征vj1,vj2,⋯,vjCv_{j_1},v_{j_2},\cdots ,v_{j_C}vj1,vj2,⋯,vjC则求一个向量h=∑i=1CvjiC\textbf{h} = \frac{\sum_{i=1}^Cv_{j_i}}{C}h=C∑i=1Cvji,接着输入到和2.2相同的输出的全连接层中得到预测结果即可;
- CBOW对2.3的这一部分损失函数不变,但是由于变成了多预测一,往回反向传播的式子有一些变化,但不是重点,在此就不赘述了。
四、Skip-gram
图五Skip−gram的结构图五\ Skip-gram的结构 图五 Skip−gram的结构
Skip-gram如上图所示,是通过综合第ttt个时间信息,来预测第ttt个时间的上下文的一种模型,目前依照我的理解,应该没必要有下文,只要是一预测多即可,但是原文写得确实是进行对称的时间区间的预测,因此我觉得这样结果可能会好一些。
这个其实看起来比较没有道理,知道一个词怎么就能知道它的上下文了呢,在此我讲一下我的理解。因为其实一个简单的全连接层不是特别能进行预测工作,我们用Skip-gram主要要做的其实是学习一个词的表征,核心任务不在于预测,这里这个预测只是将上下文的信息嵌入到这个词的表征中,仅此而已。
那对于本文第二部分的基础结构来说,
Skip-gram对2.1这一部分没有变化;
Skip-gram对2.2这一部分改为了利用一个词来预测多个词j1,j2,⋯jnj_1,j_2,\cdots\,j_nj1,j2,⋯jn,思路也很简单,先和2.2相同,求得这个词的表征vkv_{k}vk,接着输入到和2.2相同的输出的全连接层中得到了预测结果uku_kuk。要注意的是即使要预测的是CCC个词,但是仍然只使用一个全连接层,而非使用CCC个,用得到的一个结果uku_kuk去算损失函数。
Skip-gram对2.3的这一部分损失函数即改变为了
E=−log(第j1个词,第j2个词,⋯,第jC个词∣第k个词)=−log(∏i=1Cexp(uji)∑j′=1Vexp(uj′))=−∑j=1Cuji+C∗log∑j′=1Vexp(uj′)E = -\log(第j_1个词,第j_2个词,\cdots,第j_C个词 | 第k个词) = \\ -\log(\prod_{i=1}^C\frac{\exp(u_{j_i})}{\sum_{j'=1}^V\exp(u_{j'})})=\\ -\sum _{j=1}^Cu_{j_i} + C*\log\sum_{j'=1}^V\exp(u_{j'}) E=−log(第j1个词,第j2个词,⋯,第jC个词∣第k个词)=−log(i=1∏C∑j′=1Vexp(uj′)exp(uji))=−j=1∑Cuji+C∗logj′=1∑Vexp(uj′)
五、一些训练时用到的tricks
注意到每次损失函数的计算复杂度都是O(V)O(V)O(V)的,当语料库较大时,复杂度显然是不可接受的,因为跑一个句子里的一个词就要O(V)O(V)O(V),VVV有可能是十万级,百万级的。作者为了解决这个问题,提出了两个办法,一个称为HierarchicalSoftmaxHierarchical\ SoftmaxHierarchical Softmax,另一个则是NegativeSampling(负采样)Negative\ Sampling(负采样)Negative Sampling(负采样)。
5.1 HierarchicalSoftmaxHierarchical\ SoftmaxHierarchical Softmax
图六hierarchicalsoftmax图六\ hierarchical\ softmax 图六 hierarchical softmax
由于无论是多预测一,还是一预测多,求得输入词的表征复杂度都较低,而计算输出为每个词的置信度复杂度为$O(V) ,复杂度较大,而在训练时其实只关心输出为应该输出的词,即,复杂度较大,而在训练时其实只关心输出为应该输出的词,即,复杂度较大,而在训练时其实只关心输出为应该输出的词,即词o$的置信度,因此可以设计一种结构较快的求出 词o词o词o的置信度。
作者设计了一种基于huffmanhuffmanhuffman树的做法,为什么用huffmanhuffmanhuffman树其实也是为了降低复杂度,这样频繁被询问的词所需要查找到的次数较小,但是复杂度上限就是log(V)\log(V)log(V),因此我觉得随便搞个二叉树也行,本身只是为了降低复杂度。
具体做法为
首先将VVV个词作为了huffmanhuffmanhuffman树的叶子节点,根据huffmanhuffmanhuffman编码的方式进行合并。
其次定义了一个函数n(i,j)n(i,j)n(i,j),表示从根节点到第iii个词,走出jjj步到达的节点,如图六所示,定义L(i)L(i)L(i)表示根节点到第iii个节点所需要走的步,即n(i,L(i))n(i,L(i))n(i,L(i))就是第iii个词,定义ch(i)ch(i)ch(i)表示第iii个节点的左儿子,定义[[p]][\![p]\!][[p]]表示p为真的话,返回1,否则返回-1。
接着给除了叶子节点以外的n−1n-1n−1个节点各赋予了一个表征vti′\textbf v'_{t_i}vti′
最后有
p(第o个词∣已知的词)=∏j=1L(o)σ([[n(o,j+1)=ch(n(o,j))]]⋅vn(o,j)′h)p(第o个词|已知的词) = \prod_{j=1}^{L(o)}\sigma([\![n(o,j+1)=ch(n(o,j))]\!]\cdot \textbf v'_{n(o,j)}\textbf h) p(第o个词∣已知的词)=j=1∏L(o)σ([[n(o,j+1)=ch(n(o,j))]]⋅vn(o,j)′h)
其中h\textbf hh为已知词的表征。这个式子大致的意思即为,从根往下找第ooo个词,如果要走左儿子,则乘σ(vn(o,j)′h)\sigma(\textbf v'_{n(o,j)}\textbf h)σ(vn(o,j)′h),否则乘σ(−vn(o,j)′h)\sigma(-\textbf v'_{n(o,j)}\textbf h)σ(−vn(o,j)′h),有容斥的思想在其中。损失函数的计算也是基于此的,就不赘述了。
5.2 NegativeSamplingNegative\ SamplingNegative Sampling
相对来说NegativeSamplingNegative\ SamplingNegative Sampling(负采样)是一种更直观的方法,由于正样本往往只有很少的几个,负样本非常多,那就采样一些进行算,最后的损失函数为
log(σ(uo))+∑采样出的wjlog(σ(−uwj))\log(\sigma(u_o))+\sum_{采样出的w_j}\log(\sigma(-u_{w_j})) log(σ(uo))+采样出的wj∑log(σ(−uwj))
如何采一个好的样比较讲究,考虑到出现频率较高的单词往往没什么特别大意义,如a,and,thea,and,thea,and,the这些,作者构造了一个分布p(第i个词被采样)=1−tcnt(第i个词))p(第i个词被采样) = 1-\sqrt{\frac{t}{cnt(第i个词)}})p(第i个词被采样)=1−cnt(第i个词)t),ttt是手动选的一个置信度,通常为10−510^{-5}10−5,有趣的是p34p^{\frac 3 4}p43才是最后作者用的分别,他认为34\frac 3 443 次方会比较好。
六、文中的一些细节
6.1 对学习到的结构和语义上联系的实验
作者做了一个有趣的实验,来证明它真的学习到了结构和语义上的联系。我觉得这个实验对于理解学习到的结果非常有意义,即通过向量的加减来证明学习到的联系。
举个例子,设V(i)V(i)V(i)表示词iii学习到的向量,那么根据我们的理解V(China)−V(Beijing)+V(Tokyo)=?V(China)-V(Beijing)+V(Tokyo)=?V(China)−V(Beijing)+V(Tokyo)=?,显然答案应该是V(Japan)V(Japan)V(Japan)。作者通过找距离问号向量最近的向量,来看看是不是V(Japan)V(Japan)V(Japan)来验证,发现居然真的是,来证明了它学习到的结果比较优秀。他选取了五组语义上的(如城市关系)以及九组结构上的(如动词和名词),来加以验证,结果如下图。
图七对语义和结构上的学习图七\ 对语义和结构上的学习 图七 对语义和结构上的学习
6.2 对短语的学习
其实我觉得更高级的任务是去学习短语,因为真实的行为和短语的关系甚至可能更大,比如购买商品都是以框为单位,而非以单个商品为单位,在这里呢,作者用了一个较为简单的方法来学习短语,即把短语当成一个词,进行学习。因为短语组合可能比较固定,所以语料库很容易覆盖所有的短语。那么如何判断短语呢,作者用了一种估价函数score(i,j)=cnt(i,j)−δcnt(i)∗cnt(j)score(i,j)=\frac{cnt(i,j)-\delta}{cnt(i)*cnt(j)}score(i,j)=cnt(i)∗cnt(j)cnt(i,j)−δ,即两个一起出现的次数除以两个各自出现的次数,如果超过一定比例,则认为是短语。这样迭代得构造即可。
6.3 学习到的向量的联系
图八学到短语的联系图八\ 学到短语的联系 图八 学到短语的联系
有趣的加了学习短语之后,去找离它最近的单词和短语,使用Skip-gram,可以得到如图八的结果。这样看来用huffman树huffman树huffman树进行优化结果很好。第一个人是达伽马,航海家;第二个是贝加尔湖,和咸海比较类似;第三个是一个登月的人;第四个是一个海;第五个是象棋大师,对应卡斯帕罗夫也不错。
6.4 一些结果的讨论
6.4.1 HierarchicalSoftmaxHierarchical\ SoftmaxHierarchical Softmax和NegativeSamplingNegative\ SamplingNegative Sampling的对比
图九HierarchicalSoftmax和NegativeSampling的对比图九\ Hierarchical\ Softmax和Negative\ Sampling的对比 图九 Hierarchical Softmax和Negative Sampling的对比
其实总得来说在实验数据上显示的是负采样更好一些
6.4.2 CBOW和Skip-gram的对比
图十CBOW和Skip−gram的对比图十\ CBOW和Skip-gram的对比 图十 CBOW和Skip−gram的对比
在结构上的学习,Skip-gram相对比CBOW差了一些,但是在语义上的结果,Skip-gram有极大的提升。
七、一些我的想法
7.1 关于多义词
我感觉在自然语言处理上,应该会很经常的有多义词的出现。比如就人话里就会有很多多义词,比如苹果可能是一个品牌,也有可能是一个水果;再比如对于一个站点,它在某一层次来说,可能是一个交通枢纽,在某一层次也有可能只是一个普通站点;对于这个的学习,我觉得应该会有很多文章,可惜我还没读到,不过我猜可能可以用attentionattentionattention的做法去学习到,所以我打算下一篇先去读attentionisallyourneedattention\ is\ all\ your\ needattention is all your need。
7.2 关于社会计算
这部分仅在提交给社会计算大作业的版本中有。
由于大一下和大二做了一些关于图上的工作,主要是异质图的表示学习,又了解到社会计算和图的关系非常紧密,就选了社会计算课,希望再了解一些图上的知识,也确实收获了很多。
本课学到的诸如传播模型等,我觉得可以很好的利用在异质图的采样上,采样之后得到一个序列,这里就需要RNN或者本文提到的一些模型进行处理去得到图的表征。
总而言之,相信未来各自算法都是基于图的,图才更能模拟出现实的结构,因此我觉得学社会计算这个课非常有必要,也得到了很多比较前沿的知识,感觉体验非常好。
八、引用
[1] Mikolov T , Chen K , Corrado G , et al. Efficient Estimation of Word Representations in Vector Space[J]. Computer Science, 2013.
[2] Mikolov T , Sutskever I , Kai C , et al. Distributed Representations of Words and Phrases and their Compositionality[J]. Advances in neural information processing systems, 2013, 26.
[3] Rong X . word2vec Parameter Learning Explained[J]. Computer Science, 2014.
[4] https://zhuanlan.zhihu.com/p/39751353
Skip-gram CBOW 的一些理解相关推荐
- 《自然语言处理学习之路》02 词向量模型Word2Vec,CBOW,Skip Gram
本文主要是学习参考莫烦老师的教学,对老师课程的学习,记忆笔记. 原文链接 文章目录 书山有路勤为径,学海无涯苦作舟. 零.吃水不忘挖井人 一.计算机如何实现对于词语的理解 1.1 万物数字化 1.2 ...
- Rasa课程、Rasa培训、Rasa面试、Rasa实战系列之Understanding Word Embeddings CBOW and Skip Gram
Rasa课程.Rasa培训.Rasa面试.Rasa实战系列之Understanding Word Embeddings CBOW and Skip Gram 字嵌入 从第i个字符,第i+1个字符预测第 ...
- skip gram和cbow的优缺点
在cbow方法中,是用周围词预测中心词,从而利用中心词的预测结果情况,使用GradientDesent方法,不断的去调整周围词的向量.当训练完成之后,每个词都会作为中心词,把周围词的词向量进行了调整, ...
- 感知机的对偶形式及Gram矩阵的作用理解
学习李航<统计机器学习>的时候,看到感知机的对偶形式这里不甚理解,其实主要是对其中的系数 更新规则不是很理解.另外,只介绍了 Gram 矩阵,也没有说清楚 Gram 矩阵的作用.经过仔细 ...
- 感知机的对偶形式及Gram矩阵的作用理解 通俗易懂
学习李航<统计机器学习>的时候,看到感知机的对偶形式这里不甚理解,其实主要是对其中的系数 更新规则不是很理解.另外,只介绍了 Gram 矩阵,也没有说清楚 Gram 矩阵的作用.经过仔细 ...
- 基于Huffman树的CBOW模型的理解
上面是从如下地址中截取的内容:https://www.zybuluo.com/Dounm/note/591752#mjx-eqn-eq4 下面说下我对它的理解 还是以"今天 我 和 ...
- pytorch笔记: 搭建Skip—gram
skip-gram 理论部分见:NLP 笔记:Skip-gram_刘文巾的博客-CSDN博客 1 导入库 import numpy as np import torch from torch impo ...
- 小白看Word2Vec的正确打开姿势|全部理解和应用
有个用心的读者最近做了一篇论文,想知道Word2Vec的相关理论和应用方法,作为一个有强迫症的我,去翻查了大量的文献资料,决定从Word2Vec的上下文来温习一下这个NLP的基础以及做相关的知识体系的 ...
- [Embeding-2]文本表示学习-词嵌入入门理解
转载自Scofield Phil: http://www.scofield7419.xyz/2017/09/25/文本表示学习-词嵌入入门理解/ 之前一段时间,在结合深度学习做NLP的时候一直有思考一 ...
最新文章
- 避不开的算法,如何吃透?
- 网络推广外包——网络推广外包公司为每个线下商城实现“线上梦”!
- word List 11
- leetcode516. 最长回文子序列(动态规划)
- 前端npm install失败
- 限制ul显示高度_led显示屏钢结构吊装方案原则及适用条件
- OpenShift 4 - DevSecOps Workshop (9) - 向Dev环境部署应用镜像
- favicon.ico在ie下面不显示的解决方法
- livedata mvvm_Android MVVM LiveData数据绑定
- js手机号批量滚动抽奖代码实现
- darknet框架_【杂谈】面向新手的深度学习开源框架指导手册与GitHub项目,欢迎加入我们的开源团队...
- 初学者C语言输入输出挖坑填补处须知
- #转载汉化 用C++写出来的人工智能围棋游戏
- jszip压缩文件上传到服务器,AngularJS - 使用JSZip压缩上传的pdf文件
- 转载来自朱小厮博客的 一文看懂Kafka消息格式的演变
- 怎样才能走进区块链行业?
- SpringBoot Whitelabel Error Page 错误
- 1905. 统计子岛屿-深度优先遍历图
- 【Python实例】Python五分钟码出—女神颜值打分系统(人脸识别)!
- 「自控原理」5.1 频率特性及其图示