语言模型

自然语言处理(一)——语言模型

本系列主要参考自Michael Collins, Columbia University. 博主非相关专业,纯兴趣,NLP入门中,写博乃为自我整理。性懒惰,弃latex。行文随意,乱造名词,难免错误,欢迎批评指正。转载请注明。

1.1 模型引入——猜字游戏

试想这样一个猜字游戏,在给出前几个字之后让人猜出紧接着的下一个字是什么:

  • 我就读于哈尔()
  • 中国航()
  • 我()

这样一些例子中,有一些很容易猜得到,另一些就很难猜出了。然而以上过程都是人工去猜的,我们是否能够让计算机来猜测这些字呢?其实在当今的智能中文输入法中,单字联想功能在某些程度上已经很好地做到了这一点。为了实现这一目的,我们就必须要让计算机理解一些什么,例如中文语法,或者字与字之间的一些联系(就像在大多数情况下“哈尔”之后总是连接“滨”用以构成地名)。 

早期的NLP科学家试图通过语言学的规则(例如文法分析和语义分析)来构建模型以解决猜词问题,但收效甚微。后来从语音识别中借鉴了统计学方法,取得了良好的效果。虽然这之间的历史也值得大谈特谈,但我们还是回到基于统计的语言模型建立的介绍上来。 

首先,语言的形成离不开单字(word),我们将所有单字组成一个集合,称为集合ν,可以想象,ν中元素的数量非常之大,但它毕竟是一个有限集。其次,定义一个句子(sentence)的概念如下:一个句子是ν中某些元素的一个有序排列,在句子的末尾总是以一个标识符(STOP)结束。我们不妨将之这样表示: 


其中,xn总代表STOP。 

所以在计算机中,“使用欢迎博客在发表中STOP”是一个合法的句子,即使它本身看起来并不那么像一个句子。想想看,这些句子构成的集合是什么样的? 

我们定义这样由ν中元素构成的所有的句子的集合为ν+,对于ν+中的任意一个句子(x1,x2,…,xn)我们都有 

 

换句话说,p(x1,x2,…,xn)构成了我们sentence集的概率分布。 

这样,一个句子在自然语言中出现的可能性就可以定量地表示了。也就是说,一个句子的概率越高,则它是一个自然语言句子的可能性也就越大。这样,一开始提到的猜字游戏中,我们就可以找到这样一个字,使得构成这个句子的p最大。我们不妨来计算一个句子的概率。首先,我们把word抽象成随机变量(X1,X2,…,Xn),所以上文中的p更严格地表示为:

对于一个句子x1,x2,…,xn,根据链式法则,我们总有

想想看,一方面由于ν的模(也就是ν中元素的数量)是如此巨大,另一方面每个sentence又包含如此多的word,这将导致上面的概率计算公式非常非常之长。计算一个句子已经如此之费力,何况要穷举出所有句子的概率!这样,我们就不得不找出一些近似的方法来实现这个想法。

1.2 马尔可夫(Markov)模型

幸运的是,马尔可夫模型为我们提供了这样一种方法。考虑到根据一个word之前的所有words来预测这个word是如此之繁琐,为此,我们断言,任何一个word的出现概率只与他的前n个词有关,从而大大减少计算复杂性。这背后的理论基础就是Markov模型。而n代表了Markov模型的阶数。 

以二阶Markov模型为例,这时某个句子生成的概率 

而这个概率的求取是相对容易实现的,由大数定律我们可以通过频率近似概率。

在这里,只要我们给定一个训练集,我们只需要统计其中(w|u,v)出现的次数c(u,v)c(u,v,w)。由Bayes公式

我只要数数我的训练集中有多少(u,v,w),有多少(u,v),就可以算出q(w|u,v)

但是请考虑这样一个问题,假如我们有10000word,那么想要完全统计出所有的q(w|u,v)并不现实。因为任意的(u,v,w)的组合次数居然多达10^12次方。而且还有一个问题,并不是每个(w|u,v)都会在我们的训练集中出现,这将导致部分的c(u,v,w)0,表明有相当大的一部分q(w|u,v)=0。甚至c(u,v)0时,问题就更麻烦了。如果因为train set的问题而武断地说这些组合就是不存在的,恐怕有失公允。这样如何使这些组合的概率取到一个合适的值,即如何解决稀疏平滑性也是一个大问题。

把这些问题放到一边,我们首先来看看当我们训练出一个模型时(即我们得到了所有的q(w|u,v)时),如何定量地评价它的优劣。

1.3 如何评价一个模型的优劣?

