Word2Vec-语言模型的前世今生

本文详细介绍了Word2Vec语言模型的发展,从统计语言模型的基础,如马尔科夫模型和N元模型,到神经网络语言模型的引入,特别是Skip-Gram模型和Hierarchical Softmax。文章深入探讨了词向量的表示、负采样和降采样等关键概念,揭示了词向量如何捕捉文本中词语的关系和语义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

1163575-20171127221401409-1598461331.jpg

在机器学习领域,语言识别和图像识别都比较容易做到。语音识别的输入数据可以是音频频谱序列向量所构成的matrix,图像识别的输入数据是像素点向量构成的矩阵。但是文本是一种抽象的东西,显然不能直接把文本数据喂给机器当做输入,因此这里就需要对文本数据进行处理。

现在,有这么一个有趣的例子,我接下来要讲的模型就可以做到。

  • 首先给出一个例子,Paris - France + America = ?

从我们人的角度来看,Paris是法国的首都,那么首都减去国家再加上一个国家,很可能表示的就是另一个国家的首都。因此这里的结果就是华盛顿Washington.机器想做到这一点,并不容易。

  • 众所周知,只有标量或者向量可以应用加减法,抽象的自然语言该如何做到呢?

  • 一个很自然的想法就是,自然语言能否表示成数学的形式,这样就可以更加方便地研究其规律了。

  • 答案是肯定的。

现在我们可以进行思考,如何将文本中的词语用数学的形式表达出来,也就是说,文本中藏着哪些数学形式需要我们去挖掘。

  1. 文本中各个词语出现的频数是有限的,这是一个可以提取的数学形式

  2. 从逻辑的角度出发,词语之间不可能是独立的,一个词语的出现肯定与另一个或者若干个词语有关系。这就涉及到词语共现的层面了。

统计语言模型和大多数的词向量表示都是基于以上两点考虑的。

词向量的表现形式主要分为两种,一种是one-hot(one-hot representation)表示方式,将词表示成一个很长的向量,向量的长度就是词典的长度;另一种表示方法是分布式表示(distributed representation).同时,分布式表示方法又可以分为基于矩阵的表示方法、基于聚类的表示方法和基于神经网络的表示方法。

首先,最简单的就是one-hot表示方法,将词表示成一个很长的向量,向量的分量只有一个1,其他全为0,1所对应的位置就是该词在词汇表中的索引。

这样表示有两个缺点:

  1. 容易受维度灾难(the curse of dimentionality)的困扰;

  2. 没有考虑到词之间的关系(similarity)。

现在主要应用的都是分布式表示形式了。下面介绍一种简单的分布式表示形式——基于矩阵的表示形式。

如下表所示:

