Skip to content

2.1 序列建模回顾

大语言模型的本质,是对自然语言序列的概率建模。在 Transformer 横空出世之前,研究者已经花了数十年时间探索如何让机器理解和生成序列数据。这段历史不仅仅是"过时的技术"——从 N-gram 到 RNN 再到 LSTM/GRU,每一代模型所面对的核心问题(如何建模长距离依赖、如何高效训练、如何评估模型好坏)至今仍然深刻影响着大模型的设计哲学。

本节将沿着这条技术脉络,从语言模型的概率基础出发,经过统计方法(N-gram)与神经方法(RNN/LSTM/GRU)的关键节点,最终抵达训练循环网络的核心算法——通过时间的反向传播(BPTT)。理解这些基础,是后续真正读懂 Transformer 注意力机制和现代大模型架构的必要前提。

2.1.1 语言模型的概率基础

**语言模型(Language Model)**的目标只有一个:给定一段文本序列 w1,w2,,wT,估计它出现的概率 P(w1,w2,,wT)。根据概率论的链式法则(chain rule),这个联合概率可以精确分解为一系列条件概率的乘积:

P(w1,w2,,wT)=t=1TP(wtw1,w2,,wt1)

这个分解是精确的,没有任何近似。它告诉我们:一个语言模型的核心任务,就是学会估计下一个词的条件概率分布 P(wtw<t)。这正是今天所有自回归大语言模型(GPT 系列、LLaMA 等)的训练目标——给定前文,预测下一个 token。

问题在于,随着序列长度 T 增长,条件 w1,,wt1 的组合空间呈指数级膨胀。直接统计每种可能的前文对应的下一词概率是不现实的。不同时代的语言模型,本质上就是在用不同的方式压缩和近似这个条件概率。

2.1.2 N-gram:统计语言模型的基石

最经典的近似策略来自 N-gram 模型,它基于一个简洁的假设——马尔可夫假设(Markov Assumption):一个词出现的概率仅依赖于它前面的 N1 个词,而与更早的历史无关。

以 trigram(N=3)为例,条件概率被近似为:

P(wtw1,,wt1)P(wtwt2,wt1)

于是整个句子的概率变为:

P(w1,,wT)t=1TP(wtwtN+1,,wt1)

每个条件概率通过**最大似然估计(MLE)**从大规模语料库中"数数"得到:

P(wtwt2,wt1)=Count(wt2,wt1,wt)Count(wt2,wt1)

这个方法简单、高效、可解释,在神经网络兴起之前长期统治着语音识别和机器翻译领域。Google 在 2007 年曾基于 2 万亿 token 的语料训练了一个 5-gram 模型,其规模在当时已经惊人。

然而 N-gram 有三个根本性缺陷:

数据稀疏性。 随着 N 增大,绝大多数 N-gram 组合在语料中从未出现。例如"Unicorns eat sparkly rainbows"这样的 4-gram,计数为零会导致整个句子概率为零。平滑技术(如 Laplace 平滑、Kneser-Ney 平滑)可以缓解但无法根治这一问题。

无法捕捉长距离依赖。 马尔可夫假设的本质决定了 N-gram 只能看到一个很小的上下文窗口。句子中相隔较远的语法和语义关系——比如主语与远处谓语的一致性——完全超出了它的建模能力。

缺乏泛化能力。 对于 N-gram 模型,"cat"和"kitty"是两个完全无关的符号。它无法将在"the cat sat on"上学到的统计规律迁移到"the kitty sat on"。

这三个缺陷直接催生了神经语言模型的发展:词嵌入(Word Embedding)解决了泛化问题,而循环神经网络则试图突破固定窗口的限制。

2.1.3 困惑度:语言模型的评估标尺

在引入神经方法之前,我们需要一个标准化的指标来衡量语言模型的好坏。**困惑度(Perplexity, PPL)**正是这把标尺。

对于一个长度为 T 的测试序列 W=w1,w2,,wT,困惑度定义为测试集上每个 token 平均负对数似然的指数

PPL(W)=exp(1Tt=1TlogP(wtw1,,wt1))

等价地,它可以理解为每个 token 逆概率的几何平均数:

PPL(W)=(t=1T1P(wtw<t))1/T

直觉理解: 困惑度衡量的是模型在预测下一个词时平均面临的"有效选项数量"。PPL =10 意味着模型的不确定性等同于在 10 个同样可能的词中随机猜测;PPL 趋近于词汇表大小 |V| 则意味着模型几乎什么都没学到。困惑度越低,模型的预测能力越强。

困惑度与**交叉熵(Cross-Entropy)**直接相关:PPL=exp(H),其中 H 是模型在测试集上的平均交叉熵。因此,最小化困惑度等价于最小化交叉熵损失——这正是语言模型训练时的标准目标函数。

使用困惑度进行模型比较时,有几个必须遵守的前提条件:必须在同一个测试集上评估(不同文本难度不同);必须使用完全相同的词汇表和分词方法(不同的 tokenizer 产生不同的 token 序列,困惑度不可直接比较);还需注意词汇表大小对困惑度基线水平的影响(词汇表越大,基线困惑度越高)。

