本文转自:http://www.hankcs.com/nlp/cs224n-advanced-word-vector-representations.html
这节课从传统的基于计数的全局方法出发,过渡到结合两者优势的GloVe,并介绍了词向量的调参与评测方法。
复习:word2vec的主要思路
-
遍历整个语料库中的每个词
-
预测每个词的上下文:
-
然后在每个窗口中计算梯度做SGD
SGD与词向量
但每个窗口最多只有2m + 1个单词,所以∇θJt(θ)会非常稀疏:
实际上有正确答案需要去对比的只有窗口中的词语。所以每次更新只更新W矩阵中的少数列,或者为每个词语建立到词向量的哈希映射:
近似:负采样
还有一个问题亟待解决,词表V的量级非常大,以至于下式的分母很难计算:
于是,练习1中要求用negative sampling实现skip-gram。这是一种采样子集简化运算的方法。
具体做法是,对每个正例(中央词语及上下文中的一个词语)采样几个负例(中央词语和其他随机词语),训练binary logistic regression(也就是二分类器)。
negative sampling和skip-gram
目标函数:
这里t是某个窗口,k是采样个数,P(w)是一个unigram分布,详见:http://www.hankcs.com/nlp/word2vec.html#h3-12
σ是sigmoid函数:
根据上次课讲的,内积可以代表相关性。那么这个目标函数就是要最大化中央词与上下文的相关概率,最小化与其他词语的概率。
word2vec通过把相似的词语放到同一个地方附近来增大目标函数:
其他方法
word2vec将窗口视作训练单位,每个窗口或者几个窗口都要进行一次参数更新。要知道,很多词串出现的频次是很高的。能不能遍历一遍语料,迅速得到结果呢?
早在word2vec之前,就已经出现了很多得到词向量的方法,这些方法是基于统计共现矩阵的方法。如果在窗口级别上统计词性和语义共现,可以得到相似的词。如果在文档级别上统计,则会得到相似的文档(潜在语义分析LSA)。
基于窗口的共现矩阵
比如窗口半径为1,在如下句子上统计共现矩阵:
-
I like deep learning.
-
I like NLP.
-
I enjoy flying.
会得到:
朴素共现向量的问题
根据这个矩阵,的确可以得到简单的共现向量。但是它存在非常多的局限性:
-
当出现新词的时候,以前的旧向量连维度都得改变
-
高纬度(词表大小)
-
高稀疏性
解决办法:低维向量
用25到1000的低维稠密向量来储存重要信息。如何降维呢?
SVD吧:
r维降到d维,取奇异值最大的两列作为二维坐标可视化:
改进
-
限制高频词的频次,或者干脆停用词
-
根据与中央词的距离衰减词频权重
-
用皮尔逊相关系数代替词频
效果
方法虽然简单,但效果也还不错:
SVD的问题
-
不方便处理新词或新文档
-
与其他DL模型训练套路不同
Count based vs direct prediction
这些基于计数的方法在中小规模语料训练很快,有效地利用了统计信息。但用途受限于捕捉词语相似度,也无法拓展到大规模语料。
而NNLM, HLBL, RNN, Skip-gram/CBOW这类进行预测的模型必须遍历所有的窗口训练,也无法有效利用单词的全局统计信息。但它们显著地提高了上级NLP任务,其捕捉的不仅限于词语相似度。
综合两者优势:GloVe
这种模型的目标函数是:
优点是训练快,可以拓展到大规模语料,也适用于小规模语料和小向量。
明眼人会发现这里面有两个向量u和v,它们都捕捉了共现信息,怎么处理呢?试验证明,最佳方案是简单地加起来:
相对于word2vec只关注窗口内的共现,GloVe这个命名也说明这是全局的(我觉得word2vec在全部语料上取窗口,也不是那么地local,特别是负采样)。
评测方法
有两种方法:Intrinsic(内部) vs extrinsic(外部)
Intrinsic:专门设计单独的试验,由人工标注词语或句子相似度,与模型结果对比。好处是是计算速度快,但不知道对实际应用有无帮助。有人花了几年时间提高了在某个数据集上的分数,当将其词向量用于真实任务时并没有多少提高效果,想想真悲哀。
Extrinsic:通过对外部实际应用的效果提升来体现。耗时较长,不能排除是否是新的词向量与旧系统的某种契合度产生。需要至少两个subsystems同时证明。这类评测中,往往会用pre-train的向量在外部任务的语料上retrain。
Intrinsic word vector evaluation
也就是词向量类推,或说“A对于B来讲就相当于C对于哪个词?”。这可以通过余弦夹角得到:
我曾经通过这些方法验证了民间很多流行的word2vec实现准确率比原版低几十个百分点:http://www.hankcs.com/nlp/word2vec.html#h2-15
这种方法可视化出来,会发现这些类推的向量都是近似平行的:
下面这张图说明word2vec还可以做语法上的类比:
其他有趣的类比:
这在数学上是没有证明的。
结果对比
在不同大小的语料上,训练不同维度的词向量,在语义和语法数据集上的结果如下:
GloVe的效果显著地更好。另外,高纬度并不一定好。而数据量越多越好。
调参
窗口是否对称(还是只考虑前面的单词),向量维度,窗口大小:
大约300维,窗口大小8的对称窗口效果挺好的,考虑到成本。
对GloVe来讲,迭代次数越多越小,效果很稳定:
维基百科语料上得到的效果比新闻语料要好:
另一个数据集
还有直接人工标注词语相似度的:
www.cs.technion.ac.il/~gabr/resources/data/wordsim353/
对某个单词相似度排序后,得到最相关的词语。于是可以量化评测了。
Extrinsic word vector evaluation
做NER实验:
GloVe效果依然更好,但从数据上来看只好那么一点点。
视频中还谈了谈一些适合word vector的任务,比如单词分类。有些不太适合的任务,比如情感分析。课件中则多了一张谈消歧的,中心思想是通过对上下文的聚类分门别类地重新训练。
相同颜色的是同一个单词的不同义项。
TA也讲过这个问题。