什么是语言模型?语言模型的主要功能包括:
- 在给定语言序列,计算该序列出现的概率
- 判断一个语言序列是否是正常语句,即是否是人类的语言
- 已知若干个词,预测和生成下一个词
语言模型广泛应用于语音识别、拼写检查、手写体识别、OCR等任务中,也是现今LLM背后的底层原理之一。
本讲我们将介绍最简单,也是最基本的语言模型——n-gram语言模型。其表示一类概率模型,核心是由n个词(实际上可理解为词元)组成的序列,包括双词模型(bigram)、三词模型(trigram)等。
以n-gram语言模型为代表的概率统计语言模型在上世纪80年代到2000年左右是自然语言处理的主流方法,直到2000年后逐渐被神经网络语言模型取代。
n-gram语言模型
-
首先我们需要确定一个语言序列发生的概率。设w={w1,⋯,wn}为一个由n个词组成的序列(一句话),那么这个序列出现的概率P(w)=P(w1,⋯,wn)(即联合概率)
- 序列概率满足
w∈V+∑P(w)=1,0≤P(w)≤1
其中V+表示由词表V得到的无限序列集合。
- 对于序列(联合)概率的计算,使用概率链式规则将其转化为条件概率分布的乘积:
p(w)=p(w1w2…wk)=p(w1∣w0)×p(w2∣w0w1)×…×p(wk+1∣w0w1w2…wk)=t=1∏k+1p(wt∣w0w1…wt−1)
-
于是我们将序列概率计算问题转化为了条件概率计算问题。然而,在有限语料库的情况下,绝大多数条件概率在语料库中从未出现过,就会被估计成0。另一方面,序列越长,条件概率的计算复杂度就越高。
- 对此,n-gram语言模型提出马尔可夫假设:条件概率只依赖前n−1个词,不考虑所有历史序列。
-
下面给出n=1,2,3的情形:
- 一元语言模型(Unigram)使用的是条件独立假设:
P(w1,⋯,wn)=i=1∏nP(wi)
- 二元语言模型(Bigram)使用一阶马尔可夫假设:
P(w1,⋯,wn)=P(w1∣BOS)×i=2∏nP(wi∣wi−1)×P(STOP∣wn)
- 三元语言模型(Trigram)使用二阶马尔可夫假设:
P(w1,⋯,wn)=P(w1∣BOS,BOS)P(w2∣BOS,w1)×i=2∏nP(wi∣wi−2,wi−1)×P(STOP∣wn,wn−1)
对应的参数估计如下:
| 模型条件概率 |
参数估计 |
| P(wi) |
Nc(wi)(c(wi)为语料库中wi出现的次数,N为语料库词总数,下面类似) |
| P(wi∣wi−1) |
c(wi−1)c(wi−1,wi) |
| P(wi∣wi−2,wi−1) |
c(wi−2,wi−1)c(wi−2,wi−1,wi) |
-
由此可以推广到一般的n-gram语言模型:
P(w)P(wi∣wi−n+1:i−1)=i=1∏m+1P(wi∣wi−n+1:i−1)=C(wi−n+1:i−1)C(wi−n+1:i)
其中wa:b表示wa,wa+1,⋯,wb序列,wm+1=STOP,索引i−n+1≤0时填充BOS。
在实际的序列概率计算中,常常使用对数概率相加,最后再通过指数转换回概率值(因为概率乘积本身可能很小,容易导致数值下溢)
- 当n更大时,对下一个词出现的约束信息更多,具有更大的辨别力;当n更小时,在训练语料库中出现的次数更多,具有更可靠的统计信息。
- n≥4时数据稀疏和计算代价又变得显著起来,实际工程中几乎不使用。
- 深度学习中的循环神经网络RNN可以看作具有无穷元的语言模型(∞-gram)。
-
一些n-gram语料库:Google Books Ngrams,当代美国英语语料库(COCA),
-
由于语言具有远距离依赖性,所以n-gram语言模型仍然是一个不充分的语言模型。
模型评估
- 语言模型的评估主要分为外部评估和内部评估。
- 外部评估方法是指训练语言模型后,将其直接应用于下游任务,观察其准确性,然后直接针对下游应用进行优化。【另一方面是对完成下游任务的时间和空间效率进行评估】
- 虽然外部评估是评价一个语言模型性能的最佳方法,但是端到端地运行大型NLP系统往往成本高昂。于是,我们会倾向于使用内部评估方法快速评估语言模型潜在改进的指标。
- 在内部评估过程中,与机器学习方法类似,需要将数据划分为训练集、验证集与测试集。
- 训练集用于学习模型的参数。对于n-gram语言模型,其参数由语料库统计得到的n元组频率,再归一化得到的概率值。【一般假设训练集中的语料质量较高】
- 测试集则是一组与训练集完全不重叠的独立数据,用于评估模型的表现。如果模型对语言逻辑通顺的句子计算出的概率越高,说明模型的性能越好。
- 而测试集也不能被多次使用(否则会导致对测试集的针对性调优,削弱泛化能力),因此在训练过程中会使用验证集进行调优。
- 一个常用的内部评估指标是困惑度(perplexity)。它是一种基于概率的函数,通过对测试集概率取倒数,再按词数进行归一化得到(因此也被称为每词困惑度)。具体而言:
- 设测试语料由l个句子S=(s1,⋯,sl)组成,那么整个测试集出现的概率为
P(S)=i=1∏lP(si)=i=1∏lj=1∏mP(wj(i)∣wj−k+1:j−1(i))≜i=1∏nP(wi∣wi−k+1:i−1)
其中n=m×l(即整个测试集的总词数)。对这一概率计算交叉熵:
Hp(S)=−n1log2P(S)
而困惑都就是对交叉熵取指数:
PPLp(S)=2Hp(S)=P(S)−n1=ni=1∏nP(wi∣wi−k+1:i−1)1
由此可见,困惑度的量纲是词数,其可以理解为平均每次预测有多少个等效等概率候选词。
特别地,当测试集概率为1时,交叉熵为0,此时困惑都即为1,模型能够完美预测(理论下界)。
- 语言模型在数据上的困惑度越低,模型表现越好。n-gram对于英语文本的困惑度范围一般为50~1000,而如今大模型的困惑度可以稳定在20~30左右。
数据平滑
- 对于n-gram语言模型困惑度的计算,由于语言的稀疏性与语料库大小有限,测试集上的n-gram可能在训练集上从未出现过,从而导致条件概率为0,此时困惑度就无法计算。
- 为解决这一问题,我们考虑使用数据平滑,使零概率增值,非零概率下调,消除零概率,改进模型的整体正确率。
- 数据平滑的方法主要包括:
-
拉普拉斯平滑(最简单)
每一种情况出现的次数加1或者一个极小值α并重新规范化。
- 以Bigram为例:
P(wi∣wi−1)=C(wi−1)C(wi−1,wi)⟹P(wi∣wi−1)=C(wi−1)+α∣V∣C(wi−1,wi)+α
-
减值法/折扣法
修改训练样本中事件的实际计数,使样本中(实际出现的)不同事件的概率之和小于1,剩余的概率量分配给未登录词。具体包括以下方法:
-
Good-Turing 估计
记N为训练样本中所有n-gram的总数,r为样本中n-gram出现的频数,nr为出现次数恰好为r的n-gram数量,则有
N=r=1∑∞nrr=r=0∑∞nr+1(r+1)
于是考虑调整频数r:r∗=(r+1)×nrnr+1(如果nr+1=0则频数保持不变),那么出现r次的每个n-gram出现的概率变为
pr=Nr∗
此时r=1∑∞pr<1,多余的概率就分给未登录词(每个未登录词出现概率为Nn0n1)。
-
Back-off方法(也称为katz回退)
- 当某个n-gram在样本中出现的频率大于阈值K(通常取0或1)时,在原有概率估计值上乘以折扣系数(类似Good-Turing);
- 否则使用低阶(即(n-1)-gram概率)替代n-gram概率(需要乘上归一化因子)。
以Bigram为例:
pkatz(wi∣wi−1)=⎩⎨⎧drC(wi−1)C(wi−1,wi)α(wi−1)NC(wi)if C(wi−1,wi)=r>0if C(wi−1,wi)=0
-
绝对减值法
- 对于所有出现频次大于0的n-gram,将词频统一减去一个常量b(0<b≤1),最终得到的概率估计为:
pr=⎩⎨⎧Nr−b,Nn0b∑r=1∞nr,r>0r=0
-
线性减值法
从每个频数r中减去与该频数成正比的量(减值函数为线性的),剩余概率量α被n0个未见事件均分,得到概率估计:
pr=⎩⎨⎧N(1−α)rn0αr>0r=0
其中α的优化值为Nn1。【与Good-Turing对齐】
-
插值法
用低阶语法估计高阶语法,即当(n+1)-gram的值不能从训练数据中准确估计时,用n-gram来替代。示例:
P^(wi∣wi−2,wi−1)=λ1P(wi∣wi−2,wi−1)+λ2P(wi∣wi−1)+λ3P(wi)
其中i∑λi=1。
具体步骤:先将训练语料分为两部分,即从原始语料中删除一部分作为留存数据。第一部分用于训练条件概率,第二部分(留存数据)用于优化权重λi,使整体模型困惑度最低。