在上一期中我们介绍了word2vec的2种词向量模型CBOW和Skipgram。word2vec的出现让更多人关注到词向量以及词向量带来的一系列影响,很多初学者会把word2vec等同于词向量。 然而,对于词语的向量化表示,真的只有一种方法吗?难道word2vec真的没有不足之处吗? word2vec这一模型最大的问题就是看数据的视角过窄,word2vec学习的正样本是同一窗口内的某一组词汇,每次学习的时候,并不考虑这两个词在全局中的概率分布,这样的学习并不利于模型理解这个词汇的全局信息,因此其词向量的学习会变得相对片面,学习也相对缓慢。 那有没有什么模型是学习全局词汇特征的呢?答案是有Glove! Glove的作者JeffreyPennington想到了我们在本章最开始提到的onehot模型,该模型统计了单词的全局特征。Pennington对这个问题进一步剖析,放弃了文档单词矩阵,直接利用单词单词的词共现矩阵建模。 到现在,你已经了解了Glove的2个精髓:与word2vec一致的窗口文本学习(localcontextwindow)借鉴onehot模型的词共现矩阵(wordwordcooccurrencematrix) Pennington认为,只考虑稀疏矩阵会像onehot模型一样失去对于语义的理解能力,但是只考虑窗口学习又会像word2vec一样仅能学习单词在固定范围内的上下文语义表征。 下面我们来深入的介绍Glove。 一、Glove的全称:GlobalVectorsforWordRepresentation,它是一个基于全局词频统计(countbasedoverallstatistics)的词表征(wordrepresentation)工具。 二、模型概述:模型目标:进行词的向量化表示,使得向量之间尽可能多地蕴含语义和语法的信息输入:语料库输出:词向量方法:首先根据语料库构建共现矩阵,然后基于共现矩阵和Glove模型学习词向量 三、共现矩阵 A、共现矩阵X:其中Xi,j代表单词j在单词i窗口内出现的次数,具体步骤如下:首先构建一个空矩阵,大小为VV,即词汇表词汇表,值全为空确定一个滑动窗口的大小,比如:5从语料库的第一个单词开始,滑动该窗口因为是按照语料库的顺序开始的,所以中心词为到达的那个单词:i上下文词为以中心词i为滑动窗口的中心,两边的单词,为上下文词:j1,j2,,jm(假如有m个j)若窗口左右无单词,一般出现在语料库的首尾,则空着,不需要统计在窗口内,统计上下文词j出现的次数,添在矩阵中滑动过程中,不断将统计的信息添加在矩阵中,即可得到共现矩阵。 B、共现概率矩阵:单词j在单词i文本窗口内出现的概率可以定义为: Pennington对60亿英文文本进行分析和挖掘,得出相关数据如下图: C、Ratio有什么用:实际上反映的是三个词的关系,如图: D、作者思想:假设我们已经得到了词向量,如果我们用词向量Vi,Vj,Vk通过某种函数计算ratioi,j,k,能够同样得到这样的规律的话,就意味着我们词向量与共现矩阵具有很好的一致性,也就说明我们的词向量中蕴含了共现矩阵中所蕴含的信息。 E、损失函数: 上面的损失函数J,其实是均方误差函数(其中f(x)为权重函数,即频率越高的词权重应该越大,这篇论文中的所有实验,的取值都是0。75,而xmax取值都是100)。 F、那么Glove是如何训练的呢:虽然很多人声称GloVe是一种无监督(unsupervisedlearing)的学习方式(因为它确实不需要人工标注label),但其实它还是有label的,这个label就是公式2中的,而公式2中的向量和就是要不断更新学习的参数,所以本质上它的训练方式跟监督学习的训练方法没什么不一样,都是基于梯度下降的。具体地,这篇论文里的实验是这么做的:采用了AdaGrad的梯度下降算法,对矩阵中的所有非零元素进行随机采样,学习曲率(learningrate)设为0。05,在vectorsize小于300的情况下迭代了50次,其他大小的vectors上迭代了100次,直至收敛。最终学习得到的是两个vector是和,因为是对称的(symmetric),所以从原理上讲和是也是对称的,他们唯一的区别是初始化的值不一样,而导致最终的值不一样。所以这两者其实是等价的,都可以当成最终的结果来使用。但是为了提高鲁棒性,我们最终会选择两者之和作为最终的vector(两者的初始化不同相当于加了不同的随机噪声,所以能提高鲁棒性)。在训练了400亿个token组成的语料后,得到的实验结果如下图所示: 这个图一共采用了三个指标:语义准确度,语法准确度以及总体准确度。那么我们不难发现VectorDimension在300时能达到最佳,而contextWindowssize大致在6到10之间。 至此,glove模型的核心部分介绍完毕,模型通过将共现矩阵纳入损失函数,并利用上下文窗口作为统计样本空间,结合词向量与词共现矩阵,避免word2vec只聚焦局部特征与onehot只考虑词共现特征的问题,综合考虑二者,希望词向量模型学习到更全面且更精准的语义表达。针对损失函数J的分析,glove模型并未使用深度学习或神经网络作为模型框架,而是借助词共现矩阵,完成对于词向量表示的学习。由于考虑到词语分布的全局性,Pennington在论文中表明glove语义表征效果优于word2vec,然而,在真实的自然语言处理任务中,尤其是与中文相关的任务中,其效果并非全面优于word2vec,因此需要读者根据任务特性选择合适的词向量模型。 Glove与LSA、word2vec的比较: LSA(LatentSemanticAnalysis)是一种比较早的countbased的词向量表征工具,它也是基于cooccurancematrix的,只不过采用了基于奇异值分解(SVD)的矩阵分解技术对大矩阵进行降维,而我们知道SVD的复杂度是很高的,所以它的计算代价比较大。还有一点是它对所有单词的统计权重都是一致的。而这些缺点在GloVe中被一一克服了。而word2vec最大的缺点则是没有充分利用所有的语料,所以GloVe其实是把两者的优点结合了起来。从这篇论文给出的实验结果来看,GloVe的性能是远超LSA和word2vec的,但网上也有人说GloVe和word2vec实际表现其实差不多。