一个好的模型,其必然揭示了成千上万的word中的某些潜在联系,也许,它通过概率对词与词的搭配做出了某些限制。换句话说,它使我们的word集的模变小了!这样,我们可以同构构建一个变量,来描述word集经过我们模型处理后的模的大小。

考虑我们有m个句子构成一个评价集用于评价模型,每个句子由n(i)word构成

我们的评价函数同时基于这样一个朴素的思想:对于一个正常的句子,模型越好,这个句子的生成概率就越高。我们用函数L=

来构成评价函数。这个函数L()是将每个句子的生成概率求积,用log变换把求积变成求和,再对每个word求平均。

就是我们要构造的最终评价分数。容易证明,当q(w|u,v)采用平均分布时,perplexity = N,考虑到STOP不在我们的word集中,N是我们的word集的模+1.这表明,模型丝毫没有减小词的规模,因为平均分布的uvw序列本身并不带什么约束条件。

事实上我们还可以证明,perplexity还等于t的倒数,t是我们所有q(w|u,v)的几何平均。

 

1.4 如何进行稀疏平滑

终于到了解决历史遗留问题的时刻,对于上文提到的稀疏问题,我们如何使参数平滑化?通俗地讲,如何在有限的训练集情况下使所有的q(w|u,v)参数都不为0?因为我们实在没有资格说一个排列uvw不存在,只是单纯地因为它们不存在于我们的trainset中。

这里有两种常用的方法

  • 线性插值法
  • 折扣法

所谓线性插值,即将我们新的q(w|u,v)由三部分构成,分别是原先意义上的q(w|u,v)q(w|v)q(w)。为了避免混淆我们采用新的下标符号

我们新的q(w|u,v)就可以插值为:

其中,三个插值参数满足:

容易看出,只要w在我们的word集中,就可以保证每个uvw排列的q(w|u,v)都不为0

现在我们只需要解决如何设置lambda1lambda2lambda3.

和上述评价一个模型的思想类似,我们通过一个参数设置集(development set)来训练这些参数。注意,它不同于我们的train set。我们需要这样三个参数使得我们的development setsentence的概率最大。

想想看,我们能不能直接用train set去训练我们的lambdas参数?

由极大似然理论,将各个sentence的概率相乘取对数,得到

其中,三个lambda参数反映了我们对三个qML的设置权重。现在只要求lambda1lambda2lambda3使得L()取到最大值。

然而,这样得到的lambdas参数一定是最好的么?实际上,一方面我们的development set毕竟是有限的,另一方面我们的uvw是个性化的。直观地想,对于某一个uvw组合来说,如果train setc(u,v)比较多,那么这个组合的lambda1也应该相应地大一些。如果c(v)比较多,那么该组合的lambda2也应该大。我们可以这样定义,

容易看出,这样做确实满足了我们的想法。也可以用“篮子方法”来得到lambdas参数。上面的方法是连续的,而篮子方法是一个离散的方法。

所谓“篮子方法”的具体介绍如下:

想象一下我们有n个篮子,每个篮子里面都放着三个lambdas参数。我们将篮子标号为123……n

当某一个uv序列的c(u,v)大于100时,我们使用第一个篮子中的参数作为这个序列的参数。当另一个序列的c(u,v)50100之间时,我们使用第二个篮子中的参数,以此类推。

这样做的好处在于,对于每一个特定的uvw,我们都有和它对应的个性化的lambda参数。这样,我们需要优化的L()函数就变成了

形式更为复杂,但参数选取更为科学了。

 

下面,我们介绍折扣法。顾名思义,折扣法就是将我们在train  set中能够实实在在得到的q(w|u,v)折扣掉一部分分给那些没有出现的uvw序列。想法很简单,关键在于折扣多少才合适。

Collins在书中给出的方法非常简单。先考虑二元语言模型:

通常取beta0-1之间的数,例如0.5.

这样,我们就从总和为1的概率分布中折扣出了

的概率用于分配给未出现的uvw序列。我们人为地将word set分为AB两部分。如果一个word在我们的trainset中出现过,我们就把它放在A中,其余的放在B中。这样,我们的概率分布重新写如下:

B集中的概率可以这样理解:B-set中所有的w来分配折扣出来的alpha,分配权重就是它们在B-set中出现的概率。

 

现在,让我们把这个模型迁移到三元。有了二元的基础,三元很好理解。

 

 

值得一提的是,我们一开始武断地将beta=0.5,这是不合适的。优化beta的具体思想和lambdas同出一辙。

再深入地想一点,训练集中未出现的uvw是如此之多,即使它们每个q(w|u,v)非常地小,但所有这些q的总和却不见得也会小。那么,我们折扣出来的alpha真的足够这些uvw来分配么?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值