Language Modelling
本文最后更新于 2026年3月19日 上午
北京大学信息科学技术学院 自然语言处理基础(2026春)的课程笔记
第四部分:Language Modelling
一些补充
生成模型与判别模型:
这里的内容主要是对ai引论中划分训练集、验证集与测试集的回顾,只不过这里将validation set称作development set,本质是同一个东西
还有经典的K折交叉检验
什么是语言模型
我们先看几句话:
the dog barks
the dog laughs
dog the dog bark a laugh smile
前两句话看起来还比较有章法,但第三句就有点“胡言乱语”了
从概率论角度,那么出现第三句话的概率远低于前两句!
语言模型就是要给所有可能的词序列(句子)分配一个概率,使得合理的句子概率高,不合理的句子概率低
用严谨的概率论来说,假如有一个有限的词表$V$,所有由这些词构成的句子(包括不同长度)组成集合$S$
我们想要一个概率分布$p$满足:
$\sum_{s \in S}p(s)=1,p(s)\ge 0$
其中p(the dog barks)很大,p(the dog laughs)较大,p(dog the dog bark a laugh smile)极小
为什么需要语言模型
语言模型可以解决许多任务:
语音识别,例如recognize speech 与 wreck a nice beach 发音相似,但语言模型会选择更合理的那个
还有机器翻译、文本生成、句子补全等,不再一一介绍
上述所有情况都满足此公式
其中比较有意思的是surprisal理论,一个词在上下文中出现的概率越低,其信息量/惊奇度越高,读者理解起来就越困难
$Surprisal(\omega)=-log_2 p(\omega|history_{\omega})$
N-gram 语言模型
句子作为词语序列:$\omega_1,\omega_2,…,\omega_n$
句子作为随机变量序列$X_1,X_2,…,X_n$
由概率的链式法则,我们有:
但是当$n$很大的时候,似乎不好处理?
所以我们要做(马尔可夫)假设!假设当前词的概率分布只与先前的几个词相关,于是就有了N-gram模型
完全不考虑历史的模型称作unigram,考虑一个的是bigram,两个的是trigram,三个以上就有4-gram,5-gram等……

上面就是trigram的定义及例子,注意此处标点符号和终止符STOP也被算作了一个词
给定一个语料库,我们可以统计各种N-gram的出现次数
所以训练数据越多模型一定越好吗?并不一定
这是由于数据的稀疏性,某些N-gram从未出现,导致概率为0
一般trigram就足够用了
如何评估模型
一个优秀的语言模型应该为更可能出现在该语言中的句子分配较高概率
最优语言模型应该能对未见过的测试集进行最佳预测
对于某个数据集$D$,我们可以用语言模型:
计算每个句子出现的概率,$p(s)=p(\omega_1,\omega_2,…,\omega_n)$
对于整个数据集进行似然估计,计算$\Pi_{s \in D}p(s)$
然后对于$D$中共$M$个词(包括STOP)进行归一化,得到$(\Pi_{s \in D}p(s))^{\frac{1}{M}}$
对其取对数,得到$\frac{1}{M} \Sigma_{s \in D}log p(s)$
极大似然估计等价于最小化交叉熵损失$-\frac{1}{M} \Sigma_{s \in D}log p(s)$
现在我们定义困惑度$perplexity(D)=2^{-\frac{1}{M} \Sigma_{s \in D}log p(s)}$
极大似然估计越大,困惑度越低,代表模型预测的越好
困惑度可以理解为分支因子的平均值:模型在每个位置上平均有多少个等概率的词可以选择
如果困惑度为1,代表下一个出现的词只有一种可能,于是模型就非常精确
如果模型满足均匀分布,所有$p=\frac{1}{|V|}$,那么困惑度即为$|V|$,也即每次都得在$|V|$个词中随机选择
一般情况下困惑度$\ge 1$,好的语言模型能把困惑度控制在$1.4 \sim 1.5$
注意事项:
比较困惑度时,词汇表必须相同。
困惑度并不完全等同于下游任务性能,但它是常用的内部评价指标。
N-gram:N到底为多少更优?
N太小无法学习语言特征,N太大会有成本问题,概率为0问题……
处理未见事件
上面是一个例子,测试集中”you like”和”hate”在训练集中都没有,我们只能将其概率设为0,但是这些句子其实是说得通的
所以我们应该对这种未见事件赋予一定的概率!
方法:
回退gram(back-off,三元退二元,二元退一元)
直接生产出一个就叫做”unknown”的词
进行平滑操作
也可以采用插值法,将3、2、1gram的概率加权平均,所得结果依旧是一个概率分布
问题在于$\lambda$如何设置?
一种方法是继续MLE,但是很困难
可以在验证集调?
stupid back-off
当高阶不存在时,回退低阶估计
0.4是一个精心设计的数字()效果很好
修改之后的$s$已经不是概率模型了
smoothing
对于每个可能的n-gram都加上默认计数1
听起来很简单!这就是著名的laplace smoothing
存在问题:可能对于未见事件赋予了过高的权重
Good-Turing Discounting
一个直觉思路:利用已出现一次的n-gram来辅助未见事件的计数
$N_r$表示频率为$r$的单词数量,将真实计数$r$调整为$r^{\ast}$
$r^{\ast}=(r+1)\frac{N_{r+1}}{N_r}$
这样一来,所有未出现事件分配的概率是$\frac{N_1}{N_{all}}$
$r$较大时,$N_{r-1}$通常为$0$,可以采取曲线拟合或线性回归等多种方法
在测试阶段,我们如何确定某个单词在训练集中出现$r$次的可能性?
假设我们可以随机删除训练集中的某个单词来构建新的伪训练集:每次删除一个单词$w$时,若已知该单词在原始集中出现$r+1$次,则在新训练集中应出现$r$次。
原始集中$r+1$个单词的总出现次数为$N_{r+1}(r+1)$。
经过多次删除操作后,新集合中这些单词的数量可视为$N_r$,而这些单词的可能平均出现次数应为$(r+1)\frac{N_{r+1}}{N_r}$
上面是重新分配之后的结果
注意到大多数情况下$r^{\ast}=r-0.75$
所以我们或许可以对每次计数减去一个固定数值$d$?
Kneser-Ney Smoothing
对于上述方法的一种综合,结合了线性插值和回退概率,广受欢迎,限于篇幅这里不再赘述
总结:N-gram模型的优缺点
优点:
构建简单,可处理大规模语料
概率评分自然适用于许多任务
平滑技术能有效处理稀疏性
缺点:
无法捕捉长距离依赖(受限于 n 的大小)
无法处理同义词、语义相似性(词被视为原子符号)
参数数量随 n 指数增长,存储和计算成本高
数据稀疏问题依然存在,尤其高阶模型