Word2Vec

基本原理

原始模型

CBOW和skip-gram都是模型的原始形式,没有加入任何优化技巧。二选一。
层级softmax和负采样是优化方法。二选一。

Huffman树

word2vec中没有使用传统的DNN模型,而是用Huffman树来代替隐藏层和输出层的神经元。

  • 叶子节点 —— 输出层神经元
  • 叶子节点的个数 —— 词汇表大小
  • 内部节点 —— 隐藏层神经元大小

构造Huffman树:
根据词频来构造Huffman树,以词频作为节点的权重,权重越大的越靠经根节点,从而获得更小的编码长度。

在word2vec中,采用了二元逻辑回归的方法,即规定沿着左子树走就是负类(Huffman编码为1),沿着右子树走就是正类(Huffman编码为0),判别正负的方法是使用sigmoid函数:
请添加图片描述
其中 X w X_w Xw是当前内部节点得词向量, θ θ θ是需要从训练样本中求出的逻辑回归的逻辑参数

使用Huffman树的优点:
得到Huffman树之后可以进行Huffman编码,权重越高的叶子节点越靠近根节点,权重越低的叶子节点远离根节点,Huffman编码的方式会对高权重的编码值较短,对低权重的编码值较长,这样可以保证树的带权路最短,也就是说这样可以让越常用的词的编码更短。

1. CBOW(Continuous Bag-of-Words) 连续词袋模型

CBOW 简单来说,就是通过上下文,来预测中间的词

假设我们上下文大小取 4 ,特定的这个词是“learning”,如下所示:

请添加图片描述

CBOW 使用的是词袋模型,因此输入的八个词都是平等的,也就是不考虑输入词和目标词之间的位置,只要在我们上下文之内即可。

如果后续不加优化的话,对目标位置的预测结果是已知所有词的概率

参考资料:word2vec原理(一) CBOW与Skip-Gram模型基础

2. skip-gram 跳字模型

skip-gram 简单来说就是通过一个词,来预测上下文

输入是一个词,不加优化的话,输出上下文词的概率

skip-gram 和 CBOW 是一种互补的关系,训练的时候二选一即可。

关系如下:
请添加图片描述

缺点:

上面两种方法在用 softmax 计算概率的时候,因为要对每一个词的概率进行预测,假如词库里面一共有几万个词,计算量很大,非常耗时,所以需要进行优化。

对比CBOW和skip-gram

在计算时,CBOW会将contex word加起来,在遇到生僻词时,预测效果将会大大降低。skip-gram则会预测生僻字的使用环境。

  • CBOW可以理解未一个老师教多个学生。一个中心词
  • skip-gram可以理解未一个学生被多个老师教
优化
1. Hierachical softmax(层级 softmax)

传统的神经语言模型一般有三层,输入层(词向量),隐藏层和输出层(softmax),结构如下图所示。里面最大的问题在于隐藏层到输出层的softmax层的计算量很大。

计算量很大的解释:词有很多种,在softmax公式中,分母需要计算所有词概率,导致计算量很大。

请添加图片描述

两个改进
输入层到隐藏层:没有用线性变换加激活函数的方法,而是采用简单的求和取平均的。
隐藏层到输出层:沿着Huffman树型结构进行softmax计算,一层层进行,因此叫层级softmax,能够大大减少计算量。

word2vec对传统的神经语言模型做了改进,首先,对于从输入层到隐藏层的映射,没有采取神经网络的线性变换加激活函数的方法,而是采用简单的对所有输入词向量求和并取平均的方法。比如输入的是三个4维词向量:(1,2,3,4),(9,6,11,8),(5,10,7,12)(1,2,3,4),(9,6,11,8),(5,10,7,12),那么我们word2vec映射后的词向量就是(5,6,7,8)。由于这里是从多个词向量变成了一个词向量。

第二个改进就是从隐藏层到输出的softmax层这里的计算量个改进。为了避免要计算所有词的softmax概率,word2vec采样了霍夫曼树来代替从隐藏层到输出softmax层的映射。

由于我们把之前所有都要计算的从输出softmax层的概率计算变成了一颗二叉霍夫曼树,那么我们的softmax概率计算只需要沿着树形结构进行就可以了。如下图所示,我们可以沿着霍夫曼树从根节点一直走到我们的叶子节点的词 w 2 w_2 w2

请添加图片描述

霍夫曼树的内部节点类似之前神经网络隐藏层的神经元
根节点是输入词向量取平均
叶子节点类似于softmax输出层的神经元
叶子节点的个数就是词汇表的大小

判别正类和负类的方法是使用sigmoid函数,即:
p ( + ) = σ ( x w T θ ) = 1 1 + e − x w T θ p(+)=\sigma (x_{w}^{T}\theta )=\frac{1}{1+{{e}^{-x_{w}^{T}\theta }}} p(+)=σ(xwTθ)=1+exwTθ1

参考链接:word2vec原理(二) 基于Hierarchical Softmax的模型

2. negative sampling(负采样)

