07[NLP训练营]语言模型


公式输入请参考: 在线Latex公式

Language Model Introduction

语言模型用来判断:是否一句话从语法上通顺
比较:
今天是周日VS今天周日是
全民Al是趋势VS趋势全民Al是
LM是如何判断上面的句子是否符合语法的呢?
如果我们有一个pretrained的LM,对于上面两个例子,就该有:
p L M ( ) > p L M ( ) p_{LM}(今天是周日)>p_{LM}(今天周日是)
p L M ( A I ) > p L M ( A I ) p_{LM}(全民AI是趋势)>p_{LM}(趋势全民AI是)

LM 的目标

Compute the probability of a sentence or sequence of
|words.
p ( s ) = p ( w 1 , w 2 , w 3 , w 4 , w 5 w n ) (1) p(s)=p(w_1, w_2,w_3,w_4, w_5\cdots w_n)\tag1
w 1 , w 2 , w 3 , w 4 w_1, w_2,w_3,w_4 是句子s中的单词

Chain Rule for Language Model

Chain Rule推导在第一节有,这里不重复了,根据Chain Rule,公式(1)可以写为:
p ( s ) = p ( w 1 , w 2 , w 3 , w 4 , w 5 w n ) = p ( w 1 ) p ( w 2 w 1 ) p ( w 3 w 1 w 2 ) p ( w 4 w 1 w 2 w 3 ) p ( w 5 w 1 w 2 w 3 w 4 ) p ( w n w 1 w 2 w 3 w 4 w n 1 ) p(s)=p(w_1, w_2,w_3,w_4, w_5\cdots w_n)=p(w_1)p(w2|w_1)p(w_3|w_1w_2)p(w_4|w_1w_2w_3)p(w_5|w_1w_2w_3w_4)\cdots p(w_n|w_1w_2w_3w_4\cdots w_{n-1})
根据这个公式,下面看一个例子:
在这里插入图片描述
那么再来看里面的每一项是如何计算,假如我们有一个文档,文档中有两句这个话:
今天是春节我们都休息。
今天是春节我们都放假。
由于“今天是春节我们都”这句话后面有两个词,一个是“休息”,一个是“放假”,那么我们说:
p ( ) = 1 2 p(休息|今天,是,春节,我们,都)=\cfrac{1}{2}
p ( ) = 0 p(运动|今天,是,春节,我们,都)=0
从上面的计算我们可以看到,有很多项的概率计算的结果很容易是0(只要文档中没有出现过的都是0),那么我们把这个现象称为sparse,下面我们看如何解决这个问题。

Markov Assumption

