glove词向量模型
词向量的表示可以分成两类:
- 基于统计方法 共现矩阵、svd
- 基于语言模型 神经网络语言模型,word2vector,glove,elmo
word2vector中的skip-gram模型是利用类似于自动编码的器网络以中心词的one-hot表示作为输入来预测这个中心词环境中某一个词的one-hot表示,即先将中心词one-hot表示编码然后解码成环境中某个词的one-hot表示(多分类模型,损失函数用交叉熵)。CBOW是反过来的,分别用环境中的每一个词去预测中心词。尽管word2vector在学习词与词间的关系上有了大进步,但是它有很明显的缺点:只能利用一定窗长的上下文环境,即利用局部信息,没法利用整个语料库的全局信息。鉴于此,斯坦福的GloVe诞生了,它的全称是global vector,很明显它是要改进word2vector,成功利用语料库的全局信息。
这里需要提一点的是 :
word2vector 得到的词向量是隐藏层的权重矩阵,并非模型的输出
共现概率
共现 :
单词a 出现在单词b的环境中(环境指的是以b为中心的左右各若干个词)
共现矩阵:
单词对共现次数的统计表。我们可以通过大量的语料文本来构建一个共现统计矩阵。
例如,有语料如下:
I like deep learning.
I like NLP.
I enjoy flying.
共现矩阵的特点:
统计的是单词在给定环境中出现的次数,所以在一定程度上能够表达词间关系。
共现频次的技术是针对整个语料库,而不是在一定程度上能表达词间的关系
共现矩阵是对称的
共现概率比:
定义X为贡献矩阵,共现矩阵,共现矩阵中 x i j x_{i j} xij表示词j出现在词i的环境中的次数, x i x_i xi为任一词出现在i环境中的次数(即行和)
P i j = P ( j ∣ i ) = x i j x i P_{i j}=P(j \mid i)=\frac{x_{i j}}{x_{i}} Pij=P(j∣i)=xixij
为词j出现在词i环境中的概率(用频率代表概率),这个概率就是词i和词j的共现概率,共现概率也就是给定语料环境,某一个词出现的概率。
共现概率比
glove论文中给出了一个有趣的例子
k是语境词,ice和steam分别是两个中心词,但从这些概率中看不出什么东西。
接着作者对论文把这些概率做了些除法,有趣的东西出现了。
第一列:solid ice,固态冰,虽然别扭,但显然是个合理的词对(两者都有固体之意);solid steam,固态蒸汽。在背景词solid下,ice与solid的关系比steam要紧密,P(solid|ice)/P(solid|steam)这个比率很大。
第二列:ice gas,冰气;gas steam,都是气体,合理。在背景词gas下,steam与gas的关系比ice要紧密,P(gas|ice)/P(gas|steam)这个比率很小。
第三列:ice water,冰水,没问题;water steam,水蒸气,也没问题;ice和steam都与water相关,P(water|ice)/P(water|steam)趋近于1。
第四列:fashion ice,时尚冰?fashion steam,流行蒸汽?wtf?显然八竿子打不着,P(fashion|ice)/P(fashion|steam)也趋近于1。
作者假设共现概率比,可以由词向量通过函数F得到:
F ( w i , w j , w ~ k ) = P i k P j k F\left(w_{i}, w_{j}, \tilde{w}_{k}\right)=\frac{P_{i k}}{P_{j k}} F(wi,wj,w~k)=PjkPik
使用均方误差损失函数:
J = ∑ i , j = 1 V ( w i T w j + b i + b j − log ( X i j ) ) 2 J=\sum_{i, j=1}^{V}\left(w_{i}^{T} w_{j}+b_{i}+b_{j}-\log \left(X_{i j}\right)\right)^{2} J=i,j=1∑V(wiTwj+bi+bj−log(Xij))2
矩阵分解方法,有个缺点,就是各个词的权重是一样的,处理这个问题,就是添加一个根据词频决定的权重项:
J = ∑ i , j = 1 V f ( X i j ) ( w i T w j + b i + b j − log ( X i j ) ) 2 J=\sum_{i, j=1}^{V} f\left(X_{i j}\right)\left(w_{i}^{T} w_{j}+b_{i}+b_{j}-\log \left(X_{i j}\right)\right)^{2} J=i,j=1∑V<