什么是负采样?
如果我们的训练样本里的中心词 w 是一个很生僻的词,那么就得在霍夫曼树中辛苦的向下走很久。使得训练特别耗时。

改变优化目标函数-使用“Negative Sampleing”,将会使训练样本更新少量模型的weights值得注意的是,对频繁词进行二次抽样和应用负抽样不仅减少了训练过程的计算负担,而且还提高了其结果词向量的质量。

negative sampling 每次让一个训练样本仅仅更新一小部分的权重参数,从而降低梯度下降过程中的计算量。

如果vocabulary大小未1万时,当输入样本单词X到网络中时,我们期望对应的单词X的神经元节点输出1,其余9999个都应该输出0。负采样的想法很直接,将随机选择一小部分的 negative words,比如选 10个 negative words 来更新对应的权重参数。

在论文中作者指出指出对于小规模数据集,建议选择 5-20 个 negative words,对于大规模数据集选择 2-5个 negative words.

如果使用了 negative sampling 仅仅去更新positive word- “quick” 和选择的其他 10 个negative words 的结点对应的权重,共计 11 个输出神经元,相当于每次只更新 300 x 11 = 3300 个权重参数。对于 3百万 的权重来说,相当于只计算了千分之一的权重,这样计算效率就大幅度提高。

怎么选取负样本?
选取了context之后,如何选取负样本:

  • 通过单词出现的频率进行采样:导致一些类似 a、the、of等词的频率较高
  • 均匀随机地抽取负样本:没有很好的代表性

使用 一元模型分布 (unigram distribution) 来选择 negative words,一个单词被选作 negative sample 的概率跟它出现的频次有关,出现频次越高的单词越容易被选作negative words,论文中采用:
p ( w i ) = f ( w i ) 3 4 ∑ j = 1 n f ( w j ) 3 4 p({{w}_{i}})=\frac{f{{({{w}_{i}})}^{\frac{3}{4}}}}{\sum\limits_{j=1}^{n}{f{{({{w}_{j}})}^{\frac{3}{4}}}}} p(wi)=j=1nf(wj)43f(wi)43

这种方法处于上面两种极端采样方法之间,即不用频率分布,也不用均匀分布,而采用的是对词频的 3 4 \frac{3}{4} 43除以整体词频的 3 4 \frac{3}{4} 43进行采样。其中 f ( w j ) f(w_j) f(wj) 是语料库中观察到的某个词的词频。

参考链接:博客园刘建平Pinard word2vec原理(三) 基于Negative Sampling的模型

面试问题

word2vec的优化,包括层级softmax的复杂度

Hierachical softmax 的复杂度从原来的 x 变为 logx

word2vector负采样时为什么要对频率做3/4次方?

论文作者提到出于经验,效果好

请添加图片描述

可以看到,在0~1区间, x 3 / 4 x^{3/4} x3/4 输出是大于 x。而且对于越小的值,这种增益越大。

从抽样的角度来看,通过对权重开 3/4 次幂,可以提升低频词被抽到的概率。

可以认为:在保证高频词容易被抽到的大方向下,通过权重3/4次幂的方式,适当提升低频词、罕见词被抽到的概率。如果不这么做,低频词,罕见词很难被抽到,以至于不被更新到对应的Embedding。

参考链接:为什么Word2Vec训练中, 需要对负采样权重开3/4次幂?

对于其中的窗口选择策略?窗口选择5,10,15都有什么区别吗?是不是越大越好呢?

滑动拆给你扣只是提供了获取局部语料的途径。窗口越大,计算量越大。窗口越小,上下文语料信息不够,训练效果差。窗口大小默认设置为5。

word2vector 如何做负采样?是在全局采样?还是在batch采样?如何实现多batch采样?

是在全局采样的,采样概率为单词频率的 3/4 次方,是在除正样本之外所有样本中按照一定比例采样得到的负样本。

怎么确保采样不会采到正样本?
word2vec经过Huffman或者负采样之后,模型与原模型相比,是等价的还是相似的?
word2vec和tf-idf在相似度计算时的区别?
  1. word2vec 是稠密的向量,而 tf-idf 则是稀疏的向量;
  2. word2vec 的向量维度一般远比 tf-idf 的向量维度小得多,故而在计算时更快;
  3. word2vec 的向量可以表达语义信息,但是 tf-idf 的向量不可以;
  4. word2vec 可以通过计算余弦相似度来得出两个向量的相似度,但是 tf-idf 不可以;

下面十个问题参考链接:
word2vec问题(不涉及原理细节)

问题1:介绍一下word2vec?

(1) 两个模型是 CBOW 和 Skip-gram,两个加快训练的技巧是 层级softmax(Hierarchical Softmax )和负采样。

(2) 假设一个训练样本是由核心词 w 和其上下文 context(w) 组成,CBOW 就是用 context(w) 去预测 w;而 Skip-gram 则反过来,是用 w 去预测 context(w) 里的所有词。

