放牧代码和思想
专注自然语言处理、机器学习算法

CS224n笔记3 高级词向量表示

目录

hankcs.com 2017-06-08 下午9.24.05.png这节课从传统的基于计数的全局方法出发,过渡到结合两者优势的GloVe,并介绍了词向量的调参与评测方法。

复习:word2vec的主要思路

  • 遍历整个语料库中的每个词

  • 预测每个词的上下文:

  • hankcs.com 2017-06-08 下午3.25.31.png

  • 然后在每个窗口中计算梯度做SGD

SGD与词向量

但每个窗口最多只有2m + 1个单词,所以$\nabla_\theta J_t(\theta)$会非常稀疏:

hankcs.com 2017-06-08 下午3.33.16.png

实际上有正确答案需要去对比的只有窗口中的词语。所以每次更新只更新$W$矩阵中的少数列,或者为每个词语建立到词向量的哈希映射:

hankcs.com 2017-06-08 下午3.39.45.png

近似:负采样

还有一个问题亟待解决,词表V的量级非常大,以至于下式的分母很难计算:

hankcs.com 2017-06-08 下午3.25.31.png

于是,练习1中要求用negative sampling实现skip-gram。这是一种采样子集简化运算的方法。具体做法是,对每个正例(中央词语及上下文中的一个词语)采样几个负例(中央词语和其他随机词语),训练binary logistic regression(也就是二分类器)。

negative sampling和skip-gram

目标函数:

$$\begin{align*}
J_t(\theta) = \log \sigma\left(u_o^Tv_c\right)+\sum_{i=1}^k\mathbb{E}_{j \sim P(w)}\left [\log\sigma \left(-u^T_jv_c\right) \right]
\end{align*}$$

这里$t$是某个窗口,$k$是采样个数,$P(w)$是一个unigram分布,详见:http://www.hankcs.com/nlp/word2vec.html#h3-12 

$\sigma$是sigmoid函数:

sigmoid.png

根据上次课讲的,内积可以代表相关性。那么这个目标函数就是要最大化中央词与上下文的相关概率,最小化与其他词语的概率。

word2vec通过把相似的词语放到同一个地方附近来增大目标函数:

hankcs.com 2017-06-08 下午4.45.25.png

其他方法

word2vec将窗口视作训练单位,每个窗口或者几个窗口都要进行一次参数更新。要知道,很多词串出现的频次是很高的。能不能遍历一遍语料,迅速得到结果呢?

早在word2vec之前,就已经出现了很多得到词向量的方法,这些方法是基于统计共现矩阵的方法。如果在窗口级别上统计词性和语义共现,可以得到相似的词。如果在文档级别上统计,则会得到相似的文档(潜在语义分析LSA)。

基于窗口的共现矩阵

比如窗口半径为1,在如下句子上统计共现矩阵:

  • I like deep learning. 

  • I like NLP.

  • I enjoy flying.

会得到:

hankcs.com 2017-06-08 下午5.00.43.png

朴素共现向量的问题

根据这个矩阵,的确可以得到简单的共现向量。但是它存在非常多的局限性:

  • 当出现新词的时候,以前的旧向量连维度都得改变

  • 高纬度(词表大小)

  • 高稀疏性

解决办法:低维向量

用25到1000的低维稠密向量来储存重要信息。如何降维呢?

SVD吧:

hankcs.com 2017-06-08 下午5.10.35.png

r维降到d维,取奇异值最大的两列作为二维坐标可视化:

hankcs.com 2017-06-08 下午5.11.36.png

改进

  • 限制高频词的频次,或者干脆停用词

  • 根据与中央词的距离衰减词频权重

  • 用皮尔逊相关系数代替词频

效果

方法虽然简单,但效果也还不错:

hankcs.com 2017-06-08 下午5.17.13.png

hankcs.com 2017-06-08 下午5.17.27.png

hankcs.com 2017-06-08 下午5.17.45.png

SVD的问题

  • 计算复杂度高:对$n\times m$的矩阵是$O(mn^2)$

  • 不方便处理新词或新文档

  • 与其他DL模型训练套路不同

Count based vs direct prediction

这些基于计数的方法在中小规模语料训练很快,有效地利用了统计信息。但用途受限于捕捉词语相似度,也无法拓展到大规模语料。

