Word2vec算法优化
J(θ): 损失函数
问题:进行每个梯度更新时,都必须遍历整个语料库,需要等待很长的时间,优化将非常缓慢。
解决:不用梯度下降法,用随机梯度下降法 (SGD)。
减少噪音,做得更好,也可以更快的计算。
词向量的随机梯度
我们只更新实际出现的向量(当前中心词和上下文)
Word2vec算法:更多细节
为什么需要两个向量表示一个词:
- 更容易优化,最后取平均最终表示词
- 可以只用一个向量,不过做微分复杂很多
Word2vec算法实际是一个算法家族
- Skip-grams (SG) (更常用,合理自然)
- Continuous Bag of Words (CBOW)
目前介绍的都是简单的 softmax等式来训练
更有效的训练方法:负采样(SGNS)
Skip-grams负采样
目标函数
我们希望中心词和真实上下文词的向量点积最大,中心词和随机词的向量点积最小。
k是我们负采样的样本数目(随机采样的数量)
unigram分布是 单词在语料库中实际出现的频率。
(10000个词出现50次 => 50/10000)
Why not capture co-occurrence counts directly?
共现矩阵,将单词表示为共现向量(单词之间共同出现的次数)
两种方式实现共现矩阵:
- windows:与Word2vec类似,在每个单词周围都使用window。捕获了位置和一些更细微的句法和近似语义。
- full document:将窗口大小设置为段落大小或整个网页,并计算其中的共现。经常用于信息检索(潜在的语义分析)
第一种方法:Dimensionality Reduction on X (SVD)
为了得到低维度的词表示。
它能够在给定的维度内,尽可能的恢复到原始的共现矩阵。
问题:
最终得到的单词计数不是正态分布的。因为有大量的常用词和稀有词。
第二种方法:Hacks to X
按比例调整计数,处理词频较高的问题。
对原始计数取log/限制最大计数/扔掉虚数
接下来运行SVD来获得更有用有效的词向量。
总结
两种词向量表示方法:
- 共现矩阵,然后使用线性代数方法(SVD)
(问题:词之间没有意思层面的联系,只是相似性;过分重视大计数) - 随机初始,然后使用迭代神经网络更新算法(梯度下降法 负采样)
(问题:语料库很大,分母太难计算;没有有效利用数据)
Glove:将两种表示方法结合起来 => 在神经网络中使用计数矩阵
|||
V
向量差异的编码意义
关键思想:共现概率的比值可以对meaning component进行编码
重要的不是单一的概率大小,而是他们的比值,蕴含着meaning component。
ice 和 solid 共现的概率是 P 1 = 1.9 × 1 0 − 4 P1 = 1.9 \times 10 ^ {-4} P1=1.9×10−4
steam 和 solid 共现的概率是 P 2 = 2.2 × 1 0 − 5 P2 = 2.2 \times 10 ^ {-5} P2=2.2×10−5
ice和solid共现概率 和 steam和solid共现概率 的比值是 P 1 P 2 \frac{P1}{P2} P2P1