2.1.4 循环神经网络(RNN):让网络拥有记忆

N-gram 模型的核心局限在于固定窗口。一个自然的想法是:能否让模型拥有一种"记忆",在处理每个新词时不仅看到当前输入,还能利用之前所有历史信息?**循环神经网络(Recurrent Neural Network, RNN)**正是这一想法的实现。

RNN 的核心设计是参数共享的循环计算。在每个时间步 t,网络接收当前输入 xt 和上一时刻的隐状态(hidden state) ht1,通过同一组参数计算出新的隐状态和输出:

ht=tanh(XtWxh+Ht1Whh+bh)ot=HtWhq+bq

其中 WxhRd×hWhhRh×hWhqRh×q 是可学习参数,h 为隐状态维度。初始隐状态 h0 通常设为全零向量。

如果把循环展开来看,RNN 就是一个所有层共享参数的超深前馈网络——每处理一个时间步,就相当于多了一"层"。下图展示了这种展开视图:左侧是带环路的紧凑表示,右侧是沿时间轴展开后的等价结构。

RNN 展开图:左侧循环连接表示为环路,右侧展开为沿时间步的前馈结构,展示参数共享机制

RNN 的优势很明显:通过隐状态传递机制,它理论上能利用任意长的历史信息;参数共享使得模型规模不随序列长度增长;并且能自然地处理变长输入。

然而实践中,RNN 的记忆能力远没有理论上那么美好。考虑这样一个句子:"小强是一个爱学习、有礼貌、每次考试成绩都很好、同时又热爱各种体育活动的好学生。老师们都很喜欢。"模型需要从很远的"小强"推断出最后应该是"他"而不是"她"。但隐状态在经过大量时间步的线性变换和激活函数压缩后,早期信息往往已经严重衰减。

从梯度流的角度看,这个问题同样严峻。我们将在 §2.1.7 中详细分析:反向传播时梯度需要穿越大量时间步的矩阵连乘,指数级的缩放会导致梯度消失梯度爆炸——这是简单 RNN 在实践中最致命的问题。

2.1.5 LSTM:用门控机制拯救长期记忆

1997 年,Hochreiter 和 Schmidhuber 提出了长短期记忆网络(Long Short-Term Memory, LSTM),通过引入精心设计的门控机制和独立的记忆通道来解决梯度消失问题。LSTM 是 2010 年代深度学习在序列建模领域取得突破的核心架构,从手写识别、机器翻译到语音合成,几乎所有序列任务的最佳方案都曾基于 LSTM。

LSTM 的关键创新是在隐状态之外引入了一个记忆细胞状态(cell state) Ct,并用三个**门(gate)**来精细控制信息的流动。

"长短期记忆"这个名字本身就揭示了设计思想:普通 RNN 的权重是缓慢变化的"长期记忆"(编码通用知识),激活值是快速流逝的"短期记忆"。LSTM 通过记忆细胞引入了一种介于两者之间的中期记忆——它可以稳定保持很多个时间步,也可以在需要时被选择性地更新或遗忘。

三个门的计算。 输入门 It、遗忘门 Ft 和输出门 Ot 均由当前输入 Xt 与上一步隐状态 Ht1 经线性变换后通过 sigmoid 函数生成,取值范围 (0,1)

It=σ(XtWxi+Ht1Whi+bi)Ft=σ(XtWxf+Ht1Whf+bf)Ot=σ(XtWxo+Ht1Who+bo)

候选记忆与记忆更新。 同时计算一个候选记忆(输入节点)C~t,使用 tanh 激活:

C~t=tanh(XtWxc+Ht1Whc+bc)

记忆细胞的更新是 LSTM 最核心的方程——遗忘门控制保留多少旧记忆,输入门控制写入多少新信息,两者通过逐元素乘法(Hadamard 积 )和加法组合:

Ct=FtCt1+ItC~t

隐状态输出。 最终的隐状态由输出门控制记忆细胞中有多少信息可以对外暴露:

Ht=Ottanh(Ct)

LSTM 完整结构图:展示输入门、遗忘门、输出门与记忆细胞之间的数据流动

LSTM 能缓解梯度消失的关键,在于记忆细胞状态 Ct 的更新方程。观察 Ct=FtCt1+ItC~t——当遗忘门接近 1、输入门接近 0 时,CtCt1,记忆可以几乎无损地跨越任意多个时间步传递。反向传播时,梯度沿着这条"高速公路"直接流向过去的时间步,不必经过大量矩阵乘法和激活函数的压缩。这从根本上改善了长序列上的梯度流动。

2.1.6 GRU:更轻量的门控方案

LSTM 的有效性已被广泛验证,但它的四组参数(三个门加一个输入节点)带来了不小的计算开销。2014 年,Cho 等人提出了门控循环单元(Gated Recurrent Unit, GRU),将 LSTM 的三个门简化为两个,去掉了独立的记忆细胞,仅靠隐状态就实现了类似的长期记忆能力。

