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

引言

本文主要探讨了如何用困惑度来评估语言模型的好坏,以及统计语言模型中的几种平滑方法。

评估语言模型

评估语言模型就是判断语言模型的好坏。

一般使用**困惑度(perplexity)**来评估,它的公式为:
P e r p l e x i t y = 2 − ( x ) Perplexity = 2^{-(x)} Perplexity=2(x)
其中 x x x为平均对数似然。我们希望平均对数似然越大越好,也就是困惑度越小越好。

下面以一个例子来说明。给定一个样本“今天天气很好,适合出去运动”。

自然语言处理——语言模型(三)_第1张图片
我们来计算这个训练好的Bigram的困惑度。
首先计算 p ( 今 天 ) = 0.002 p(今天)=0.002 p()=0.002,然后我们希望给定“今天”的条件下后面接“天气”的概率越大越好,从语言模型可以得知 p ( 天 气 ∣ 今 天 ) = 0.01 p(天气|今天)=0.01 p()=0.01

接下给定“天气”,看出现“很好”的概率 p ( 很 好 ∣ 天 气 ) = 0.1 p(很好|天气)=0.1 p()=0.1

自然语言处理——语言模型(三)_第2张图片
这样我们就计算出来针对这句话的每个单元的概率,即似然。我们希望似然越大越好。

那如何求平均对数似然呢,对每个概率取对数,然后求所有概率的平均即可。

统计语言模型的平滑方法

在上篇文章中,

自然语言处理——语言模型(三)_第3张图片
我们要评估“今天/开始/训练营/课程”和“今天/没有/训练营/课程”这两句话的概率。

p ( 今 天 , 开 始 , 训 练 营 , 课 程 ) = p ( 今 天 ) ⋅ p ( 开 始 ) ⋅ p ( 训 练 营 ) ⋅ p ( 课 程 ) p(今天,开始,训练营,课程) = p(今天) \cdot p(开始) \cdot p(训练营) \cdot p(课程) p(,,,)=p()p()p()p()

我们分别来计算上面每个单词的概率,首先统计语料库中单词总数 V = 19 V=19 V=19 C ( 今 天 ) = 2 C(今天)=2 C()=2,所以 p ( 今 天 ) = 2 19 p(今天)=\frac{2}{19} p()=192

同理可以计算出每个单词的概率。
p ( 今 天 , 开 始 , 训 练 营 , 课 程 ) = p ( 今 天 ) ⋅ p ( 开 始 ) ⋅ p ( 训 练 营 ) ⋅ p ( 课 程 ) = 2 19 × 1 19 × 1 19 × 1 19 = 2 1 9 4 \begin{aligned} p(今天,开始,训练营,课程) &= p(今天) \cdot p(开始) \cdot p(训练营) \cdot p(课程) \\ &= \frac{2}{19} \times \frac{1}{19} \times \frac{1}{19} \times \frac{1}{19} = \frac{2}{19^4} \end{aligned} p(,,,)=p()p()p()p()=192×191×191×191=1942

下面看第二个句子“今天/没有/训练营/课程”的概率。
p ( 今 天 , 没 有 , 训 练 营 , 课 程 ) = p ( 今 天 ) ⋅ p ( 没 有 ) ⋅ p ( 训 练 营 ) ⋅ p ( 课 程 ) = 2 19 × 0 19 × 1 19 × 1 19 = 0 \begin{aligned} p(今天,没有,训练营,课程) &= p(今天) \cdot p(没有) \cdot p(训练营) \cdot p(课程) \\ &= \frac{2}{19} \times \frac{0}{19} \times \frac{1}{19} \times \frac{1}{19} = 0 \end{aligned} p(,,,)=p()p()p()p()=192×190×191×191=0

因为单词“没有”未出现在语料库中,导致它的概率为零,最终让整个句子的概率为零。
这个句子显然是合理的,但是其概率为零是不合理的。

为了解决这个问题,我们需要采用平滑的方法,

Add-1 Smoothing

加1平滑也称为拉普拉斯平滑,最早是法国数学家拉普拉斯提出来的。

假设没有平滑,我们要这样计算概率:
P ( w i ∣ w i − 1 ) = c ( w i − 1 , w i ) c ( w i ) P(w_i|w_{i-1}) = \frac{c(w_{i-1},w_i)}{c(w_i)} P(wiwi1)=c(wi)c(wi1,wi)

