原因:
- one-hot的余弦相似度没有意义
- 降维
原理:
- 挖掘预料中词汇出现顺序之间的关联,需要注意的是word2vec只关注上下文的关联性,对上下文中的顺序一视同仁。
类别:
- Continuous Bag of Words: 上下文 -> 自己
- Skip-Gram: 自己 -> 上下文(其实也等价于自己->整个句子,毕竟P(x∣x)=1)
Skip-Gram推导比较简单,据说性能也比CBOW好,此处就略过CBOW。
算法细节
首先定义词向量相似度为余弦相似度,假设词向量的模相同(起码随机初始化的情况下,模的范围差别不会太大),所以可以等价与算向量内积uoTvc
所以,就可以定义矩阵W,其中one-hot编码的词向量wTW=v
然后定义词汇之间的条件概率,给定wc的条件下wo发生的概率(其实就是先算余弦相似度然后连上softmax):
P(wo∣wc)=i∑euiTvceuoTvc
接下来,假设上下文的词汇相对于当前词汇条件独立:
P(wo1,wo2,…∣wc)=P(wo1∣wc)P(wo2∣wc)…
那么对语料库滑窗获取数据集,并最大化Skip-Gram概率:
t∏−m≤j≤m∏P(wt+j∣wt)
这里我没说j=0,因为当j=0时P=1,写不写都讲等价。
用极大似然法最大化这个概率,取对数后加负号,得到:
J=−t∑−m≤j≤m∑logP(wt+j∣wt)
logP(wo∣wc)=uoTvc−log(i∑eui⊤vc)
此处i是对所有词向量加和,每次算梯度要遍历所有词向量比较贵,所以用负采样(感觉也可以叫欠采样),上面的公式后面那项不是求与所有向量相似度之和,而是求随机n个向量相似度之和,渐进意义上是等价的(其实也不等价,还要乘上n_words/n)