word2vec(2) 背景知识

word2vec 是用来生成词向量的工具,而词向量与语言模型有着密切的关系。

1. 统计语言模型

统计语言模型是NLP的基础。统计语言模型是用来计算一个句子的概率,其通常基于一个语料库D来构建。即判断一句话是否是人话的概率。如下图所示:

为了能够量化地衡量哪个句子更像一句人话,可以设计如上图所示函数。假设W = w_{1}^{T} = (w_{1}, w_{2}, ..., w_{T}) 表示由T个词w_{1}, w_{2}, ..., w_{T}按顺序构成1个句子,则w_{1}, w_{2}, ..., w_{T}的联合概率为

p(W)=p(w_{1}^{T})=p(w_{1}, w_{2}, ..., w_{T})

=p(w_{1})p(w_{2}|w_{1})p(w_{3}|w_{1},w_{2})...p(w_{T}|w_{1},w_{2}...w_{T-1})

=p(w_{1})p(w_{2}|w_{1})p(w_{3}|w_{1}^{2})...p(w_{T}|w_{1}^{T-1})

其中条件概率 p(w_{1})p(w_{2}|w_{1})p(w_{3}|w_{1}^{2})...p(w_{T}|w_{1}^{T-1}) 便是语言模型的参数(?????参数这个词有点怪),如果参数已经全部算得,那么给定一个句子W = w_{1}^{T} = (w_{1}, w_{2}, ..., w_{T})便能很快算得p(W)了。

看起来很简单,但是稍微分析一下,就可以知道具体实现起来有多麻烦。例如,先来看看模型参数的个数,刚才考虑的是一个长度为T的句子,就需要计算Tp(w_{1})p(w_{2}|w_{1})p(w_{3}|w_{1}^{2})...p(w_{T}|w_{1}^{T-1}))个参数,不妨假设语料库对应词典D的大小为N,那么考虑长度为T的任意句子,理论上就有N^{T}种可能,每种可能都要计算T个参数,总共就需要计算TN^{T}个参数(这里的参数是怎么计算的呢)。这个量级非常吓人,此外,这些概率计算之后需要保存下来,存储这些信息也需要巨大的空间开销。

此外,这些参数如何计算呢?常见的方法有n-gram模型,决策树,最大熵模型,最大熵马尔可夫模型,条件随机场,神经网络方法等。这里只介绍n-gram模型和神经网络模型。

2. n-gram模型

考虑p(w_{k}|w_{1}^{k-1}) (k > 1)的近似计算,利用bayes公式,有

p(w_{k}|w_{1}^{k-1}) = \frac{p(w_{1}^{k})}{p(w_{1}^{k-1})}

根据大数定理,当语料库足够大时,p(w_{k}|w_{1}^{k-1}) 可近似表示为

p(w_{k}|w_{1}^{k-1}) = \frac{count(w_{1}^{k})}{count(w_{1}^{k-1})}

其中count(w_{1}^{k-1})count(w_{1}^{k})表示在语料中出现的次数。可想而知,当语料库很大时,两者的统计会多么耗时。

可以看出,一个词出现的概率跟它前面的所有词都相关,如果假定一个词的出现概率只跟他前面固定数目的词相关呢?这就是n-gram模型的基本思想,它做了一个n-1阶的马尔可夫假设,认为一个词的出现的概率就只与它前面的n-1个词相关,即:

p(w_{k}|w_{1}^{k-1}) = \frac{count(w_{k-n+1}^{k})}{count(w_{k-n+1}^{k-1})}

以n=2为例

p(w_{k}|w_{1}^{k-1}) = \frac{count(w_{k-1}, w_{k})}{count(w_{k-1})}

这样一简化,不仅使得单个参数的统计变得更容易,也使得参数的总数变少了。
那么,n-gram中参数n一般取多大比较合适呢?一般来说,n的选择需要同时考虑计算复杂度和模型效果两个因素。

在计算复杂度方面,假定我们的词典大小N=200000,则模型参数数量随着n逐渐增大的情况如下表所示:

