谈谈谷歌word2vec的原理

word2vec

在NLP领域中,为了能表示人类的语言符号,通常会把这些符号转成一种数学向量形式以方便处理,咱们把语言单词嵌入到向量空间中就叫词嵌入(word embedding)。谷歌开源的word2vec则是这么一种词嵌入工具,它能生成词向量,经过词向量能够很好地度量词与词之间的类似性。word2vec采用的模型包含了连续词袋模型(CBOW)和Skip-Gram模型。经过它能够在大数据量上进行高效训练从而获得词向量。html

n-gram语言模型

在讨论词向量时先看NLP中很重要的统计语言模型,简单来讲就是计算某个句子出现的几率,好比“我今天上班迟到了”这句话在整个语言下的几率,通常咱们会经过一个大的语料库来进行统计。算法

用数学语言来描述,假设咱们的句子为bash


,则该句子的几率为

其中P(w1)表示第一个词w1出现的几率;P(w2|w1)是第一个词出现的前提下第二个词出现的几率;以此类推。好比s=“我今天上班迟到了”,那么P(s)=P(我)P(今天|我)P(上班|我,今天)P(迟到了|我,今天,上班)。网络

上面的语言模型的参数空间太大并且数据稀疏,致使在实际中基本没法使用。因此咱们须要一个假设,某个词出现的几率只与它前面的一个或几个词有关,这个假设就是马尔科夫假设。有了它问题就变简单了,某个句子出现的几率就能够用下面表示(这里假设某词只与前面一个词相关)。分布式

n-gram这种处理序列信息的方式依然存在局限性,好比当n大于3时基本就没法处理了,参数空间太大。另外它不能表示词与词之间的关联性。因而咱们看下另一种语言模型——神经网络语言模型,虽然它并不能彻底解决n的问题,但它提供了另一种语言模型思路。实际上,在深度学习中有另外的处理方式,好比RNN、LSTM等,能够克服n-gram中n没法取太大(即没法关联距离较远的词)的缺点。函数

one-hot形式的词向量

在继续了解神经网络语言模型以前咱们先看怎么用向量来表示词,前面咱们说过词向量就是用来表示人类语言的一种数学化的方式,其包含了不少种表示方式。其中最简单的向量方式便是one-hot形式。工具

它的处理方式简单粗暴,通常就是统计词库包含的全部V个词,而后将这V个词固定好顺序,而后每一个词就能够用一个V维的稀疏向量来表示,向量中只有在该词出现的位置的元素才为1,其它元素全为0。好比下面这几个词,第一个元素为1的表示中国,第六个元素为1的表示美国,第五个元素为1的表示日本。学习

中国 [1,0,0,0,0,0,0,0,0,……,0,0,0,0,0,0,0]
美国 [0,0,0,0,0,1,0,0,0,……,0,0,0,0,0,0,0]
日本 [0,0,0,0,1,0,0,0,0,……,0,0,0,0,0,0,0]复制代码

从中能够看到one-hot形式的维数一般会很大,由于词数量通常在10W级别,这会致使训练时难度大大增长,形成维数灾难。另外这么多维只以顺序信息而且只用1和0来表示单词,很浪费空间。再一个是这种方式的任意两个词都是孤立的,无法看出两个词之间的类似性。因而看看有没有改进的方法。大数据

分布式词向量

鉴于one-hot形式词向量的缺点,出现了另一种词向量表示方式——分布式词向量(distributed word representation)。 分布式词向量则干脆直接用普通的向量来表示词向量,而元素的值为任意实数,该向量的维数能够在事前肯定,通常能够为50维或100维。这时的词向量相似以下(这里假设用5维来表示):优化

中国 [1.25, 0.2, 0.3, 0.5, 0.6]
美国 [0.1, 0.3, 0.5, 0.1, 1.5]
日本 [2.2, 0.2, 0.4, 0.6, 1.0]复制代码

其中每一个元素的具体数值则由训练来肯定。这样一来就克服了在深度学习中可能的维度灾难,并且充分利用了空间,若是使用适当的训练方法训练出来的词向量能够直接根据两个词之间的距离来计算类似性。

神经网络语言模型

神经网络语言模型即用神经网络来训练语言模型,最经典的模型是Bengio等人提出的三层神经网络,它思路大概是对于语料C任意一个词w,取它的前n-1个词做为输入,这个跟n-gram的思路是一样的,而w则为它的输出,有了输入和输出就组成了训练样本了。

这里写图片描述
这里写图片描述

下面根据上图进行讲解,首先设每一个词w用m维向量来表示,则每一个词都有对应着本身的m维向量,另外设语料的总词数为v。接着分别看三层网络,

  • 输入层,输入层负责将前n-1个词向量输入,即将