Probability and Ratio k = solid k = gas k = water k = fashion
\(p(k\vert ice)\) \(1.9\times 10^{-4}\) \(6.6\times 10^{-5}\) \(3.0\times 10^{-3}\) \(1.7\times 10^{-5}\)
\(p(k\vert steam\)) \(2.2\times 10^{-5}\) \(7.8\times 10^{-4}\) \(2.2\times 10^{-3}\) \(1.8\times 10^{-5}\)
\(p(k\vert ice)/(p(k\vert steam)\) \(8.9\) \(8.5\times 10^{-2}\) \(1.36\) \(0.96\)

简单说一下上面的矩阵。

假设我们对一些热力学短语或者词语的概念感兴趣,我们选择i=ice,k=steam,我们想看看ice和steam的关系,可以通过他们与其他词语的共现频率来研究。这些其他词语我们称之为探测词。这里我们选择探测词k为solid,gas,water和fashion。显然,ice与solid的相关性较高,但是与steam相关性较低,因此我们期望看到的是\(p_{ik}/p_{jk}\)比值比较大。对于探测词gas,我们期望看到的是\(p_{ik}/p_{jk}\)比值比较小。而water和fashion与ice和steam的关系要么都十分密切,要么都不怎么密切,因此对于这两个探测词,\(p_{ik}/p_{jk}\)应该接近于1.

上表是基于一个很大的语料库统计得出的,符合我们的预期。相比于单独使用原始概率,概率比值可以更好的区分相关词语和不相关词语,比如solid和gas与water和fashion;也可以很容易区分两个相关词。

那么,在正式介绍自然语言处理,或者说wrod2vec之前,有必要介绍以下统计语言模型。它是现在所有语言模型的基础。

第二个需要讲的分布式表示方式是基于神经网络的表示方法。在此之前,有必要讲一下传统的统计语言模型,毕竟它对语言模型影响深远。


统计语言模型

1. 引言

给出以下三个句子:

美联储主席本·伯南克昨天告诉媒体7000亿美元的救助资金将借给上百家银行、保险公司和汽车公司

美主席联储本·伯南克告诉昨天媒体7000亿美元的资金救助将借给百上家银行、保险公司和汽公车司

美主车席联储本·克告诉昨天公司媒体7000伯南亿美行元的金将借给百救助上家资银、保险公司和汽

对于第一个句子,语句通畅,意思也很不明白;对于第二个句子,虽然个别词语调换了位置,但也不影响阅读,我们仍然能够知道表达的是什么意思;对于第三个句子,我们就很难知道具体表示什么意思了。

如果问你为什么第三个句子不知道表达什么,你可能会说句子混乱,语义不清晰。在上个世纪70年代的时候,科学家们也是这样想的,并且试图让计算机去判断一个句子的语义是否清晰,然而,这样的方法是走不通的。

贾里尼克想到了一种很好的统计模型来解决上述问题。判断一个句子是否合理,只需要看它在所有句子中出现的概率就行了。第一个句子出现的概率大概是\(10^{-20}\),第二个句子出现的概率大概是\(10^{-25}\),第三个句子出现的概率大概是\(10^{-70}\),第一个句子出现的可能性最大,因此这个句子最为合理。

那么,如何计算一个句子出现的概率呢,我们可以把有史以来人类说过的话都统计一遍,这样就能很方便的计算概率了。然而,你我都知道这条路走不通。

假设想知道S在文本中出现的可能性,也就是数学上所说的S的概率,既然\(S=w_1,w_2,...,w_n\),那么不妨把S展开表示,

\[P(S)=P(w_1,w_2,...,w_n)\]

利用条件概率的公式,S这个序列出现的概率等于每一个词出现的条件概率的乘乘积,展开为:

\[P(w_1,w_2,...,w_n)=P(w_1)P(w_2\vert w_1)P(w_3\vert w_1,w_2)\cdots P(w_n\vert w_1,w_2,\cdots w_{n-1})\],

计算\(P(w_1)\)很容易,\(P(w_2\vert w_1)\)也还能算出来,\(P(w_3\vert w_1,w_2)\)已经非常难以计算了。

2. 偷懒的马尔科夫(Andrey Markov)

假设上面的n不取很长,而只取2个,那么就可以大大减少计算量。即在此时,假设一个词\(w_i\)出现的概率只与它前面的\(w_{i-1}\)有关,这种假设称为1阶马尔科夫假设。

现在,S的概率就变得简单了:

\[P(w_1,w_2,...,w_n) \approx P(w_1)P(w_2\vert w_1)\]

那么,接下来的问题就变成了估计条件概率\(P(w_i\vert w_{i-1})\),根据它的定义,

\[P(w_i\vert w_{i-1}) = \frac{P(w_i,w_{i-1})}{P(w_{i-1})}\],

当样本量很大的时候,基于大数定律,一个短语或者词语出现的概率可以用其频率来表示,即

\[P(w_i,w_{i-1}) \approx \frac{count(w_i,w_{i-1})}{count(*)}\]

\[P(w_{i-1}) \approx \frac{count(w_{i-1})}{count(*)}\]

其中,\(count(i)\)表示词\(i\)出现的次数,\(count\)表示语料库的大小。

那么

\[P(w_i\vert w_{i-1}) = \frac{P(w_i,w_{i-1})}{P(w_{i-1})} \approx \frac{count(w_i,w_{i-1})}{count(w_{i-1})}\]

3. 高阶语言模型

在前面的模型中,每个词只与前面1个词有关,和更前面的词就没有关系了,这似乎简单的有点过头了。那么,假定每个词\(w_i\)都与前面的N-1个词有关,而与更前面的词无关,这样,当前词的概率只取决于前面N-1个词的联合概率,即

\[P(w_1\vert w_1,w_2,\cdots w_{i-1}) \approx P(w_1\vert w_{i-N+1},w_{i-N+2},\cdots w_{i-1})\],

上面这种假设被称为n-1阶马尔科夫假设,对应的模型称为N元模型。N=2就是二元模型,N=1其实就是上下文无关的模型,基本不怎么使用。

上面的模型看起来已经很完美了,但是考虑以下两个问题,对于二元模型:

  • 如果此时\(count(w_i,w_{i-1})=0\),是否可以说\(P(w_i\vert w_{i-1})=0\) ?

  • 如果此时\(count(w_i,w_{i-1})=count(w_{i-1})\),是否可以说\(P(w_i\vert w_{i-1})=1\) ?

显然,不能这么武断。

但是,实际上上述两种情况肯定是会出现的,尤其是语料足够大的时候,那么,我们怎么解决上述问题呢?

古德和图灵给出了一个很漂亮的重新估计概率的公式,这个公式后来被称为古德-图灵估计。

古德图灵的原理是:

对于没有看见的事件,我们不能认为他发生的概率就是0,因此从概率的总量中,分配一个很小的比例给这些没有看见的事件。这样一来,看见的那些事件的概率就要小于1了,因此,需要将所有看见的事件的概率调小一点。至于小多少,要根据“越是不可信的统计折扣越多”的方法进行。

假定在语料库中出现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值