语言模型基础:从统计到神经网络的演进 | Foundations of Language Models: From Statistics to Neural Networks
第一章:语言模型基础——从统计到神经网络的演进
1.1 语言模型的基本定义与核心概念
语言模型(Language Model,LM)是自然语言处理(Natural Language Processing,NLP)领域中最为基础且核心的概念之一。从本质上讲,语言模型是对人类语言进行数学建模的计算机程序,其核心任务是学习文本序列的概率分布,进而能够对给定的词序列估计其出现的概率,或者根据已知的上文预测下一个可能出现的词。这种能力使得语言模型成为机器翻译、语音识别、文本生成、智能问答等众多NLP任务的重要基础技术。
从数学的角度严格定义,语言模型可以表述为对语言序列 $P(w_1, w_2, \ldots, w_n)$ 的概率建模,其中 $w_i$ 表示第 $i$ 个词(或词元,token)。根据概率论的链式法则(Chain Rule),一个长度为 $n$ 的序列的联合概率可以分解为条件概率的乘积形式:
$$P(w_1, w_2, \ldots, w_n) = P(w_1) \cdot P(w_2|w_1) \cdot P(w_3|w_1, w_2) \cdot \ldots \cdot P(w_n|w_1, w_2, \ldots, w_{n-1})$$
这个分解看似简单,却揭示了语言建模的本质:每一个词出现的概率都取决于它前面所有的词(称为上下文,context)。在实际应用中,这种完整的条件依赖会带来严重的计算和统计问题,因为随着序列增长,需要估计的条件概率数量呈指数级增长,且许多条件组合在训练语料中可能从未出现过,导致数据稀疏问题。因此,研究者们发展出了多种近似方法来处理这一难题,这也构成了语言模型发展历程中的重要线索。
语言模型的核心能力可以归纳为两个相互关联的任务。第一个任务是评估(Evaluation),即给定一个文本序列,计算其出现的概率。这一能力在机器翻译中尤为重要,因为一个好的翻译结果应该是一个在目标语言中自然且常见的句子,其概率应当高于不自然或不准确的翻译。第二个任务是生成(Generation),即给定一个前缀或上下文,预测下一个最可能出现的词,或者从零开始生成一个完整的句子。这种生成能力是如今大语言模型(Large Language Model,LLM)对话系统的基础。
在语言模型的发展历程中,评估指标也经历了演变。传统的评估指标如困惑度(Perplexity,PPL)是衡量语言模型性能的重要指标,它定义为概率的倒数平均值的平方根,数学表达式为:
$$\text{PPL} = \left( \prod_{i=1}^{n} \frac{1}{P(w_i|w_{<i})} \right)^{\frac{1}{n}}$$
困惑度可以理解为模型在预测下一个词时的不确定性程度。假设模型对每个位置都有完美的预测能力,即 $P(w_i|w_{<i}) = 1$,则困惑度为1,表示完全没有不确定性;而如果模型对每个词都均匀分布,即 $P(w_i|w_{<i}) = \frac{1}{V}$($V$ 为词表大小),则困惑度等于词表大小,表示最大的不确定性。在实践中,一个优秀的语言模型应当能够在标准测试集上达到较低的困惑度。
1.2 统计语言模型的兴起:N-gram模型
1.2.1 马尔可夫假设与N-gram的基本原理
统计语言模型的发展可以追溯到20世纪80年代,其中最具影响力的当属N-gram模型。这类模型的核心思想基于马尔可夫假设(Markov Assumption):下一个词出现的概率仅与前面有限的若干个词相关,而不需要考虑整个历史。这种局部性假设大大简化了语言模型的计算,使得模型训练和推理成为可能。
具体而言,N-gram模型假设第 $i$ 个词只与前面 $n-1$ 个词相关,即:
$$P(w_i|w_1, w_2, \ldots, w_{i-1}) \approx P(w_i|w_{i-n+1}, \ldots, w_{i-1})$$
根据 $n$ 的取值不同,N-gram模型有不同的名称。当 $n=1$ 时,称为一元语法(Unigram)模型,每个词的出现概率与上下文完全无关;当 $n=2$ 时,称为二元语法(Bigram)模型,每个词只与前一个词相关;当 $n=3$ 时,称为三元语法(Trigram)模型,每个词与前两个词相关。在实际应用中,三元语法和四元语法(4-gram)是最为常用的配置。
以二元语法为例,句子的概率可以简化为:
$$P(w_1, w_2, \ldots, w_n) \approx \prod_{i=1}^{n} P(w_i|w_{i-1})$$
这种分解使得模型参数大大减少。对于一个大小为 $V$ 的词表,Unigram模型需要 $V$ 个参数,Bigram模型需要 $V^2$ 个参数,而Trigram模型需要 $V^3$ 个参数。虽然参数数量仍然很大,但相比完全依赖所有历史的方法已经有了本质性的简化。
1.2.2 参数估计:最大似然估计
N-gram模型的参数估计采用最大似然估计(Maximum Likelihood Estimation,MLE)方法。对于Bigram模型,参数 $P(w_i|w_{i-1})$ 的估计公式为:
$$P(w_i|w_{i-1}) = \frac{\text{Count}(w_{i-1}, w_i)}{\text{Count}(w_{i-1})}$$
其中,$\text{Count}(w_{i-1}, w_i)$ 表示词对 $(w_{i-1}, w_i)$ 在训练语料中共同出现的次数,$\text{Count}(w_{i-1})$ 表示词 $w_{i-1}$ 出现的次数。这种估计方法直观且易于计算,只需要对训练语料进行一次遍历统计即可得到所有参数。
为了更好地理解这一过程,我们可以考虑一个简单的英语语料库例子。假设我们的训练语料包含以下句子:
``` the cat sat on the mat the dog ran in the park ```
对于Bigram模型,我们可以统计每个词后面出现各词的概率。例如,统计"the"后面出现"cat"、"dog"、"mat"、"park"等词的概率。从语料中可以看到,"the"总共出现了4次,其中2次后面跟着"cat"和"dog",另外2次后面跟着"mat"和"park"("the mat"和"the park")。因此,$P(\text{cat}|\text{the}) = 2/4 = 0.5$,$P(\text{dog}|\text{the}) = 2/4 = 0.5$,而$P(\text{sat}|\text{the}) = 0$,因为在训练语料中"the sat"从未出现。
1.2.3 数据稀疏问题与平滑技术
N-gram模型面临的最严峻挑战是数据稀疏(Data Sparsity)问题。语言是极其丰富多样的,而训练语料的规模总是有限的。在实际的文本中,可能出现的词序列组合数量是巨大的,但任何语料库都不可能覆盖所有的可能组合。许多合法的词序列在训练语料中从未出现过,导致其概率被估计为零。
考虑一个具体的例子。在一个包含数十亿词的语料库中,"the cat sat on the mat"可能出现过数千次,但"the cat sat on the rug"可能从未出现。按照最大似然估计,后者出现的概率为零。然而,从语义角度看,"mat"和"rug"都是"坐在上面"的合理对象,因此后者应该有一定的非零概率。这种零概率问题会严重影响语言模型的整体性能。
为了解决这一问题,研究者们发展出了多种平滑(Smoothing)技术,其核心思想是将部分概率质量从高频率的N-gram分配给未出现的N-gram。常用的平滑方法包括:
拉普拉斯平滑(Laplace Smoothing),也称为加一平滑(Add-one Smoothing),是最简单的平滑方法。它将所有N-gram的计数加1,确保没有零概率的N-gram:
$$P(w_i|w_{i-1}) = \frac{\text{Count}(w_{i-1}, w_i) + 1}{\text{Count}(w_{i-1}) + V}$$
其中 $V$ 是词表大小。加一平滑虽然简单有效,但往往会过度平滑,导致模型性能下降,特别是对于出现次数较多的N-gram。
古德-图灵估计(Good-Turing Estimation)是一种更为精巧的平滑方法。其基本思想是将被观察次数为 $r$ 的事物重新估计其出现次数为 $r^*$,公式为:
$$r^* = (r+1) \cdot \frac{N_{r+1}}{N_r}$$
其中 $N_r$ 表示在训练语料中出现恰好 $r$ 次的N-gram数量。古德-图灵估计将高频N-gram的概率质量分配给低频和未出现的N-gram。Kneser-Ney平滑和Katz平滑等方法都是在古德-图灵估计基础上的改进。
插值平滑(Interpolated Smoothing)和回退平滑(Backoff Smoothing)是另一种重要的策略。前者将不同阶的N-gram概率进行线性组合:
$$P_{\text{interp}}(w_i|w_{i-1}, w_{i-2}) = \lambda_1 P(w_i|w_{i-1}, w_{i-2}) + \lambda_2 P(w_i|w_{i-1}) + \lambda_3 P(w_i)$$
后者则在高阶N-gram不可用时回退到低阶N-gram。这些技术在实际系统中都有广泛应用。
1.2.4 N-gram模型的局限性
尽管N-gram模型在历史上取得了重要成功,并在许多应用中仍然发挥着作用,但它存在固有的局限性,这些局限性促使研究者们寻找新的方法。
上下文容量有限是N-gram模型最根本的缺陷。由于马尔可夫假设的强局部性,N-gram模型只能捕获非常有限的上下文信息。即使是5-gram或6-gram模型,也无法理解跨越很长距离的语义依赖关系。例如,在句子"The author of the famous novel that was published in 1956"中,正确预测最后一个词"1956"需要理解前面的整个短语结构,而N-gram模型无法做到这一点。
泛化能力不足是另一个严重问题。N-gram模型本质上是基于词序列的表面统计,它无法理解词语之间的语义相似性。"猫在睡觉"和"小狗在休息"表达的是类似的语义,但N-gram模型会将它们视为完全不同的序列,因为它们的字面组成几乎没有重叠。模型无法将"猫"和"小狗"视为同一类概念,也无法将"睡觉"和"休息"视为可替换的表达。
维度灾难也是不可忽视的挑战。随着 $n$ 的增大,N-gram的组合数量呈指数增长。对于一个包含10万个词的词表,5-gram的理论组合数为 $10^{20}$,即使训练语料规模达到万亿词级,也只能覆盖其中微不足道的一部分。这使得高阶N-gram模型难以获得足够的统计数据。
1.3 词向量:语言的分布式表示
1.3.1 词的表示问题
在深入讨论神经语言模型之前,我们需要先理解词向量(Word Embedding)这一关键概念。词向量是词的分布式表示(Distributed Representation),它将每个词映射到一个低维稠密向量空间。这种表示方法相较于传统的独热表示(One-hot Representation)具有显著优势,是现代NLP技术的重要基石。
传统的独热表示将每个词表示为一个长度为词表大小 $V$ 的向量,其中只有一个位置为1,其余均为0。例如,假设词表中共有5个词{"king", "queen", "man", "woman", "child"},则"king"可以表示为 $[1, 0, 0, 0, 0]$,"queen"表示为 $[0, 1, 0, 0, 0]$。这种表示方法简单直观,但存在两个严重问题。
首先是维度灾难。当词表规模达到数万甚至数十万时,每个向量都是高维稀疏的,这给计算和存储带来巨大负担。更重要的是,独热表示无法表达词与词之间的语义关系。在独热空间中,"king"和"queen"的距离与"king"和"child"的距离是相同的,因为所有词向量之间都是正交的。但这显然不符合语言的实际语义结构——"king"和"queen"是一对相关概念,而"king"和"child"的关系则截然不同。
分布式表示的核心思想源于哈里斯(Zellig Harris)在1954年提出的分布假说(Distributional Hypothesis):具有相似分布的词倾向于具有相似的含义。换句话说,一个词的含义可以由它的上下文来刻画。如果两个词经常出现在相似的上下文中,那么它们很可能具有相似的语义。这一假说为词向量学习提供了理论基础。
在分布式表示中,每个词被表示为一个低维(通常为50到300维)的稠密向量。这些向量不是稀疏的0-1向量,而是包含连续值的实数向量。重要的是,这些实数向量能够编码丰富的语义信息,相似的词在向量空间中距离较近。
1.3.2 Word2Vec:词向量的突破性方法
2013年,米科洛夫(Tomas Mikolov)等人提出了Word2Vec模型,这是词向量技术发展史上的重要里程碑。Word2Vec包含两种核心架构:连续词袋模型(Continuous Bag-of-Words,CBOW)和跳元模型(Skip-gram)。这两种模型都采用浅层神经网络结构,能够在大规模语料上高效地学习高质量的词向量。
CBOW模型的目标是根据上下文预测中心词。给定一个词序列 $w_{t-n}, \ldots, w_{t-1}, w_{t+1}, \ldots, w_{t+n}$,CBOW尝试预测中心词 $w_t$。模型结构包含输入层、投影层和输出层。在输入层,上下文中的词通过词向量矩阵 $W_{\text{in}}$ 转换为向量,然后这些向量取平均(或者求和)得到一个投影向量,该向量再通过输出层权重矩阵 $W_{\text{out}}$ 计算得到各个词的概率分布。最终选择概率最高的词作为预测结果。
Skip-gram模型则相反,它根据中心词预测上下文中的词。给定中心词 $w_t$,Skip-gram尝试预测它周围 $2n$ 个上下文词。模型的训练目标是最大化这些上下文词出现的对数概率:
$$\mathcal{L} = \sum_{t=1}^{T} \sum_{-n \leq j \leq n, j \neq 0} \log P(w_{t+j}|w_t)$$
条件概率 $P(w_{t+j}|w_t)$ 通过softmax函数计算:
$$P(w_O|w_I) = \frac{\exp(v_{w_O}'^\top v_{w_I})}{\sum_{w=1}^{V} \exp(v_w'^\top v_{w_I})}$$
其中 $v_{w_I}$ 是输入词向量,$v_{w_O}'$ 是输出词向量(有时输入输出使用不同的向量表示)。
然而,上述softmax函数的分母需要遍历整个词表,当词表规模很大时计算代价极高。为解决这一问题,Word2Vec引入了两种高效的近似训练方法。
层次Softmax(Hierarchical Softmax)使用霍夫曼树(Huffman Tree)代替扁平化的输出层。在霍夫曼树中,每个词都是叶子节点,从根节点到叶节点的路径定义了该词的编码。树的构建遵循词频原则,高频词距离根节点更近,需要更少的步数即可到达。在层次Softmax中,每个内部节点对应一个二分类器,使用sigmoid函数计算向左或向右走的概率:
$$P(\text{left}|h) = \sigma(h^\top \theta)$$
其中 $h$ 是隐藏层的输出向量,$\theta$ 是该节点的参数。这种方法将计算复杂度从 $O(V)$ 降低到 $O(\log V)$。
负采样(Negative Sampling)是另一种高效的训练方法。其核心思想是将多分类问题转换为多个二分类问题:对于每个正样本(正确的上下文词),随机采样若干负样本(不正确的词),然后训练一个二分类器来区分正负样本。负采样的目标函数为:
$$\mathcal{L} = \log \sigma(v_{w_O}'^\top v_{w_I}) + \sum_{i=1}^{k} \mathbb{E}_{w_i \sim P_n(w)}[\log \sigma(-v_{w_i}'^\top v_{w_I})]$$
其中 $k$ 是负样本数量,$P_n(w)$ 是负采样分布,通常取与词频的 $3/4$ 次方成正比的分布。这种方法显著提高了训练效率,同时能够学习到高质量的词向量。
1.3.3 Word2Vec学到的语义关系
Word2Vec的一个令人惊奇的特性是,它能够自动学习到词与词之间的语义和语法关系。通过简单的向量运算,我们可以发现词向量空间中蕴含的丰富结构。
最著名的例子是"国王 - 男人 + 女人 ≈ 女王"(或"queen")。这个等式表明,词向量捕获了"性别"这一语义维度。如果我们用 $\vec{\text{king}}$、$\vec{\text{man}}$、$\vec{\text{woman}}$、$\vec{\text{queen}}$ 分别表示这四个词的向量,那么:
$$\vec{\text{king}} - \vec{\text{man}} + \vec{\text{woman}} \approx \vec{\text{queen}}$$
这个结果意味着向量 $\vec{\text{king}} - \vec{\text{man}}$ 捕获了"royal"的语义概念(或者更准确地说,是从"man"到"king"的转换关系),加上"woman"后,就得到了"queen"。类似的关系在词向量空间中普遍存在,例如:
- $\vec{\text{Paris}} - \vec{\text{France}} + \vec{\text{Italy}} \approx \vec{\text{Rome}}$
- $\vec{\text{walking}} - \vec{\text{walked}} + \vec{\text{ran}} \approx \vec{\text{running}}$
- $\vec{\text{good}} - \vec{\text{best}} + \vec{\text{worst}} \approx \vec{\text{worse}}$
这些例子表明,词向量不仅编码了词汇的语义相似性,还编码了词与词之间的类比关系。这种能力使得词向量成为NLP任务中的强大特征表示。
1.3.4 GloVe:全局词向量表示
2014年,斯坦福大学的研究团队提出了GloVe(Global Vectors for Word