参考博客:
word2vec原理推导与代码分析
CS224n笔记3 高级词向量表示
关于word2vec的回顾
- skipgram:利用中心词预测上下文
- example: I like deep learning and nlp.
- 存在
两个词典
,一个为中心词词典V,一个为上下文词词典U,两个词典包含的词相同 - 1.移动滑动窗口,选择中心词deep
I likedeep
learning and nlp
P(I|deep)=exp(uTIvdeep)求和,对于词典中所以词,此处固定 P ( I | d e e p ) = e x p ( u I T v d e e p ) 求 和 , 对 于 词 典 中 所 以 词 , 此 处 固 定
P(like|deep)=exp(uTlikevdeep)求和,对于词典中所以词,此处固定 P ( l i k e | d e e p ) = e x p ( u l i k e T v d e e p ) 求 和 , 对 于 词 典 中 所 以 词 , 此 处 固 定 - 2.移动滑动窗口,中心词learning
I like deeplearning
and nlp
- 存在
SGD与词向量
- 问题一:梯度更新的稀疏性
在梯度下降进行优化时会有很多参数
而且很稀疏
(假设有20000个词,每个词100维,则有20000*100个参数需要去优化,但是每次移动窗口,如上面的例子,只需要更新5个向量,所以梯度很稀疏)在更新向量矩阵时,会发现很稀疏
,而且大量的梯度更新很快会导致内存的耗尽
。所以相比稀疏矩阵的运算,更需要更新特定的列
就可以了,如对于第二个窗口,只需更新like,deep,and,nlp。或者或者为每个词语建立到词向量的哈希映射
- 问题二:分母的计算量大,negative sampling
- 这里还存在一个问题,在求每一个P时,均需要计算一遍所有的词对于中心词的概率的求和,即下式的分母部分:
P(I|deep)=exp(uTIvdeep)求和,对于词典中所以词,此处固定 P ( I | d e e p ) = e x p ( u I T v d e e p ) 求 和 , 对 于 词 典 中 所 以 词 , 此 处 固 定
计算量很大,但是事实很多次根本不会出现在中心词附近,如斑马和深度学习。所有这里使用了一个trick,仅随机化取出五个十个或者其他数目的随机词
,这些从语料库其余部分取出的随机词是不同时出现的,然后最小化他们的概率。 - 故目标函数变为(最大化):
这里t是某个窗口,k是采样个数,P(w)是一个unigram分布
。此处的采样是基于词出现频率的采样,具体实现时,对词频取了0.75次幂
:
- 这里还存在一个问题,在求每一个P时,均需要计算一遍所有的词对于中心词的概率的求和,即下式的分母部分:
word2vec总结
- 1.使用窗口滑动
- 2.预测每个词周围的词
- 3.我们通过这种途径去捕捉词的共现性,即一个词与其他词共同出现的频率
其他方法
word2vec将窗口视作训练单位,每个窗口或者几个窗口都要进行一次参数更新。要知道,很多词串出现的频次是很高的。能不能遍历一遍语料,迅速得到结果呢?
早在word2vec之前,就已经出现了很多得到词向量的方法,这些方法是基于统计共现矩阵的方法。如果在窗口级别上统计词性和语义共现,可以得到相似的词。如果在文档级别上统计,则会得到相似的文档(潜在语义分析LSA)。不考虑语法等信息,只考虑词的共现性。
基于窗口的共生矩阵
- example: 比如窗口半径为1,在如下句子上统计共现矩阵,计算每个词窗口范围内其他词出现的频率:
- I like deep learning.
- I like NLP.
- I enjoy flying.
- 但其有很多局限性:
- 1.有新词,则向量改变
- 2.维度非常高,而且很稀疏,非常不健壮
- 为了解决上述问题,Solution:只存储最重要的信息,在一定固定长度内。一般在25-1000维之间。
- 怎样进行降维?
- SVD分解
- 怎样进行降维?
- 改进:
- 1.现在高频词的次数,如限制最多为100, 或者去掉停用词(只使用词的长尾效应)
- 2.进行权重,离中心词越近权重越高
- 存在的问题:
- SVD:
- 其在处理大型矩阵时效果并没有很好
- 不方便处理新词或新文档
- SVD:
Count based vs direct prediction
这些基于计数的方法在中小规模语料(如PCA)训练很快,有效地利用了统计信息,我们只需要统计一次语料信息。但用途受限于捕捉词语相似度,也无法拓展到大规模语料。计数很大的词并没有那么高的重要度,我们使用了很多方法去进行降维。
而NNLM, HLBL, RNN, Skip-gram/CBOW这类进行预测的模型会缩放语料库的尺寸,必须遍历所有的窗口训练,也无法有效利用单词的全局统计信息。但它们显著地提高了上级NLP任务,其捕捉的不仅限于词语相似度。
组合上述两者,GloVe
可参考:GloVe模型
目标函数:
其中:
- θ θ 为所有参数
- W:遍历每个可能共现的词对,每次优化一个计数
- u包含了所以的词的向量,u,v为列中的向量和行中的向量,他们本质上是可交换的
- Pij P i j 为词 j 出现在词 i 的context里面的概率
- 我们希望最小化
内积
和词对出现次数的对数的距离
,f 可以减少频繁共现的事件
- f是一个max函数,使得高频出现的词被平滑
- 这里面有两个向量u和v,它们都捕捉了共现信息,怎么处理呢?试验证明,最佳方案是简单地加起来:
Xfinal=U+V X f i n a l = U + V
也可以拼接,但是效果没有那么好 - 相对于word2vec只关注窗口内的共现,GloVe这个命名也说明这是全局的
评价模型:
有两种方法:Intrinsic(内部) vs extrinsic(外部)
1.内部评价:
专门设计单独的试验,由人工标注词语或句子相似度,与模型结果对比。好处是是计算速度快,但不知道对实际应用有无帮助。
Intrinsic word vector evaluation
也就是词向量类推
,或说“A对于B来讲就相当于C对于哪个词?”。这可以通过余弦夹角得到:
- 实验证明,GloVe确实在捕捉语义关系上效果很好,也可以看到向量维数不是越大越好,但是训练语料越大,表示会有提升。
- 视频中还谈了谈一些适合word vector的任务,比如单词分类。有些
不太适合
的任务,比如情感分析
。课件中则多了一张谈消歧的,中心思想是通过对上下文的聚类分门别类地重新训练。