范式转移的序章:从统计语言模型到神经网络的演进
自然语言处理领域的每一次范式转移,都源于对前一代技术根本局限的深刻认知与突破性重构。在深度学习革命之前,统计语言模型主导了数十年的自然语言处理研究,其核心思想是基于频率的局部模式归纳;随后,神经网络语言模型开启了分布式表征的新纪元,而循环神经网络及其变体则试图拥抱序列的时序本质。然而,这些模型在长程依赖建模、计算并行化与全局上下文理解上,始终存在难以逾越的结构性瓶颈。本章将系统回顾从n-gram统计模型到RNN/LSTM系列的演进脉络,通过严谨的理论分析与实证对比,揭示其内在局限如何共同孕育了Transformer架构的历史必然性。这并非一段简单的技术替代史,而是一场关于“如何让机器真正理解语言”的持续追问,其答案的每一次逼近,都深刻地重塑了自然语言处理的研究范式与应用边界。
2.1 n-gram模型:统计语言模型的基石与边界
n-gram模型是统计自然语言处理的基础设施,其核心假设是马尔可夫假设:当前词的出现仅依赖于前n-1个词。给定一个词序列$w_1, w_2, ..., w_T$,其联合概率被分解为条件概率的乘积: $$P(w_1, w_2, ..., w_T) = \prod_{t=1}^{T} P(w_t | w_{t-n+1}^{t-1})$$ 其中$w_{t-n+1}^{t-1}$表示前n-1个词的历史上下文。模型参数通过极大似然估计从大规模语料中学习,即统计每个n-gram模式的出现频率。
n-gram模型的贡献是奠基性的。在1990年代至2000年代初,它几乎定义了整个统计机器翻译、语音识别和拼写纠错领域。IBM的统计机器翻译模型系列(IBM Models 1-5)严重依赖n-gram语言模型作为输出流畅性的评分器。其优势在于简洁、高效、可解释:概率计算是纯粹的查表与插值操作,训练和推理速度极快,且模型行为完全由训练语料决定。这种透明性使其成为工业界早期大规模部署的首选,例如在谷歌的拼写检查系统(2005年左右)中,trigram模型是核心组件。
然而,n-gram模型的局限性是根本性的,且随任务复杂度增加而急剧恶化。
第一,数据稀疏性与维度灾难。语言是一个开放系统,词汇表V的大小可达数十万甚至百万级别。一个n-gram的组合空间是$|V|^n$,即使使用最常出现的10万个词,bigram有100亿种可能,trigram更是高达$10^{15}$。真实语料库相对于这个空间是极其稀疏的,绝大多数n-gram在训练集中从未出现,导致其估计概率为零。为解决此问题,引入了平滑技术(如加一平滑、Kneser-Ney平滑、退避法),但这些方法本质上是基于启发式的概率“修补”,并未真正学习语言的内在规律。它们将未登录n-gram的概率 mass 分散到更短的子序列或低频词上,这导致概率估计存在系统性偏差,尤其在处理专业领域或新颖文本时,模型性能会断崖式下降。
第二,缺乏泛化能力与语义抽象。n-gram模型完全基于词的表面形式进行匹配。它无法识别“汽车”与“轿车”、“买”与“购买”之间的语义等价性,因为这些词的n-gram上下文几乎不重叠。这种符号孤立性使得模型无法将在一个上下文学到的知识迁移到另一个语义相关的上下文。例如,在语料中见过“我开汽车”,但面对“我驾驶轿车”时,模型无法利用“开”与“驾驶”、“汽车”与“轿车”的潜在关联来给出合理概率。这严重限制了模型对语言丰富性和灵活性的捕捉。
第三,严格的局部视野与长程依赖的彻底缺失。n-gram的上下文窗口是固定且局部的(通常n=3或5)。对于超过n-1步的依赖关系,模型完全无能为力。而自然语言中,长程依赖是普遍存在的:一个句子的主语可能在几十个词前出现,其动词需要与之保持数、格一致;篇章层面的指代、主题连贯、逻辑论证都依赖于跨越句子甚至段落的远距离关联。n-gram模型将这些依赖视为独立的局部事件,从根本上破坏了语言的结构性。例如,在句子“虽然天气恶劣,但运动员们坚持完成了比赛,他们的精神令人钦佩”中,“他们”指代“运动员们”,这个指代关系需要跨越10个以上的词,trigram模型完全无法建立这种连接。
第四,无法处理未登录词(Out-of-Vocabulary, OOV)。训练时未出现的词,在测试时遇到,n-gram模型只能将其映射为`<UNK>`标记,丢失所有具体语义信息。在动态变化的网络文本或专业文献中,OOV问题极为突出。
综上所述,n-gram模型是一个强大的局部模式匹配工具,但它将语言视为一个离散符号的马尔可夫链,忽视了语言的生成性、递归性与语义 Compositionality。它的成功恰恰掩盖了其理论上的根本缺陷,为后续更强大的模型提供了明确的“反面教材”:我们需要一个能泛化到未见过模式的模型,一个能捕捉词与词之间语义关系的模型,一个能建模任意长度依赖关系的模型,以及一个能高效利用计算资源的模型。
2.2 神经网络语言模型:分布式表示的黎明与有限窗口的桎梏
2003年,Yoshua Bengio等人在论文《A Neural Probabilistic Language Model》中提出的神经网络语言模型(Neural Network Language Model, NNLM),标志着自然语言处理从离散符号统计向量化、分布式表征的范式转移。NNLM的核心洞见是:将词映射为低维、稠密、连续的向量(词向量),使得语义相似的词在向量空间中距离相近,并通过一个神经网络来学习从历史词向量到下一个词的概率分布。
NNLM的典型结构包含四个部分: 1. 嵌入层:将每个输入词$w_{t-n+1}, ..., w_{t-1}$通过一个查找表(Lookup Table)映射为d维词向量$\mathbf{e}(w_i) \in \mathbb{R}^d$。 2. 拼接层:将n-1个词向量拼接成一个长向量$\mathbf{x} = [\mathbf{e}(w_{t-n+1}); ...; \mathbf{e}(w_{t-1})] \in \mathbb{R}^{(n-1)d}$。 3. 隐层:$\mathbf{h} = \tanh(\mathbf{W}_1 \mathbf{x} + \mathbf{b}_1)$,其中$\mathbf{W}_1 \in \mathbb{R}^{m \times (n-1)d}$,$m$是隐层神经元数量。 4. 输出层:$y = \text{softmax}(\mathbf{W}_2 \mathbf{h} + \mathbf{b}_2)$,其中$\mathbf{W}_2 \in \mathbb{R}^{|V| \times m}$,计算下一个词$w_t$在所有词汇上的概率。
模型通过最小化负对数似然(即交叉熵损失)进行训练: $$\mathcal{L} = -\sum_{t} \log P(w_t | w_{t-n+1}^{t-1})$$
NNLM的革命性贡献在于:
第一,引入了分布式假设与词向量。词向量$\mathbf{e}(w)$不再是独热编码(One-hot),而是通过训练学习到的稠密向量。这使模型具备了泛化能力:即使两个词从未在相同的n-gram历史中出现,只要它们的语义相似(如“国王”与“女王”),其词向量就会相近,从而在预测时产生相似的影响。后续的研究(如Mikolov的Word2Vec)证明,从NNLM这类模型中提取的词向量,能捕获丰富的语言规律,如“vector('Madrid') - vector('Spain') + vector('France') ≈ vector('Paris')”。这是n-gram模型完全无法企及的。
第二,将语言建模转化为一个函数逼近问题。模型不再存储离散的n-gram计数,而是学习一个从历史上下文向量$\mathbf{x}$到概率分布$y$的连续函数。这使得模型能够对未见过的n-gram历史做出有根据的推断,其概率估计更加平滑。
第三,为端到端学习奠定了基础。整个模型(从词表到输出概率)可以通过反向传播联合训练,所有参数(词向量、权重矩阵)都服务于最终的预测目标。这为后续更复杂的神经网络架构(如RNN、Transformer)提供了统一的技术框架。
然而,NNLM在继承n-gram核心思想(固定长度、局部历史)的同时,也继承了其最致命的缺陷,并因自身结构而加剧:
第一,固定长度的历史窗口。尽管通过词向量实现了泛化,但NNLM的输入历史长度$n-1$仍然是固定且有限的。它无法处理超过n-1步的长程依赖。增加n可以扩大视野,但会导致参数数量线性增长(嵌入层拼接维度增加,$\mathbf{W}_1$变宽),计算和存储开销急剧上升,且仍无法处理任意长度的依赖。这与人类理解句子或段落时动态调整注意力范围的能力相去甚远。
第二,参数数量巨大,训练效率低下。输出层是$|V|$路的softmax分类器,$|V|$通常为10万至百万级。这意味着$\mathbf{W}_2 \in \mathbb{R}^{|V| \times m}$是一个巨大的矩阵,每次前向传播和反向传播都需要计算所有词汇的分数,计算成本与词汇表大小成正比。这是NNLM在实际大规模语料上训练的主要瓶颈。虽然后续提出了分层softmax、噪声对比估计(NCE)等技术来近似输出层,但模型本身的固定窗口问题并未解决。
第三,无法有效利用序列的时序动态性。NNLM将历史词向量简单拼接,相当于将历史词视为一个无序的集合(尽管在输入中是按顺序的,但拼接操作本身不保留顺序信息,完全依赖隐层来学习顺序模式)。这迫使模型必须从静态的拼接向量中“猜出”顺序,增加了学习难度。对于语言这种强时序信号,这种处理方式是低效的。
第四,深度受限。早期的NNLM通常只有一层隐层。深层网络虽然理论上表达力更强,但训练困难。在2010年代中期,随着ReLU激活函数、Dropout、更好的初始化等技术的出现,深层前馈网络才变得可行,但NNLM的固定窗口架构限制了其深度的意义——无论多深,输入都只是局部窗口。
NNLM是一个关键的过渡模型。它证明了分布式表征的强大,并确立了神经语言建模的基本流程:词向量 + 神经网络 + softmax输出。但它本质上仍然是n-gram思想的神经网络翻版:一个基于固定长度、局部历史的分类器。它未能解决长程依赖问题,其计算效率也因输出层而备受挑战。这些未竟之业,将循环神经网络推向了舞台中央。
2.3 RNN与LSTM:序列建模的尝试与困境
循环神经网络(Recurrent Neural Network, RNN)及其变体长短期记忆网络(Long Short-Term Memory, LSTM)和门控循环单元(Gated Recurrent Unit, GRU),是深度学习时代前期序列建模的绝对主流。其核心设计哲学是:通过循环连接,让网络能够处理任意长度的序列,并理论上具备记忆历史信息的能力。
2.3.1 循环神经网络:理论上的无限历史与实践中梯度消失
RNN在时间步$t$的更新公式为: $$\mathbf{h}_t = f(\mathbf{W}_{xh} \mathbf{x}_t + \mathbf{W}_{hh} \mathbf{h}_{t-1} + \mathbf{b}_h)$$ 其中$\mathbf{x}_t$是当前词的词向量,$\mathbf{h}_t$是当前隐藏状态,$f$通常是tanh或ReLU。隐藏状态$\mathbf{h}_t$被同时用作当前输出的依据($ \mathbf{y}_t = \text{softmax}(\mathbf{W}_{hy} \mathbf{h}_t + \mathbf{b}_y)$)和下一个时间步的输入。通过这种循环,理论上,$\mathbf{h}_t$可以累积从序列开始到$t$的所有历史信息,从而解决固定窗口问题。
RNN在语言建模、文本分类等任务上取得了比n-gram和NNLM更好的效果,因为它动态地、顺序地处理序列,隐藏状态的大小(隐层维度)是固定的,与序列长度无关,理论上可以处理任意长的序列。
然而,标准RNN在实践中遭遇了严重的梯度消失/爆炸问题。根据链式法则,在随时间反向传播(Backpropagation Through Time, BPTT)时,损失函数对早期参数$\mathbf{W}_{hh}$的梯度是: $$\frac{\partial \mathcal{L}}{\partial \mathbf{W}_{hh}} = \sum_{t=1}^{T} \frac{\partial \mathcal{L}}{\partial \mathbf{h}_t} \cdot \frac{\partial \mathbf{h}_t}{\partial \mathbf{h}_{t-1}} \cdot ... \cdot \frac{\partial \mathbf{h}_{k+1}}{\partial \mathbf{h}_k} \cdot \frac{\partial \mathbf{h}_k}{\partial \mathbf{W}_{hh}}$$ 其中雅可比矩阵$\frac{\partial \mathbf{h}_t}{\partial \mathbf{h}_{t-1}} = \text{diag}(f'(\mathbf{W}_{xh} \mathbf{x}_t + \mathbf{W}_{hh} \mathbf{h}_{t-1} + \mathbf{b}_h)) \cdot \mathbf{W}_{hh}$。如果$\mathbf{W}_{hh}$的特征值小于1,多次连乘会导致梯度指数级衰减至0(消失);如果大于1,则会导致梯度指数级增长至无穷(爆炸)。
对于语言建模,我们关心的是序列开头的信息(如主语)对结尾预测(如动词)的影响。梯度消失意味着,在训练过程中,序列开头参数$\mathbf{W}_{hh}$几乎收不到来自远距离时间步的有用梯度信号,因此无法学习到长程依赖。Hochreiter & Schmidhuber在1991年的经典论文《Untersuchungen zu dynamischen neuronalen Netzen》中,通过理论分析清晰揭示了这一问题。尽管后续使用了梯度裁剪(Gradient Clipping)来缓解爆炸,但消失问题在标准RNN中是结构性的,无法根本解决。
2.3.2 LSTM:门控机制与长程依赖的有限修复
为应对梯度消失,Hochreiter & Schmidhuber在1997年提出了长短期记忆网络。LSTM的核心创新是细胞状态(Cell State)$\mathbf{C}_t$ 和门控机制(输入门$i_t$、遗忘门$f_t$、输出门$o_t$)。其更新公式为: $$\begin{aligned} f_t &= \sigma(\mathbf{W}_f \cdot [\mathbf{h}_{t-1}, \mathbf{x}_t] + \mathbf{b}_f) \\ i_t &= \sigma(\mathbf{W}_i \cdot [\mathbf{h}_{t-1}, \mathbf{x}_t] + \mathbf{b}_i) \\ \tilde{\mathbf{C}}_t &= \tanh(\mathbf{W}_C \cdot [\mathbf{h}_{t-1}, \mathbf{x}_t] + \mathbf{b}_C) \\ \mathbf{C}_t &= f_t \odot \mathbf{C}_{t-1} + i_t \odot \tilde{\mathbf{C}}_t \\ o_t &= \sigma(\mathbf{W}_o \cdot [\mathbf{h}_{t-1}, \mathbf{x}_t] + \mathbf{b}_o) \\ \mathbf{h}_t &= o_t \odot \tanh(\mathbf{C}_t) \end{aligned}$$
细胞状态$\mathbf{C}_t$是信息的“高速公路”。遗忘门$f_t$决定从$\mathbf{C}_{t-1}$中丢弃哪些信息,输入门$i_t$决定将哪些新信息$\tilde{\mathbf{C}}_t$存入$\mathbf{C}_t$,而输出门$o_t$决定从$\mathbf{C}_t$中输出哪些信息到隐藏状态$\mathbf{h}_t$。门控值通过sigmoid函数输出(0,1)区间,实现受控的信息流。
LSTM的设计使其在理论上具备长期记忆能力。如果遗忘门$f_t$长期接近1(即“记住”),而输入门$i_t$在某些时刻才打开(即“写入”),那么细胞状态$\mathbf{C}_t$可以几乎不变地传递数十甚至数百个时间步,梯度因此可以沿这条“高速公路”稳定流动,极大地缓解了梯度消失问题。实验证明,LSTM在许多需要长程依赖的任务上(如语言建模、语音识别)显著优于标准RNN。
然而,LSTM的“成功”并非完美,其内在困境依然深刻:
第一,门控的“有限带宽”与信息压缩。细胞状态$\mathbf{C}_t$的维度是固定的(如512或1024)。这意味着无论序列多长,所有需要长期保留的信息都必须被压缩到这个固定大小的向量中。这构成了一个根本性的信息瓶颈。对于包含丰富实体、关系、逻辑的复杂文档,一个固定维度的向量难以无损地编码所有关键信息。遗忘门的选择性丢弃,虽然是一种智能筛选,但也意味着信息损失是不可避免的。
第二,顺序处理的固有低效性。RNN/LSTM本质上是顺序自回归模型:必须计算完$t-1$步的隐藏状态,才能计算第$t$步。这导致了两个致命弱点:
- **无法并行化**:序列长度$T$决定了计算图的深度,训练时BPTT必须按时间步顺序展开,无法像卷积神经网络那样在序列维度上并行。这使得训练长序列模型非常缓慢,成为制约模型规模和数据利用效率的主要因素。尽管后来有“逐层”并行(不同时间步在不同设备上计算)等优化,但时间步间的强依赖使得并行度远低于Transformer。
- **推理时的串行延迟**:在自回归生成(如文本生成)时,必须一个词一个词地生成,因为下一个词的预测依赖于当前步的输出。这导致生成速度受限于最慢的单步计算,无法利用现代硬件的大规模并行能力。
第三,建模长程依赖的效率递减。虽然LSTM理论上可以记住很久以前的信息,但在实践中,信息传递得越远,其有效性往往越低。这不仅仅是梯度问题,更是优化问题。在长序列上,模型需要学会在正确的时间步打开遗忘门和输入门,这是一个极其困难的 Credit Assignment 问题。研究表明,即使使用LSTM,在数百步的序列上,模型性能也