可以看到,随着n的增大,模型参数数量呈指数级增长,所以实际中n不能取太大,一般取n=3左右。

在模型效果方面,理论上是n越大,效果越好,现如今,互联网的海量数据以及机性能的提升使得计算更高阶的语言模型(n>10)成为课呢呢个,但需要注意的是,当n大到一定程度的时候,模型效果的提升幅度会变小,比如n从1到2,再从2到3,模型效果上升显著,但从3到4时,模型效果的提升就不显著了。

另外,n-gram中还有一个叫做平滑化的重要环节,主要考虑以下两个问题:

1. 若count(w_{k-n+1}^{k})=0,则p(w_{k}|w_{1}^{k-1})是否为0。

2. 若count(w_{k-n+1}^{k-1})=count(w_{k-n+1}^{k}),则p(w_{k}|w_{1}^{k-1})是否为1。

有关平滑化的问题,大家可以参考博客:http://blog.csdn.net/baimafujinji/article/details/5129780

总结起来,n-gram模型就是这样一种模型,其主要工作就是在语料中统计各种词串出现的次数以及平滑化处理,概率值计算好之后存储起来,下次需要计算一个句子的概率时,只需找到相关的概率参数,将它们连乘起来就好了。

然而,在机器学习领域有一种通用的解决问题的方法:对所考虑的问题建模后先为其构造一个目标函数,然后对这个目标函数进行优化,从而求得一组最优的参数,最后利用这组最优参数对应的模型来进行预测。

对于统计语言模型而言,利用最大似然,可把目标函数设为:

\prod_{w}p(w|context(w))

其中C表示语料库(corpus),context(w)表示w的上下文,即w周边的词的集合。当context(w)为空时,p(w|context(w))=p(w)。特别地,对于前面介绍的n-gram模型,就有

context(w)=w_{k-n+1}^{k-1}

即认为一个词的出现的概率就只与它前面的n-1个词相关。

当然,实际应用中常采用最大对数似然,即把目标函数设为:

L=\sum_{w\in C}p(w|context(w))

然后对这个函数进行最大化。从上面的目标函数可见,概率p(w|context(w))已被视为关于wcontext(w)的函数,即

p(w|context(w))=F(w,context(w),\theta )

其中\theta为待定参数集。这样一来,一旦对目标函数进行优化得到最优参数集\theta ^{*}后,F也就唯一被确定了,以后任何概率p(w|context(w))就可以通过函数F来计算了(那我想问下这个参数是怎么算的呢?是他的函数,w, context(w) 是怎么算的呢?--- 我觉得可能是训练的时候还是按照统计来当做样本输入进去,计算的时候就直接计算了?)。与n-gram相比,这种方法不需要事先计算并保存所有的概率值,而是通过直接计算来获取,且通选取合适的模型可使得\theta中参数的个数远小于n-gram中模型参数的个数。

很显然,对于这样一种方法,最关键的地方就在于函数 的构建了。下一小节将介绍一种通过神经网络来构造函数F的方法。之所以特意介绍这个方法,是因为它可以视为Word2Vec中算法框架的前身或者说基础。

3. 神经概率语言模型

本小节介绍 Bengio 等人于2003年在论文《A Neural Probabilistic Language Model》中提出的一种神经概率语言模型。该模型用到了一个重要的工具——词向量。该论文首次提出用神经网络来解决语言模型的问题,虽然在当时并没有得到太多的重视,却为后来深度学习在解决语言模型问题甚至很多别的nlp问题时奠定了坚实的基础,后人站在Yoshua Bengio的肩膀上,做出了更多的成就。包括Word2Vec的作者Tomas Mikolov在NNLM的基础上提出了RNNLM和后来的Word2Vec。文中也较早地提出将word表示一个低秩的向量,而不是One-Hot。word embedding作为一个language model的副产品,在后面的研究中起到了关键作用,为研究者提供了更加宽广的思路。值得注意的是Word2Vec的概念也是在该论文中提出的。

