字体大小
第四编 序列建模与生成学习的发展 · 04_第四编_序列建模与生成学习的发展/第16章_循环神经网络及其改进/chapter.md

第16章 循环神经网络及其改进

本章核心问题

在第15章已经看到,固定窗口上下文和有限离散状态虽然给出了序列建模的统计起点,但它们仍难以表达复杂历史依赖。那么,神经网络如何把“历史”变成一种可学习、可连续更新的内部表示?

更具体地说,本章要回答:循环神经网络如何通过隐状态递推来压缩历史信息;时间反向传播为何能够训练这种时间展开结构;梯度消失与梯度爆炸为何成为循环模型的核心困难;以及 LSTM 和 GRU 这样的门控结构如何试图缓解长程依赖建模问题。

1. 问题背景

第15章已经建立了序列建模的统计起点。无论是 n-gram 还是 HMM,它们都在努力回答同一个问题:当当前观测依赖于历史时,应该如何以可估计、可推断的方式压缩过去的信息。n-gram 用固定长度上下文窗口来近似完整历史,HMM 则用有限离散状态链来承载隐藏动态。这两类模型都极其重要,因为它们第一次把顺序依赖与状态演化正式写成了数学对象。

但它们的局限同样清楚。固定上下文窗口意味着模型只能记住有限长度的局部历史,而无法灵活决定哪些更早的信息仍然重要;有限离散状态则意味着模型表达能力受限,难以承载丰富、连续、细粒度的语义结构。尤其在语言建模、机器翻译和复杂语音识别中,真正有意义的信息往往并不局限于最近几个符号或少量手工状态,而可能跨越较长距离并以高度组合化的方式影响当前预测。

这就自然引出一个新想法:历史能否不再被表示为固定窗口或人工设计的离散状态,而是由神经网络自己学习成一个连续向量状态,并随着时间逐步更新?如果第三编的核心贡献是把“表示”变成可学习对象,那么第四编到这一章为止,问题就进一步变成:能否把“随时间演化的表示”也变成可学习对象?

循环神经网络正是在这一背景下出现的。它不是简单把第11章中的前馈网络重复用于每个时间点,而是引入了跨时间共享参数和递推状态结构。换言之,RNN 的核心不是“网络会循环”这一表面特征,而是它把过去压缩进一个随时间更新的隐状态中,使神经网络第一次能够直接在时间维度上处理历史依赖。

从全书结构看,这一章在第四编中的地位非常关键。第15章给出了序列建模的统计语言,但仍主要停留在局部概率和有限状态假设;第16章则把第三编的神经表示学习思想正式带入序列世界。它既承接第15章留下的局限,也为后面序列生成模型、编码器—解码器结构以及注意力机制的出现准备直接背景。因为只要循环模型的瓶颈一旦暴露,研究者就会继续追问:是否存在比单一路径递推状态更强的序列表示方式?

2. 数学原理

2.1 从固定窗口到可学习隐状态

第15章中的 n-gram 模型把历史压缩成一个固定长度窗口,而 HMM 则把历史压缩成一个有限离散状态。循环神经网络提出的核心替代方案,是用一个连续向量

$$ h_t\in\mathbb R^d $$

来表示到时刻 $t$ 为止的历史摘要,其中 $d$ 表示隐状态维数,$h_t$ 表示第 $t$ 个时刻的隐状态。

这个定义非常重要。它意味着,模型不再用有限个离散状态去描述历史,而是用一个高维连续表示来承载过去信息。若当前输入记为

$$ x_t\in\mathbb R^m, $$

其中 $m$ 表示输入维数,则最基本的循环神经网络递推写成

$$ h_t=\phi(W_h h_{t-1}+W_x x_t+b), $$

这里 $W_h\in\mathbb R^{d\times d}$ 表示隐状态到隐状态的权重矩阵,$W_x\in\mathbb R^{d\times m}$ 表示输入到隐状态的权重矩阵,$b\in\mathbb R^d$ 表示偏置向量,$\phi(\cdot)$ 表示逐元素非线性激活函数。

这个递推式的含义是:当前隐状态 $h_t$ 由两部分共同决定,一部分来自上一时刻的历史摘要 $h_{t-1}$,另一部分来自当前输入 $x_t$。也就是说,RNN 把“历史如何保留”与“新信息如何写入”统一到同一递推结构中。

