语言模型(Language Model,LM)(也称统计语言模型)是描述自然语言概率分布的模型,是一个非常基础和重要的自然语言处理任务。利用语言模型,可以计算一个词序列或一句话的概率,也可以在给定上文的条件下对接下来可能出现的词进行概率分布的估计。同时,语言模型是一项天然的预训练任务,在基于预训练模型的自然语言处理方法中起到非常重要的作用,因此这种预训练模型有时也被称为预训练语言模型。本文将主要介绍经典的N元语言模型(N-gram Language Model)。

N元语言模型

语言模型的基本任务是在给定词序列w_1, w_2, … , w_{t-1}的条件下,对下一时刻t可能出现的词w_t的条件概率P(w_t|w_1 w_2 …w_{t-1})进行估计。一般地,把w_1, w_2, . . ., w_{t-1}的历史。例如,对于历史“我喜欢”,希望得到下一个词为“读书”的概率,即:P ( 读书 ∣ 我喜欢 )。在给定一个语料库时,该条件概率可以理解为当语料中出现“我喜欢”时,有多少次下一个词为“读书”,然后通过最大似然估计进行计算:

P(读书|我喜欢) = \frac{C( 我喜欢读书 )}{C( 我喜欢 )}

式中,C ( ⋅ ) 表示相应词序列在语料库中出现的次数(也称为频次)。通过以上的条件概率,可以进一步计算一个句子出现的概率,即相应单词序列的联合概率P(w_1, w_2, …, w_l),式中l为序列的长度。可以利用链式法则对该式进行分解,从而将其转化为条件概率的计算问题,即:


P(w_1, w_2, …, w_l) = \quad \prod_{i=1}^{l} P(w_i | w_1 w_2 … w_{i-1})

然而,随着句子长度的增加,w_i | w_1 w_2 … w_{i - 1}出现的次数会越来越少,甚至从未出现过,那么P(w_i|w_1 w_2 … w_{i-1})则很可能为0,此时对于概率估计就没有意义了。为了解决该问题,可以假设“下一个词出现的概率只依赖于它前面n − 1个词”,即:


P(w_t | w_1 w_2 … w_{t-1}) \approx P( w_t | w_{t-n+1} w_{t-n+2} … w_{t-1})

该假设被称为马尔可夫假设(Markov Assumption)。满足这种假设的模型,被称为N元语法或N元文法(N-gram)模型。特别地,当 N = 1 时,下一个词的出现独立于其历史,相应的一元语法通常记作unigram。当N = 2 时,下一个词只依赖于前1个词,对应的二元语法记作bigram。二元语法模型也被称为一阶马尔可夫链(Markov Chain)。类似的,三元语法假设(N = 3)也被称为二阶马尔可夫假设,相应的三元语法记作trigram。N的取值越大,考虑的历史越完整。在unigram模型中,由于词与词之间相互独立,因此它是与语序无关的。以bigram模型为例,上式可转换为:


P(w_1, w_2, … , w_l) = \quad \prod_{i=1}^l P(w_i | w_{i-1})

为了使P(w_i | w_{i-1})对于i = 1有意义,可在句子的开头增加一个句首标记“<BOS>”(Begin Of Sentence),并设w_0 = <BOS>同时,也可以在句子的结尾增加一个句尾标记“<EOS>”(End Of Sentence),设w_{l+1} = <BOS>

平滑

虽然马尔可夫假设(下一个词出现的概率只依赖于它前面n − 1个词)降低了句子概率为0的可能性,但是当n比较大或者测试句子中含有未登录词(Out-Of-Vocabulary,OOV)时,仍然会出现“零概率”问题。由于数据的稀疏性,训练数据很难覆盖测试数据中所有可能出现的N-gram,但这并不意味着这些N-gram出现的概率为0。为了避免该问题,需要使用平滑(Smoothing)技术调整概率估计的结果。本文将介绍一种最基本,也最简单的平滑算法——折扣法。折扣法(Discounting)平滑的基本思想是“损有余而补不足”,即从频繁出现的N-gram中匀出一部分概率并分配给低频次(含零频次)的N-gram,从而使得整体概率分布趋于均匀。

