149 lines
6.6 KiB
Markdown
149 lines
6.6 KiB
Markdown
---
|
||
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|
|