输入,而他们的链接方式只是将他们首尾拼接起来便可,这样输入其实就是一个m(n-1)维向量,设为X。

  • 隐含层,该层节点数可本身设定,该层输出为z = tanh(wx+p),其中w为输入层到隐含层的权重,p为偏置项。
  • 输出层,一共有v个节点,每一个节点的值为对应词的几率,即下个词为该词的几率值,最后还会经过softmax激励函数对输出值归一化。y值的计算公式为y = uz+q,其中u是隐含层到输出层的权重,q为偏置项。

如今样本集及神经网络结构都有了,接下去使用梯度降低法对其进行优化训练就能获得一个语言模型。

经过神经网络训练出来的语言模型自带平滑,这个归功于咱们的激活函数,而传统的n-gram方式则须要咱们额外作平滑化处理。并且词向量还能表示词语的类似性。

Skip-gram和CBOW模型

神经网络语言模型解决了几率平滑、数据稀疏及维度灾难等问题,但它仍然没法完全解决n的问题,即经过前n个词来预测接着的单词,这里认为神经网络语言模型没法取n大于5。另一个是训练须要花费不少时间。

为了克服这些缺点,出现了CBOW模型和Skip-gram模型。它们都是经过对原始的神经网络语言模型进行改良。

另外CBOW模型和Skip-gram模型的输入向量中再也不使用one-hot形式,而是能够假设一个m维向量,初始值能够随机设置,而后经过训练不断优化最后获得具体的向量值。这也就是为何说咱们在训练CBOW模型和Skip-gram模型时会产生一个词向量的副产品,该词向量是一个分布式词向量。

这里写图片描述
这里写图片描述

以CBOW模型为例

它对原始的神经网络语言模型作了一些改造,好比把原来的隐含层去掉了,投影层直接与输出层相连,这是由于隐含层增长了计算量,并且去掉后基本不会影响效果。投影层作的操做就是累加输入层的全部向量,再回想一下传统神经网络语言模型是怎么处理输入层的?就是向量的链接操做,将输入层的全部向量首尾相链接。这种方式也就意味着丢弃词语的序列信息,这很好理解,原来方式是输入向量首尾先连,而如今是作累和操做。

  • 输入层,对于词w(t),取先后若干个词做为输入,好比先后2个词,则w(t-2)、w(t-1)、t(t+1)、t(t+2)做为输入。
  • 投影层,对输入层全部向量作求和累加操做。
  • 输出层,是一棵庞大的很深的二叉树,以下图,树的叶子结点表示语料库中出现的词,好比w1 w2 w3 w4 ...wv,语料库总共有v个不一样的词,它实际上是一棵哈夫曼树,经过语料库中词频而构建的,把词频当作权值而后按照哈夫曼树构造的算法进行构造便可,这个比较简单。
    这里写图片描述
    这里写图片描述

CBOW模型的训练

训练其实就是根据某个词先后若干词来预测该词,这其实能够当作是多分类。最朴素的想法就是直接使用softmax来分别计算每一个词的对应的归一化的几率。但对于动辄十几万词汇量的场景中使用softmax计算量太大,因而须要用一种二分类组合形式的hierarchical softmax,即输出层为一棵二叉树。

如今看看怎么来训练这棵二叉树。以下图,每一个二叉树叶子结点表示一个词,非叶子结点则表明词,但它有一个权重参数\theta,每一个非叶子结点的权重参数都不一样,另外再约定每一个节点的左边的子节点编码为1,右边的子节点编码为0。那么从根节点开始(根节点不做编码),词“天天”的编码为10,词“运动”的编码为00。

如今假设正确输出为“天天”,对应的编码为10,那么具体是怎么更新参数的?实际上除了叶子结点,其余节点均可以当作是一个神经元,能够看到它是一个二分类的结构,那么经过logistic回归就能够实现二分类。为了找到“天天”这个词,首先经过根节点,通过logistic分类后应该分到左边子节点,即编码为1,接着继续进行logistic分类到右边子节点,即编码为0,而后获得最后的结果。

这里写图片描述
这里写图片描述

设w为某个词,w先后若干个词用$w_m$表示,二叉树总共有s层,设从根节点到w节点通过的节点的参数为$\theta_1,\theta2,...\theta{s-1}$,好比“天天”通过的参数为$\theta_1,\theta_2$,再设从第二层节点到w节点通过的节点的编码为$b_2,b_3,...,b_s$,则w的条件几率为,

咱们知道除了叶子结点外,其余每一个节点都是作logistic回归,有

为方便计算取对数似然函数做为目标函数,获得

其中l为语料库,接着对目标函数作最大化优化,能够看到目标函数中有两个参数须要学习,一个是$\theta$一个是输入x,x学习就是获得咱们的词向量副产品,而$\theta$则是CBOW模型的参数。分别对二者求偏导,有

有了偏导就能够用梯度上升法了,继续求另一个偏导,有

这样,两个向量参数均可以经过梯度上升法更新训练了。

========广告时间========

鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有须要的朋友能够到 item.jd.com/12185360.ht… 进行预约。感谢各位朋友。

为何写《Tomcat内核设计剖析》

=========================

欢迎关注:

这里写图片描述
这里写图片描述
相关文章
相关标签/搜索