Files
Notes/机器学习/深度学习模型/2-序列模型/1-RNN-循环神经网络.md
2026-05-16 17:16:51 +08:00

149 lines
6.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: 1-RNN-循环神经网络
draft: false
tags:
- RNN
- 循环神经网络
- 序列模型
- 深度学习
---
## 循环神经网络 (Recurrent Neural Networks, RNN) 深度解析笔记
循环神经网络RNN是深度学习中处理**序列数据**如文本、音频、时间序列的核心架构。与传统的前馈神经网络MLP不同RNN 引入了“隐状态”的概念,使其能够捕获数据在时间维度上的演变规律。
---
### 1. 核心动机:为什么要“循环”?
传统神经网络假设输入与输出之间是独立的。然而,在许多场景中,这种假设并不成立:
- **语言建模**:预测下一个词取决于之前的语境。
- **视频处理**:每一帧的含义往往依赖于前一帧。
RNN 通过将神经元的输出重新连接到输入,形成了一个带有“记忆”的反馈环路。
---
### 2. 数学模型与结构推导
我们可以将 RNN 看作是一个在时间步 $t$ 上不断重复的单元。
#### 2.1 符号定义
- $x_t \in \mathbb{R}^d$: $t$ 时刻的输入向量。
- $h_t \in \mathbb{R}^h$: $t$ 时刻的隐状态Hidden State代表了模型对过去信息的记忆。
- $y_t \in \mathbb{R}^q$: $t$ 时刻的输出向量。
- $W_{xh}, W_{hh}, W_{hy}$: 权重矩阵(注意:**这些权重在所有时间步之间是共享的**)。
- $b_h, b_y$: 偏置项。
#### 2.2 前向传播方程
在每一个时刻 $t$RNN 执行以下两个计算步骤:
1. **更新隐状态**
$$h_t = \sigma(W_{xh} x_t + W_{hh} h_{t-1} + b_h)$$
其中 $\sigma$ 通常是 $tanh$ 或 $ReLU$ 激活函数。
2. **计算当前输出**
$$y_t = \phi(W_{hy} h_t + b_y)$$
对于分类任务,$\phi$ 通常是 $Softmax$。
> **关键点**$h_t$ 是关于 $x_t$ 和 $h_{t-1}$ 的函数,而 $h_{t-1}$ 又是关于 $x_{t-1}$ 和 $h_{t-2}$ 的函数。通过递归,我们可以推导出 $h_t = f(x_t, x_{t-1}, x_{t-2}, \dots, x_1)$。
---
### 3. 训练算法:随时间反向传播 (BPTT)
RNN 的训练使用的是 **Backpropagation Through Time (BPTT)**。其实质仍然是链式法则,但由于权值共享,梯度的累加过程变得更加复杂。
#### 3.1 损失函数
设总损失 $\mathcal{L}$ 为所有时间步损失的和:
$$\mathcal{L} = \sum_{t=1}^T \mathcal{L}_t$$
#### 3.2 梯度推导
以权重矩阵 $W_{hh}$ 为例,我们要计算 $\frac{\partial \mathcal{L}}{\partial W_{hh}}$。根据链式法则:
$$\frac{\partial \mathcal{L}}{\partial W_{hh}} = \sum_{t=1}^T \frac{\partial \mathcal{L}_t}{\partial W_{hh}}$$
对于时刻 $t$ 的梯度 $\frac{\partial \mathcal{L}_t}{\partial W_{hh}}$,由于 $h_t$ 依赖于 $h_{t-1}$,而 $h_{t-1}$ 又包含 $W_{hh}$,所以需要对整个历史轨迹求导。展开链式法则:
$$\frac{\partial \mathcal{L}_t}{\partial W_{hh}} = \frac{\partial \mathcal{L}_t}{\partial h_t} \cdot \frac{\partial h_t}{\partial W_{hh}}$$
但 $\frac{\partial h_t}{\partial W_{hh}}$ 本身又是一个链式过程,因为 $h_t$ 依赖于 $h_{t-1}$,继续展开:
$$= \frac{\partial \mathcal{L}_t}{\partial h_t} \cdot \left( \frac{\partial h_t}{\partial h_{t-1}} \cdot \frac{\partial h_{t-1}}{\partial W_{hh}} + \frac{\partial h_t}{\partial W_{hh}} \bigg|_{h_{t-1}} \right)$$
这里 $\frac{\partial h_t}{\partial W_{hh}} \big|_{h_{t-1}}$ 表示将 $h_{t-1}$ 视为常数时 $h_t$ 对 $W_{hh}$ 的直接偏导。继续递归展开 $h_{t-1}$ 对 $W_{hh}$ 的依赖,最终得到:
$$\frac{\partial \mathcal{L}_t}{\partial W_{hh}} = \sum_{k=1}^t \frac{\partial \mathcal{L}_t}{\partial y_t} \cdot \frac{\partial y_t}{\partial h_t} \cdot \left( \prod_{j=k+1}^t \frac{\partial h_j}{\partial h_{j-1}} \right) \cdot \frac{\partial h_k}{\partial W_{hh}}$$
**逐步解释:**
- $\frac{\partial \mathcal{L}_t}{\partial y_t} \cdot \frac{\partial y_t}{\partial h_t}$:从输出层到当前隐状态的梯度
- $\prod_{j=k+1}^t \frac{\partial h_j}{\partial h_{j-1}}$**关键乘积项**,表示误差从时刻 $t$ 传播回时刻 $k$ 时,中间经过的雅可比矩阵连乘
- $\frac{\partial h_k}{\partial W_{hh}}$:时刻 $k$ 的隐状态对 $W_{hh}$ 的直接偏导
**物理直观理解:** 可以将 BPTT 理解为一条反向流淌的"误差河流"。在每个时间步,输出产生的误差会向过去的时间步逆流而上。每经过一个时间步的反向传播,梯度就需要乘以一个雅可比矩阵 $\frac{\partial h_j}{\partial h_{j-1}}$。这就好比一块石头从河流终点扔进去,激起的涟漪会向源头传播。但每经过一个水坝(时间步),涟漪的幅度就会被"打折"。折扣多少取决于水坝的透水性(雅可比矩阵的特征值)。
---
### 4. RNN 的致命伤:梯度消失与梯度爆炸
在处理长序列时BPTT 面临严重的数值稳定性问题。
#### 4.1 数学直观分析
观察上述乘积项 $\frac{\partial h_j}{\partial h_{j-1}}$。根据状态方程:
$$\frac{\partial h_j}{\partial h_{j-1}} = diag(\sigma'(W_{xh} x_j + W_{hh} h_{j-1} + b_h)) \cdot W_{hh}$$
如果序列很长(例如 $t$ 很大),这个雅可比矩阵的连乘会导致:
- **梯度消失 (Vanishing Gradient)**:如果 $W_{hh}$ 的特征值小于 1 且激活函数的导数较小(如 $tanh$ 的导数 $\leq 1$),梯度会呈指数级减小。模型将“忘记”遥远的过去。
- **梯度爆炸 (Exploding Gradient)**:如果 $W_{hh}$ 的特征值过大,梯度会迅速膨胀,导致参数更新步长过大,训练崩溃。
#### 4.2 局限性总结
1. **长期依赖缺失**:标准 RNN 很难学习到相距超过 10-20 个时间步以上的依赖关系。
2. **并行计算受限**:由于 $h_t$ 必须等待 $h_{t-1}$ 计算完成RNN 无法像 CNN 那样在时间维度上高度并行化。
---
### 5. 改进方向与演进
为了解决梯度消失问题研究者们提出了一种“门控机制”Gating Mechanism
其基本思想是:既然直接连乘会导致梯度消失,那么我们能不能在网络中增加一些“高速公路”,让关键信息能够无损地流向未来?
这便引出了后来统治序列建模领域的 **长短期记忆网络 (Long Short-Term Memory, LSTM)**。LSTM 通过引入“遗忘门”、“输入门”和“输出门”,精细化地控制信息的保留与丢弃,从而极大地缓解了长程依赖问题。
---
### 总结表RNN 关键特性
|**特性**|**描述**|
|---|---|
|**输入**|变长的序列数据|
|**参数**|$W_{xh}, W_{hh}, W_{hy}$ 在所有时间步共享|
|**记忆**|通过隐状态 $h_t$ 维持|
|**弱点**|梯度消失/爆炸,难以处理超长序列|
|**后继者**|LSTM, GRU, 以及后来的 Transformer|