加一平滑(Add-one Discounting)是一种典型的折扣法,也被称为拉普拉斯平滑(Laplace Smoothing),它假设所有N-gram的频次比实际出现的频次多一次。例如,对于unigram模型来说,平滑之后的概率可由以下公式计算:


P(w_l) = \frac{C(w_i)+1}{\sum_w (C(w) + 1)} = \frac{C(w_i) + 1}{N + |V|}

在实际应用中,尤其当训练数据较小时,加一平滑将对低频次或零频次事件给出过高的概率估计。一种自然的扩展是加\delta平滑。在加\delta平滑中,假设所有事件的频次比实际出现的频次多\delta次,其中0 \leq \delta \leq 1。以bigram语言模型为例,使用加\delta平滑之后的条件概率为:


P(w_i|w_{i-1} = \frac{C(w_{i-1} w_i) + \delta}{\sum_m (C(w_{i-1} w_i) + \delta)}) = \frac{C(w_{i-1}) + \delta}{C(w_{i - 1}) + \delta |V|}

关于超参数\delta的取值,需要用到开发集数据。根据开发集上的困惑度对不同\delta取值下的语言模型进行评价,最终将最优的δ用于测试集。由于引入了马尔可夫假设,导致N元语言模型无法对长度超过N 的长距离词语依赖关系进行建模,如果将 N 扩大,又会带来更严重的数据稀疏问题,同时还会急剧增加模型的参数量(N-gram数目),为存储和计算都带来极大的挑战。5.1节将要介绍的神经网络语言模型可以较好地解决N元语言模型的这些缺陷。

语言模型性能评价

衡量一个语言模型好坏的一种方法是将其应用于具体的外部任务(如:机器翻译),并根据该任务上指标的高低对语言模型进行评价。这种方法也被称为“外部任务评价”,是最接近实际应用需求的一种评价方法。但是,这种方式的计算代价较高,实现的难度也较大。因此,目前最为常用的是基于困惑度(Perplexity,PPL)的“内部评价”方式。为了进行内部评价,首先将数据划分为不相交的两个集合,分别称为训练集D^{train}和测试集D^{test},其中D^{train}用于估计语言模型的参数。由该模型计算出的测试集的概率P(D^{test})则反映了模型在测试集上的泛化能力。假设测试集D^{test} = w_1 w_2 … w_N
(每个句子的开始和结束分布增加<BOS>与<EOS>标记),那么测试集的概率为:


P(D^{test} = P(w_1 w_2 … w_N)) = \quad \prod_{i=1}^N P(w_i | w_1 w_2 … w_{i-1})^{- \frac{1}{N}}

困惑度则为模型分配给测试集中每一个词的概率的几何平均值的倒数:


PPL(D^{test}) = (\quad \prod_{i=1}^N P(w_i| w_1 w_2 … w_{i-1})^{- \frac{1}{N}})

对于bigram模型而言:


PPL(D^{test}) = (\quad \prod_{i=1}^N P(w_i|w_{i-1})^{-\frac{1}{N}})

在实际计算过程中,考虑到多个概率的连乘可能带来浮点数下溢的问题,通常需要将上式转化为对数和的形式:


PPL(D^{test}) = 2^{-\frac{1}{N} \sum_{i-1}{N} \log_2 P(w_i|w_{i-1})}

困惑度越小,意味着单词序列的概率越大,也意味着模型能够更好地解释测试集中的数据。需要注意的是,困惑度越低的语言模型并不总是能在外部任务上取得更好的性能指标,但是两者之间通常呈现出一定的正相关性。因此,困惑度可以作为一种快速评价语言模型性能的指标,而在将其应用于下游任务时,仍然需要根据其在具体任务上的表现进行评价。

参考文献:
[1] 车万翔, 崔一鸣, 郭江. 自然语言处理:基于预训练模型的方法[M]. 电子工业出版社, 2021.
[2] 邵浩, 刘一烽. 预训练语言模型[M]. 电子工业出版社, 2021.
[3] 何晗. 自然语言处理入门[M]. 人民邮电出版社, 2019
[4] Sudharsan Ravichandiran. BERT基础教程:Transformer大模型实战[M]. 人民邮电出版社, 2023
[5] 吴茂贵, 王红星. 深入浅出Embedding:原理解析与应用实战[M]. 机械工业出版社, 2021.