什么是词向量呢?简单来说,就是对词典D中任意的词w,将词w转化为一个固定长度的向量v(w)\in \mathbb{R}^{m}v(w)就称为词w的向量。


既然是神经概率语言模型,那么当然要用到一个神经网络啦。下图是神经网络的示意图:

神经网络包括四个层,输入层,投影层,隐藏层,输出层,WU分别表示投影层与隐藏层以及隐藏层和输出层之间的权值矩阵,pq分别为隐藏层和输出层上的偏置向量。

注意:当提及神经网络时,人们更多将其视为如下图所示的三层结构。本文将其描述为如上图所示的四层结构,一方面是便于描述,另一方面是便于和 word2vec 中使用的网络结构进行对比。


对于语料C中任意一个词w,将Context(w)取为其前面n-1个词,如果不满n-1个词,那么可以人为添加一个(或几个)填充向量,这样二元对(Context(w),w)就是一个训练样本了,接下来,讨论(Context(w),w)经过上面的神经网络时是如何运算的。一旦语料C和词向量长度m给定后,投影层和输出层的规模就确定了,投影层的规模为(n-1)m,而输出层为N即语料C的词汇量大小。而隐藏层的规模n_{h}是可调参数可任意调整。


为什么投影层规模是(n-1)m呢?因为输入层是n-1个词,每个词的词向量长度为m(这里可能是随机初始化的??),输入层到投影层只是做了一个简单的向量连接操作可能这里并没有改变维度??),所以长度为(n-1)m。那么,神经网络的计算过程就很清楚了:

其中tanh是隐藏层的激活函数。

经过上述两步得到的输出是一个长度为y_{w}=(y_{w,1},y_{w,2},...,y_{w,N})^{T}的向量,其分量不能表示概率,如果想要y_{w}的分量y_{w,i}表示当上下文context(w)时下一个词恰为词典D中第i个词的概率,我们还需要做一个softmax归一化,归一化后,p(w|context(w))就可以表示为:

其中i_{w}表示词w在词典D中的索引。