马尔科夫假设就是用来近似的计算上面的概率的。
1st order Markov Assumption
p ( ) = p ( ) p(休息|今天,是,春节,我们,都)=p(休息|都)
只关注最近的一个词
2nd order Markov Assumption
p ( ) = p ( ) p(休息|今天,是,春节,我们,都)=p(休息|我们,都)
3rd order Markov Assumption
p ( ) = p ( ) p(休息|今天,是,春节,我们,都)=p(休息|春节,我们,都)
抽象为具体的公式:
1st order Markov Assumption:
p ( s ) = p ( w 1 , w 2 , w 3 , w 4 , w 5 w n ) = p ( w 1 ) p ( w 2 w 1 ) p ( w 3 w 2 ) p ( w 4 w 3 ) p ( w 5 w 4 ) p ( w n w n 1 ) = p ( w 1 ) i = 2 n ( w i w i 1 ) p(s)=p(w_1, w_2,w_3,w_4, w_5\cdots w_n)=p(w_1)p(w2|w_1)p(w_3|w_2)p(w_4|w_3)p(w_5|w_4)\cdots p(w_n|w_{n-1})\\ =p(w_1)\prod_{i=2}^n(w_i|w_{i-1})
2nd order Markov Assumption:
p ( s ) = p ( w 1 , w 2 , w 3 , w 4 , w 5 w n ) = p ( w 1 ) p ( w 2 w 1 ) p ( w 3 w 1 w 2 ) p ( w 4 w 2 w 3 ) p ( w 5 w 3 w 4 ) p ( w n w n 1 ) = p ( w 1 ) p ( w 2 w 1 ) i = 3 n ( w i w i 2 w i 1 ) p(s)=p(w_1, w_2,w_3,w_4, w_5\cdots w_n)=p(w_1)p(w2|w_1)p(w_3|w_1w_2)p(w_4|w_2w_3)p(w_5|w_3w_4)\cdots p(w_n|w_{n-1})\\ =p(w_1)p(w_2|w_1)\prod_{i=3}^n(w_i|w_{i-2}w_{i-1})
3rd order Markov Assumption:
p ( s ) = p ( w 1 , w 2 , w 3 , w 4 , w 5 w n ) = p ( w 1 ) p ( w 2 w 1 ) p ( w 3 w 1 w 2 ) p ( w 4 w 1 w 2 w 3 ) p ( w 5 w 2 w 3 w 4 ) p ( w n w n 3 w n 2 w n 1 ) = p ( w 1 ) p ( w 2 w 1 ) p ( w 3 w 1 w 2 ) i = 4 n ( w i w i 3 w i 2 w i 1 ) p(s)=p(w_1, w_2,w_3,w_4, w_5\cdots w_n)=p(w_1)p(w2|w_1)p(w_3|w_1w_2)p(w_4|w_1w_2w_3)p(w_5|w_2w_3w_4)\cdots p(w_n|w_{n-3}w_{n-2}w_{n-1})\\ =p(w_1)p(w_2|w_1)p(w_3|w_1w_2)\prod_{i=4}^n(w_i|w_{i-3}w_{i-2}w_{i-1})

LM计算实例(based 1st order)

假如已知:
p ( ) = 0.01 p ( ) = 0.002 p ( ) = 0.001 p ( I ) = 0.0001 p ( ) = 0.02 p ( ) = 0.0002 p(是|今天)=0.01\\ p(今天)=0.002\\ p(周日|是)=0.001\\ p(周日I今天)=0.0001\\ p(周日)=0.02\\ p(是|周日)=0.0002
比较:今天是周日VS今天周日是 两句话的概率
p(今天是周日)=
在这里插入图片描述
可以看到:
p ( ) > p ( ) p(今天是周日)>p(今天周日是)
根据刚才的Markov Assumption,我们可以有不同的LM,下面具体来看。

Language Model:Unigram

公式:
p ( s ) = p ( w 1 , w 2 , w 3 , w 4 , w 5 w n ) = p ( w 1 ) p ( w 2 ) p ( w 3 ) p ( w 4 ) p ( w 5 ) p ( w n ) p(s)=p(w_1, w_2,w_3,w_4, w_5\cdots w_n)=p(w_1)p(w2)p(w_3)p(w_4)p(w_5)\cdots p(w_n)
下面看例子:
p ( ) = p ( ) p ( ) p ( ) p ( ) p ( ) p ( ) p(今天,是,春节,我们,都,休息)=p(今天)p(是)p(春节)p(我们)p(都)p(休息)
同样的
p ( ) = p ( ) p ( ) p ( ) p ( ) p ( ) p ( ) p(今天,春节,是,都,我们,休息)=p(今天)p(春节)p(是)p(都)p(我们)p(休息)
可以看到虽然单词位置不一样了,但是计算出来的句子概率都一样,但是上面的句子明显语法要好得多。

Language Model:Bigram

基于1st order Markov Assumption
p ( s ) = p ( w 1 , w 2 , w 3 , w 4 , w 5 w n ) = p ( w 1 ) p ( w 2 w 1 ) p ( w 3 w 2 ) p ( w 4 w 3 ) p ( w 5 w 4 ) p ( w n w n 1 ) = p ( w 1 ) i = 2 n ( w i w i 1 ) p(s)=p(w_1, w_2,w_3,w_4, w_5\cdots w_n)=p(w_1)p(w2|w_1)p(w_3|w_2)p(w_4|w_3)p(w_5|w_4)\cdots p(w_n|w_{n-1})\\ =p(w_1)\prod_{i=2}^n(w_i|w_{i-1})
同样是上面两句话:
在这里插入图片描述
当然还可以有Trigram,以此类推后:

Language Model:N-gram

当N>2的时候,也把这个模型称为:higher order LM
最常用还是N=2
如果N=3,就相当于2nd order Markov Assumption。
下面来看看如何来估计模型的概率

估计语言模型的概率

Unigram:Estimating Probability

先看看公式:
p ( s ) = p ( w 1 , w 2 , w 3 , w 4 , w 5 w n ) = p ( w 1 ) p ( w 2 ) p ( w 3 ) p ( w 4 ) p ( w 5 ) p ( w n ) p(s)=p(w_1, w_2,w_3,w_4, w_5\cdots w_n)=p(w_1)p(w2)p(w_3)p(w_4)p(w_5)\cdots p(w_n)
这里面的每个单词概率 p ( w n ) p(w_n) 怎么求?
用一个单词在文档出现的次数,除以文档中单词的总数。
看例子:
语料库如下:
在这里插入图片描述
那么下面这句话的概率计算如下图所示:结果是 2 1 9 4 \cfrac{2}{19^4}
在这里插入图片描述
再看另外一句话:
在这里插入图片描述
由于“没有”这个词没有在语料库中出现,导致整句话的概率为0,这个明显不合理的。
解决方案就是在没有出现过的词语分子上加一个很小的值(这个值也叫:平滑项)。

Bigram:Estimating Probability

先看公式:
p ( s ) = p ( w 1 , w 2 , w 3 , w 4 , w 5 w n ) = p ( w 1 ) p ( w 2 w 1 ) p ( w 3 w 2 ) p ( w 4 w 3 ) p ( w 5 w 4 ) p ( w n w n 1 ) = p ( w 1 ) i = 2 n ( w i w i 1 ) p(s)=p(w_1, w_2,w_3,w_4, w_5\cdots w_n)=p(w_1)p(w2|w_1)p(w_3|w_2)p(w_4|w_3)p(w_5|w_4)\cdots p(w_n|w_{n-1})\\ =p(w_1)\prod_{i=2}^n(w_i|w_{i-1})
那么里面的每一项: p ( w n w n 1 ) p(w_n|w_{n-1}) 如何计算?看例子:
在这里插入图片描述
在这里插入图片描述
看例子:
语料库如下:
在这里插入图片描述
注意,第一今天的概率用的是unigram的算法来计算。
在这里插入图片描述
在这里插入图片描述
这里也有某项为0,整个句子的概率也为0的情况。同样可以用平滑项来优化。

N-gram:Estimating Probability

N=3,用同样的语料库:
p L M ( ) = p L M ( ) p L M ( ) p L M ( ) p L M ( ) p_{LM}(今天上午有课程)=p_{LM}(今天)p_{LM}(上午|今天)p_{LM}(有|今天,上午)p_{LM}(课程|今天,上午,有)
其中: p L M ( ) = 1 / 2 p_{LM}(有|今天,上午)=1/2
p L M ( ) = 1 p_{LM}(课程|今天,上午,有)=1

评估语言模型Evaluation of Language Model

Q:训练出来的语言模型效果好还是坏?
理想情况下
1.假设有两个语言模型A,B
2.选定一个特定的任务比如:拼写纠错
3.把两个模型A,B都应用在此任务中
4.最后比较准确率,从而判断A,B的表现
注意:以上的评估是理想状态,要想完成以上的评估,需要很长的时间或者很多精力。我们希望能找到一种方法,不用执行特定的任务,就能直接判定模型的好坏。这个就是:

Perplexity(困惑度)

