一个简单但难以超越的sentence embedding基线方法
词向量->句向量
从而用于文本分类,情感分析等
词袋模型
v(“natural language processing”) =
1/3 (v(“natural”) + v(“language”) + v(“processing”))
从词袋模型到更复杂的模型
Bag-of-words -> CNN,RNN
本文思想
一种非常简单的无监督算法,加权Bag-of-words并且移除特定方向
第一步,对句子中的每个词向量,乘以一个独特的权值。这个权值是一个常数αα除以αα与该词语频率的和,也就是说高频词的权值会相对下降。求和后得到暂时的句向量。
然后计算语料库所有句向量构成的矩阵的第一个主成分uu,让每个句向量减去它在uu上的投影(类似PCA)。
概率原理解释
其原理是,给定上下文向量,一个词的出现概率由两项决定:作为平滑项的词频,以及上下文:
其中第二项的意思是,有一个平滑变动的上下文随机地发射单词。
词向量的深究
word2vec的主要思想
遍历语料中的所有单词
预测中心词的上下文单词
在每个窗口下使用SGD进行更新迭代
梯度下降在词向量中方法中的问题
每个滑动窗口仅有2m+1个单词,所以梯度向量非常稀疏
每次迭代仅需要更新那些出现过的单词
word2vec的练习中的实现
对所有单词进行softmax分类计算量过大
在练习中采用skip-gram模式和负采样的方法进行训练
在文章““Distributed RepresentaRons of Words and Phrases
and their ComposiRonality”中,代价函数为:
P(W)是一个unigram分布http://www.hankcs.com/nlp/word2vec.html#h3-12,对其取3/4次方,可以使得常见词采样次数变少,稀有词采样次数变多,“劫富济贫”
word2vec小结
遍历语料中的所有单词
预测每个单词的周边单词
在每个时刻对共现单词进行捕获
为什么不在捕获共现单词的同时捕获其次数呢?
其他方法
基于窗口的共现矩阵
例如,
I like deep learning.
I like NLP.
I enjoy flying.
以共现窗口为1,则共现矩阵如下
共现矩阵的一些问题:
- 增加了词汇的维度,需要很多的存储空间
- 出现新词的话,旧向量维度需要改变
- 高稀疏性
解决方案
采用更低纬度的方法来进行矩阵表示:SVD?
更进一步的改进:
限制高频词,停用词
根据与中央词的距离衰减词频权重
用皮尔逊相关系数代替词频
SVD的一些问题:
计算复杂度高,O(mn)
不方便处理新文档
与其他DL模型的训练套路不一致
Glove方法
综合了划窗方法word2vec和统计信息LSI的特点的方法
Glove的代价函数为
Pij代表了两个单词出现的频次,F是一个上限函数
该方法的优点是训练快,可以扩展到大规模预料,也适用于小规模的语料
代价函数中存在向量u和v,最后的结果向量是将二者求和得到最终词向量
相对于word2vec关注窗口内的共现,Glove方法关注了全局信息(频数)
评测方法
有两种方法:Intrinsic(内部) vs extrinsic(外部)
Intrinsic:专门设计单独的试验,由人工标注词语或句子相似度,与模型结果对比。好处是是计算速度快,但不知道对实际应用有无帮助。
Extrinsic:通过对外部实际应用的效果提升来体现。耗时较长,不能排除是否是新的词向量与旧系统的某种契合度产生。需要至少两个subsystems同时证明。这类评测中,往往会用pre-train的向量在外部任务的语料上retrain。
各种评测结果详PPT。