文章目录

  • Language Model Introduction
  • LM 的目标
  • Chain Rule for Language Model
  • Markov Assumption
  • LM计算实例(based 1st order)
  • Language Model
  • Language Model: Unigram
  • Language Model: Bigram
  • Language Model: N-gram
  • 估计语言模型的概率
  • Unigram:Estimating Probability
  • Bigram:Estimating Probability
  • N-gram:Estimating Probability
  • 评估语言模型Evaluation of Language Model
  • Perplexity(困惑度)
  • 平滑处理Smoothing
  • 问题引入
  • Add-one Smoothing(Laplace Smoothing)
  • Add-K Smoothing
  • Interpolation
  • Good-Turning Smoothing
  • 引例
  • 说明
  • 缺点及解决



公式输入请参考:

在线Latex公式


上一节的Noisy Channel Model里面有一个非常重要的部分,就是

语言模型 guit 语言模型训练_lua,这个是LM,下面就来看这个模型。

Language Model Introduction

语言模型用来判断:是否一句话从语法上通顺
比较:
今天是周日VS今天周日是
全民Al是趋势VS趋势全民Al是
LM是如何判断上面的句子是否符合语法的呢?
如果我们有一个pretrained的LM,对于上面两个例子,就该有:
语言模型 guit 语言模型训练_sed_02
语言模型 guit 语言模型训练_语言模型_03

LM 的目标

Compute the probability of a sentence or sequence of words.
语言模型 guit 语言模型训练_sed_04
语言模型 guit 语言模型训练_sed_05是句子s中的单词

Chain Rule for Language Model

Chain Rule推导在第一节有,这里不重复了,根据Chain Rule,公式(1)可以写为:

语言模型 guit 语言模型训练_sed_06

根据这个公式,下面看一个例子:

语言模型 guit 语言模型训练_语言模型 guit_07


那么再来看里面的每一项是如何计算,假如我们有一个文档,文档中有两句这个话:

今天是春节我们都休息。

今天是春节我们都放假。

由于“今天是春节我们都”这句话后面有两个词,一个是“休息”,一个是“放假”,那么我们说:

语言模型 guit 语言模型训练_lua_08

语言模型 guit 语言模型训练_sed_09

从上面的计算我们可以看到,有很多项的概率计算的结果很容易是0(只要文档中没有出现过的都是0),那么我们把这个现象称为sparse,下面我们看如何解决这个问题。

Markov Assumption

马尔科夫假设就是用来近似的计算上面的概率的。
1st order Markov Assumption
语言模型 guit 语言模型训练_sed_10
只关注最近的一个词
2nd order Markov Assumption
语言模型 guit 语言模型训练_语言模型_11
3rd order Markov Assumption
语言模型 guit 语言模型训练_lua_12
抽象为具体的公式:
1st order Markov Assumption:
语言模型 guit 语言模型训练_语言模型_13
2nd order Markov Assumption:
语言模型 guit 语言模型训练_sed_14
3rd order Markov Assumption:
语言模型 guit 语言模型训练_sed_15

LM计算实例(based 1st order)

假如已知:

语言模型 guit 语言模型训练_语言模型 guit_16

比较:今天是周日VS今天周日是 两句话的概率

语言模型 guit 语言模型训练_语言模型 guit_17


语言模型 guit 语言模型训练_lua_18


可以看到:

语言模型 guit 语言模型训练_语言模型_19

根据刚才的Markov Assumption,我们可以有不同的LM,下面具体来看。

Language Model

Language Model: Unigram

公式:
语言模型 guit 语言模型训练_sed_20
下面看例子:
语言模型 guit 语言模型训练_语言模型_21
同样的
语言模型 guit 语言模型训练_语言模型_22
可以看到虽然单词位置不一样了,但是计算出来的句子概率都一样,但是上面的句子明显语法要好得多。Unigram的缺点就是不考虑单词的位置。

Language Model: Bigram

基于1st order Markov Assumption

语言模型 guit 语言模型训练_语言模型_13

同样是上面两句话:

语言模型 guit 语言模型训练_语言模型 guit_24


当然还可以有Trigram,以此类推后:

Language Model: N-gram

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

估计语言模型的概率

Unigram:Estimating Probability

先看看公式:

语言模型 guit 语言模型训练_sed_20

这里面的每个单词概率语言模型 guit 语言模型训练_语言模型_26怎么求?

用一个单词在文档出现的次数,除以文档中单词的总数。

看例子:

语料库如下:

语言模型 guit 语言模型训练_sed_27


那么下面这句话的概率计算如下图所示:结果是语言模型 guit 语言模型训练_sed_28

语言模型 guit 语言模型训练_lua_29


再看另外一句话:

语言模型 guit 语言模型训练_sed_30


由于“没有”这个词没有在语料库中出现,导致整句话的概率为0,这个明显不合理的。

解决方案就是在没有出现过的词语分子上加一个很小的值(这个值也叫:平滑项)。

Bigram:Estimating Probability

先看公式:

语言模型 guit 语言模型训练_语言模型_13

那么里面的每一项:语言模型 guit 语言模型训练_语言模型 guit_32如何计算?看例子:

语言模型 guit 语言模型训练_语言模型 guit_33


语言模型 guit 语言模型训练_sed_34


看例子:

语料库如下:

语言模型 guit 语言模型训练_sed_27


注意,第一今天的概率用的是unigram的算法来计算。

语言模型 guit 语言模型训练_lua_36


