word2vec是用来生成词向量的工具,而词向量与语言模型有着密切的关系,为此,不妨先来了解一些语言模型方面的知识。
1、统计语言模型
统计语言模型(Statistical Language Model)是所有NLP的基础,被广泛应用于语音识别,机器翻译,分词,词性标注和信息检索等任务。
简单的说,统计语言模型是用来计算一个句子的概率的概率模型,它通常基于一个语料库来构建,那什么叫做一个句子的概率呢?假设一个由(w1,w2,....wT)这T个词按顺序构成的一个句子W,则(w1,w2,....wT)的联合概率:
上面的这个式子就是这个句子的概率,利用贝叶斯公式,可以将上式链式分解为:
所以,可以看到,上面模型需要估计的参数有T个,拆借出的每个条件概率都是语言模型的参数,如果这些参数都已经算得,则可以算出一个句子的概率。
看起来很简单,但是稍微分析一下,就可以知道具体实现起来有多麻烦。例如,先来看看模型参数的个数,刚才考虑的是一个长度为T的句子,就需要计算T个参数,不妨假设语料库对应词典D的大小为N,那么考虑长度为T的仁义句子,理论上就有NT种可能,每种可能都要计算T个参数,总共就需要计算TNT个参数。这个量级非常吓人,此外,这些概率计算之后需要保存下来,存储这些信息也需要巨大的空间开销。
那么,这些参数如何计算呢?常见的方法有n-gram模型,决策树,最大熵模型,最大熵马尔可夫模型,条件随机场,神经网络方法等。这里只介绍n-gram模型和神经网络模型。
2、N-Gram模型
可以看出,一个词出现的概率跟它前面的所有词都相关,如果假定一个词的出现概率只跟他前面固定数目的词相关呢?这就是n-gram模型的基本思想,它做了一个n-1阶的马尔可夫假设,认为一个词的出现的概率就只与它前面的n-1个词想管,即:
于是我们便有:
以n=2为例,即每个词的出现的概率只与它前面一个词有关,即:
这样一件话,不仅使得单个参数的统计变得更容易,也使得参数的总数变少了。
那么,n-gram中参数n一般取多大比较合适呢?一般来说,n的选择需要同时考虑计算复杂度和模型效果两个因素。
在计算复杂度方面,假定我们的词典大小N=200000,则模型参数数量随着n逐渐增大的情况如下表所示:
可以看到,随着n的增大,模型参数数量呈指数级增长,所以实际中n不能取太大,一般取n=3左右。
在模型效果方面,理论上是n越大,效果越好,现如今,互联网的海量数据以及机性能的提升使得计算更高阶的语言模型(n>10)成为课呢呢个,但需要注意的是,当n大到一定程度的时候,模型效果的提升幅度会变小,比如n从1到2,再从2到3,模型效果上升显著,但从3到4时,模型效果的提升就不显著了。另外,n-gram中还有一个叫做平滑化的重要环节,主要考虑以下两个问题:
有关平滑化的问题,大家可以参考博客:
http://blog.csdn.net/baimafujinji/article/details/51297802
总结起来,n-gram模型就是这样一种模型,其主要工作就是在语料中统计各种词串出现的次数以及平滑化处理,概率值计算好之后存储起来,下次需要计算一个句子的概率时,只需找到相关的概率参数,将它们连乘起来就好了。
然而在机器学习领域有一种通用的招数是这样的,对所考虑的问题建模后现为其构造一个目标函数,然后对这个目标函数进行优化,从而求得一组最优的参数,最后利用这组最优参数对应的模型来进行预测。
对于统计语言模型而言,利用最大似然,可把目标函数设为:
上式中,C表示语料,Context(w)表示词w的上下文,即w周边的词的集合。
当然,实际应用中通常采用最大对数似然,把目标函数设为:
然后对上面的函数进行最大化,可以看到,概率p(w|context(w))被视为关于w和Context(w) 的函数,即:
其中Θ为待定参数集。这样的话,但我们得到最优的参数Θ后,F也就唯一确定了,以后任何概率p(w|context(w))都可以通过F来计算了,与n-gram相比,这种方法不需要事先保存所有的概率,而是通过直接计算来获取,而且通过选取合适的模型可以使参数Θ的个数远小于n-gram中参数的个数。
显然,对于这样一种算法,最关键的地方就在于函数F的构造了,接下来我们会介绍一种通过神经网络来构造F的方法,这种方法也可以视为word2vec种算法框架的基础或者前身。
3、神经概率语言模型
本节介绍的神经概率语言模型,用到了一个重要的工具-词向量。什么是词向量呢?简单来说,就是对辞典D中任意的词w,将词w转化为一个固定长度的向量v(w),这个向量就称为词向量。
既然是神经概率语言模型,那么当然要用到一个神经网络啦。下图是神经网络的示意图:
神经网络包括四个层,输入层,投影层,隐藏层,输出层,W和U分别表示投影层与隐藏层以及隐藏层和输出层之间的权值矩阵,p和q分别为隐藏层和输出层上的偏置向量。
对于语料C中任意一个词w,将Context(w)取为其前面n-1个词,如果不满n-1个词,那么可以人为添加用以填充,这样二元对(Context(w),w)就是一个训练样本了,接下来,讨论(Context(w),w)经过上面的神经网络时是如何运算的。如果语料C和词向量长度m给定后,投影层和输出层的规模就确定了,投影层的规模为(n-1)m,而输出层为N即语料C的词汇量大小。而隐藏层的规模是可调参数可任意调整。
为什么投影层规模是(n-1)m呢,因为输入层是n-1个词,每个词的词向量长度为m,输入层到投影层只是做了一个简单的向量连接操作,所以长度为(n-1)m。那么,神经网络的计算过程就很清楚了:
经过上述两步得到的输出是一个长度为N的向量,其分量不能表示概率,我们还需要做一个softmax归一化:
上式就给出了概率p(w|context(w))的函数表示,即得到了上一节中提到的函数F,那么在神经概率模型中,待确定的参数Θ有哪些呢?
上面的参数都是通过训练算法得到的。那么神经网络模型的运算量多大呢?投影层的规模为(n-1)m,隐藏层的规模是nh,输出层的规模为N:
不难发现,整个模型的大部分计算集中在隐藏层和输出层之间的矩阵向量运算,以及输出层上的softmax归一化运算,因此后续的很多工作,包括word2vec都是在这一部分上进行改进的。
那么神经网络概率模型相比于n-gram的优势在哪呢?主要有以下两点:
1、词语之间的相似性可以通过词向量来体现
2、基于词向量的模型自带平滑功能,不需要进行额外的处理
网友评论