(3) HS 是试图用词频建立一棵哈夫曼树,那么经常出现的词路径会比较短。树的叶子节点表示词,共词典大小多个,而非叶子结点是模型的参数,比词典个数少一个。要预测的词,转化成预测从根节点到该词所在叶子节点的路径,是多个二分类问题。// 不太明白??

(4 ) 对于负采样,则是把原来的 Softmax 多分类问题,直接转化成一个正例和多个负例的二分类问题。让正例预测 1,负例预测 0,这样子更新局部的参数。

问题2:对比 Skip-gram 和 CBOW

(1) 训练速度上 CBOW 应该会更快一点。

因为每次会更新 context(w) 的词向量,而 Skip-gram 只更新核心词的词向量。

两者的预测时间复杂度分别是 O(V),O(KV)

(2) Skip-gram 对低频词效果比 CBOW好。

因为是尝试用当前词去预测上下文,当前词是低频词还是高频词没有区别。但是 CBOW 相当于是完形填空,会选择最常见或者说概率最大的词来补全,因此不太会选择低频词。(想想老师学生的那个例子)

Skip-gram 在大一点的数据集可以提取更多的信息。总体比 CBOW 要好一些。

问题3:对比 HS 和 负采样

(1)优化目标:
①HS让每个非叶子节点去预测要选择的路径(每个节点是个二分类问题),目标函数是最大化路径上的二分类概率。
p ( w ∣ c o n t e x t ( w ) ) = ∐ j = 2 l ( w ) p ( d j w ∣ x w , θ j − 1 w ) p(w|context(w))=\coprod\limits_{j=2}^{l(w)}{p(d_{j}^{w}|{{x}_{w}},\theta _{j-1}^{w})} p(wcontext(w))=j=2l(w)p(djwxw,θj1w)
p ( d j w ∣ x w , θ j − 1 w ) = [ σ ( x w T θ j − 1 w ) ] 1 − d j w    ⁣ ⁣ ⋅  ⁣ ⁣    ⁣ ⁣ [  ⁣ ⁣  1- σ ( x w T θ j − 1 w )    ⁣ ⁣ ]  ⁣ ⁣   d j w p(d_{j}^{w}|{{x}_{w}},\theta _{j-1}^{w})={{[\sigma (x_{w}^{T}\theta _{j-1}^{w})]}^{1-d_{j}^{w}}}\text{ }\!\!\cdot\!\!\text{ }\!\![\!\!\text{ 1-}\sigma (x_{w}^{T}\theta _{j-1}^{w}){{\text{ }\!\!]\!\!\text{ }}^{d_{j}^{w}}} p(djwxw,θj1w)=[σ(xwTθj1w)]1djw  [ 1-σ(xwTθj1w) ] djw

②负采样是最大化正样例概率同时最小化负样例概率。
g ( w ) = σ ( x w T θ w ) ∏ u ∈ N E G ( w ) [ 1 − σ ( x w T θ u ) ] g(w)=\sigma (x_{w}^{T}{{\theta }^{w}})\prod\limits_{u\in NEG(w)}{[1-\sigma }(x_{w}^{T}{{\theta }^{u}})] g(w)=σ(xwTθw)uNEG(w)[1σ(xwTθu)]

(2)负采样更快一些,特别是词表很大的时候。与HS相比,负采样不再使用霍夫曼树,而是使用随机负采样,能大幅度提高性能。

问题 4:负采样为什么要用词频来做采样概率?

因为这样可以让频率高的词先学习,然后带动其他词的学习。

问题 5:为什么训练完有两套词向量,为什么一般只用前一套?

(1) 对于 Hierarchical Softmax 来说,哈夫曼树中的参数是不能拿来做词向量的,因为没办法和词典里的词对应。

(2) 负采样中的参数其实可以考虑做词向量,因为中间是和前一套词向量做内积,应该也是有意义的。但是考虑负样本采样是根据词频来的,可能有些词会采不到,也就学的不好。

问题 6:对比字向量和词向量

(1) 字向量其实可以解决一些问题,比如未登陆词,还有做一些任务的时候还可以避免分词带来的误差。

(2) 词向量它的语义空间更大,更加丰富,语料足够的情况下,词向量是能够学到更多的语义的。

问题 7:为什么负采样/分层softmax能加快训练

(1) 负采样 1在优化参数的时候,只更新涉及到的向量参数;2 放弃用softmax而是用sigmoid,原来的方法中softmax需要遍历所有单词的概率得分。

(2) 分层softmax:上面的 Softmax 每次和全部的词向量做内积,复杂度是 O(V),V 是词典大小。如果考虑把每个词都放到哈夫曼树的叶节点上,用sigmoid做二分类,那么复杂度就可以降为 O(logV),即树的高度,因为只需要预测从根节点到相应叶节点的路径即可。

问题8:word2vec的缺点

(1) 忽略了词序

问题9:hs为什么用霍夫曼树而不用其他二叉树?

这是因为Huffman树对于高频词会赋予更短的编码,使得高频词离根节点距离更近,从而使得训练速度加快。

问题10:为什么用的是线性激活函数?

word2vec不是为了做语言模型,它不需要预测得更准。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值