2018-01-13 | CS244n | UNLOCK

CS244n lecture3 Notes:高级词向量

word2vec基本思想回顾

  • 遍历corpus中每个词
  • 预测每个窗口中心词周围的词
  • 计算该窗口内梯度,利用SGD对参数(这里参数即是vector)优化

word2vec可能存在的问题

  • 梯度稀疏
    假设词窗口大小为m的话,仅能够得到2m+1个词,因此梯度会非常稀疏。
    对于这种情况,有时只对词窗口中出现过的词对应的词向量进行更新。这样一来对于权重矩阵W或者(词向量矩阵)我们只需要更新特定行或列,或者为每个词语到词向量建立hash映射。但是如果有上百万个词时,向量的更新量会非常大。

用Negative Sampling 加速计算

在skip-gram模型中,如图所示
skip-gram

在上式中,softmax分母归一化操作需要很大的计算量,因为需要遍历整个词典计算点积总和,所以在作业1中采用negative sampling 来实现skip gram model。负采样的主要思想是,训练一个LR二分类器,正例是中心词和它周围词构成的词对,负样本是中心词和在词典中随机选取的词构成的词对。

在这篇文献“Distributed RepresentaRons of Words and Phrases
and their Compositionality”中,采用negative sampling来实现SG模型,总体的目标函数为,
image.png

其中,T代表总词窗口的个数也即是迭代次数,k是负采样个数.在目标函数中采用Sigmod函数,函数形式和曲线如图所示。p(w)是某个unigram分布。负采样具体介绍略。
image.png

目标函数简化后为
image.png

函数有两部分构成,加号左侧第一部分代表中心词和周围词真正共现的概率,后一部分是中心词和随机采样词共现的概率,因此优化的目标是使真正共现词概率最大化(前一部分),非共现词概率最小化(后者)。

image.png
在负采样unigram 分布p(w)的0.75次幂进行采样,一个目的是用来平滑,同时也保证了频率低的词也可以经常被采样到。

word2vec 总结。

  • 遍历语料库中每一个词,
  • 预测每个词周围词
  • 每次预测出一个共现词
    这样就引出了一个问题,为什么我们不能直接找共现词而不经过这种遍历?因word2vec对于参数的更新是在一个窗口或者某几个窗口之后。答案是肯定,早之前就有对词共现的研究—词共现矩阵,主要有两种方式,一种是基于整个文档形成,另一种是基于窗口构建矩阵,这种思想就是Latent Senmentic Analysis,和word2vec一样,利用窗口在每个词周围获取syntatic句法(POS)和语义信息。

直接构建词共现矩阵

我们通过找共现词然后预测出最终合适的词,那这就出来个问题,为什么我们不能基于语料库直接找共现词?之所以word2vec采用这种方式是因为参数的更新是在一个窗口或者某几个窗口之后,也就意味着需要很多次迭代才能找到共现词。
直接寻找共现词是完全可以的,早期的学者就有对词共现的研究—构建词共现矩阵,它主要有两种方式,一种是基于整篇文档构成词-文档矩阵,另一种是基于窗口构建矩阵,这种思想就是常说的Latent Senmentic Analysis(LSA),和word2vec一样,它利用窗口在每个词周围获取syntatic句法(POS)和语义信息。

基于窗口构建共现矩阵示例

假设有以个语料库(这里指句子集合)

j

分词,根据词窗口距离统计词共现次数,词窗口一般选择1-10,这里选择1,即前后一个位置,可得到词共现矩阵为,
image.png

矩阵中每一行或列都可以看做是词的一个向量,可以直接用这个向量参与一些NLP任务。但这种采用简单方式得到的词向量会有如下限制,

  • 向量维度和词典大小保持一致,当词典增大,维度就发生改变
  • 词典通常很大,所以向量维度很大,需要更多的存储空间
  • 可以发现矩阵存在稀疏性问题,对不同模型鲁棒性差

通过采用SVD将向量转换为25-1000的低纬度向量。这其中也会牵涉到一些优化方法如对高频词停用词进行过滤,采用皮尔逊系数代替词频值。SVD进行计算词向量存在如下问题,比如,计算复杂度大,对于一个nxm的矩阵复杂度为O(mn^2),不易处理新词或文档;由于采用慈功贤矩阵获得词向量有诸多限制,是否可以基于此获得更高效的词向量?

用SVD对词共现矩阵降维

通过采用SVD将词共现矩阵转换为25-1000的低纬度向量可以得到更好的词向量,如图。
image.png

这其中可以采用如下tricks,

  • 对高频词停用词进行过滤
  • 采用皮尔逊系数代替词频值
  • 对于频率相同的词窗口进行重采样

SVD降维存在的问题

SVD计算复杂度大,对于一个N x M的矩阵复杂度为O(mn^2),不易合并新词或新文档;

基于频率和直接预测共现词方法对比

image.png

对比如上图。
基于频率统计的方法有LSA, HAL, COALS, Hellinger-PCA,具有如下特点,

  • 训练速度快
  • 充分利用统计性
  • 主要用来获取词间的相似性
  • 无法扩展到大规模语料

直接预测共现词获得词向量的方法有NNLM,HLBL,RNN,Skip-gram/CBOW,有如下特点

  • 性能随语料库大小而变
  • 不能充分利用统计规律
  • 可以提升其他NLP任务效果
  • 能够后的词相似度以外的pattern

既然基于计数和直接预测都有优缺点,可否直接将二者进行结合成新的模型?

最好的词向量模型Glove

模型目标函数为:
image.png
这里P(ij)是两个词共现次数,f为max函数,函数曲线如下图
image.png

该模型所具有一下好处,

  • 训练速度快
  • 对大规模语料也适用
  • 对于小语料库、小向量也有较好额效果

我们知道在模型总我们对于每个词我们都有两词向量u和v,他们中都含有共现信息,实践证明,将二者合并时最佳的选择。

image.png

这节课中有一部分hightlight talk,会单独拿出来进行记录。

词向量评价

对词向量的评价和NLP传统评测方法一样,有两种内部(Intrinsic)和外部(extrinsic).

  • 内部评价指标或方式
    专门设计单独的试验,由人工标注词语或句子相似度,与模型结果对比。好处是计算速度快,但不知道对实际应用有无帮助。
  • 外部评价
    通过对外部实际应用的效果提升来体现。耗时较长,不能排除是否是新的词向量与旧系统的某种契合度产生。需要至少两个subsystems同时证明。这类评测中,往往会用pre-train的向量在外部任务的语料上retrain。

词向量内部评价示例

词向量类推,这一是word2vec出来之后经常会拿来举例的。“A对于B,就像C对于D”,这可以通过余弦相似度夹角得到。
image.png
最终结果发现,将他们进行可视化之后,可以看出每个组之间的形式还是很类似的。
image.png

对于词向量外部评价,就是通过词向量可以直接提升任务效果,如NER,分类等。

评论加载中