引言
在机器学习领域,语言识别和图像识别都比较容易做到。语音识别的输入数据可以是音频频谱序列向量所构成的matrix,图像识别的输入数据是像素点向量构成的矩阵。但是文本是一种抽象的东西,显然不能直接把文本数据喂给机器当做输入,因此这里就需要对文本数据进行处理。
现在,有这么一个有趣的例子,我接下来要讲的模型就可以做到。
- 首先给出一个例子,Paris - France + America = ?
从我们人的角度来看,Paris是法国的首都,那么首都减去国家再加上一个国家,很可能表示的就是另一个国家的首都。因此这里的结果就是华盛顿Washington.机器想做到这一点,并不容易。
众所周知,只有标量或者向量可以应用加减法,抽象的自然语言该如何做到呢?
一个很自然的想法就是,自然语言能否表示成数学的形式,这样就可以更加方便地研究其规律了。
答案是肯定的。
现在我们可以进行思考,如何将文本中的词语用数学的形式表达出来,也就是说,文本中藏着哪些数学形式需要我们去挖掘。
文本中各个词语出现的频数是有限的,这是一个可以提取的数学形式
从逻辑的角度出发,词语之间不可能是独立的,一个词语的出现肯定与另一个或者若干个词语有关系。这就涉及到词语共现的层面了。
统计语言模型和大多数的词向量表示都是基于以上两点考虑的。
词向量的表现形式主要分为两种,一种是one-hot(one-hot representation)表示方式,将词表示成一个很长的向量,向量的长度就是词典的长度;另一种表示方法是分布式表示(distributed representation).同时,分布式表示方法又可以分为基于矩阵的表示方法、基于聚类的表示方法和基于神经网络的表示方法。
首先,最简单的就是one-hot表示方法,将词表示成一个很长的向量,向量的分量只有一个1,其他全为0,1所对应的位置就是该词在词汇表中的索引。
这样表示有两个缺点:
容易受维度灾难(the curse of dimentionality)的困扰;
没有考虑到词之间的关系(similarity)。
现在主要应用的都是分布式表示形式了。下面介绍一种简单的分布式表示形式——基于矩阵的表示形式。
如下表所示:
Probability and Ratio | k = solid | k = gas | k = water | k = fashion |
---|---|---|---|---|
) | ||||
简单说一下上面的矩阵。
假设我们对一些热力学短语或者词语的概念感兴趣,我们选择i=ice,k=steam,我们想看看ice和steam的关系,可以通过他们与其他词语的共现频率来研究。这些其他词语我们称之为探测词。这里我们选择探测词k为solid,gas,water和fashion。显然,ice与solid的相关性较高,但是与steam相关性较低,因此我们期望看到的是比值比较大。对于探测词gas,我们期望看到的是比值比较小。而water和fashion与ice和steam的关系要么都十分密切,要么都不怎么密切,因此对于这两个探测词,应该接近于1.
上表是基于一个很大的语料库统计得出的,符合我们的预期。相比于单独使用原始概率,概率比值可以更好的区分相关词语和不相关词语,比如solid和gas与water和fashion;也可以很容易区分两个相关词。
那么,在正式介绍自然语言处理,或者说wrod2vec之前,有必要介绍以下统计语言模型。它是现在所有语言模型的基础。
第二个需要讲的分布式表示方式是基于神经网络的表示方法。在此之前,有必要讲一下传统的统计语言模型,毕竟它对语言模型影响深远。
统计语言模型
1. 引言
给出以下三个句子:
- 美联储主席本·伯南克昨天告诉媒体7000亿美元的救助资金将借给上百家银行、保险公司和汽车公司
-
- 美主席联储本·伯南克告诉昨天媒体7000亿美元的资金救助将借给百上家银行、保险公司和汽公车司
-
- 美主车席联储本·克告诉昨天公司媒体7000伯南亿美行元的金将借给百救助上家资银、保险公司和汽
对于第一个句子,语句通畅,意思也很不明白;对于第二个句子,虽然个别词语调换了位置,但也不影响阅读,我们仍然能够知道表达的是什么意思;对于第三个句子,我们就很难知道具体表示什么意思了。
如果问你为什么第三个句子不知道表达什么,你可能会说句子混乱,语义不清晰。在上个世纪70年代的时候,科学家们也是这样想的,并且试图让计算机去判断一个句子的语义是否清晰,然而,这样的方法是走不通的。
贾里尼克想到了一种很好的统计模型来解决上述问题。判断一个句子是否合理,只需要看它在所有句子中出现的概率就行了。第一个句子出现的概率大概是,第二个句子出现的概率大概是,第三个句子出现的概率大概是,第一个句子出现的可能性最大,因此这个句子最为合理。
那么,如何计算一个句子出现的概率呢,我们可以把有史以来人类说过的话都统计一遍,这样就能很方便的计算概率了。然而,你我都知道这条路走不通。
假设想知道S在文本中出现的可能性,也就是数学上所说的S的概率,既然,那么不妨把S展开表示,
利用条件概率的公式,S这个序列出现的概率等于每一个词出现的条件概率的乘乘积,展开为:
计算很容易,也还能算出来,已经非常难以计算了。
2. 偷懒的马尔科夫(Andrey Markov)
假设上面的n不取很长,而只取2个,那么就可以大大减少计算量。即在此时,假设一个词出现的概率只与它前面的有关,这种假设称为1阶马尔科夫假设。
现在,S的概率就变得简单了:
那么,接下来的问题就变成了估计条件概率,根据它的定义,
当样本量很大的时候,基于大数定律,一个短语或者词语出现的概率可以用其频率来表示,即
其中,表示词出现的次数,表示语料库的大小。
那么
3. 高阶语言模型
在前面的模型中,每个词只与前面1个词有关,和更前面的词就没有关系了,这似乎简单的有点过头了。那么,假定每个词都与前面的N-1个词有关,而与更前面的词无关,这样,当前词的概率只取决于前面N-1个词的联合概率,即
上面这种假设被称为n-1阶马尔科夫假设,对应的模型称为N元模型。N=2就是二元模型,N=1其实就是上下文无关的模型,基本不怎么使用。
上面的模型看起来已经很完美了,但是考虑以下两个问题,对于二元模型:
如果此时,是否可以说 ?
如果此时,是否可以说 ?
显然,不能这么武断。
但是,实际上上述两种情况肯定是会出现的,尤其是语料足够大的时候,那么,我们怎么解决上述问题呢?
古德和图灵给出了一个很漂亮的重新估计概率的公式,这个公式后来被称为古德-图灵估计。
古德图灵的原理是:
对于没有看见的事件,我们不能认为他发生的概率就是0,因此从概率的总量中,分配一个很小的比例给这些没有看见的事件。这样一来,看见的那些事件的概率就要小于1了,因此,需要将所有看见的事件的概率调小一点。至于小多少,要根据“越是不可信的统计折扣越多”的方法进行。
假定在语料库中出现