循环神经网络 (Recurrent Neural Networks, RNN) 深度解析笔记
循环神经网络(RNN)是深度学习中处理序列数据(如文本、音频、时间序列)的核心架构。与传统的前馈神经网络(MLP)不同,RNN 引入了“隐状态”的概念,使其能够捕获数据在时间维度上的演变规律。
1. 核心动机:为什么要“循环”?
传统神经网络假设输入与输出之间是独立的。然而,在许多场景中,这种假设并不成立:
-
语言建模:预测下一个词取决于之前的语境。
-
视频处理:每一帧的含义往往依赖于前一帧。
RNN 通过将神经元的输出重新连接到输入,形成了一个带有“记忆”的反馈环路。
2. 数学模型与结构推导
我们可以将 RNN 看作是一个在时间步
2.1 符号定义
-
: 时刻的输入向量。 -
: 时刻的隐状态(Hidden State),代表了模型对过去信息的记忆。 -
: 时刻的输出向量。 -
: 权重矩阵(注意:这些权重在所有时间步之间是共享的)。 -
: 偏置项。
2.2 前向传播方程
在每一个时刻
-
更新隐状态:
其中
通常是 或 激活函数。 -
计算当前输出:
对于分类任务,
通常是 。
关键点:
是关于 和 的函数,而 又是关于 和 的函数。通过递归,我们可以推导出 。
3. 训练算法:随时间反向传播 (BPTT)
RNN 的训练使用的是 Backpropagation Through Time (BPTT)。其实质仍然是链式法则,但由于权值共享,梯度的累加过程变得更加复杂。
3.1 损失函数
设总损失
3.2 梯度推导
以权重矩阵
对于时刻
但
这里
逐步解释:
:从输出层到当前隐状态的梯度 :关键乘积项,表示误差从时刻 传播回时刻 时,中间经过的雅可比矩阵连乘 :时刻 的隐状态对 的直接偏导
物理直观理解: 可以将 BPTT 理解为一条反向流淌的”误差河流”。在每个时间步,输出产生的误差会向过去的时间步逆流而上。每经过一个时间步的反向传播,梯度就需要乘以一个雅可比矩阵
4. RNN 的致命伤:梯度消失与梯度爆炸
在处理长序列时,BPTT 面临严重的数值稳定性问题。
4.1 数学直观分析
观察上述乘积项
如果序列很长(例如
-
梯度消失 (Vanishing Gradient):如果
的特征值小于 1 且激活函数的导数较小(如 的导数 ),梯度会呈指数级减小。模型将“忘记”遥远的过去。 -
梯度爆炸 (Exploding Gradient):如果
的特征值过大,梯度会迅速膨胀,导致参数更新步长过大,训练崩溃。
4.2 局限性总结
-
长期依赖缺失:标准 RNN 很难学习到相距超过 10-20 个时间步以上的依赖关系。
-
并行计算受限:由于
必须等待 计算完成,RNN 无法像 CNN 那样在时间维度上高度并行化。
5. 改进方向与演进
为了解决梯度消失问题,研究者们提出了一种“门控机制”(Gating Mechanism)。
其基本思想是:既然直接连乘会导致梯度消失,那么我们能不能在网络中增加一些“高速公路”,让关键信息能够无损地流向未来?
这便引出了后来统治序列建模领域的 长短期记忆网络 (Long Short-Term Memory, LSTM)。LSTM 通过引入“遗忘门”、“输入门”和“输出门”,精细化地控制信息的保留与丢弃,从而极大地缓解了长程依赖问题。
总结表:RNN 关键特性
| 特性 | 描述 |
|---|---|
| 输入 | 变长的序列数据 |
| 参数 | |
| 记忆 | 通过隐状态 |
| 弱点 | 梯度消失/爆炸,难以处理超长序列 |
| 后继者 | LSTM, GRU, 以及后来的 Transformer |