官网地址:https://code.google.com/archive/p/word2vec/
论文地址:https://arxiv.org/pdf/1301.3781.pdf
我觉得原理讲的比较好的:word2vec原理(一) CBOW与Skip-Gram模型基础 - 刘建平Pinard - 博客园
最近发现学习知识还是尽量找官网的解释,比较全,别人讲过的会帮助你理解,但是会漏掉一些知识
word2vec是训练词向量的一款非常好用的工具,由谷歌发明,主要有:
1.2种模型: cbow(连续词袋模型)和skip-gram(跳字模型)
2.2种近似训练的方法:层次softmax和nagative_sampling(负采样)
CBOW:输入特定词的上下文向量,输出是所有词的softmax的概率,训练的目标是使得特定词的softmax概率最大
Skip-Gram:输入特定词,输出是所有词的softmax概率,训练目标是使得特定词上下文的对应的词的出现概率最大
Word2vec实际上是一个浅层的神经网络,由输入层-隐藏层-输出层构成,输出层本来的目标是特定词的softmax概率,如果不加以优化,复杂度是V(词汇表大小),复杂度相当高,所以Word2vec提出了2种近似的训练办法,用以提升训练速度
1.Hierarchical Softmax
输入层到隐藏层,使用的是所有输入向量求和并取平均。而在隐藏层-输出层,则是构建了一颗霍夫曼树来替代隐层到输出层的映射,根节点的词向量对应着我们投影后的词向量,树的内部节点就相当于是所有隐藏层的神经元,而树的叶子节点就相当于是softmax输出层的神经元,树的叶子节点的大小就是词汇表的大小V。
映射不是一下子完成的,而是沿着树节点一步步完成的,所以也叫做层次softmax。
具体是使用逻辑回归,用词向量和树的内部节点的参数,计算出往左还是往右走的概率,目标就是找到合适的所有节点的词向量和所有内部节点θ, 使训练样本达到最大似然
使用梯度上升进行优化
优点:将复杂度从V降低到了log2(V),且满足贪心的优化思想,越常出现的词汇,越靠近根节点
cbow:对2c个输入进行迭代
skip-gram:对2c个输出进行迭代
2.Nagative Sampling
hs的缺点是:虽然极大地提升了效率,但是如果是一个生僻词,那么需要向下走很久,所以采用ns来求解
取一个中心词作为正例,neg个采样出来的词作为负例,通过二元逻辑回归,得到每个词的词向量和对应的参数
如何采样?
按照每个词出现的频次,取四分之三次幂,得到每个词的出现的概率,按照这个概率来采样。(其实是概率*M,其中 M>>V,将1等分成M个线段,每个词汇根据自己的概率得到对应的长度,采样的到哪段就取对应段的词汇作为负例)
为什么取四分之三?
作者有说是实践的效果更好,不过可以想象下四分之三次幂的曲线,对于罕见词而言,概率变化不大,而对常见词,下降的比较明显,可以降低常见词被抽取到的频次。
1.结构:skip-gram (慢,但对罕见词效果更好) vs CBOW (fast)
2.训练方法:hierarchical softmax (对罕见词效果更好) vs negative sampling (对常见词效果更好,对低维度的词效果更好)
3.sub-sampling(下采样):在大数据集上,可以提升准确度和训练速度,1e-3 to 1e-5
4.维度:一般是越大越好,(也有可能会有反例)
5.窗口大小:skip-gram:10左右,cbow:5左右
所以如果要追求速度的话:CBOW+nagative sampling
要追求罕见词的表现的话:skip-gram+ hierarchical softmax
预训练的词向量
GoogleNews-vectors-negative300.bin.gz.
https://drive.google.com/file/d/0B7XkCwpI5KDYNlNUTTlSS21pQmM/edit?usp=sharing
如何衡量准确率:
./demo-word-accuracy.sh
词聚类:
./demo-classes.sh
从词到词汇(我理解是组合词)
./demo-phrases.sh
词的类比关系:
demo-analogy.sh