cs224n | 高级词向量表示

参考博客:

word2vec原理推导与代码分析
CS224n笔记3 高级词向量表示

关于word2vec的回顾

  • skipgram:利用中心词预测上下文
  • example: I like deep learning and nlp.
    • 存在两个词典,一个为中心词词典V,一个为上下文词词典U,两个词典包含的词相同
    • 1.移动滑动窗口,选择中心词deep
      I like deep 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 deep learning 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,仅随机化取出五个十个或者其他数目的随机词,这些从语料库其余部分取出的随机词是不同时出现的,然后最小化他们的概率。
    • 故目标函数变为(最大化):
      cs224n | 高级词向量表示_第1张图片

      这里t是某个窗口,k是采样个数,P(w)是一个unigram分布。此处的采样是基于词出现频率的采样,具体实现时,对词频取了0.75次幂
      cs224n | 高级词向量表示_第2张图片
      这个幂实际上是一种“平滑”策略,能够让低频词多一些出场机会,高频词贡献一些出场机会,劫富济贫。

word2vec总结

  • 1.使用窗口滑动
  • 2.预测每个词周围的词
  • 3.我们通过这种途径去捕捉词的共现性,即一个词与其他词共同出现的频率

其他方法

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

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

基于窗口的共生矩阵
  • example: 比如窗口半径为1,在如下句子上统计共现矩阵,计算每个词窗口范围内其他词出现的频率:
    • I like deep learning.
    • I like NLP.
    • I enjoy flying.
    • cs224n | 高级词向量表示_第3张图片
    • 但其有很多局限性:
      • 1.有新词,则向量改变
      • 2.维度非常高,而且很稀疏,非常不健壮
    • 为了解决上述问题,Solution:只存储最重要的信息,在一定固定长度内。一般在25-1000维之间。
      • 怎样进行降维?
        • SVD分解
    • 改进:
      • 1.现在高频词的次数,如限制最多为100, 或者去掉停用词(只使用词的长尾效应)
      • 2.进行权重,离中心词越近权重越高
    • 存在的问题:
      • SVD:
        • 其在处理大型矩阵时效果并没有很好
        • 不方便处理新词或新文档

Count based vs direct prediction

这些基于计数的方法在中小规模语料(如PCA)训练很快,有效地利用了统计信息,我们只需要统计一次语料信息。但用途受限于捕捉词语相似度,也无法拓展到大规模语料。计数很大的词并没有那么高的重要度,我们使用了很多方法去进行降维。

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

组合上述两者,GloVe

可参考:GloVe模型
目标函数:

J(θ)=12i,j=1Wf(Pij)(uTivjlogPij)2 J ( θ ) = 1 2 ∑ i , j = 1 W f ( P i j ) ( u i T v j − l o g P i j ) 2

其中:

  • θ θ 为所有参数
  • W:遍历每个可能共现的词对,每次优化一个计数
  • u包含了所以的词的向量,u,v为列中的向量和行中的向量,他们本质上是可交换的
  • Pij P i j 为词 j 出现在词 i 的context里面的概率
  • 我们希望最小化内积词对出现次数的对数的距离,f 可以减少频繁共现的事件
  • f是一个max函数,使得高频出现的词被平滑
    cs224n | 高级词向量表示_第4张图片
  • 这里面有两个向量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对于哪个词?”。这可以通过余弦夹角得到:
      cs224n | 高级词向量表示_第5张图片

    • 实验证明,GloVe确实在捕捉语义关系上效果很好,也可以看到向量维数不是越大越好,但是训练语料越大,表示会有提升。
      cs224n | 高级词向量表示_第6张图片
    • 视频中还谈了谈一些适合word vector的任务,比如单词分类。有些不太适合的任务,比如情感分析。课件中则多了一张谈消歧的,中心思想是通过对上下文的聚类分门别类地重新训练。

你可能感兴趣的:(cs224n | 高级词向量表示)