2.2 循环结构如何对应条件序列建模

若我们希望在每个时刻输出某个预测,例如预测下一个词、当前标签或某个时间点的目标值,则通常再引入输出变量

$$ y_t, $$

并写成

$$ o_t=W_o h_t+c, $$

以及

$$ \hat y_t=g(o_t), $$

其中 $W_o$ 表示从隐状态到输出的权重矩阵,$c$ 表示输出偏置,$o_t$ 表示输出层线性输入,$g(\cdot)$ 表示输出变换函数,例如 softmax 或恒等映射。这样一来,RNN 在每个时刻都把历史压缩成隐状态 $h_t$,再由该隐状态产生当前预测。

若任务是语言建模,则更常见的写法是

$$ P(x_{t+1}\mid x_1,\dots,x_t)\approx P(x_{t+1}\mid h_t). $$

这个近似式的意义是:完整历史不再直接进入条件概率,而是先被递推压缩为隐状态 $h_t$,然后再由该隐状态参数化当前条件分布。与 n-gram 模型相比,这里最大的变化是,历史压缩方式本身不再由固定窗口写死,而是由参数 $W_h,W_x,b$ 在训练中学习出来。

因此,RNN 可以被理解为一种“可学习的历史压缩器”。它保留了第15章条件概率链的基本思想,但把其中最关键的历史表示部分,从固定统计结构变成了连续可学习表示。

2.3 参数共享为何是序列长度可扩展的关键

若对每个时间点都使用一套完全不同的参数,那么模型既无法处理变长序列,也难以泛化到未见长度。RNN 的另一个核心设计,是在所有时间步共享同一组参数 $W_h,W_x,W_o,b,c$。也就是说,对于任意时刻 $t$,状态更新规则和输出规则都是同一套。

这个性质意义重大。第一,它使模型能够作用于不同长度的序列,而不必为每个长度重新定义参数。第二,它体现了一种时间平移上的结构假设:同类局部动态规律应当在不同时间位置上以相同方式起作用。第三,它使训练样本中不同时间位置的信息,都能够共同用于更新同一组参数,从而提高统计效率。

因此,参数共享在序列模型中的地位,和第13章中卷积网络的参数共享有某种对应关系。卷积是在空间位置上共享检测器,RNN 则是在时间位置上共享状态更新机制。二者都说明:一旦数据具有某种重复结构,合适的共享方式就能大幅提高建模效率。

2.4 时间展开与时间反向传播

虽然 RNN 在形式上是递推定义的,但训练时通常把它在时间上展开。设序列长度为 $T$,则整条计算图可以理解为一个深度为 $T$ 的共享参数网络:

$$ h_1\to h_2\to \cdots \to h_T. $$

若总损失定义为

$$ \mathcal L=\sum_{t=1}^T L_t, $$

其中 $L_t$ 表示第 $t$ 个时刻的单步损失,那么对参数求梯度时,就必须把来自后续时刻的影响逐步沿时间链条传回去。这就是时间反向传播,通常称为 BPTT(backpropagation through time)。

以某个较早时刻的隐状态 $h_t$ 为例,总损失对它的梯度不仅来自当前时刻损失 $L_t$,还来自所有未来时刻 $L_{t+1},\dots,L_T$ 的间接影响。因此可以写成一种递推结构:

$$ \frac{\partial \mathcal L}{\partial h_t}=\frac{\partial L_t}{\partial h_t}+\frac{\partial \mathcal L}{\partial h_{t+1}}\frac{\partial h_{t+1}}{\partial h_t}. $$

这个公式说明:当前隐状态的梯度由两部分组成,一部分是它对当前任务的直接贡献,另一部分是它通过影响后续隐状态而对未来任务产生的间接贡献。与第11章的层间反向传播相比,这里只是把“层”替换成了“时间步”,本质上仍然是链式法则。

因此,RNN 的训练关键不在于它引入了某种全新微积分,而在于它把反向传播从空间层级结构扩展到了时间递推结构。

2.5 梯度消失与梯度爆炸为何在 RNN 中更严重

RNN 的一个著名困难,是梯度消失与梯度爆炸。要理解这一点,可以看损失对较早隐状态的影响是如何沿时间链条累积的。若只看递推的一部分,梯度传播中会 repeatedly 出现如下局部 Jacobian:

$$ \frac{\partial h_t}{\partial h_{t-1}}. $$

