word2vec的缺陷:
- 没有考虑词序,因为它假设了词的上下文无关(把概率变为连乘)
- 没有考虑全局的统计信息
针对这两个方面,应该都有很多解决的方案,毕竟word2vec是很老的东西了。这里介绍了一个方法,改进全局的统计信息。
co-occurrence matrix
计算共现矩阵,作用于两个方面:
- 句子:捕捉语义和语法的相似性
- 文章:捕捉主题的相似性
基于窗口的共现矩阵
比如窗口半径为1,在如下句子上统计共现矩阵:
-
I like deep learning.
-
I like NLP.
-
I enjoy flying.
会得到:
这样会得到一个稀疏的向量空间,然后通过SVD的方法将它变成稠密矩阵。
用这个方法的缺点很明显,每次来新词都要重新全部SVD一次
改进
这个改进的方案,在任何需要用到词频的地方都会游泳
-
限制高频词的频次,或者干脆停用词
-
根据与中央词的距离衰减词频权重
-
用皮尔逊相关系数代替词频
优缺点
这些基于计数的方法在中小规模语料训练很快,有效地利用了统计信息。但用途受限于捕捉词语相似度,也无法拓展到大规模语料。
而NNLM, HLBL, RNN, Skip-gram/CBOW这类进行预测的模型必须遍历所有的窗口训练,也无法有效利用单词的全局统计信息。但它们显著地提高了上级NLP任务,其捕捉的不仅限于词语相似度。
Glove模型
从看了一些论文来说,好像这是一个套路,就是在别人的基础上往损失函数里面加东西,A有特性,则构造损失函数使B具有同样的特性,就将AB融合。
Glove模型就是这样提出一个损失函数:
J(θ)=12∑i,j=1Wf(Pij)(uiTvj?log?Pij)2J(\theta)=\frac{1}{2}\sum_{i,j=1}^W f(P_{ij})\left(u_i^Tv_j-\log P_{ij}\right)^2J(θ)=21?i,j=1∑W?f(Pij?)(uiT?vj??logPij?)2
源码剖析:
https://blog.csdn.net/weixin_36711901/article/details/78508798
公式推导:
https://blog.csdn.net/u014665013/article/details/79642083
优缺点
既然glove提出了考虑了共现矩阵,那么它就一定要比word2vec要好吗?谷歌一下,这是一个挺有趣的回答
存在的问题
我看不懂ui,vju_i,v_jui?,vj?是什么,是原始的向量吗?应该不是吧。
但是这句话怎么理解呢?
明眼人会发现这里面有两个向量u和v,它们都捕捉了共现信息,怎么处理呢?试验证明,最佳方案是简单地加起来:
Xfinal=U+VX_final=U+VXf?inal=U+V