word2vec中数学原理详解以及原理思考

            很久没有写博客了,也没有写过相关总结。最近,工作中又开始用到了word2vector,正好就做个相关总结。这方面相关的博客有很多,我看过的讲的最清楚的就是@peghoty的博客。

要理解wordvector的原理,有些知识还是需要提前了解一下。

预备知识:http://blog.csdn.net/itplus/article/details/37969635

背景知识:http://blog.csdn.net/itplus/article/details/37969817 ,这里要着重去理解统计语言模型,n-gram模型和神经概率语言模型。

建议看一下预备知识和背景知识。

本博文前半篇幅主要借助@peghoty的博客讲解数学原理,后半篇幅主要讲一些总结和本人对word2vec的一些思考。

             词向量的训练主要有两个具体的模型——CBOW(Continuous Bag-of-Wods Model)模型和Skip-gram(Continuous Skip-gram Model)模型。关于这两个模型,大神Tomas Mikolov 给出了如图1和图2 所示的示意图。

图1 CBOW模型 图2 Skip-gram模型

从示意图可知,两个模型都包含三层:输入层、投影层和输出层。CBOW是在一直当前词Wt的上下文W(t-2),W(t-1),W(t+1),W(t+2)的前提下预测当前词Wt;Skip-gram与其正好相反。

对于CBOW和Skip-gram两个模型,word2vector给出了两套框架(即由于词向量学习最初的设计方案存在很大的效率问题,而衍生出来的两个优化方案),分别是Hierarchical Softmax和Negative Sampling。

接下来的关于CBOW和Skip-gram的详细讲解,转自@peghoty。

关于CBOW模型和Skip-gram模型的理解与总结(以下均为个人理解,由于知识限制,可能存在错误,欢迎批评指正!):

1、先来谈一些依赖Huffman树的HS方案,抛开公式,如果让我们来设计这个方案的话我们会怎么做?即、摆在我们面前的只有一批语料,如何利用这批语料来构建一个神经概率语言模型并得到附产物词向量?

a、对这批语料进行词频统计并构建Huffman树,一旦语料固定了,那么此刻该Huffman树就固定了。(接下来就是怎么用这棵树?)

b、先以CBOW模型为例,从语料中我们可以获得训练样本(context(w),w)。此时要注意,训练样本(context(w),w)虽然可以理解为带标签样本,但目标函数是最大化对数似然,标签是什么并不重要,只需要知道给定context(w),最大化得到w的概率就行。(样本就这样构建好了)

c、接下来看一下这棵Huffman树,每个叶子节点都是词典中的一个词w,其中还有非叶子节点,它们表示什么不用关心。该Huffman树已经固定,依据极大似然估计的思路,此时的目标转换为利用训练样本来计算构建给定Huffman树的极大似然估计,即最大可能的去逼近这课依据词频构建的Huffman树。(生成这棵树就是为了和样本建立关系,那么如何逼近?)

d、从这棵树中我们可知,每个词w都有且只有一个从根节点到该叶子节点的唯一路径。通过这条路径来构建context(w)和w的关系。步骤b中提到给定context(w)要最大化得到w的概率,对应到树中就是当根节点是context(w)时,最大化找到这条正确的路径的概率,即去逼近每个w(叶子节点)的唯一路径。Huffman树是一棵二叉树,在每个非叶子节点上做方向选择时,最大概率的去选择正确路径的方向,此时,逼近唯一路径的过程变成了一个分层二分类的过程(即HS的思想)。此时,正负类的概念,正确的路径方向是正类,相反的路径方向是负类,那么在每个非叶子节点上只需要利用sigmoid函数做一个二分类即可。

OK,思路就是这么简单,说白了就是,一开始你只有样本,那没办法构建模型,也没办法训练啊,怎么办?于是用语料得到一个固定树,此时思路就来了,用样本去逼近这棵树。那怎么训练呢?因为树是二叉树,正确的路径方向为正,错误的方向为负,那正负样本不就有了嘛,于是就可以训练了,极大似然估计就能搞定。

Skip-gram模型,同理。

另外,负采样优化方案也是这样,一开始只有样本,只是换了一个构建模型的方案。什么方案呢?因为咱们利用sigmoid函数,那就要让样本有正类有负类,那怎么让它有正类有负类呢?此时,可以把(context(w),w)当做正样本,w为正类标签。负样本从何而来,那就需要负采样了,通过负采样来采样除w以外的词!w,那(context(w),!w)就构成了负样本了,!w就是负类标签。这样正负样本都有了,就可以利用最简单的极大似然估计去训练了。

总结:

1、两个模型优劣比较:CBOW模型训练速度快;而Skip-gram训练速度相对较慢,对罕见字有利,总体效果相对较好。Skip-gram比CBOW慢的原因就不解释了,看公式就明白了。只说一下,为什么Skip-gram对罕见字有利?原因是对单个词w来讲,假设窗口大小是c,那么在一次迭代中,w的词表示会被单独修正2c次,而在CBOW中,w的词表示虽然也会被修正2c次,但是每次修正都是将残差平均到多个词上再去修正w。

2、两个优化方案优劣比较:HS对罕见字有利;而负采样对常见词和低维向量有利。HS对罕见字有利的原因是罕见字的路径长度更长,可以对比深度学习中的网络层数越多效果相对越好。而负采样对常见词有利原因是常见词以更大的概率被选中,更高频的参与了训练。

猜你喜欢

转载自blog.csdn.net/wuxiaosi808/article/details/82116060