第二小节中提到概率p(w|context(w))=F(w,context(w),\theta ),那么其中待确定的参数\theta有哪些呢?总结起来,包括两部分:(这里的v(w)是参数吗?训练的时候和预测的时候?

这些参数均通过训练算法得到。

值得注意的是,通常的机器学习算法中,输入都是已知的,但在上述神经概率语言模型中,输入v(w)也需要通过训练才能得到。这是下面将要提到的word2vec的重点。

接下来,我们分析一下上述模型的运算量,在神经网络中,我们主要涉及的规模为(n-1)mn_{h}N,依次查看其中涉及的参数:

  • n是一个词的上下文包含的词数,通常不超过5
  • m是词向量长度,通常是量级10^{1}~10^{2}
  • n_{h}由用户指定,通常需要取得太大,如10^{2}量级
  • N是语料库词汇量大小,与语料有关,通常是10^{4}~10^{5}量级

再结合上述公式来看,整个模型的大部分计算集中在隐藏层和输出层之间的矩阵向量计算以及输出层上的softmax归一化运算,因此后续的工作,有很多就是针对这部分进行优化的,其中就包括了word2vec的工作。

与n-gram模型相比,神经概率语言模型有什么优势呢?主要有以下两点:

  • 1. 词语之间的相似性可以通过词向量来体现。

举例来说,如果某个(英语)语料中S_{1}= A dog is running in the room出现了10000次,而S_{2}=A cat is running in the room只出现了1次。按照n-gram模型的做法,p(S_{1})肯定会远大于p(S_{2})。注意,S_{1}S_{2}的唯一区别在与dog和cat,而这两个词无论是句法还是语义上都扮演了相同的角色,因此,p(S_{1})p(S_{2})应该很接近才对。事实上,由神经概率语言模型算得的 p(S_{1})p(S_{2}) 是大致相等的。原因在于:(1)在神经概率语言模型中假定了“相似的”的词对应的词向量也是相似的;(2)概率函数关于词向量是光滑的,即词向量中的一个小变化对概率的影响也只是一个小变化。这样一来,对于下面这些句子:

A dog is running in the room
A cat is running in the room
The cat is running in a room
A dog is walking in a bedroom
The dog was walking in the room

只要在语料库中出现一个,(在神经概率语言模型中)其他句子的概率也会相应的增大。

  • 2. 基于词向量的模型自带平滑化功能(由softmax归一化公式,

     可知,p(w|context(w))\in (0,1)不会为零),不再需要像n-gram那样进行额外处理了。

最后,我们回过头来想想,词向量在整个神经概率语言模型中扮演了什么角色呢?训练时,它是用来帮助构造目标函数的辅助参数,训练完成后,它也好像只是语言模型的一个副产品。但这个副产品可不能小觑,下一节将对其作进一步阐述。

4. 词向量的理解

在NLP任务中,我们将自然语言交给机器学习算法来处理,但机器无法直接理解人类的语言,因此首先要做的事情就是将语言数字化,如何将自然语言进行数字化呢?词向量提供了一种很好的方式。

一种最简单的词向量是one-hot representation,就是用一个很长的向量来表示一个词,向量的长度为词典D的大小N,向量的分量只有一个1,其他全为0,1的位置对应该词在词典中的索引。但这种词向量表示有一个缺点,就是受维度灾难的困扰,尤其是将其用于Deep Learning场景时,又如,它不能很好刻画词与词之间的相似性;

另一种词向量是Distributed Representation,它最早是Hinton在1986年提出的,可以克服one-hot representation 的上述缺点,其基本想法是:通过训练将某种语言中的每一个词映射成一个固定长度的短向量,所有这些向量构成一个词向量空间,而每一向量可视为该空间中的一个点,在这个空间上引入“距离”,就可以根据词之间的距离来判断它们之间的相似性了,word2vec中采用的就是这种Distributed Representation的词向量。

为什么叫做 Distributed Representation?很多人问到这个题。我的一个理解是这样的:对于 one-hot representation,向量中只有一个非零分量,非常集中(有点孤注一掷的感觉);而对于 Distributed Representation,向量中有大量非零分量,相对分散(有点风险平推的感觉),把词的信息分布到各个分量中去了。这一点,跟并行计算里的分布式并行很像。

为更好地理解上述思想,我们来举一个通俗的例子。

例:假设在二维平面上分布有 a 个不同的点,给定其中的某个点,现在想在平面上找到与这个点最相近的一个点我们是怎么做的呢?首先,建立一个直角坐标,基于该坐标条,其上的每个点就唯一地对应一个坐标(x,y);接着引入欧氏距离;最后分別计算这个点与其他 a-1 个点之问的距离,对应最小距离值的那个(或那些)点便是我们要找的点了。

上面的例子中,坐标(x, y)的地位就相当于词向量,它用来将平面上一个点的位置在数学上作量化。坐标系建立好以后,要得到某个点的坐标是很容易的。然而,在 NLP 任务中,要得到词向量就复杂得多了,而且词向量并不唯一,其质量依赖于训练语料、训练算法等因素。

如何获取词向量呢?有很多不同模型可用来估计词向量,包括有名的 LSA (Latent Semantic Analysis)和 LDA (Latent Dirichlet Allocation)。此外,利用神经网络算法也是一种常用的方法,上一小节介绍的神经概率语言模型就是一个很好的实例。当然,在那个模型中,目标是生成语言模型,词向量只是一个副产品。事实上,大部分情况下,词向量和语言模型都是捆绑在一起的,训练完成后两者同时得到。用神经网络来训练语言模型的思想最早由百度 IDL(深度学习研究院)的徐伟[18]提出。这方面最经典的文章要数 Bengio 于 2003 年发表在 JMLR 上的《A Neural Probabilistic Language Model》,其后有一系列相关的研究工作,其中也包括谷歌 Tomas Nikolov 团队的 word2vec。

文献《Exploiting Similarities among Languages for Machine Translation》给出一个简单的例子可以帮助我们了解词向量,考虑英语和西班牙语两种语言,通过训练分别得到它们对应的词向量空间 E (nglish)和S (panish)。从英语中取出五个词 one, two, three, four, five,设其在 E 中对应的词向量分别为u_{1},u_{2},u_{3},u_{4},u_{5}  为方便作图,利用主成分分析(PCA)降维,得到相应的二维向量 v_{1},v_{2},v_{3},v_{4},v_{5},在二维平面上将这五个点描出来,如下图左图。

类似地,在西班牙语中取出(与 one, two, three, four, five 对应的)uo, dos, tres, cuatro,cinco,设其在 S 中对应的词向量分别为s_{1},s_{2},s_{3},s_{4},s_{5}  ,用 PCA 降维后的二维向量分别为t_{1},t_{2},t_{3},t_{4},t_{5}将它们在二维平面上描出来(可能还需作适当的旋转),如上图右图所示。

观察左、右两幅图,容易发现:五个词在两个向量空间中的相对位置差不多,这说明两种不同语言对应向量空间的结构之间具有相似性,从而进一步说明了在词向量空间中利用距离刻画词之间相似性的合理性。

注意,词向量只是针对“词”来提的,事实上,我们也可以针对更细粒度或更粗粒度来进行推广,如字向量[20]句子向量文档向量[21],它们能为字、句子、文档等单元提供更好的表示。

2. CBOW

CBOW模型的训练输入是某一个特征词的上下文相关的词对应的词向量,而输出就是这特定的一个词的词向量。比如下面这段话,我们的上下文大小取值为4,特定的这个词是"Learning",也就是我们需要的输出词向量,上下文对应的词有8个,前后各4个,这8个词是我们模型的输入。由于CBOW使用的是词袋模型,因此这8个词都是平等的,也就是不考虑他们和我们关注的词之间的距离大小,只要在我们上下文之内即可

这样我们这个CBOW的例子里,我们的输入是8个词向量,输出是所有词的softmax概率(训练的目标是期望训练样本特定词对应的softmax概率最大),对应的CBOW神经网络模型输入层有8个神经元,输出层有词汇表大小个神经元。隐藏层的神经元个数我们可以自己指定。通过DNN的反向传播算法,我们可以求出DNN模型的参数,同时得到所有的词对应的词向量。这样当我们有新的需求,要求出某8个词对应的最可能的输出中心词时,我们可以通过一次DNN前向传播算法并通过softmax激活函数找到概率最大的词对应的神经元即可。

3. Skip-Gram

Skip-Gram模型和CBOW的思路是反着来的,即输入是特定的一个词的词向量,而输出是特定词对应的上下文词向量。还是上面的例子,我们的上下文大小取值为4, 特定的这个词"Learning"是我们的输入,而这8个上下文词是我们的输出。

这样我们这个Skip-Gram的例子里,我们的输入是特定词, 输出是softmax概率排前8的8个词,对应的Skip-Gram神经网络模型输入层有1个神经元输出层有词汇表大小个神经元。隐藏层的神经元个数我们可以自己指定。通过DNN的反向传播算法,我们可以求出DNN模型的参数,同时得到所有的词对应的词向量。这样当我们有新的需求,要求出某1个词对应的最可能的8个上下文词时,我们可以通过一次DNN前向传播算法得到概率大小排前8的softmax概率对应的神经元所对应的词即可。

word2vec为什么 不用现成的DNN模型,要继续优化出新方法呢?最主要的问题是DNN模型的这个处理过程非常耗时。我们的词汇表一般在百万级别以上,这意味着我们DNN的输出层需要进行softmax计算各个词的输出概率的的计算量很大。有没有简化一点点的方法呢?

word2vec也使用了CBOW与Skip-Gram来训练模型与得到词向量,但是并没有使用传统的DNN模型。最先优化使用的数据结构是用霍夫曼树来代替隐藏层输出层的神经元,霍夫曼树的叶子节点起到输出层神经元的作用,叶子节点的个数即为词汇表的小大。 而内部节点则起到隐藏层神经元的作用。

霍夫曼树

在word2vec中,约定编码方式和上面的例子相反,即约定左子树编码为1,右子树编码为0,同时约定左子树的权重不小于右子树的权重。

3.1 基于Hierarchical Softmax的模型概述

我们先回顾下传统的神经网络词向量语言模型,里面一般有三层,输入层(词向量),隐藏层和输出层(softmax层)。里面最大的问题在于从隐藏层到输出的softmax层的计算量很大,因为要计算所有词的softmax概率,再去找概率最大的值。这个模型如下图所示。其中V是词汇表的大小,

word2vec对这个模型做了改进,首先,对于从输入层到隐藏层的映射,没有采取神经网络的线性变换加激活函数的方法而是采用简单的对所有输入词向量求和并取平均的方法。比如输入的是三个4维词向量:(1,2,3,4),(9,6,11,8),(5,10,7,12),那么我们word2vec映射后的词向量就是(5,6,7,8)。由于这里是从多个词向量变成了一个词向量。

第二个改进就是从隐藏层到输出的softmax层这里的计算量个改进。为了避免要计算所有词的softmax概率,word2vec采样了霍夫曼树来代替从隐藏层到输出softmax层的映射。我们在上一节已经介绍了霍夫曼树的原理。如何映射呢?这里就是理解word2vec的关键所在了。

由于我们把之前所有都要计算的从输出softmax层的概率计算变成了一颗二叉霍夫曼树,那么我们的softmax概率计算只需要沿着树形结构进行就可以了。如下图所示,我们可以沿着霍夫曼树从根节点一直走到我们的叶子节点的词w_{2}

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

其中x_{w}是当前内部节点的词向量,而\theta则是我们需要从训练样本求出的逻辑回归的模型参数。

使用霍夫曼树有什么好处呢?首先,由于是二叉树,之前计算量为V,现在变成了\log_{2}V。第二,由于使用霍夫曼树是高频的词靠近树根,这样高频词需要更少的时间会被找到,这符合我们的贪心优化思想。

回到基于Hierarchical Softmax的word2vec本身,我们的目标就是找到合适的所有节点的词向量和所有内部节点\theta, 使训练样本达到最大似然。那么如何达到最大似然呢?

3.2 基于Hierarchical Softmax的CBOW模型

由于word2vec有两种模型:CBOWSkip-Gram,我们先看看基于CBOW模型时,Hierarchical Softmax如何使用。

首先我们要定义词向量的维度大小M,以及CBOW的上下文大小2c,这样我们对于训练样本中的每一个词,其前面的c个词和后面的c个词作为了CBOW模型的输入,该词本身作为样本的输出,期望softmax概率最大。

在做CBOW模型前,我们需要先将词汇表建立成一颗霍夫曼树。

对于从输入层到隐藏层,这一步比较简单,就是对w周围的2c个词向量求和取平均即可,即:

这里总结下基于Hierarchical Softmax的CBOW模型算法流程,梯度迭代使用了随机梯度上升法:

输入:基于CBOW的语料训练样本,词向量的维度大小M,CBOW的上下文大小2c,步长\eta

输出:霍夫曼树的内部节点模型参数θ,所有的词向量w

3.3 基于Hierarchical Softmax的Skip-Gram模型

具体地,把【页面-事件】所有可能的组合看作词,删除极高频(类比停用词)、极低频(减少复杂度)的组合,余下的组合进行one-hot编码,使用skip-gram网络结构进行训练,V是过滤后所有【页面-事件】组合的总数,N为embedding size(N<  

In hierarchical softmax tree, the optimum of parent nodes can not guarantee that the optimal low level nodes are in their descendants, and all items still need to be traversed to find the optimal one.?????

参考链接:

Word2vec在风控中的应用

word2vec 中的数学原理详解(一)目录和前言

word2vec(简单快速理解) _点击

word2vec原理(一) CBOW与Skip-Gram模型基础

word2vec原理(二) 基于Hierarchical Softmax的模型

word2vec原理(三) 基于Negative Sampling的模型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值