当损失从时刻 $T$ 回传到时刻 $t$ 时,往往要连乘一串这样的项:

$$ \frac{\partial h_T}{\partial h_t}=\prod_{k=t+1}^T \frac{\partial h_k}{\partial h_{k-1}}. $$

这个连乘结构与第11章多层网络中的梯度传播高度相似,只不过现在连乘长度对应序列时间长度。若这些 Jacobian 的谱范数普遍小于 1,连乘结果就会迅速衰减,从而导致较早时间点几乎收不到梯度信号;若谱范数普遍大于 1,连乘又可能迅速放大,导致梯度爆炸。

这说明,RNN 虽然在理论上能把历史压缩进隐状态,但在实践上未必能把很早之前的信息稳定传到当前。模型形式上允许长程依赖,不代表训练过程就真的能学会长程依赖。也正是在这里,循环神经网络第一次清楚暴露出“表示存在”与“表示可被稳定学习”之间的差距。

2.6 简单 RNN 为什么难以保留长程信息

从状态更新公式

$$ h_t=\phi(W_h h_{t-1}+W_x x_t+b) $$

可以看出,简单 RNN 在每一步都会对上一时刻状态做线性变换,再经过非线性压缩。这意味着历史信息在每个时间步都会被重新混合和重新压缩。若某条早期信息需要在很长时间后仍然保持可辨识,那么模型就必须在许多轮变换后依然把这条信息保留下来。

问题在于,普通非线性递推没有显式机制区分“哪些信息应长期保留,哪些信息应立刻遗忘”。所有内容都被混合进同一个隐状态向量,再统一经过同一组更新规则。这样做虽然简单,却使长期记忆和短期响应难以被精细分离。

因此,简单 RNN 的瓶颈并不只是梯度数值问题,也是一种表示机制问题:它缺乏专门控制信息流入、保留和输出的结构装置。LSTM 和 GRU 的门控思想,正是针对这一点提出的。

2.7 LSTM 如何通过门控控制信息流

长短期记忆网络(LSTM)的核心思想,是把“隐状态”进一步拆成更细的内部记忆结构,并用门控机制显式控制信息如何写入、遗忘和输出。设其细胞状态记为

$$ c_t, $$

隐状态记为

$$ h_t. $$

LSTM 典型地引入三个门:输入门、遗忘门和输出门。它们可写为

$$ i_t=\sigma(W_i x_t+U_i h_{t-1}+b_i), $$
$$ f_t=\sigma(W_f x_t+U_f h_{t-1}+b_f), $$
$$ o_t=\sigma(W_o x_t+U_o h_{t-1}+b_o), $$

其中 $i_t,f_t,o_t$ 分别表示输入门、遗忘门和输出门,$\sigma(\cdot)$ 表示 sigmoid 函数,$W_\cdot,U_\cdot,b_\cdot$ 都是待学习参数。除此之外,还会构造候选记忆内容

$$ \tilde c_t=\tanh(W_c x_t+U_c h_{t-1}+b_c). $$

接着,细胞状态更新为

$$ c_t=f_t\odot c_{t-1}+i_t\odot \tilde c_t, $$

最终隐状态输出为

$$ h_t=o_t\odot \tanh(c_t). $$

这些公式第一次把“记忆该保留什么、遗忘什么、暴露什么”显式写进了模型。遗忘门 $f_t$ 控制旧记忆保留多少,输入门 $i_t$ 控制新信息写入多少,输出门 $o_t$ 控制当前内部记忆有多少被暴露为外部隐状态。相比简单 RNN 把所有信息都混在同一递推式中,LSTM 通过门控实现了更细致的信息流控制。

2.8 LSTM 为什么能缓解长程依赖问题

LSTM 被认为能够更好处理长程依赖,一个核心原因在于其细胞状态更新

$$ c_t=f_t\odot c_{t-1}+i_t\odot \tilde c_t $$

包含一条更接近加法的记忆通路。若在某段时间内遗忘门 $f_t$ 接近 1,输入门 $i_t$ 接近 0,那么旧记忆 $c_{t-1}$ 就可以较少失真地传递到后续时刻。这与简单 RNN 每一步都必须经过同一种非线性混合不同。