GRU 只使用两个门:重置门(reset gate) Rt更新门(update gate) Zt

Rt=σ(XtWxr+Ht1Whr+br)Zt=σ(XtWxz+Ht1Whz+bz)

重置门控制从旧隐状态中读取多少信息来生成候选隐状态 H~t

H~t=tanh(XtWxh+(RtHt1)Whh+bh)

Rt 接近 0 时,候选隐状态几乎完全忽略历史信息,退化为一个仅依赖当前输入的 MLP;当 Rt 接近 1 时,计算过程与普通 RNN 完全一致。

更新门的角色类似于 LSTM 中遗忘门和输入门的合体——它用一个门同时决定保留多少旧状态、写入多少新状态:

Ht=ZtHt1+(1Zt)H~t

这个凸组合非常优雅:Zt 接近 1 时完全保留旧状态(跳过当前时间步),Zt 接近 0 时完全采用新的候选状态。

GRU 完整结构图:展示重置门和更新门控制隐状态更新的数据流动

GRU 与 LSTM 的对比可以简洁地总结:GRU 参数更少(两组门 vs. 三组门加记忆细胞),训练速度更快,在许多任务上性能与 LSTM 相当甚至接近。当计算预算有限时,GRU 是一个值得优先尝试的选择。不过 LSTM 在需要更精细的记忆控制的场景下(如非常长的序列或复杂的依赖结构)通常仍有优势。

2.1.7 BPTT:通过时间反向传播与截断策略

训练 RNN(包括 LSTM 和 GRU)的标准方法是通过时间的反向传播(Backpropagation Through Time, BPTT)(Werbos, 1990)。其核心思路是:将 RNN 沿时间轴展开为一个深度等于序列长度的前馈网络,然后应用标准的反向传播算法。

考虑一个简化的 RNN 模型。在每个时间步 t,隐状态和输出为:

ht=f(xt,ht1,wh),ot=g(ht,wo)

目标函数是所有时间步上损失的平均:

L=1Tt=1Tl(yt,ot)

计算 L/wh 时,由于 ht 通过 ht1 递归地依赖 wh,链式法则展开后会产生一个涉及所有历史时间步的长链:

htwh=f(xt,ht1,wh)wh+f(xt,ht1,wh)ht1ht1wh

递归展开这个表达式可得 [选读]:

htwh=f(xt,ht1,wh)wh+i=1t1(j=i+1tf(xj,hj1,wh)hj1)f(xi,hi1,wh)wh

这里的关键是连乘项 jfhj1。在简单 RNN 中,这对应于 Whh 的高次幂。如果 Whh 的特征值的模大于 1,连乘项指数爆炸(梯度爆炸);如果小于 1,则指数衰减(梯度消失)。这就是为什么简单 RNN 在长序列上难以训练的数学根源。

梯度爆炸可以通过梯度裁剪(gradient clipping)来缓解——当梯度范数超过阈值时,按比例缩小。但梯度消失是更深层的结构性问题,这正是 LSTM 和 GRU 的门控机制所解决的。

在实践中,完整的 BPTT 代价太高(内存和计算都随序列长度线性增长),因此普遍采用截断 BPTT(Truncated BPTT):将序列切分为长度为 τ 的子段,梯度只在每个子段内反向传播,不穿越子段边界。这本质上是对真实梯度的一个近似,它放弃了对距离超过 τ 步的长程依赖的建模,换取了计算效率和数值稳定性。

截断 BPTT 还带来一个附带好处:它对模型产生了一种隐式正则化效果,偏向于学习短程交互模式而非过于复杂的长程依赖——这在很多实际任务中反而是有利的。

2.1.8 小结

本节从语言建模的概率基础出发,回顾了序列建模的核心技术脉络:

  • 链式法则分解是所有语言模型的理论基础——将联合概率分解为逐步预测下一个词的条件概率。
  • N-gram 通过马尔可夫假设将问题简化为固定窗口内的统计计数,简单高效但受限于稀疏性和短程依赖。
  • **困惑度(PPL)**作为交叉熵的指数形式,提供了比较语言模型性能的标准化指标。
  • RNN 通过隐状态引入了理论上无限长的记忆,但梯度消失使其在实践中难以捕捉长距离依赖。
  • LSTM 通过记忆细胞和三门机制(输入门、遗忘门、输出门)建立了梯度的"高速公路",有效缓解了梯度消失问题。
  • GRU 用两个门(重置门、更新门)实现了与 LSTM 相当的效果,同时减少了参数量和计算开销。
  • BPTT 是训练循环网络的标准算法,截断策略在计算效率与梯度精度之间取得了实用的平衡。

这些技术构成了序列建模的"经典范式"。然而,无论是 LSTM 还是 GRU,其本质上的逐步递推结构使得计算无法并行化,训练效率随序列长度线性下降。这个根本性的瓶颈,正是下一节将要介绍的 Transformer 架构所要解决的核心问题。