一、模型效果
给定一个句子,如“I love you very much”。假设中心词是love,通过这个模型可以输出"love"这个单词的上下文"I"和"you"的概率,当然这个上下文的窗口是可以自己指定的;
skip-gram模型的基础是神经网络,所以在不断迭代训练的过程中,神经网络中的权重矩阵会不断更新,当训练完成后,神经网络中输入层和隐藏层中间的权重矩阵多代表的就是语料库中每一个单词的低维向量表示。
二、模型的训练过程
至于skip-gram模型的更详细的原理,这里我不在做过多的赘述,网上有很多详细的介绍。我主要是想记录一下skip-gram模型的详细训练过程,包括输入是什么形式、输出是什么形式,更新的参数是什么等等。希望能够给想要开始学习skip-gram算法的同学一个感性的认识,之后再去理性的学习算法原理和代码实现。
模型总体上是一个三层的神经网络结构,包括输入层,输入层和隐藏层之间的权重矩阵,隐藏层,隐藏层和输出层之间的权重矩阵,输出层(需要softmax激活)。
1、首先skip-gram模型的输入层是 one-hot编码(至于什么是one-hot编码,自行百度即可),一个中心单词有几个上下文,batch就为几,即单词迭代输入的训练样本个数;
2、输入层和隐藏层之间的链路权重矩阵即为最后要得到的单词的低维向量表示,其中单词维度为隐藏层的维度。需要不断的通过反向传播更新权重矩阵的值;
3、隐藏层由输入层和权重矩阵计算得到,因为输入层为one-hot编码,编码中只有一个1,其余为0。如果是传统的逐行逐列相乘再相加这种矩阵计算的话,太耗时间,所以这里可以用tensorflow里面的查找索引方式计算(tensorflow中的lookup),加快速度;
4、隐藏层和输出层之间的链路权重矩阵没有什么代表意义,反向传播更新就完了;
5、输出层得到的向量是语料库中每一个单词是中心词的上下文的概率,由softmax函数计算而来。
softmax层的优化:
这里因为原始语料库通常是上百万甚至更多,如果计算每一个单词为中心词上下文的概率,并反向传播更新每一条链路权重,计算量太大太大。所以这里考虑的是采用负采样或者层次话softmax来计算速度。通常负采样用的比较多,主要是将多分类问题转化为二分类问题,只有正类和负类,其中正类是中心词的上下文单词,负类不属于上下文单词。这里要做的就是最大化正类,最小化负类。
在负采样中,1个正样本对应设定的K个负样本,所以模型一共由K+1个分类,对比之前将所有语料库中的单词进行softmax分类,负采样转化为了K+1个二分类问题,每次迭代训练的K+1个而不是上百万个,所以权重矩阵也只会更新一小部分,大大提高了计算速度。
而至于如何进行负采样,有现成的公式,自行百度即可。
6、有了softmax层的概率值向量,以及中心词的one-hot编码向量,就可以构造损失函数。可以采用交叉熵损失,也可以采用残差平方项。然后反向传播更新链路权重的值。
这样,模型训练完成后,就可以得到每一个单词的低维向量表示,然后可以通过余弦值来计算两个单词之间的相似度。
三、skip-gram的应用场景:
自然语言处理中,单词上下文的预测;
在图网络中,结合deep walk中进行节点的低维向量表示;
图网络中,进行链路预测和社区发现
当然应用场景应该还有很多。
四、源码链接:
链接:https://pan.baidu.com/s/1Nb81gam2awREPbVdIFBkkQ
提取码:xk6x