而NNLM, HLBL, RNN, Skip-gram/CBOW这类进行预测的模型必须遍历所有的窗口训练,也无法有效利用单词的全局统计信息。但它们显著地提高了上级NLP任务,其捕捉的不仅限于词语相似度。

综合两者优势:GloVe

这种模型的目标函数是:

$$J(\theta)=\frac{1}{2}\sum_{i,j=1}^W f(P_{ij})\left(u_i^Tv_j-\log P_{ij}\right)^2$$

这里的$P_{ij}$是两个词共现的频次,f是一个max函数:

hankcs.com 2017-06-08 下午7.22.15.png

优点是训练快,可以拓展到大规模语料,也适用于小规模语料和小向量。

明眼人会发现这里面有两个向量$u$和$v$,它们都捕捉了共现信息,怎么处理呢?试验证明,最佳方案是简单地加起来:

$$X_{final} =U+V$$

相对于word2vec只关注窗口内的共现,GloVe这个命名也说明这是全局的(我觉得word2vec在全部语料上取窗口,也不是那么地local,特别是负采样)。

评测方法

有两种方法:Intrinsic(内部) vs extrinsic(外部)

Intrinsic:专门设计单独的试验,由人工标注词语或句子相似度,与模型结果对比。好处是是计算速度快,但不知道对实际应用有无帮助。有人花了几年时间提高了在某个数据集上的分数,当将其词向量用于真实任务时并没有多少提高效果,想想真悲哀。

Extrinsic:通过对外部实际应用的效果提升来体现。耗时较长,不能排除是否是新的词向量与旧系统的某种契合度产生。需要至少两个subsystems同时证明。这类评测中,往往会用pre-train的向量在外部任务的语料上retrain。

Intrinsic word vector evaluation

也就是词向量类推,或说“A对于B来讲就相当于C对于哪个词?”。这可以通过余弦夹角得到:

hankcs.com 2017-06-08 下午9.00.00.png

我曾经通过这些方法验证了民间很多流行的word2vec实现准确率比原版低几十个百分点:http://www.hankcs.com/nlp/word2vec.html#h2-15 

这种方法可视化出来,会发现这些类推的向量都是近似平行的:

hankcs.com 2017-06-08 下午9.03.18.png

hankcs.com 2017-06-08 下午9.03.35.png

下面这张图说明word2vec还可以做语法上的类比:

hankcs.com 2017-06-08 下午9.05.55.png

其他有趣的类比:

hankcs.com 2017-06-08 下午9.06.35.png

这在数学上是没有证明的。

结果对比

在不同大小的语料上,训练不同维度的词向量,在语义和语法数据集上的结果如下:

hankcs.com 2017-06-08 下午9.13.47.png

GloVe的效果显著地更好。另外,高纬度并不一定好。而数据量越多越好。

调参

窗口是否对称(还是只考虑前面的单词),向量维度,窗口大小:

hankcs.com 2017-06-08 下午9.20.11.png

大约300维,窗口大小8的对称窗口效果挺好的,考虑到成本。

对GloVe来讲,迭代次数越多越小,效果很稳定:

hankcs.com 2017-06-08 下午9.24.05.png

维基百科语料上得到的效果比新闻语料要好:

hankcs.com 2017-06-08 下午9.26.26.png

另一个数据集

还有直接人工标注词语相似度的:

hankcs.com 2017-06-08 下午9.29.01.png

www.cs.technion.ac.il/~gabr/resources/data/wordsim353/ 

对某个单词相似度排序后,得到最相关的词语。于是可以量化评测了。

hankcs.com 2017-06-08 下午9.31.22.png

Extrinsic word vector evaluation

做NER实验:

hankcs.com 2017-06-08 下午9.38.12.png

GloVe效果依然更好,但从数据上来看只好那么一点点。

视频中还谈了谈一些适合word vector的任务,比如单词分类。有些不太适合的任务,比如情感分析。课件中则多了一张谈消歧的,中心思想是通过对上下文的聚类分门别类地重新训练。

hankcs.com 2017-06-08 下午9.47.56.png

相同颜色的是同一个单词的不同义项。

TA也讲过这个问题。

知识共享许可协议 知识共享署名-非商业性使用-相同方式共享码农场 » CS224n笔记3 高级词向量表示

分享到:更多 ()

评论 欢迎留言

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

我的开源项目

HanLP自然语言处理包基于DoubleArrayTrie的Aho Corasick自动机