拉普拉斯平滑只是把每一项都增加了 1 1 1,因为词典中共有 V V V个单词,因此分母中需要增加 V V V

P L a p l a c e ( w i ∣ w i − 1 ) = c ( w i − 1 , w i ) + 1 c ( w i ) + V P_{Laplace} (w_i|w_{i-1}) = \frac{c(w_{i-1},w_i) + 1}{c(w_i) + V} PLaplace(wiwi1)=c(wi)+Vc(wi1,wi)+1

分母加 V V V的原因是保证条件概率之和为 1 1 1

这样假设遇到没有见过的组合“我们,是”,那么项 c ( 我 们 , 是 ) c(我们,是) c(,)至少也会是 1 1 1,整个式子的概率也不会是零。

Add-K Smoothing

加k平滑类似加1平滑,不过每一项增加的是 k k k(不一定是整数,可以是0.1,0.01)。

P L a p l a c e ( w i ∣ w i − 1 ) = c ( w i − 1 , w i ) + k c ( w i ) + k V P_{Laplace} (w_i|w_{i-1}) = \frac{c(w_{i-1},w_i) + k}{c(w_i) + kV} PLaplace(wiwi1)=c(wi)+kVc(wi1,wi)+k

要如何选择合适的 k k k呢。

我们可以把训练好的语言模型用在验证集中,来计算困惑度。
把困惑度看成是一个关于 k k k的函数 f ( k ) f(k) f(k)

我们需要最小化困惑度,也就是要最小化 f ( k ) f(k) f(k),从而可以找到
k ^ = arg ⁡   min ⁡ f ( k ) \hat k = \arg \,\min f(k) k^=argminf(k)

Interpolation

我们以一个例子来说明, C ( w ) C(w) C(w)表示 w w w在语料库中出现的次数。
自然语言处理——语言模型(三)_第4张图片
假设有上面几个单词以及出现的次数,我们如何求 p ( k i t c h e n ∣ i n   t h e ) p(kitchen|in\,the) p(kitcheninthe) p ( a r b o r e t u m ∣ i n   t h e ) p(arboretum|in\,the) p(arboretuminthe)

按照以前的方法来计算的话,它们两的概率都为零,从另一个角度来看,即认为"in the"后面出现"kitchen"和"arboretum"(植物园)的概率是一样的。从我们的经验来看,显然是不合理的。

虽然我们没有在训练集中看到这些词语,并不代表未来不会看到。

我们上面的模型是trigram,在trigram中,我们没有看到"in the kitchen"与"in the arboretum",那我们不妨退而求其次,我们看unigram模型,即单个单词出现的概率。

我们可以看到"kichen"出现了4次,而"arboretum"出现了0次,因此Interpolation认为 p ( k i t c h e n ∣ i n   t h e ) > p ( a r b o r e t u m ∣ i n   t h e ) p(kitchen|in\,the) > p(arboretum|in\,the) p(kitcheninthe)>p(arboretuminthe)

Interpolation的核心思想是:在计算Trigram的时候,为了更加合理,同时考虑Unigram,Bigram和Trigram出现的频次。

那我们如何公式化表示呢,我们要综合考虑这三个模型,但是显然不能同等对待,每个模型的重要程度肯定是不同的,因此需要增加一个权重。

p ( w n ∣ w n − 1 , w n − 2 ) = λ 1 p ( w n ∣ w n − 1 , w n − 2 ) + λ 2 p ( w n ∣ w n − 1 ) + λ 3 p ( w n ) p(w_n|w_{n-1},w_{n-2}) = \lambda_1 p(w_n|w_{n-1},w_{n-2}) + \lambda_2 p(w_n|w_{n-1}) + \lambda_3 p(w_n) p(wnwn1,wn2)=λ1p(wnwn1,wn2)+λ2p(wnwn1)+λ3p(wn)

其中 λ 1 + λ 2 + λ 3 = 1 \lambda_1 + \lambda_2 + \lambda_3 =1 λ1+λ2+λ3=1

Good-Turning Smoothing

我们还是用一个例子来阐述,假设你在钓鱼,已经抓到了18只鱼,其中有:
10条鲤鱼,3条黑鱼,2条刀鱼,1条鲨鱼,1条草鱼,1条鳗鱼。

