再谈word2vec

word2vec是Google于2013年开源推出的一个用于获取word vector的工具包,已经有7年的历史了。随着技术的不断更新迭代,word2vec渐渐淡出了从业者(尤其是“后浪”们)的视线。然而,作为曾经借用word2vec做语义提取并取得比较理想效果的小白,还是想详细的介绍下经典算法。
word2vec包括两种模型CBOW(Continuous Bag of words Model)和skip-gram(Continuous Skip-gram Model).前者是通过上下文context(w)来预测中心词w,后者则是通过中心词w来预测上下文context(w)。以上两种模型均可通过层级softmax 和负采样的结构实现。
那么这里就会有个问题:直观地,CBOW多个输入对对一个输出,Skip-gram则是一个输入对多个输出,是既然可以通过相同的结构来实现,那么如何做到统一呢?
其实很简单,在实现CBOW时,会有一个“映射层”,将上下文的词向量做累加求和操作,这样就把“多对一”转化了“一对一”。对于Skip-gram,通过在似然函数中用多对“一对一”的连乘实现“一对多”。

那么我们弄清楚了输入输出层,接着来要解决的就是数据具体的训练过程。接下来我们重点关注下具体实现细节。

  • 层级softmax
    再谈word2vec

基于词频建立哈夫曼树是层级softmax结构中最重要的一部分(如图所示)。字典中的所有词分布在叶子结点上,某个词训练数据时的“走”的网络结构,其实就是根节点到叶子结的路径。期间经过的那个非叶子结点都是sigmode,雷同LR的目标函数,层级softmax 的似然函数如下,
再谈word2vec

  • 负采样

相较于层级softmax,负采样没有复杂的网络结构,取而代之的是使用负样本来进行训练。那么何为负样本?假设目标词是w,也其它词则为w的负样本。可是这样就会使得负样本量巨大,所以我们需要进行采样。
众所周知,任何语料库中词汇都会有高低频之分,即词典中的所有词并非均匀分布,若随机采样,高频词会以大概率出现在负样本中。为避免这个问题,我们将词频做归一化(如下公式),从而进行加权采样。
采样具体操作如下:
再谈word2vec
得到采样的负样本,那么就可以得到似然函数如下:
再谈word2vec

更多内容,欢迎关注“机器爱学习”公众号~