word2vec

一背景

word组成了句子,要想在文本上做一些研究或者工作,首先要解决的问题就是word的表示, word如"me", "I", "our"这些word, 直接使用就相当于特征定性类别的特征, 如果用one-hot表示word,由于词汇表中word的个数太大,所以一个word的向量长度太大。是否有一些其他的表示方法来表示word,一方面向量长度适中,另一方面相似word对应的向量页相似。

二word2vec

word的表示并不是专门的一个模型求取向量,该部分是模型中一个中间产物。

模型

如果输入层word的表示方法是one-hot形式,中间的就是各个word的向量表示, V代表词汇表中单词数目,N代表表示word向量的长度。 该部分类似于embedding的过程。因为是one-hot的表示,所以一个word对应W中的一行。

语言模型比较经典的有CBOW和Skip-gram

CBOW是拿一个词语的上下文作为输入,来预测这个词语本身。

CBOW模型

Skip-Gram:是用一个词语作为输入,来预测它周围的上下文

Skip-gram

三 Hierarchical Softmax

传统神经网络模型

在里面最大的问题是从隐藏层到输出的softmax层的计算量很大,因为要计算所有词的softmax概率,再去找概率最大的值。针对上面的传统神经网络模型,语言模型做了以下几点改变:

1. 对于从输入层到隐藏层的映射, 没有采取神经网络的线性变换加激活函数的方法,而是采取简单的对所有输入词向量求和并取平均的方法。

2. 从隐藏层到输出的softmax层这里的计算量进行改进,为了避免计算所有词的softmax概率, word2vec采样了霍夫曼树来代替从隐藏层到输出softmax层的映射。

霍夫曼树应用

霍夫曼树的所有内部节点就类似之前神经网络隐藏层的神经元,其中,根结点的词向量对应我们的投影后的词向量, 而所有叶子节点就类似于之前神经网络softmax输出层的神经元, 叶子节点的个数就是词汇表的带下。在霍夫曼树中,隐藏层到输出层的softmax映射不是一下子完成的,而是沿着霍夫曼树一步步完成的,因此这种softmax取名叫做"Hierarchical softmax"。

如何沿着霍夫曼树一步步完成? 在word2vec中,采用了二元逻辑回归的方法,即规定沿着左子树走,那么就是负类(霍夫曼编码1), 沿着右子树走,那么就是正类(霍夫曼树编码0)。判定正类和负类的方法是使用sigmoid函数。

这样做的好处在于:

1. 由于是二叉树,之前计算量为V,现在变成了。

2. 由于使用霍夫曼树是高频的词靠近树根,这样高频词需要更少的时间会被找到,这符合我们的贪心优化思想。

3. 容易理解,被划为为左子树而成为负类的概率为。控制谁的概率值大的因素一个是当前节点的词向量,另一个是当前节点的模型参数。

四 基于Negative Sampling

上一节中讲解了Hierarchical Softmax。列举对应的优缺点

1. 使用霍夫曼树来代替传统的神经网络,可以提高模型训练的效率。

2. 如果中心词是一个很生僻的词,那么就得在霍夫曼树中辛苦的向下走很久。

针对以上的优缺点, 生成一种通过负采样的方法的word2vec模型的方法。

比如我们有一个训练样本,中心词是w,它周围上下文共有22c个词,记为()context(w)。由于这个中心词w,的确和()context(w)相关存在,因此它是一个真实的正例。通过Negative Sampling采样,我们得到neg个和w不同的中心词,=1,2,..wi,i=1,2,..neg,这样()context(w)和wi就组成了neg个并不真实存在的负例。利用这一个正例和neg个负例,我们进行二元逻辑回归,得到负采样对应每个词wi对应的模型参数θi,和每个词的词向量。

副采样也是采用了二元逻辑回归来求解模型参数,通过负采样,我们得到了neg个负例, 。将正例定义为。

在逻辑回归中:正例满足条件:

                        

负例满足调价:

             

目标函数:

                

对应的对数似然函数

                        

参考链接:word2vec

你可能感兴趣的:(word2vec)