word2vec中的数学原理

文章主要是为了今后回顾自己所学,多为总结他人经验所得。

CBOW模型的网络结构包括三层:输入层、投影层和输出层。和神经概率语言模型相比,他没有了隐藏层。且其投影层是将输入层的向量做求和累加而不是拼接。另外一个特殊之处在于,其输出层是树形结构(Haffman树)而不是线性结构。

然后我们说一下它的输出层。输出层对应的是一颗二叉树,它以语料中出现过的词当叶子节点,以各词在语料中出现的次数当权值构造出来的树。

一般来说,用n(n>0)个带权值的叶子来构造二叉树,限定二叉树中除了这n个叶子外只能出现度为2的结点。那么符合这样条件的二叉树往往可构造出许多颗,其中带权路径长度最小的二叉树就称为哈夫曼树或最优二叉树。根据定义,一棵二叉树要使其WPL值最小,必须使权值越大的叶子结点越靠近根结点,而权值越小的叶子结点越远离根结点。

在word2vec中,适合利用投影向量x以及输出层Huffman树来定义条件概率函数p(w|Contex(w))的呢?

实际上我们从根节点出发,将每一个分支的判断都视为做了一次二分类问题。碰巧除根节点外,树中每个结点都对应了一个取值为0或1的Huffman编码。因此,我们可以将编码为1的结点定义为负类,编码为0的结点定义为正类。也就是说,将一个结点进行分类时,分到左边就是负类,分到右边就是正类。

这里的\theta即为每个Huffman结点所对应的向量,即当x遇到此结点后,通过上式计算其属于正负类的概率,然后分到下一个节点再继续重复此步骤。

接下来就是对似然函数进行优化,使其最大化。word2vec采用的是梯度上升法。

 这里我们注意到,针对w的每一个结点处的损失,对其上一个结点求偏导,然后更新其上一个结点所对应的向量。

 

 

这里我们注意到,针对每一个词w,我们更新的仅是其对应的上下文的词向量,并且梯度考虑的是把所有结点对x的梯度累加并贡献到Context(w)中每一个词的词向量上。

 

2.skip-gram模型

从直观上理解,Skip-Gram是给定input word来预测上下文。刚开始我不理解这个模型,因为对于相同的输入,我们会有多个不同的输出,那么此时的\theta会一直变动,那这个模型最终的作用在哪呢?后来经过查看多个资料,我才明白,这个模型对于我们而言其实并不重要,我们并不会用这个训练好的模型去处理新的任务,我们真正需要的是这个模型通过训练数据说学得的参数x,建模并不是我们最终的目的。弄明白这点,那么其他的就都很好理解了,因为Skip-Gram实际上与CBOW没有太大的差别。

 

 

 

 

正常情况下,对于每一个样本(w,context(w)),我们是在给定w的情况下,计算每一个u属于context(w)以及其负采样的条件概率的乘积,而源码中将context(w)拆成一个一个来考虑,实际上是计算了在给定w及其负采样的情况下,计算真实的u的条件概率的乘积。

 

需要注意的是,构建词典D时,其中包含一个特殊的词</s>,他被放在词典的第一个位置上。它代表语料中出现的换行符。作用主要是用来判别一个句子的结束。

word2vec中,有对语料中的低频词和高频词都进行一些特殊处理。

对于低频词,有一个min_count参数可以过滤掉在语料中出现次数小于该阈值的词,此外,也可以通过预先设定阈值参数min_reduce来根据词典当前的规模来决定是否需要对词典中的低频词进行清理。

对于高频词,因为模型训练是以行为单位进行的,那么高频词在众多样本上会进行多次训练,但不会发现显著的变化,并且提供的有用信息较少。因此,提出了一种子抽样的技巧,可以用来提高训练速度(提高2~10倍,并且可提高那些相对来说词频没那么高的词的词向量精度)。主要是通过给定一个词频阈值t,将那些满足f(w)>t的所谓的高频词以prob(w)的概率被舍弃。但实际中,Word2vec是计算ran的值,然后产生一个(0,1)之间的随机数r,若r>ran,则舍弃词w。

源码中对于学习率也用到了自适应技术,每处理完10000个词,则对学习率进行一次调整,可以看到学习率随着训练的进行二逐渐变小,且趋于0.但是学习率也不能过小,因此,源码中加入了一个阈值,一旦学习率低于此阈值,则将学习率固定为阈值。

窗口及上下文:

模型训练每次就是处理一个句子,利用特殊词</s>进行分割。但句子若是过长,则通过参数max_sentence_length强行截断。而对于context(w),文中描述的是取其前后各c个词,但是实际是通过一个窗口阈值参数window,每次构造context(w)时,首先生成区间[1,window]上的一个随机整数u,w前后各取u个词构成context(w)。

 

投影方式上采用直接累加的方式比起首尾相接除了所得向量更短外,还有一个好处就是对于处于一句话的首尾的某些词,其前后词的个数可能不够窗口数,此时则需要补充填充向量,但直接相加就没有这个问题。

 

神经网络模型中采用的是零初始化,而后者采用的是随机初始化。

展开阅读全文

没有更多推荐了,返回首页