对于词语的表示,最开始采用one-hot编码,用于判断文本中是否具有该词语;后来发展使用Bag-of-Words,使用词频信息对词语进行表示;再后来使用TF-IDF根据词语在文本中分布情况进行表示。而近年来,随着神经网络的发展,分布式的词语表达得到大量使用,word2vec就是对词语进行连续的多维向量表示。
区别于其它神经网络对词语embedding表示,Mikolov的word2vec非常漂亮,直接采用单层神经网络(或理解为sigmoid函数)对词语进行表示。具体的方法有两种CBOW和Skip-gram,具体模型结构如下:
CBOW是使用周边词语来预测当前词语出现的概率,而skip-gram是采用中心词语预测周边词语的概率。需要说明的是,当语料较少时使用CBOW方法比较好,当语料较多时采用skip-gram表示比较好。
本文具体描述skip-gram模型的原理与实现。假设给定一句话“中国 经济 近年来 发展 飞快”,skip-gram模型就是通过“近年来”预测其它周边词语的概率。模型的预测目标函数,就是使得中心词预测周边词的概率最大,具体数学表示为:
对于概率p的计算公式可以表示为:
当语料比较大时,词典规模会比较大,求softmax速度会变得很慢,严重影响了训练速度。此时有两种方法进行改进:(1)分层softmax; (2)负采样。分层softmax的原理很简单,就是构建Huffman树(使得计算概率的次数最小),正例词都在叶子结点,其他词为中间节点,分层进行softmax。负采样的思想也很简单,就是不计算所有词的概率算softmax,而是采样一些负样本,算对数sigmoid函数,近似softmax。具体原理就是最大化正例概率,最小化负例出现的概率。
根据上述公式,使用Pytorch进行模型实现,具体如下:
领取专属 10元无门槛券
私享最新 技术干货