1.词向量
本节通过word2vec学习词向量。word2vec模型背后的基本思想是对出现在上下文环境里的词进行预测。对于每一条输入文本,我们选取一个上下文窗口和一个中心词,并基于这个中心词去预测窗口里其他词出现的概率。因此word2vec模型可以方便地从新增语料中学习到新增词的向量表达,是一种高效的在线学习算法( online learning word2vec的主要思路:通过单词和上下文彼此预测,对应的两个算法分别为:
1.Skip- grams(SG):预测上下文
2. Continuous Bag of Words(CBOW):预测目标单词
2.Skip-grams原理和网络结构
Word2Vvec模型实际上分为了两个部分,第一部分为建立模型,第二部分是通过模型获取嵌入词向量Word2Vvec的整个建模过程实际上与自编码器(auto- encoder)的思想很相似,即先基于训练数据构建一个神经网络,当这个模型训练好以后,我们并不会用这个训练好的模型处理新的任务,我们真正需要的是这个模型通过训练数据所学得的参数,例如隐层的权重矩阵一一后面我们将会看到这些权重在Word2vec中实际上就是我们试图去学习的“ word vectors”。
2.1 Skip-grams过程
假如我们有一个句子“ The dog barked at the mailman”
1.首先我们选句子中间的一个词作为我们的输入词,例如我们选取“dog’”作为 nput word
2.有了 input wordl以后,我们再定义一个叫做 Iskip window的参数,它代表着我们从当前 input word的一侧(左边或右边)选取词的数量。如果我们设置 skip window=2,那么我们最终获得窗口中的词(包括 input word在内) 就是[The,‘dog’, barked ’ at] skip window=2代表着选取左 input word左侧側2个词和右側2个词进入我们的窗口,所以整个窗口大小span=2x2=4。另一个参数叫 num skips,它代表着我们从整个窗口中选取多少个不同的词作为我们的 output word,当 skip window=2, num skips=2时,我们将会得到两组( input word, output word)形式的训练数据,即(dog," barked),(dog’,'the)。
3.神经网络基于这些训练数据将会输出一个概率分布,这个概率代表着我们的词典中的每个词作为 input wordi的output word的可能性。这句话有点绕、我们来看个例子。第二步中我们在设置 skip window和 num skips=2的情况下获得了两组训练数据。假如我们先拿一组数据(dog, barked)来训练神经网络,那么模型通过学习这个训练样本,会告诉我们词汇表中每个单词当’dog作为 input word时,其作为 output word的可能性也就是说模型的输出概率代表着到我们词典中每个词有多大可能性跟 input wordl同时出现。例如:如果我们向神经网络模型中输入一个单词 Soviet"、那么最终模型的输出概率中,像 Union”’,’ Russia这种相关词的概率将远高于像” watermelon," kangaroo“非相关词的概率。因为" Union’“," Russia在文本中更大可能在" Soviet’的窗口中出现。
我们将通过给神经网络输入文本中成对的单词来训练它完成上面所说的概率计算。下面的图中给出了一些我们训练样本的例子。我们选定句子 The quick brown fox jumps over lazy dog’,设定我们的窗口大小为2( window_size=2),也就是说我们仅选输入词前后各两个词和输入词进行组合。下图中,蓝色代表 input word 方框内代表位于窗口内的单词。
我们的模型将会从每对单词出现的次数中习得统计结果。例如,我们的神经网络可能会得到更多类似(“ Soviet“、" Union“)这样的训练样本对,而对于(’ Soviet," Sasquatch“)这样的组合却看到的很少。因此,当我们的模型完成训练后,给定一个单词’ Soviet作为输入,输出的结果中" Union’或者’ Russia“要比’ Sasquatch“被赋予更高的概率
PS: input word和 output wordi都会被我们进行one-hot编码。仔细想一下,我们的输入被one-hot编码以后大多数维度上都是0(实际上仅有一个位置为1),所以这个向量相当稀疏,那么会造成什么结果呢。如果我们将一个1x10000 的向量和10000x300的矩阵相乘,它会消耗相当大的计算资源,为了高效计算,它仅仅会选择矩阵中对应的向量中维度值为1的索引行
2.2 Skip-grams训练
由上部分可知,Word2vec模型是一个超级大的神经网络(权重矩阵规模非常大)。例如:我们拥有10000个单词的词汇表,我们如果想嵌入300维的词向量,那么我们的输入-隐层权重矩阵和隐层输出层的权重矩阵都会有10000x 300=300万个权重,在如此庞大的神经网络中进行梯度下降是相当慢的。更糟糕的是,你需要大量的训练数据来调整这些权重并且避免过拟合。百万数量级的权重矩阵和亿万数量级的训练样本意味着训练这个模型将会是个灾难。
解决方案:
1.将常见的单词组合( word pairs)或者词组作为单个“ words”来处理
2.对高频次单词进行抽样来减少训练样本的个数
3.对优化目标采用’ negative sampling"方法,这样每个训练样本的训练只会更新一小部分的模型权重,从而降低计算负担