Stanford cs224d 深度学习与nlp(二) 高级词向量

SGD与词向量

在每一个窗口中,我们最多只有2m+1个单词,所以 会非常稀疏

image_1bor07qr3okhi7u1r21193g128u9.png-31.3kB

我们实际上只更新了出现在窗口中的那些词的列

所以我们只需要更新词向量矩阵U和V中的少数列,或者为每个词和词向量建立一个hash映射

image_1bor0amj4h5f13sa1gkvgee5jtm.png-20kB

负采样

词向量矩阵的量级很大,所以下面式子的分母很难计算

image_1bor0ibi2dk3onrvq6ddt1q1p13.png-147.3kB

之前我们提到word2vec有两种高效的训练方法:

  • Hierarchical softmax
  • Negative sampling

而我们第一节课采用了更简单的naive softmax

而negative sampling简化计算的步骤是:具体做法是,对每个正例(中央词语及上下文中的一个词语)采样几个负例(中央词语和其他随机词语),训练binary logistic regression(也就是二分类器)。

negative sampling和skip-gram

目标函数:

image_1bor1ftnn1heq2rtl15i8f15co1t.png-7.8kB

image_1bor0ru13v5015fhtem15d11e061g.png-13.8kB

  • 这里t是某个窗口,k是采样个数

  • 是sigmoid函数

所以上式可以化为:

image_1bor1hmr11jme11kuh681ab61pe2a.png-22.4kB

  • 需要做的是最大化第一项(真实出现在中心词上下文的词),最小化第二项(随机选取的词)
  • P(w)是一个unigram分布

word2vec通过把相似词语放到同一个地方来增大目标函数(内积大嘛)

image_1bor21b984en1f0v16l815vgmgq2n.png-1025.2kB

其他方法

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

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

基于窗口的共现矩阵X

我们先规定一个固定大小的窗口,然后统计每个词出现在窗口中次数,这个计数是针对整个语料集做的。可能说得有点含糊,咱们一起来看个例子,假定我们有如下的3个句子,同时我们的窗口大小设定为1(把原始的句子分拆成一个一个的词):

  1. I enjoy flying.
  2. I like NLP.
  3. I like deep learning.
    由此产生的计数矩阵如下:

image_1bor5s4em1di9168utrnjtgvju9.png-326.3kB

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

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

  • 高纬度(词表大小)

  • 高稀疏性

通过降维减少计算量,用25到1000的低维稠密向量来储存重要信息。

通过SVD进行降维

image_1bor60qsi409185cn5ug261msnm.png-221.9kB

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

image_1bor617prck71jfp1qqh1gf6tch13.png-253.1kB

改进:

  • 限制高频词(a,the,he,has…)的频次(如最大为100,超过就不再计数),或者干脆停用词

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

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

效果还不错:

image_1bor65ntk1hlk1l6tfvrr51oi91g.png-251.4kB

image_1bor66viu1qq3112h11vk13ddkts1t.png-42.6kB

SVD的问题

  • 计算复杂度高,对m*n的矩阵 O( )
  • 不方便处理新词和新文档
  • 与其他DL模型训练套路不同

基于统计的词向量模型vs基于预测的词向量模型(Count based vs direct prediction)

前者以基于SVD分解技术的LSA模型为代表,通过构建一个共现矩阵得到隐层的语义向量
优点:充分利用了全局的统计信息。

缺点:然而这类模型得到的语义向量往往很难把握词与词之间的线性关系(例如著名的King、Queen、Man、Woman等式)。

后者则以基于神经网络的Skip-gram模型为代表,通过预测一个词出现在上下文里的概率得到embedding词向量。

优点:其得到的词向量能够较好地把握词与词之间的线性关系,因此在很多任务上的表现都要略优于SVD模型。

缺点:这类模型的缺陷在于其对统计信息的利用不充分,训练时间与语料大小息息相关。

综合两者优势:GloVe

这种模型的目标函数是:

image_1bor6d1fdrd4evcpch189n1cg02a.png-10.7kB

这里的Pij是两个词共现的频次,f是一个max函数,用于降低高频词对模型的干扰:

image_1bor6kmni1ppv198tpk11ha81lsh2n.png-42.3kB

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

这里面有两个向量u和v,它们都捕捉了共现信息
试验证明,最佳方案是简单地加起来:

image_1bor7g4i7n5ujlrm1me0rnt3h.png-3.4kB

相对于word2vec只关注窗口内的共现,GloVe这个命名也说明这是全局的

模型的评估:

通常有两种方式:Intrinsic和Extrinsic

Intrinsic:

  • 关注模型在一个特定子任务上的表现
  • 快速便捷
  • 有助于更好地理解模型内在的性质
  • 可能实际应用时效果不好

Extrinsic:

  • 关注在一个具体任务上的表现,如机器翻译或情感分析
  • 通常比较耗时
  • 比Intrinsic评估更具有参考意义

Intrinsic评估

对于词向量模型,一个常用的Intrinsic评估是向量类比(word vector analogies)。它评估了一组词向量在语义和句法上表现出来的线性关系。具体来说,给定一组词(a, b, c, d),我们要验证的是image_1bor7rega5c4sd31cj21luc1u984b.png-5.7kB,即d是与向量 的cosine距离最近的词。

image_1bor849oc7fc14of168ql0eokh4o.png-98.2kB

Mikolov在他的word2vec开源工具包里也提供了用于word
analogy评估的数据集。例如国家与首都的类比数据,时态或是比较级的类比数据。

借助于Intrinsic评估,我们也可以方便快捷地对模型的超参数(Hyperparameters)进行选择。例如向量的维度,context window的大小,甚至是模型的选择。

一些有趣的类比:

image_1bor85chpmguhvlgh178q17ds55.png-616.1kB

训练结果

image_1bor8ei594mt127r1ibn11pv13ju5i.png-621.6kB

Glove效果是最好的。

另外高维度数据效果不一定好,而数据量越多效果越好

调参

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

300维,窗口大小为8的对称窗口效果较好。

image_1bor8j66p173n1qrh10g62e81tm5v.png-405.6kB

迭代次数越多,效果越稳定

image_1bor8jgcgorq9r36f817461r5j6c.png-338.7kB

维基百科语料比新闻语料效果好,主要是因为一些词在新闻中很少出现

image_1bor8l7a31lr912le1b3kfjd1k276p.png-479.5kB

Extrinsic评估

值得注意的是,即使一些模型在人为设定的Intrinsic任务上表现较弱,并不能说明它们在具体的真实任务中毫无优势。Intrinsic评估的主要作用是对模型的超参数进行初步的调整和选择(这种模型选择在Extrinsic任务上往往极为耗时)。而评估模型的优劣还是要看它在Extrinsic任务上的表现。

对于词向量模型,常见的Extrinsic任务是对词向量进行分类。例如命名实体识别(NER)和情感分析。理论上,如果我们习得的词向量足够精确,那么语义或句法上相近的词必然分布在同一片向量空间。这就使得基于词向量的分类更加准确。

采用Extrinsic评估时我们用的还是softmax函数。具体上一篇已经写过了。

word2vec适用范围

对单词分类比较适合,情感分析就不太适合,

歧义消解

中心思想:通过上下文聚类,对不同词义分门别类进行训练

image_1bor8t9lle4u18vf85jb042ln76.png-627kB

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