Word2vec训练速度优化技巧
Word2vec是一种常用的词嵌入技术,它通过训练神经网络来将词语映射到连续的向量空间中。在实际应用中,尤其是处理大规模语料库时,Word2vec的训练速度优化显得尤为重要。以下是几种常用的优化技巧:
Softmax)
原始的Word2Vec使用softmax得到最种的词汇概率分布,但由于词汇表往往包含上百万个单词,如果针对输出中每一个单词都要用softmax计算概率的话,计算量是非常大的。为了解决这个问题,Mikolov等人提出了分层softmax(Hierarchical
Softmax)方法。这种方法使用一颗二叉树来得到每个单词的概率,被验证的效果最好的二叉树类型就是霍夫曼树。叶节点与单词表中V个单词一一对应,出现频率高的单词霍夫曼编码就短,更加靠近根节点。原来的Word2Vec模型结构会被改变,隐藏层后直接和霍夫曼树中每一个非叶节点相连,然后再每一个非叶节点上计算二分概率,这个概率是指从当前节点随机游走的概率,可以任意指定是向左游走的概率,还是向右游走的概率。从根节点到目标单词的路径是唯一的,将中间非叶节点的游走概率相乘就得到了最终目标单词的概率。这样只用计算树深度个输出节点的概率就可以得到目标单词的概率。
Sampling)
负采样(Negative
Sampling)是另一种常用的优化技巧,它是为了提高训练速度并改善所得词向量的质量。与分层softmax相比,负采样不再采用复杂的霍夫曼树,而是利用相对简单的随机负采样。针对一个样本(WI,W),负采样的目标函数如下所示:现在的目标就是利用logistic
regression,从带有噪声(负样本)的目标中找到正样本(Wo),其中K是负样本采样的数量。作者指出在小训练集上,k取520比较合适;大训练集上k取25即可。和SGD的思想非常像,不再是利用所有的负样本进行参数的更新,而是只利用负采样出来的K个来进行loss的计算,参数的更新。
of
Frequent
Words)
在大语料集中,像the,
a,
in之类的单词出现频率非常高,几乎是很多单词的上下文,造成其携带的信息非常少。对这些单词进行下采样不仅可以加快训练速度还可以提高低频词训练词向量的质量。其中f(wi)是单词wi出现的频率,t凭经验值取10的5次方。该公式保证出现频率超过t的单词将被下采样,并且不会影响原有的单词的频率相对大小(rank)。先生成(target,
context),比如(love,[I,
China]),然后依次遍历他们,小于P(wi)的训练样本将被从训练样本中去掉。
词组并不能简单的将单词分开解释,而是应该看做一个整体,例如“New
York”。把这样的词组看成是一个整体,用特殊的符号代替不会过多的增加词汇表的大小,但效果是很显著的。
通过上述优化技巧的应用,可以在很大程度上提高Word2vec的训练速度,使其能够在大规模语料库上进行高效训练。