Skip to content

语言模型和平滑方法

📅 发表于 2017/07/31
🔄 更新于 2025/07/23
👁️ — 次访问
📝 1868 字
⏳ 5 分钟
自然语言处理
#语言模型
#自然语言处理
#各种熵
#数据平滑

传统的语言模型,模型评估参数(信息、各种熵和困惑度),最后介绍了一些数据平滑的方法

语言模型 ​

二元语法

对于一个句子s=w1⋯wn,近似认为一个词的概率只依赖于它前面的1个词。即一个状态只跟上一个状态有关,也称为一阶马尔科夫链。

p(s)=p(w1)p(w2|w1)p(w3|w2)⋯p(wn|wl−1)=∏i=1lp(wi|wi−1)

设c(wi−1wi) 表示二元语法wi−1wi在给定文本中的出现次数,则上一个词是wi−1下一个词是wi的概率p(wi∣wi−1)是当前语法wi−1wi出现的次数比上所有形似wi−1w的二元语法的出现次数

p(wi∣wi−1)=c(wi−1wi)∑wc(wi−1w),w是变量

n元语法

认为一个词出现的概率和它前面的n个词有关系。则对于句子s=w1w2⋯wl,其概率计算公式为如下:

p(s)=p(w1)p(w2|w1)p(w3|w1w2)⋯p(wn|w1w2⋯wl−1)=∏i=1np(wi|w1⋯wi−1)

上述公式需要大量的概率计算,太理想了。一般取n=2或者n=3。

对于n>2的n元语法模型,条件概率要考虑前面n−1个词的概率,设wij表示wi⋯wj,则有

p(s)=∏i=1l+1p(wi∣wi−n+1i),p(wi∣wi−n+1i)=c(wi−n+1i)⏞具体以wi结尾的词串w[i−n+1,i]∑wic(wi−n+1i)⏟所有以wi结尾的词串w[i−n+1,i]

实际例子

假设语料库S是由下面3个句子组成,所求的句子t在其后:

python
s = ['brown read holy bible', 'plm see a text book', 'he read a book by david']
t = 'brown read a book'

那么求句子t出现的概率是

p(t)=p(brownreadabook)=p(brown|BOS)p(read|brown)p(a|read)p(book|a)p(eos|book)≈0.06

n元文法的一些应用如下

语音识别歧义消除

如给了一个拼音 tashiyanjiushengwude,得到了很多可能的汉字串:踏实研究生物的,他实验救生物的,他是研究生物的 ,那么求出argstrmaxP(str|pinyin),即返回最大概率的句子

汉语分词问题

给定汉字串他是研究生物的。可能的汉字串 他 是 研究生 物 的和他 是 研究 生物 的,这也是求最大句子的概率

开发自然语言处理的统计方法的一般步骤

  • 收集大量语料(基础工作,工作量最大,很重要)
  • 对语料进行统计分析,得出知识(如n元文法,一堆概率)
  • 针对场景建立算法,如计算概率可能也用很多复杂的算法或者直接标注
  • 解释或者应用结果

模型评估参数 ​

基础

  • 评价目标:语言模型计 算出的概率分布与“真实的”理想模型是否接近
  • 难点:无法知道“真实的”理想模型的分布
  • 常用指标:交叉熵,困惑度

信息量和信息熵 ​

X是一个离散随机变量,取值空间为R,其概率分布是p(x)=P(X=x),x∈R。

信息量

概率是对事件确定性的度量,那么信息就是对不确定性的度量。信息量 I(X)代表特征的不确定性,定义如下

I(X)=−log⁡p(x)

信息熵

信息熵H(x)是特征不确定性的平均值,用表示,定义如下

H(X)=∑x∈Rp(x)log1p(x)=−∑x∈Rp(x)log⁡p(x)

一般是log2p(x),单位是比特。若是ln⁡p(x),单位是奈特。

  • 信息熵的本质是信息量的期望
  • 信息熵是对不确定性的度量
  • 随机变量X的熵越大,说明不确定性也大;若X为定值,则熵为0
  • 平均分布是"最不确定”的分布

联合熵和条件熵 ​

X,Y是一对离散型随机变量,并且X,Y∼p(x,y)。

联合熵

联合熵实际上描述的是一对随机变量平均所需要的信息量,定义如下。

H(X,Y)=−∑x∈X∑y∈Yp(x,y)log⁡p(x,y)

条件熵

给定X的情况下,Y的条件熵为

H(Y∣X)=−∑x∈X∑y∈Yp(x,y)log⁡p(y∣x)

其中可以推导出:H(X,Y)=H(X)+H(Y∣X)。

相对熵和交叉熵 ​

相对熵

随机变量X的状态空间Ωx上有两个概率分布p(x)和q(x)。一般p是真实分布,q是预测分布。

相对熵也称为KL距离,用来衡量相同事件空间里两个概率分布的差异。

p和q的相对熵D(p∣∣q)用来度量它们之间的差异,如下

D(p∣∣q)=∑x∈Xp(x)log⁡p(x)q(x)=Ep(log⁡p(X)q(X))(期望)

特别地,若p==q,则相对熵为0;若差别增加,相对熵的值也增加。简单理解“相对”如下:

D(p∣∣q)=∑x∈Xp(x)(log⁡p(x)−log⁡q(x))=(−∑x∈Xp(x)log⁡q(x))⏟以q去近似p的熵=交叉熵−(−∑x∈Xp(x)log⁡p(x))⏟p本身的熵

交叉熵

交叉熵用来衡量估计模型与真实概率分布之间的差异。

随机变量X∼p(x),q(x)近似于p(x)。 则随机变量X和模型q之间的交叉熵H(X,q)如下:以q去近似p的熵

H(p,q)=H(X)+D(p∣∣q)=−∑x∈Xp(x)log⁡q(x)

实际应用

交叉熵的实际应用,设y是预测的概率分布,y′为真实的概率分布。则用交叉熵去判断估计的准确程度

H(y′,y)=−∑iyi′log⁡yi=−∑iy真实log⁡y预测

n元文法模型的交叉熵

设测试集T=(t1,t2,…,tl)包含l个句子,则定义测试集的概率p(T)为多个句子概率的乘积

p(T)=∏i=1lp(ti),其中p(ti)=∏i=1lwp(wi|wi−n+1i−1),见上面

其中wij表示词wi⋯wj,∑wc(readw)是查找出所有以read开头的二元组的出现次数。

则在数据T上n元模型p(wi|wi−n+1i−1)的交叉熵Hp(T)定义如下

Hp(T)=−1WTlog2⁡p(T),其中WT是文本T中基元(词或字)的长度

公式的推导过程如下

−∑x∈Xp(x)log⁡q(x)⟹−1WT∑log⁡q(x)⏟使用均匀分布代替p(x)⟹−1WTlog⁡∏r(wi|wi−n+1i−1)⟹−1WTlog2⁡p(T)

可以这么理解:利用模型p对WT个词进行编码,每一个编码所需要的平均比特位数。

困惑度 ​

困惑度是评估语言的基本准则人,也是对测试集T中每一个词汇的概率的几何平均值的倒数。

PPT(T)=2Hp(T)=1p(T)WT=2交叉熵

当然,交叉熵和困惑度越小越好。语言模型设计的任务就是要找出困惑度最小的模型。

在英语中,n元语法模型的困惑度是50∼1000,交叉熵是6∼10个比特位。

数据平滑 ​

问题的提出 ​

按照上面提出的语言模型,有的句子就没有概率,但是这是不合理的,因为总有出现的可能,概率应该大于0。设c(w)是w在语料库中的出现次数。

p(read∣plm)=c(plm∣read)∑wic(plm|wi)=01=0,这是不对的

因此,必须分配给所有可能出现的字符串一个非0的概率值来避免这种错误的发送。

平滑技术就是用来解决这种零概率问题的。平滑指的是为了产生更准确的概率来调整最大似然估计的一种技术,也称作数据平滑。思想是劫富济贫,即提高低概率、降低高概率,尽量是概率分布趋于均匀。

数据平滑是语言模型中的核心问题

加法平滑 ​

其实为了避免0概率,最简单的就是给统计次数加1。这里我们可以为每个单词的出现次数加上δ,δ∈[0,1],设V是所有词汇的单词表,|V|是单词表的词汇个数,则有概率:

padd(wi∣wi−n+1i−1)=δ+c(wi−n+1i)∑wi(δ∗|V|+c(wi−n+1i))=δ+c(wi−n+1i)⏞具体词串[i−n+1,i]δ∗|V|+∑wic(wi−n+1i)⏟所有以wi结尾的词串[i−n+1,i]

注:这个方法很原始。

Good-Turing ​

Good-Turing也称作古德-图灵方法,这是很多平滑技术的核心。

主要思想是重新分配概率,会得到一个剩余概率量p0=n1N,设n0为未出现的单词的个数,然后由这n0个单词去平均分配得到p0,即每个未出现的单词的概率为p0n0。

对于一个n元语法,设nr恰好出现r次的n元语法的数目,下面是一些新的定义

  • 出现次数为r的n元语法 新的出现次数r∗=(r+1)nr+1nr
  • 设N=∑r=0∞nrr∗=∑r=1∞nrr,即N是这个分布中最初的所有文法出现的次数,例如所有以read开始的总次数
  • 出现次数为r的修正概率 pr=r∗N

剩余概率量p0=n1N的推导

总的概率=∑r>0nrpr=∑r>0nr(r+1)nr+1nrN=1N(∑r>0(r+1)nr+1=1N(∑r>0(rnr−n1)=1−n1N<1

然后把p0平均分配给所有未见事件(r=0的事件)。

缺点

  • 若出现次数最大为k,则无法计算r=k的新的次数r∗和修正概率pr
  • 高低阶模型的结合通常能获得较好的平滑效果,但是Good-Turing不能高低阶模型结合

Jelinek-Mercer ​

问题引入

假如c(sendthe)=c(sendthou)=0,则通过GT方法有p(the∣send)=p(thou∣send),但是实际上却应该是p(the∣send)>p(thou∣send)。

所以我们需要在二元语法模型中加入一个一元模型

pML(wi)=c(wi)∑wc(w)

二元线性插值

使用r将二元文法模型和一元文法模型进行线性插值

p(wi∣wi−1)=λpML(wi|wi−1)+(1−λ)pML(wi),λ∈[0,1]

所以可以得到p(the∣send)>p(thou∣send)

总访客数:— · 总访问量:—
PLM's Blog @ 2016 - 2026