
1.1.1 n-gram语言模型
n-gram指的是由n个连续单词构成的序列,例如,large是一个一元语法(Unigram)的实例,large language是一个二元语法(Bigram)的实例,而large language model是一个三元语法(Trigram)的实例。基于n-gram构造的语言模型称为n-gram语言模型,这种语言模型将单词序列的生成过程看作马尔可夫过程,其数学基础是马尔可夫假设(Markov Assumption),即第n个词仅仅依赖于它前面的n-1个词。使用n-gram语言模型计算单词序列的概率时,不同的n会有不同的计算方法。例如,当n-1时,我们采用的是一元语法语言模型:

则单词序列“large language model”的概率的计算公式为:

其中,<s>和</s>是标识句子开头和结束的特殊符号。当n=2时,用二元语法语言模型计算单词序列的概率的计算公式为:

则单词序列“large language model”的概率的计算公式为:

以此类推,当n=3时,用三元语法语言模型计算单词序列的概率的计算公式为:

则单词序列“large language model”的概率的计算公式为:

可以看出,使用n-gram语言模型的前提是对条件概率进行精确的估计。常用的一个方法是收集大量的自然文本语料,然后采用最大似然估计(Maximum Likelihood Estimation,MLE)的方式计算这些条件概率。MLE的目标是通过优化
使得训练语料的概率最大化。
以在单词序列w1,w2,…,wm上训练一元语法语言模型为例,考虑到某些单词会重复出现(比如w1和wm都是单词“large”),我们将

表示为:

其中,vi表示词汇表中某个单词,c(vi)表示在单词序列w1,w2,…,wm中vi出现的频次。一元语法语言模型训练的目标是使P(w1,w2,…,wm)最大化,因此可以抽象成如下数学问题:

通过求解上述问题,我们发现可以通过统计单词出现的频次来实现对语言模型中的参数的估计,一元语法语言模型中的各个概率可以通过如下公式进行计算:

其中,c(wi)表示单词wi在训练数据中的频次。
以此类推,二元语法语言模型中的各个条件概率值可以通过如下公式进行计算:

同理,三元语法语言模型中的各个条件概率值可以通过如下公式进行计算:

虽然n-gram语言模型在实际应用场景中有不错的表现,但它也存在一定的局限性。当处理的文本中包含不在当前语言模型的词汇表中的单词时,就会遇到未登录词(Out-Of-Vocabulary,OOV)问题。降低未登录词问题负面影响的策略有二:一是忽略不在现有n-gram语言模型的词汇表中的所有单词;二是在词汇表中引入特殊词元(例如“<UNK>”)来显式表示词汇表外单词的概率。
n-gram语言模型的另一个问题是维数灾难(Curse of Dimensionality)。为了使n-gram语言模型能够建模较长的上下文,我们需要增大n的值,但当n变大时,需要计算对应概率的n-gram的个数呈指数增长。某些n-gram在训练语料中极为稀疏,从而导致没有足够的数据来对其概率进行准确估测,甚至出现训练数据中未出现的n-gram被赋予零概率的情况。解决这个问题需要用到语言模型平滑(Language Model Smoothing)技术,该技术将一定的概率分配给未见过的单词或n-gram来平滑概率分布。