从梯度角度看,细胞状态上的这种近似线性通路,也更有利于误差信号沿时间传播。虽然它并不能彻底消除所有训练困难,但至少为模型提供了一种显式机制,使某些信息可以跨越较长时间而不被迅速淹没。

因此,LSTM 的重要性不只在于“参数更多”,而在于它第一次把“记忆控制”本身设计成可学习结构。序列建模也由此从“递推状态存在”推进到“递推状态如何被管理”。

2.9 GRU 如何做更紧凑的门控近似

门控循环单元(GRU)可以看作对 LSTM 的一种更简洁改写。它没有显式分离细胞状态 $c_t$ 和隐状态 $h_t$,而是直接在一个状态变量上引入更新门与重置门。典型写法为

$$ z_t=\sigma(W_z x_t+U_z h_{t-1}+b_z), $$
$$ r_t=\sigma(W_r x_t+U_r h_{t-1}+b_r), $$

以及候选状态

$$ \tilde h_t=\tanh(W_h x_t+U_h(r_t\odot h_{t-1})+b_h). $$

最终更新写成

$$ h_t=(1-z_t)\odot h_{t-1}+z_t\odot \tilde h_t. $$

这里 $z_t$ 是更新门,控制保留旧状态还是采用新状态;$r_t$ 是重置门,控制在生成候选状态时,旧信息应被利用到什么程度。与 LSTM 相比,GRU 结构更紧凑、参数更少,但仍然保留了“信息流由门控调节”的核心思想。

这说明,LSTM 和 GRU 的共同本质,不在于具体公式细节,而在于它们都认识到:若要让神经网络真正学会时间上的长期依赖,状态递推本身必须带有可学习的信息选择机制。

3. 代表模型或算法

3.1 简单循环神经网络

简单 RNN 是最基础的神经序列模型。结构上,它通过共享参数的隐状态递推把历史压缩为连续向量;训练方式上,通常依赖时间展开后的反向传播和梯度下降;推理方式上,则按时间顺序逐步更新状态并输出预测。

它在本章中的典型性极强,因为它第一次把第三编中的神经表示学习思想直接带入序列世界。它告诉我们,历史不一定要写成固定窗口或离散状态,而可以由神经网络自己学习成连续记忆。

3.2 LSTM

LSTM 是循环神经网络最重要的改进之一。结构上,它通过输入门、遗忘门、输出门和细胞状态,把记忆管理显式写进模型;训练方式上,仍依赖 BPTT 和梯度优化;推理方式上,则在每个时间步同时更新细胞状态和隐状态。

它在本章中的典型性在于:它最有代表性地展示了“门控机制”如何缓解长程依赖问题,也最清楚地体现了序列表示学习从“有状态”走向“可控状态”的发展。

3.3 GRU

GRU 是另一种广泛使用的门控循环结构。它在保持门控思想的同时,使用更紧凑的状态更新方式。结构上,它比 LSTM 更简洁;训练和推理方式则与一般循环模型类似。

它在本章中的典型性,在于说明门控思想并不依赖某一种固定结构,而是一类更普遍的设计原则:用可学习门控来调节历史保留与新信息写入。

4. 典型应用

4.1 语言模型

语言模型的任务是根据前文预测下一个词或符号。第15章中的 n-gram 已经给出了这种任务的统计起点,但它只能依赖固定窗口上下文。RNN 则把历史压缩为连续隐状态 $h_t$,从而可以把条件建模写成

$$ P(x_{t+1}\mid x_1,\dots,x_t)\approx P(x_{t+1}\mid h_t). $$

在这个应用中,本章数学内容的对应关系非常清楚:输入词向量或符号表示对应 $x_t$,历史摘要对应 $h_t$,输出 softmax 对应条件概率分布,BPTT 则负责把预测误差沿时间反向传回去。因此,RNN 语言模型的关键突破不在于它换了一个损失函数,而在于它第一次用可学习连续状态替代了固定长度上下文。

4.2 机器翻译

在早期神经机器翻译中,常见做法是用一个循环网络读入源语言序列,把历史压缩到最后状态,再由另一个循环网络生成目标语言序列。这个过程说明,RNN 不只是做局部预测器,还可以作为序列到序列映射的编码器和解码器。

其数学本质仍然对应本章的隐状态递推。源序列逐步写入编码状态,目标序列逐步由解码状态生成。也正是在这里,RNN 的一个重要局限开始显现:若整个源序列都必须被压缩进一个固定长度向量,长句翻译就会非常困难。这一瓶颈后来将直接推动注意力机制的提出。