然后有三个问题:自然语言处理——语言模型(三)_第5张图片
对于第一个问题,最简单的方法就是计算之前我们钓到鲨鱼的概率是多少,就是 1 18 \frac{1}{18} 181

然后来看第二个问题,虽然18只鱼里包含了6种鱼了,但是钓到的下一条鱼一定是属于这6种里吗?显然是未必的,可能会是金鱼、八爪鱼…

下一条鱼是新鱼种的概率貌似是很难计算出来的,但是我们有一种方法可以近似地计算出来,假设下一条鱼是新鱼种,那么新鱼种的概率就是 1 19 \frac{1}{19} 191

我们从这个角度来思考一下,

在这里插入图片描述
假设我们钓到第15条鱼的时候,有可能后面钓到的鱼是之前没钓到过的鱼种,我们钓到第16条鱼的时候,是一条鲨鱼,是新鱼种。

第17条的时候也是新鱼种草鱼。所以近似的方法就是,我们目前为止钓到 1 1 1条的鱼来近似未来新鱼种的概率

对于第二个问题,一种简单的方法是用后面这3条鱼来估计未来钓到新鱼种的概率。也就是 3 18 \frac{3}{18} 183

那我们重新思考一下,下一条抓到鲨鱼的概率是多少,也就是问题3。

在问题1的时候,我们的答案是 1 18 \frac{1}{18} 181,这个概率的假设是所有这6种鱼加起来的概率是等于 1 1 1的,即使不存在新鱼种的。

而现在我们认为还存在未知的新鱼种,也就是说之前这6种鱼的概率是小于 1 1 1的,所以下一条鱼为鲨鱼的概率是小于 1 18 \frac{1}{18} 181

这就是Good-Turning Smoothing的思想。在细讲该算法之前,先要看一个定义。

N c N_c Nc是出现 c c c次的单词的个数。

看一个例子“Sam I am I am Sam I do not eat”。

  • Sam : 2次
  • I :3次
  • am :2次
  • do : 1次
  • not :1次
  • eat : 1次

我们计算下出现了 3 3 3次的单词, N 3 = 1 N_3=1 N3=1
同理, N 2 = 3 , N 1 = 3 N_2=3,N_1=3 N2=3,N1=3

下面就来看下Good-Turning Smoothing的算法。
自然语言处理——语言模型(三)_第6张图片
它分为两部分,第一部分处理没有出现过的单词,第二部分处理出现过的单词。

  • 在处理没有出现过的单词时,有两种方式。其中 P M L E = 0 P_{MLE}=0 PMLE=0这种方式是我们回答第一个问题时的做法;另一种方式是用 N 1 N \frac{N_1}{N} NN1

  • 在处理出现过的单词时,也有两种方式。第一种方法是比较简单的方法;第二种是基于Good-Turning Smoothing的方法。

我们用这几种方法来对钓鱼的例子来计算新鱼种“飞鱼”的概率。已经抓到了18只鱼,其中有:
10条鲤鱼,3条黑鱼,2条刀鱼,1条鲨鱼,1条草鱼,1条鳗鱼。

  • 先看没有出现过的“飞鱼”:
    • P M L E ( 飞 鱼 ) = 0 18 = 0 P_{MLE}(飞鱼) = \frac{0}{18} = 0 PMLE()=180=0
    • P G T ( 飞 鱼 ) = N 1 N = 3 18 P_{GT}(飞鱼) = \frac{N_1}{N} = \frac{3}{18} PGT()=NN1=183
  • 再看出现过的,假设是“草鱼”( c c c代表草鱼出现的次数,这里是 1 1 1次):
    • P M L E ( 草 鱼 ) = 1 18 P_{MLE}(草鱼) = \frac{1}{18} PMLE()=181
    • P G T ( 草 鱼 ) = ( 1 + 1 ) × N 2 N 1 ⋅ N = 2 ⋅ 1 3 ⋅ 18 = 1 27 P_{GT}(草鱼) = \frac{(1+1) \times N_2}{N_1 \cdot N} = \frac{2 \cdot 1}{3 \cdot 18} =\frac{1}{27} PGT()=N1N(1+1)×N2=31821=271 ( N 2 = 1 N_2=1 N2=1)

缺点:可能碰到出现次数为零的情况。

你可能感兴趣的:(人工智能,读书笔记)