语言模型演进史:从统计方法到神经网络
自然语言处理(NLP)领域的发展是一部不断突破计算与表示极限的史诗。从早期基于规则的系统到当今以Transformer为基石的大语言模型,每一次范式转移都源于对前序技术瓶颈的深刻洞察与创新性突破。理解这一演进历程,不仅是把握NLP技术脉络的关键,更是洞悉当前大模型革命何以成为可能的基石。本章将系统性地回顾语言模型从统计方法到神经网络的完整演进路径,深入剖析各阶段核心方法的原理、优势与根本局限,并重点聚焦于Seq2Seq与Attention机制这一承前启后的关键突破,为后续章节深入Transformer架构奠定坚实的历史与理论基础。我们将看到,Transformer并非凭空出现的天才构想,而是数十年研究积累、问题驱动的必然产物,其每一个设计决策都能在历史文献中找到对应的痛点与启发。
统计语言模型的奠基:n-gram模型与稀疏性诅咒
在神经网络主导NLP之前,统计语言模型(Statistical Language Model, SLM)是处理自然语言概率建模的核心范式。其核心思想极为朴素:一个词出现的概率,取决于它前面出现的词。这种“马尔可夫假设”将无限的历史依赖简化为有限长度的条件概率。n-gram模型是这一思想的直接实现,它通过计算前n-1个词组成的序列(称为上下文)条件下,第n个词出现的条件概率来定义语言模型。
形式化地,给定词序列 $w_1, w_2, ..., w_T$,n-gram模型将联合概率 $P(w_1, w_2, ..., w_T)$ 分解为条件概率的乘积: $$P(w_1, w_2, ..., w_T) = \prod_{t=1}^{T} P(w_t | w_{t-n+1}, ..., w_{t-1})$$ 其中,$P(w_t | w_{t-n+1}, ..., w_{t-1})$ 即n-gram概率,通过从大规模语料库中计数并归一化得到: $$P(w_t | w_{t-n+1}, ..., w_{t-1}) = \frac{C(w_{t-n+1}, ..., w_{t-1}, w_t)}{C(w_{t-n+1}, ..., ..., w_{t-1})}$$ 这里 $C(\cdot)$ 表示特定词序列在语料中出现的频次。
实践案例:构建一个三元模型(trigram) 假设我们有一个微型语料库:“I love natural language processing. I love deep learning.” 我们想计算“I love deep”的概率。首先需要统计所有三元组的出现次数:
- “I love natural”: 1次
- “love natural language”: 1次
- “natural language processing”: 1次
- “processing . I”: 1次
- “. I love”: 1次
- “I love deep”: 1次
- “love deep learning”: 1次
- “deep learning .”: 1次
要计算 $P(deep | I, love)$,我们需要找到以“I love”开头的所有三元组,即“I love natural”和“I love deep”,总频次为2。“I love deep”出现1次,因此: $$P(deep | I, love) = \frac{1}{2} = 0.5$$
然而,当词汇表 $V$ 规模巨大(通常达数万至数十万)时,n-gram模型立即遭遇 “维度灾难” 与 “数据稀疏性” 的致命打击。一个二元模型(bigram)就需要 $|V|^2$ 个参数,三元模型则需 $|V|^3$ 个。即使使用最常见的10万词汇表,三元模型的参数量也高达 $10^{15}$ 量级,这远远超过任何现实语料库所能覆盖的规模。绝大多数可能的n-gram在训练语料中从未出现,其计数为零,导致条件概率无法计算。这种稀疏性诅咒使得模型无法为未见过的序列分配合理的概率,严重损害了泛化能力。
为缓解此问题,研究者发展了多种平滑技术(Smoothing),其核心思想是从已观察到的n-gram概率中“挪用”少量概率质量,分配给未观察到的n-gram。经典方法包括:
- **加法平滑(Add-one/LapLace平滑)**:对所有计数加1,简单但效果粗糙,会过度分配给低频事件。
- **Kneser-Ney平滑**:更精细的方法,不仅考虑n-gram的绝对频次,还考虑其作为上下文出现的“独特性”。其核心洞见是:一个词出现在新上下文中的能力(即“续写能力”)更能反映其语言概率。例如,“陈”字在“北京”后出现多次,但几乎不再出现在其他城市后,则“陈”作为通用城市名的概率应很低。Kneser-Ney通过计算低阶n-gram的“折扣”概率并回退到低阶模型来分配剩余概率,成为传统n-gram模型的性能标杆。
尽管有平滑技术,n-gram模型仍存在根本性局限: 1. 上下文窗口固定且短:受限于计算与数据,n通常取2-5。这无法捕捉长距离依赖,如句子主语和动词之间的数的一致性问题(“The cats *are*” vs “The cat *is*”),当主语与动词间隔较远时,n-gram模型无能为力。 2. 无法泛化到相似语境:模型将每个n-gram视为独立符号。“cat sat on mat”与“dog sat on mat”被视为完全不同的四元组,尽管“sat on mat”这一语义核心相同。模型缺乏对词义、句法结构的抽象能力。 3. 无法处理开放词汇:对未登录词(Out-of-Vocabulary, OOV)通常赋予一个固定的“<UNK>”概率,丢失了所有语义信息。
这些局限催生了对分布式表示和神经网络的探索,开启了NLP的下一篇章。
神经网络语言模型:分布式表示的曙光
1986年,Rumelhart、Hinton等人提出的分布式表示(Distributed Representation)概念为突破n-gram的符号主义瓶颈提供了理论基础。其核心思想是:将离散的符号(词)映射为连续空间中的稠密向量(词嵌入),使得语义相似的词在向量空间中距离相近。这种表示天然具备泛化能力——“king”与“queen”的向量差可能与“man”与“woman”的向量差平行,使得“king - man + woman ≈ queen”的向量运算成为可能。
2003年,Bengio等人提出的神经网络语言模型(Neural Network Language Model, NNLM) 首次将这一思想成功应用于语言建模,标志着神经NLP时代的开端。NNLM的架构如图1-1所示:
```mermaid graph LR A[输入层<br/>前n-1个词的one-hot编码] --> B[嵌入层<br/>查找表<br/>将词映射为稠密向量] B --> C[拼接层<br/>将n-1个词向量拼接为长向量] C --> D[隐藏层<br/>非线性变换<br/>tanh激活] D --> E[输出层<br/>Softmax<br/>词汇表概率分布] E --> F[预测下一个词] ```
模型详解与数学表达: 1. 输入表示:将前 $n-1$ 个词 $w_{t-n+1}, ..., w_{t-1}$ 通过查找表(Lookup Table)映射为词向量 $\mathbf{e}(w_{t-n+1}), ..., \mathbf{e}(w_{t-1})$。每个词向量维度为 $m$(通常50-500维)。 2. 特征拼接:将 $n-1$ 个词向量拼接为一个长向量 $\mathbf{x} = [\mathbf{e}(w_{t-n+1})^T, ..., \mathbf{e}(w_{t-1})^T]^T$,维度为 $(n-1)m$。 3. 隐藏层变换:$\mathbf{h} = \tanh(\mathbf{W}_1 \mathbf{x} + \mathbf{b}_1)$,其中 $\mathbf{W}_1$ 是隐藏层权重矩阵,$\mathbf{b}_1$ 是偏置。 4. 输出层:$\mathbf{y} = \mathbf{W}_2 \mathbf{h} + \mathbf{b}_2$,然后通过Softmax函数得到下一个词 $w_t$ 的条件概率: $$P(w_t | w_{t-n+1}, ..., w_{t-1}) = \frac{\exp(y_{w_t})}{\sum_{w \in V} \exp(y_w)}$$ 其中 $y_{w_t}$ 是输出向量 $\mathbf{y}$ 中对应词 $w_t$ 的分量。
NNLM的革命性贡献:
- **引入词嵌入**:首次在语言模型中实现端到端的词向量学习,词向量作为模型参数与任务一同优化,捕捉到了词义和句法信息。实验表明,向量空间中存在“国家-首都”等语义关系。
- **端到端训练**:整个模型通过最大似然目标函数端到端训练,避免了n-gram中复杂的平滑计数。
- **泛化能力**:即使未见过的词序列,只要其组成词在训练集中出现过,模型就能给出非零概率,一定程度上缓解了稀疏性。
根本性局限与计算瓶颈: 然而,NNLM自身也面临严重挑战,这恰恰解释了为何它未能直接取代n-gram,并为后续RNN的引入埋下伏笔: 1. 固定上下文窗口:与n-gram一样,NNLM的上下文长度由输入层设计固定(通常n=5或6)。要处理更长依赖,必须增加n,导致拼接向量维度爆炸,参数量剧增。 2. 参数冗余与计算低效:输出层Softmax需要计算词汇表 $|V|$ 上所有词的概率,其计算复杂度为 $O(|V|)$。当 $|V|$ 达数十万时,每次前向传播都成为巨大瓶颈。尽管后来发展了层次化Softmax、噪声对比估计(NCE)等技术,但NNLM架构本身未解决上下文长度问题。 3. 架构不匹配序列本质:语言是顺序信号,但NNLM将固定长度的上下文块视为独立输入,忽略了序列的递归和动态特性。
这些局限促使研究者寻求能自然处理可变长序列的架构,循环神经网络(RNN)及其变体应运而生。
循环神经网络与长短期记忆网络:序列建模的尝试
循环神经网络(Recurrent Neural Network, RNN)是专为序列数据设计的神经网络。其核心思想是在时间步上共享参数,并维护一个隐含状态(hidden state)来传递历史信息。在时间步 $t$,RNN接收当前输入 $x_t$ 和前一时间步的隐含状态 $h_{t-1}$,计算当前隐含状态 $h_t$ 和输出 $y_t$: $$h_t = f(W_{xh} x_t + W_{hh} h_{t-1} + b_h)$$ $$y_t = g(W_{hy} h_t + b_y)$$ 其中 $f$ 和 $g$ 通常为非线性激活函数(如tanh、ReLU)和输出层函数(如Softmax)。
这种循环连接使得RNN在理论上能够处理任意长度的序列,并将所有历史信息压缩到固定维度的隐含状态 $h_t$ 中。然而,朴素的RNN(也称为“Elman RNN”)在实践中遭遇了严重的梯度消失/爆炸问题。当通过时间反向传播(BPTT)训练时,损失函数对早期时间步权重的梯度是多个雅可比矩阵的乘积。当雅可比矩阵的特征值持续小于1时,梯度会指数级衰减至零(消失),导致早期时间步的权重无法有效更新;反之,若特征值大于1,梯度会指数级增长(爆炸),导致训练不稳定。这使RNN难以学习长距离依赖——即间隔较远的词之间的关联。
长短期记忆网络(Long Short-Term Memory, LSTM) 由Hochreiter和Schmidhuber于1997年提出,通过精妙的门控机制(Gating Mechanism)设计,有效缓解了梯度问题,成为后续十余年序列建模的绝对主流。LSTM单元的核心是细胞状态(cell state) $c_t$,它像一条传送带,贯穿整个序列,允许信息无损流动。三个门控单元调节信息流:
- **遗忘门**(forget gate) $f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f)$:决定从细胞状态中丢弃哪些信息。
- **输入门**(input gate) $i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i)$ 与候选细胞状态 $\tilde{c}_t = \tanh(W_c \cdot [h_{t-1}, x_t] + b_c)$:决定将哪些新信息存入细胞状态。
- **输出门**(output gate) $o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o)$:决定从细胞状态输出哪些信息到隐含状态。
细胞状态更新与隐含状态输出为: $$c_t = f_t \odot c_{t-1} + i_t \odot \tilde{c}_t$$ $$h_t = o_t \odot \tanh(c_t)$$ 其中 $\odot$ 表示逐元素相乘。
LSTM的突破性意义:
- **显式长期记忆**:细胞状态提供了近乎线性的信息流动路径,梯度可以沿此路径稳定传播数百步,使LSTM能捕捉长达数百词的长距离依赖。这在机器翻译等任务中至关重要,例如正确翻译德语中位于句末的动词。
- **门控的选择性记忆**:三个门控让模型学会“记住什么、忘记什么、输出什么”,实现了对信息流的动态、精细控制。
GRU的简化:Cho等人在2014年提出门控循环单元(Gated Recurrent Unit, GRU),将遗忘门与输入门合并为更新门,并简化了细胞状态与隐含状态的关系,参数量更少、计算更快,在许多任务上表现与LSTM相当,成为轻量级替代方案。
实践案例:LSTM在语言建模中的表现 在Penn Treebank等标准语言建模数据集上,LSTM显著超越了NNLM和n-gram模型。例如,著名的LSTM语言模型(Zaremba et al., 2014)使用2层LSTM,每层隐藏单元650个,在PTB上的困惑度(Perplexity, PPL)降至约78以下,而最佳n-gram模型(Kneser-Ney平滑5-gram)的PPL约为120。困惑度越低,表示模型预测下一个词的概率分布越接近真实分布,是语言模型的核心评估指标。
LSTM/GRU的剩余挑战: 尽管LSTM/GRU在序列建模上取得巨大成功,但其固有架构仍存在无法克服的瓶颈,这恰恰为Attention机制和Transformer的诞生提供了直接动力: 1. 顺序递归的计算瓶颈:RNN/LSTM本质是顺序计算,时间步 $t$ 的计算依赖于 $t-1$ 的完成。这严重限制了并行化能力,使得训练长序列模型耗时极长。即使使用GPU,训练大规模语料上的深层LSTM仍需数周甚至数月。 2. 信息瓶颈:所有历史信息必须压缩到固定维度的隐含状态向量中。当序列极长时,早期信息可能在传递过程中逐渐衰减或丢失,即使LSTM也难以保证完美记忆。这对需要全局上下文理解的任务(如文档摘要、长文档问答)构成挑战。 3. 梯度问题并未完全消除:虽然LSTM缓解了梯度消失,但在极长序列(数百至上千步)上,梯度仍可能不稳定,训练依然困难。
这些挑战指向一个根本问题:是否必须通过顺序递归来建模序列?能否设计一种并行的、能直接建模任意位置间关系的架构? 这一追问将我们引向Seq2Seq与Attention的革命性思想。
序列到序列学习:Encoder-Decoder范式的诞生
2014年,Sutskever等人提出序列到序列学习(Sequence-to-Sequence, Seq2Seq)框架,首次将编码器-解码器(Encoder-Decoder)架构应用于机器翻译任务,并取得突破性成果。这一框架的核心洞见是:将任意长度的输入序列映射为固定长度的语义向量(上下文向量),再由此向量解码生成任意长度的输出序列。
架构详解:
- **编码器(Encoder)**:通常使用双向RNN(BiRNN)或双向LSTM(BiLSTM)。双向设计使每个时间步的隐含状态同时融合了过去和未来的上下文信息(在翻译任务中,即整个输入句子)。编码器最终将输入序列 $X = (x_1, ..., x_m)$ 编码为一个固定维度的上下文向量 $\mathbf{c}$,通常取最后一个时间步的隐含状态,或对所有时间步隐含状态进行池化。
- **解码器(Decoder)**:也是一个RNN/LSTM,以 $\mathbf{c}$ 为初始隐含状态,自回归地生成输出序列 $Y = (y_1, ..., y_n)$。在每一步 $t$,解码器接收上一时刻的输出词 $y_{t-1}$ 和上一时刻的隐含状态 $h_{t-1}$,计算当前隐含状态 $h_t$ 和输出概率分布:
$$P(y_t | y_{<t}, X) = \text{Softmax}(W_s \tanh(W_c [h_t; \mathbf{c}]))$$ 这里 $[h_t; \mathbf{c}]$ 表示将解码器当前状态与上下文向量拼接,$W_c$ 和 $W_s$ 为可学习参数。
Seq2Seq的划时代意义: 1. 端到端可训练:整个模型(编码器+解码器)通过最大化输出序列的条件似然 $P(Y|X)$ 进行联合训练,无需复杂的特征工程或管道式处理。 2. 长度解耦:输入输出长度不再需要预先对齐或固定,模型自动学习对齐关系。 3. 通用序列转换框架:该范式迅速被扩展到文本摘要、对话生成、代码生成等众多序列转换任务。
根本性缺陷:信息瓶颈: 然而,Seq2Seq模型存在一个致命弱点:所有输入信息必须压缩进一个固定长度的上下文向量 $\mathbf{c}$。当输入序列较长时,这个向量成为严重的信息瓶颈。早期信息在编码过程中可能丢失,解码器在生成后期词时,难以再访问到输入序列的细节信息。这导致对长句、复杂句的翻译质量显著下降。实验表明,当输入句子超过50词时,标准Seq2Seq的性能会急剧恶化。
早期改进尝试: 为缓解信息瓶颈,研究者尝试了多种方法:
- **双向编码器**:使用BiRNN/BiLSTM编码,使 $\mathbf{c}$ 包含更丰富的双向上下文。
- **多级编码器**:堆叠多层RNN,逐步抽象语义。
- **注意力思想萌芽**:部分工作开始探索让解码器在每一步“回顾”编码器的不同部分,但尚未形成统一机制。
这些尝试为Attention机制的正式登场铺平了道路。
注意力机制:打破信息瓶颈的钥匙
2015年,Bahdanau等人提出**神经机器翻