word2vec基本思想回顾
- 遍历corpus中每个词
- 预测每个窗口中心词周围的词
- 计算该窗口内梯度,利用SGD对参数(这里参数即是vector)优化
word2vec可能存在的问题
- 梯度稀疏
假设词窗口大小为m的话,仅能够得到2m+1个词,因此梯度会非常稀疏。
对于这种情况,有时只对词窗口中出现过的词对应的词向量进行更新。这样一来对于权重矩阵W或者(词向量矩阵)我们只需要更新特定行或列,或者为每个词语到词向量建立hash映射。但是如果有上百万个词时,向量的更新量会非常大。
用Negative Sampling 加速计算
在skip-gram模型中,如图所示
在上式中,softmax分母归一化操作需要很大的计算量,因为需要遍历整个词典计算点积总和,所以在作业1中采用negative sampling 来实现skip gram model。负采样的主要思想是,训练一个LR二分类器,正例是中心词和它周围词构成的词对,负样本是中心词和在词典中随机选取的词构成的词对。
在这篇文献“Distributed RepresentaRons of Words and Phrases
and their Compositionality”中,采用negative sampling来实现SG模型,总体的目标函数为,
其中,T代表总词窗口的个数也即是迭代次数,k是负采样个数.在目标函数中采用Sigmod函数,函数形式和曲线如图所示。p(w)是某个unigram分布。负采样具体介绍略。
目标函数简化后为
函数有两部分构成,加号左侧第一部分代表中心词和周围词真正共现的概率,后一部分是中心词和随机采样词共现的概率,因此优化的目标是使真正共现词概率最大化(前一部分),非共现词概率最小化(后者)。
在负采样unigram 分布p(w)的0.75次幂进行采样,一个目的是用来平滑,同时也保证了频率低的词也可以经常被采样到。
word2vec 总结。
- 遍历语料库中每一个词,
- 预测每个词周围词
- 每次预测出一个共现词
这样就引出了一个问题,为什么我们不能直接找共现词而不经过这种遍历?因word2vec对于参数的更新是在一个窗口或者某几个窗口之后。答案是肯定,早之前就有对词共现的研究—词共现矩阵,主要有两种方式,一种是基于整个文档形成,另一种是基于窗口构建矩阵,这种思想就是Latent Senmentic Analysis,和word2vec一样,利用窗口在每个词周围获取syntatic句法(POS)和语义信息。
直接构建词共现矩阵
我们通过找共现词然后预测出最终合适的词,那这就出来个问题,为什么我们不能基于语料库直接找共现词?之所以word2vec采用这种方式是因为参数的更新是在一个窗口或者某几个窗口之后,也就意味着需要很多次迭代才能找到共现词。
直接寻找共现词是完全可以的,早期的学者就有对词共现的研究—构建词共现矩阵,它主要有两种方式,一种是基于整篇文档构成词-文档矩阵,另一种是基于窗口构建矩阵,这种思想就是常说的Latent Senmentic Analysis(LSA),和word2vec一样,它利用窗口在每个词周围获取syntatic句法(POS)和语义信息。
基于窗口构建共现矩阵示例
假设有以个语料库(这里指句子集合)
分词,根据词窗口距离统计词共现次数,词窗口一般选择1-10,这里选择1,即前后一个位置,可得到词共现矩阵为,
矩阵中每一行或列都可以看做是词的一个向量,可以直接用这个向量参与一些NLP任务。但这种采用简单方式得到的词向量会有如下限制,
- 向量维度和词典大小保持一致,当词典增大,维度就发生改变
- 词典通常很大,所以向量维度很大,需要更多的存储空间
- 可以发现矩阵存在稀疏性问题,对不同模型鲁棒性差
通过采用SVD将向量转换为25-1000的低纬度向量。这其中也会牵涉到一些优化方法如对高频词停用词进行过滤,采用皮尔逊系数代替词频值。SVD进行计算词向量存在如下问题,比如,计算复杂度大,对于一个nxm的矩阵复杂度为O(mn^2),不易处理新词或文档;由于采用慈功贤矩阵获得词向量有诸多限制,是否可以基于此获得更高效的词向量?
用SVD对词共现矩阵降维
通过采用SVD将词共现矩阵转换为25-1000的低纬度向量可以得到更好的词向量,如图。
这其中可以采用如下tricks,
- 对高频词停用词进行过滤
- 采用皮尔逊系数代替词频值
- 对于频率相同的词窗口进行重采样
SVD降维存在的问题
SVD计算复杂度大,对于一个N x M的矩阵复杂度为O(mn^2),不易合并新词或新文档;
基于频率和直接预测共现词方法对比
对比如上图。
基于频率统计的方法有LSA, HAL, COALS, Hellinger-PCA,具有如下特点,
- 训练速度快
- 充分利用统计性
- 主要用来获取词间的相似性
- 无法扩展到大规模语料
直接预测共现词获得词向量的方法有NNLM,HLBL,RNN,Skip-gram/CBOW,有如下特点
- 性能随语料库大小而变
- 不能充分利用统计规律
- 可以提升其他NLP任务效果
- 能够后的词相似度以外的pattern
既然基于计数和直接预测都有优缺点,可否直接将二者进行结合成新的模型?
最好的词向量模型Glove
模型目标函数为:
这里P(ij)是两个词共现次数,f为max函数,函数曲线如下图
该模型所具有一下好处,
- 训练速度快
- 对大规模语料也适用
- 对于小语料库、小向量也有较好额效果
我们知道在模型总我们对于每个词我们都有两词向量u和v,他们中都含有共现信息,实践证明,将二者合并时最佳的选择。
这节课中有一部分hightlight talk,会单独拿出来进行记录。
词向量评价
对词向量的评价和NLP传统评测方法一样,有两种内部(Intrinsic)和外部(extrinsic).
- 内部评价指标或方式
专门设计单独的试验,由人工标注词语或句子相似度,与模型结果对比。好处是计算速度快,但不知道对实际应用有无帮助。 - 外部评价
通过对外部实际应用的效果提升来体现。耗时较长,不能排除是否是新的词向量与旧系统的某种契合度产生。需要至少两个subsystems同时证明。这类评测中,往往会用pre-train的向量在外部任务的语料上retrain。
词向量内部评价示例
词向量类推,这一是word2vec出来之后经常会拿来举例的。“A对于B,就像C对于D”,这可以通过余弦相似度夹角得到。
最终结果发现,将他们进行可视化之后,可以看出每个组之间的形式还是很类似的。
对于词向量外部评价,就是通过词向量可以直接提升任务效果,如NER,分类等。
评论加载中