公式:
P e r p l e x i t y = 2 ( x )  x:average log likelihood Perplexity=2^{-(x)} \text{ x:average log likelihood}
Perplexity通常用于无监督学习的模型的评估。x是在训练集中计算出来的 ,我们希望x越大越好。
一般,我们是把LM放到语料库中,就可以得到x:
在这里插入图片描述
Perplexity是越小越好。下看例子如何计算Perplexity:
假设训练好的Bigram
p(天气|今天)=0.01
p(今天)=0.002
p(很好|天气)=0.1
p(适合|很好)=0.01
p(出去|适合)=0.02
p(运动|出去)=0.1
针对语料库,计算出对应的likelihood:
在这里插入图片描述
再把计算出来的likelihood分别取对数log,然后求平均:
x = l o g 0.002 + l o g 0.01 + l o g 0.1 + l o g 0.01 + l o g 0.02 l o g 0.1 6 x=\cfrac{log0.002+log0.01+log0.1+log0.01+log0.02log0.1}{6}
然后把x带入困惑度公式即可。
当然,除了困惑度,还有召回率,精确率等指标用于不同场景。
Training 38 millon words, test 1.5 million words, WSJ(by Dan Jurafsky)
在这里插入图片描述
n-gram,n越大越容易过拟合。

平滑处理Smoothing

问题引入

在Estimating Probability这节中,我们需要对等于0的概率进行处理,如果不处理就会出现两个明显不同的语句概率都为0的情况,无法分辨语法的好坏。


语料库
今天 上午 的 天气 很好
我 很 想 出去 运动
但 今天 上午 有 课程
训练营 明天 才 开始


在这里插入图片描述
由于画圈的两项都没有在语料库中出现,所以这两项的值为0,导致这两句话的概率都为0,但是我们看到下面的那句话明显要比上面那句话语法要好。
因此我们要引入平滑项。

Add-one Smoothing(Laplace Smoothing)

没有加平滑项之前:
P M L E ( w i w i 1 ) = c ( w i 1 , w i ) c ( w i ) (2) P_{MLE}(w_i|w_{i-1})=\cfrac{c(w_{i-1},w_i)}{c(w_i)}\tag2
这里的分子很容易等于0,因此我们给分子加上1,即便词语没有出现在语料库中,整个项也不会等于0了。
加平滑项之后:
P A d d 1 ( w i w i 1 ) = c ( w i 1 , w i ) + 1 c ( w i ) + V P_{Add-1}(w_i|w_{i-1})=\cfrac{c(w_{i-1},w_i)+1}{c(w_i)+V}
V代表语料库中的单词数量
这里为什么分母要加上V呢?而不是别的数,或者不是2V,3V呢?看例子来理解:


语料库
今天 上午 的 天气 很好
我 很 想 出去 运动
但 今天 上午 有 课程
训练营 明天 才 开始


这里V=17
用公式2来计算概率:
“今天”出现两次,两次后面都接的“上午”,所以分子分母都有2,然后再分别加1和V:
在这里插入图片描述
对于语料库中的其他所有的词都没有出现在“今天”后面,所以分子是0,分母还是2
在这里插入图片描述
这些词一共有16个,所以整个概率就是:
3 19 + 1 19 , , 1 19 16 = 1 \cfrac{3}{19}+\underset{16个}{\cfrac{1}{19},\cdots,\cfrac{1}{19}}=1
所有可能性加起来要等于1,这是为什么要在分母加V的理由。

Add-K Smoothing

和Add-one Smoothing非常像,只是把1改为k
P A d d k ( w i w i 1 ) = c ( w i 1 , w i ) + k c ( w i ) + k V P_{Add-k}(w_i|w_{i-1})=\cfrac{c(w_{i-1},w_i)+k}{c(w_i)+kV}
当k=1时,就和Add-one Smoothing一样了。
同样的语料库,我们来看看k=3的情况:
在这里插入图片描述
那么不同的k应该如何选择?
方法1:分别把 k = 1 , 2 , 3 , 4 , 5 , 6 , . . . , 100 k=1,2,3,4,5,6,...,100 代入,然后比较
方法2:把k看做参数,得到一个函数 f ( k ) f(k) ,来进行优化。那么我们可以用之前的困惑度来评出k的最优值。

Interpolation