4.3 语音识别

与第15章的 HMM 相比,RNN 在语音识别中的优势在于,它不必把历史写成少量离散状态,而可以用连续隐状态去表达更细致的声学上下文。输入的声学特征帧序列作为 $x_t$,隐状态 $h_t$ 则逐步整合过去帧信息,从而在当前时刻形成更有判别力的表示。

在这个应用中,LSTM 尤其重要,因为语音中许多有意义的依赖跨度超过简单局部窗口,而门控机制恰好提供了一种更稳健的长期信息保留方式。因此,语音识别很好地说明了本章的数学主线如何落到现实任务中:序列不是只靠局部马尔可夫假设来处理,而是靠连续可学习状态来表示历史。

4.4 序列标注

在序列标注任务中,例如词性标注、命名实体识别或生物序列标注,模型需要对每个位置输出一个标签,但每个位置的判断又依赖周围上下文。RNN 的递推隐状态天然适合这种设定,因为它能在每个时间点形成一个包含历史信息的表示。

这里本章数学结构的对应关系同样直接:输入序列位置上的特征对应 $x_t$,任务相关上下文表示对应 $h_t$,每步输出层对应当前位置标签分布。也就是说,序列标注之所以适合 RNN,不是因为它只是“对很多点做分类”,而是因为每个点的分类都必须嵌入时间上下文中完成。

5. 局限性与历史转折

循环神经网络把神经表示学习正式带入序列建模,这是一次极其重要的推进。但它的局限也同样清楚。首先,RNN 的状态更新本质上是串行的:第 $t$ 个时刻的计算依赖第 $t-1$ 个时刻状态,因此序列各位置很难像卷积或后来的注意力模型那样高度并行。这在长序列和大规模训练中会带来明显效率瓶颈。

其次,即使有 LSTM 和 GRU,长程依赖问题也并没有被彻底解决。门控机制确实缓解了信息保留困难,但当序列极长、依赖跨越极远距离时,单一路径递推状态仍然容易成为信息瓶颈。模型必须把大量历史压缩进少数向量状态,这种“编码压缩瓶颈”在机器翻译等序列到序列任务中尤为明显。

再次,RNN 虽然能学连续状态,却仍然主要依赖“按顺序逐步推进”的表示方式。只要任务需要在远距离位置之间快速建立直接联系,单一递推链条就会显得过于间接。研究者因此开始追问:是否可以让模型在处理某个位置时,不必只依赖上一状态,而能更直接地访问整段历史中的相关部分?

这就自然引出了下一阶段的发展。第16章回答了“神经网络如何学习时间状态表示”,但也明确暴露出其串行递推和压缩瓶颈。后面注意力机制的出现,正是为了突破这一限制。也就是说,RNN 并不是序列建模的终点,而是从早期统计序列模型走向更强大序列表示架构的关键过渡。

6. 本章小结

本章讨论了循环神经网络如何把神经表示学习思想带入序列建模。核心结论是:RNN 通过共享参数的隐状态递推,把历史压缩为连续可学习表示;时间反向传播使这种时间展开结构能够被训练;而梯度消失、梯度爆炸和长期记忆困难,又推动了 LSTM 与 GRU 等门控结构出现。

它在 AI 发展史上的意义,在于让神经网络第一次真正进入语言、语音与一般序列问题的核心地带。但本章也明确表明,递推状态并不能彻底解决长程依赖与并行效率问题。这正是后续注意力机制和 Transformer 继续出现的直接动力。

关键公式

$$ h_t=\phi(W_h h_{t-1}+W_x x_t+b) $$
$$ \hat y_t=g(W_o h_t+c) $$
$$ \mathcal L=\sum_{t=1}^T L_t $$
$$ \frac{\partial h_T}{\partial h_t}=\prod_{k=t+1}^T \frac{\partial h_k}{\partial h_{k-1}} $$
$$ c_t=f_t\odot c_{t-1}+i_t\odot \tilde c_t $$
$$ h_t=(1-z_t)\odot h_{t-1}+z_t\odot \tilde h_t $$

关键概念

  • 循环神经网络
  • 隐状态
  • 时间反向传播
  • 梯度消失
  • 梯度爆炸
  • LSTM
  • GRU
  • 门控机制