什么是Word2Vec
将单词转换成向量,语义上相似的单词在一个多维空间距离很近
可以看看gensim包
Skip-Gram
给定input word来预测上下文
假设我们有一个句子:
The dog barked at the mailman
首先我们选取dog作为我们的输入词,然后设置skip_window为2,那么我们从dog左侧和右侧都取两个词,那么就是The,dog,barked,at
设置num_skips为2,我们会得到(dog,barked)和(The,dog)两组形式的训练数据
我们的模型会从每对单词出现的次数中学习出现的概率,比如我们的训练样本有很多(“Soviet“,”Union“)这样的样本对,那么输入Soviet,输出结果为Union的概率就会很高
但是,神经网络只能接受数值的输入,我们需要用数值来表示单词,比如我们可以从文档中抽取10000个词组成词汇表,使用独热编码,将每个单词都是10000维的向量
模型的输入是10000维的向量,那么输出包含了这10000个单词的概率大小:
最终的模型就是一个概率分布
隐层
假设我们想用300维的向量表示一个单词,那么隐层的权重矩阵位10000行,300列
经过神经网络的隐层计算,单词会从10000维的向量变成300维的向量
输出层
输出层是一个softmax回归分类器,输出0-1之间的概率
如果两个单词有着很相似的上下文,那么两个单词的嵌入向量也会很相似
高效训练
Word2Vec模型是一个超级大的神经网络,比如10000个词,300维,那么就有300万的权重
所以有了一些优化点
单词组合成词组
有些单词只有有组合在一起才有意义呢
对高频单词进行抽样
有些单词,比如the,for这种,在训练文本中到处都是,我们可以让the这种不在上下文窗口中出现
word2vec的C语言代码实现了一个计算在词汇表中保留某个词概率的公式
Z(Wi)表示某个单词在预料中出现的概率
我们可以看到,出现概率越小,保留的概率越大
负采样
负采样让每训练一个样本仅仅更新一小部分权重,而不是全部,可以降低计算量
负采样的思想特别简单,就是每次按照一定概率随机采样一些词当做负例,从而就只需要计算这些负采样出来的负例了
对于小规模数据集,选择5-20个negative words会比较好,对于大规模数据集可以仅选择2-5个negative words
我们的隐层-输出层拥有300 x 10000的权重矩阵。如果使用了负采样的方法我们仅仅去更新我们的positive word-“quick”的和我们选择的其他5个negative words的结点对应的权重,共计6个输出神经元,相当于每次只更新[公式]个权重。对于3百万的权重来说,相当于只计算了0.06%的权重,这样计算效率就大幅度提高