先看例子,假如说我们从语料库从得到下面词语的出现次数:
C(in the kitchen)=0
C(the kitchen)=3
C(kitchen)=4
C(arboretum)=0
然后分别计算下面两个东西的条件概率,发现由于C(in the kitchen)=0,下面第一个是为0,由于C(arboretum)=0,所以第二个也是0。
p(kitchen | in the)=0
p(arboretum | in the)=0
按理来说第一个短语的概率要比第二个要高才对。
改进的核心思路
在计算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 ) λ 1 + λ 2 + λ 3 = 1 p(w_n|w_{n-1},w_{n-2})=\lambda_1p(w_n|w_{n-1},w_{n-2})\\ +\lambda_2p(w_n|w_{n-1})\\ +\lambda_3p(w_n)\\ \lambda_1+\lambda_2+\lambda_3=1

Good-Turning Smoothing

https://blog.csdn.net/lt326030434/article/details/87893601

引例

假设你在钓鱼,已经抓到了18只鱼:
10条鲤鱼,3条黑鱼,2条刀鱼,1条鲨鱼,1条草鱼,1条鳗鱼……
Q1:下一个钓到的鱼是鲨鱼的概率是多少?
之前总共18只鱼,只有一条是鲨鱼,所以下一条是鲨鱼的概率是1/18。
Q2:下一条鱼是新鱼种(之前没有出现过)的概率是多少?
之前总共18只鱼,其中包含新鱼种(各一条的)有三次,所以可以估算再次钓到新鱼种的概率是3/18
Q3:既然如此,重新想一下,下一条抓到的鱼为鲨鱼的概率是多少?
问题1没有考虑新鱼种,所以下一条是鲨鱼的概率是1/18,但是考虑新鱼种后,我们要吧概率分一些给新的鱼种,所以在这个条件下下一条是鲨鱼的概率是明显要小于1/18才对。下面来看Good-Turning Smoothing是怎么计算这个考虑新物种的概率。

说明

N c N_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次
那么在这个句子里面 N 3 = 1 , N 2 = 2 , N 1 = 3 N_3=1,N_2=2,N_1=3
对于没有出现过的单词:
观察原来的数据给出的概率: P M L E = 0 P_{MLE}=0
Good-Turning Smoothing则为: P G T = N 1 N P_{GT}=\cfrac{N_1}{N}
对于出现过的单词:
观察原来的数据给出的概率: P M L E = c N P_{MLE}=\cfrac{c}{N}
Good-Turning Smoothing则为: P G T = ( c + 1 ) N c + 1 N c 1 N P_{GT}=\cfrac{(c+1)N_{c+1}}{N_c}*\cfrac{1}{N}
有的地方用这个: P G T = ( c + 1 ) N c + 1 N c P_{GT}=\cfrac{(c+1)N_{c+1}}{N_c} 搞不懂。。。。
先用鱼来算一下:
假设你在钓鱼,已经抓到了18只鱼:
10条鲤鱼,3条黑鱼,2条刀鱼,1条鲨鱼,1条草鱼,1条鳗鱼……
在这里插入图片描述
在这里插入图片描述
下面看词的例子:
在这里插入图片描述
下一个是没有出现过的单词:
0.00015 = N 1 N = 1132844 7514941065 0.00015=\cfrac{N_1}{N}=\cfrac{1132844}{7514941065}
下一个是出现过一次的单词:
P G T = ( c + 1 ) N c + 1 N c = ( 1 + 1 ) 263611 1132844 = 0.46539 P_{GT}=\cfrac{(c+1)N_{c+1}}{N_c}=\cfrac{(1+1)263611}{1132844}=0.46539
以此类推,可以看到计算结果和test的结果很接近。

缺点及解决

可以看到这个方法在计算出现c频次的单词个数概率的计算要依赖c+1频次的单词出现次数。
假如在文章中出现100次的单词个数概率要先得到出现101次的单词个数,如果101刚好缺失就无法计算了。这个时候我们观察上面的表可以看到,随着频次增加,单词出现的个数是下降的,所以我们可以用曲线拟合一下,估计一下缺失值。
在这里插入图片描述

发布了140 篇原创文章 · 获赞 35 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/oldmao_2001/article/details/104522821