语言模型 guit 语言模型训练_sed_37


这里也有某项为0,整个句子的概率也为0的情况。同样可以用平滑项来优化。

N-gram:Estimating Probability

N=3,用同样的语料库:
语言模型 guit 语言模型训练_lua_38
其中:语言模型 guit 语言模型训练_lua_39
语言模型 guit 语言模型训练_语言模型 guit_40

评估语言模型Evaluation of Language Model

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

Perplexity(困惑度)

公式:

语言模型 guit 语言模型训练_lua_41

Perplexity通常用于无监督学习的模型的评估。x是在训练集中计算出来的 ,我们希望x越大越好。

一般,我们是把LM放到语料库中,就可以得到x:

语言模型 guit 语言模型训练_sed_42


Perplexity是越小越好。下看例子如何计算Perplexity:

假设训练好的Bigram

p(天气|今天)=0.01

p(今天)=0.002

p(很好|天气)=0.1

p(适合|很好)=0.01

p(出去|适合)=0.02

p(运动|出去)=0.1

针对语料库,计算出对应的likelihood:

语言模型 guit 语言模型训练_语言模型 guit_43


再把计算出来的likelihood分别取对数log,然后求平均:

语言模型 guit 语言模型训练_语言模型_44

然后把x带入困惑度公式即可。

当然,除了困惑度,还有召回率,精确率等指标用于不同场景。

Training 38 millon words, test 1.5 million words, WSJ(by Dan Jurafsky)

语言模型 guit 语言模型训练_语言模型_45


n-gram,n越大越容易过拟合。

这里直接给出的是困惑度的公式,没有给这个公式怎么来的,具体看word2vec的论文带读:深度之眼Paper带读笔记NLP.2:word2vec.baseline.1

平滑处理Smoothing

问题引入

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


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


使用Bigram计算:

语言模型 guit 语言模型训练_lua_46


由于画圈的两项都没有在语料库中出现,所以这两项的值为0,导致这两句话的概率都为0,但是我们看到下面的那句话明显要比上面那句话语法要好。

因此我们要引入平滑项。

Add-one Smoothing(Laplace Smoothing)

没有加平滑项之前:
语言模型 guit 语言模型训练_lua_47
这里的分子很容易等于0,因此我们给分子加上1,即便词语没有出现在语料库中,整个项也不会等于0了。
加平滑项之后:
语言模型 guit 语言模型训练_lua_48
V代表语料库中的单词数量
这里为什么分母要加上V呢?而不是别的数,或者不是2V,3V呢?看例子来理解:


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


这里V=17

用公式2来计算概率:

“今天”出现两次,两次后面都接的“上午”,所以分子分母都有2,然后再分别加1和V:

语言模型 guit 语言模型训练_语言模型 guit_49


对于语料库中的其他所有的词都没有出现在“今天”后面,所以分子是0,分母还是2

语言模型 guit 语言模型训练_语言模型 guit_50


这些词一共有16个,所以整个概率就是:

语言模型 guit 语言模型训练_lua_51

所有可能性加起来要等于1,这是为什么要在分母加V的理由。

Add-K Smoothing

和Add-one Smoothing非常像,只是把1改为k

语言模型 guit 语言模型训练_语言模型_52

当k=1时,就和Add-one Smoothing一样了。

同样的语料库,我们来看看k=3的情况:

语言模型 guit 语言模型训练_语言模型 guit_53


那么不同的k应该如何选择?

方法1:分别把语言模型 guit 语言模型训练_语言模型_54代入,然后比较

方法2:把k看做参数,得到一个函数语言模型 guit 语言模型训练_lua_55,来进行优化。那么我们可以用之前的困惑度来评出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出现的频次。
语言模型 guit 语言模型训练_lua_56

Good-Turning Smoothing

引例

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

说明

语言模型 guit 语言模型训练_语言模型_57记为出现c次的单词的个数(有多少个单词出现了c次)
例:Sam I am I am Sam I do not eat
Sam:2次
I:3次
am:2次
do:1次
not:1次
eat:1次
那么在这个句子里面语言模型 guit 语言模型训练_语言模型 guit_58

对于没有出现过的单词

对于出现过的单词

MLE概率

语言模型 guit 语言模型训练_语言模型 guit_58

Good-Turning概率

有的地方用这个:语言模型 guit 语言模型训练_sed_63搞不懂。。。。

先用鱼来算一下:

假设你在钓鱼,已经抓到了18只鱼:

10条鲤鱼,3条黑鱼,2条刀鱼,1条鲨鱼,1条草鱼,1条鳗鱼……

语言模型 guit 语言模型训练_lua_64


语言模型 guit 语言模型训练_sed_65


根据上面的钓鱼例子,我们大概可以推断一般情况下(不是绝对):

语言模型 guit 语言模型训练_语言模型 guit_66

下面看词的例子:

语言模型 guit 语言模型训练_语言模型 guit_67


Adjusted count是GT算法估计出来概率

下一个单词是没有出现过的单词的概率(就是语言模型 guit 语言模型训练_sed_68):

语言模型 guit 语言模型训练_语言模型 guit_69

下一个是出现过一次的单词:

语言模型 guit 语言模型训练_语言模型_70

以此类推,可以看到计算结果和Test count的结果很接近。

缺点及解决

可以看到这个方法在计算出现c频次的单词个数概率的计算要依赖c+1频次的单词出现次数。

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

语言模型 guit 语言模型训练_语言模型_71