这是本文档旧的修订版!
第七章 循环神经网络
1. 概念定义与原理讲解
1.1 序列数据与循环神经网络
序列数据的特性:
序列数据是指数据点之间存在时间或顺序依赖关系的数据,与自然语言、时间序列、音频、视频等密切相关。序列数据的核心特点是:
1. 变长性:序列长度不固定
2. 顺序性:数据点的顺序包含重要信息
3. 依赖性:当前状态依赖于历史状态
传统神经网络的局限:
前馈神经网络(FNN)和卷积神经网络(CNN)处理固定尺寸输入,难以直接建模序列依赖关系。传统方法如N-gram模型、隐马尔可夫模型(HMM)存在维度灾难或表达能力有限的问题。
循环神经网络的诞生:
循环神经网络(Recurrent Neural Network,RNN)是一类专门设计用于处理序列数据的神经网络。其核心思想是引入“循环”连接,使网络具有记忆能力,能够捕捉序列中的时序依赖关系。
1.2 RNN的基本结构
1.2.1 网络结构
RNN的核心是一个循环单元,其隐藏状态$h_t$由当前输入$x_t$和上一时刻的隐藏状态$h_{t-1}$共同决定:
$$h_t = f(W_{hh} h_{t-1} + W_{xh} x_t + b_h)$$
$$y_t = g(W_{hy} h_t + b_y)$$
其中:
- $x_t$:时刻$t$的输入
- $h_t$:时刻$t$的隐藏状态
- $y_t$:时刻$t$的输出
- $W_{hh}, W_{xh}, W_{hy}$:权重矩阵
- $b_h, b_y$:偏置向量
- $f, g$:激活函数(通常$f$为tanh或ReLU,$g$依任务而定)
1.2.2 展开表示
RNN可以按时间步展开为前馈网络的共享参数形式:
x_1 → [RNN Cell] → h_1 → [RNN Cell] → h_2 → ... → h_T
↑ ↑
h_0 h_1
这种展开方式使得可以使用反向传播算法进行训练,称为时间反向传播(Backpropagation Through Time,BPTT)。
1.2.3 参数共享
RNN在不同时间步共享相同的参数($W_{hh}, W_{xh}, W_{hy}$),这使得模型能够:
- 处理任意长度的序列
- 减少参数量
- 学习时序不变的特征
1.3 RNN的变体与应用模式
1.3.1 应用模式
根据输入输出结构,RNN有多种应用模式:
| 模式 | 输入 | 输出 | 应用示例 |
| 一对多 | 固定向量 | 序列 | 图像描述生成 |
| 多对一 | 序列 | 固定向量 | 情感分析、文本分类 |
| 多对多(同步) | 序列 | 序列(同长) | 命名实体识别、语音识别 |
| 多对多(异步) | 序列 | 序列(不同长) | 机器翻译、Seq2Seq |
1.3.2 双向RNN(Bidirectional RNN)
标准RNN只利用过去的信息,双向RNN同时利用过去和未来的信息:
$$\overrightarrow{h}_t = f(W_{xh}^f x_t + W_{hh}^f \overrightarrow{h}_{t-1} + b_h^f)$$
$$\overleftarrow{h}_t = f(W_{xh}^b x_t + W_{hh}^b \overleftarrow{h}_{t+1} + b_h^b)$$
$$h_t = [\overrightarrow{h}_t; \overleftarrow{h}_t]$$
双向RNN通过正向和反向两个RNN分别捕获前向和后向上下文,适用于需要全局上下文的任务。
1.3.3 深度RNN
通过堆叠多个RNN层来增加模型深度:
$$h_t^{(l)} = f(W_{hh}^{(l)} h_{t-1}^{(l)} + W_{xh}^{(l)} h_t^{(l-1)} + b_h^{(l)})$$
深度RNN能够学习更复杂的层次化时序特征,但训练难度也相应增加。
1.4 RNN的训练挑战
1.4.1 梯度消失与梯度爆炸
BPTT中的梯度传播:
$$\frac{\partial L}{\partial W} = \sum_{t=1}^T \frac{\partial L_t}{\partial W}$$
其中涉及连乘项:
$$\frac{\partial h_T}{\partial h_1} = \prod_{t=2}^T \frac{\partial h_t}{\partial h_{t-1}} = \prod_{t=2}^T W_{hh}^T \cdot \text{diag}(f'(h_{t-1}))$$
梯度消失问题:
- 当特征值小于1时,连乘导致梯度指数级减小
- 长期依赖关系难以学习
- tanh和sigmoid的导数最大值为1,更容易出现此问题
梯度爆炸问题:
- 当特征值大于1时,连乘导致梯度指数级增长
- 参数更新不稳定,可能溢出
1.4.2 解决方案
梯度裁剪(Gradient Clipping):
解决梯度爆炸的简单有效方法:
$$\text{if } ||g|| > \text{threshold}: g = \frac{\text{threshold}}{||g||} \cdot g$$
截断BPTT(Truncated BPTT):
限制反向传播的时间步数,降低计算开销和梯度消失影响。
更好的激活函数:
使用ReLU或 leaky ReLU 替代tanh/sigmoid。
1.5 长短期记忆网络(LSTM)
1.5.1 LSTM的动机
LSTM(Long Short-Term Memory)由Hochreiter和Schmidhuber于1997年提出,专门设计用于解决RNN的长期依赖问题。
核心思想:引入门控机制,显式控制信息的流动和记忆。
1.5.2 LSTM的结构
LSTM通过三个门和一个记忆单元实现精细的信息控制:
遗忘门(Forget Gate): $$f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f)$$
决定从细胞状态中丢弃什么信息。
输入门(Input Gate): $$i_t = \sigma(W_i \cdot [h_{t-1}, x_t] + b_i)$$ $$\tilde{C}_t = \tanh(W_C \cdot [h_{t-1}, x_t] + b_C)$$
决定哪些新信息存入细胞状态。
细胞状态更新(Cell State): $$C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t$$
细胞状态是LSTM的核心,类似传送带,信息可以相对 unchanged 地流动。
输出门(Output Gate): $$o_t = \sigma(W_o \cdot [h_{t-1}, x_t] + b_o)$$ $$h_t = o_t \odot \tanh(C_t)$$
决定输出什么信息。
1.5.3 LSTM的变体
Peephole连接: 让门控信号能够“窥视”细胞状态: $$f_t = \sigma(W_f \cdot [C_{t-1}, h_{t-1}, x_t] + b_f)$$
耦合遗忘门和输入门: $$f_t = 1 - i_t$$
GRU(Gated Recurrent Unit):
Cho等人于2014年提出,简化LSTM结构:
重置门: $$r_t = \sigma(W_r \cdot [h_{t-1}, x_t])$$
更新门: $$z_t = \sigma(W_z \cdot [h_{t-1}, x_t])$$
候选状态: $$\tilde{h}_t = \tanh(W \cdot [r_t \odot h_{t-1}, x_t])$$
状态更新: $$h_t = (1 - z_t) \odot h_{t-1} + z_t \odot \tilde{h}_t$$
GRU将遗忘门和输入门合并为更新门,将细胞状态和隐藏状态合并,参数量更少,计算更快。
1.6 序列到序列模型(Seq2Seq)
1.6.1 编码器-解码器架构
Seq2Seq模型由编码器和解码器两部分组成:
编码器(Encoder): 将输入序列$(x_1, x_2, ..., x_T)$编码为固定长度的上下文向量$c$: $$h_t = f(x_t, h_{t-1})$$ $$c = q(\{h_1, h_2, ..., h_T\})$$
通常$q$取最后时刻的隐藏状态:$c = h_T$。
解码器(Decoder): 根据上下文向量$c$生成输出序列: $$s_t = f(y_{t-1}, s_{t-1}, c)$$ $$y_t = g(s_t, c)$$
1.6.2 注意力机制
传统Seq2Seq的瓶颈在于固定长度的上下文向量。注意力机制允许解码器动态关注输入序列的不同部分:
注意力权重: $$e_{tj} = a(s_{t-1}, h_j)$$ $$\alpha_{tj} = \frac{\exp(e_{tj})}{\sum_{k=1}^T \exp(e_{tk})}$$
上下文向量: $$c_t = \sum_{j=1}^T \alpha_{tj} h_j$$
注意力机制解决了长序列的信息瓶颈问题,是Transformer架构的前身。
1.7 RNN的应用
1.7.1 自然语言处理
- 语言建模:预测下一个词的概率$P(w_t|w_1, ..., w_{t-1})$
- 机器翻译:Seq2Seq + Attention
- 文本摘要:抽取式或生成式摘要
- 情感分析:多对一分类
- 命名实体识别:序列标注
1.7.2 语音识别
- 声学模型:将音频特征映射到音素
- CTC(Connectionist Temporal Classification):处理输入输出对齐
1.7.3 时间序列预测
- 股票价格预测
- 天气预测
- 设备故障预测
1.7.4 其他应用
- 视频分析
- 音乐生成
- 手写识别
1.8 RNN的局限与替代方案
1.8.1 RNN的局限
1. 顺序计算限制:难以并行化 2. 长距离依赖:即使LSTM也难以捕捉非常长的依赖 3. 计算效率:逐时间步计算,速度慢 4. 梯度问题:深层堆叠时仍面临梯度问题
1.8.2 Transformer的崛起
Transformer完全基于注意力机制,摒弃了循环结构: - 完全并行计算 - 捕捉任意距离的依赖关系 - 在大规模数据上表现优异
1.8.3 现代发展趋势
1. RNN与Transformer混合:Reformer、Transformer-XL 2. 结构化稀疏注意力:降低Transformer复杂度 3. 状态空间模型(SSM):Mamba等,结合RNN和CNN优点
2. 例题分析
例题1:RNN前向传播计算
题目:考虑一个简单的RNN单元,输入维度为2,隐藏状态维度为3。给定: - $W_{xh} = \begin{bmatrix} 0.1 & 0.2 \\ 0.3 & 0.4 \\ 0.5 & 0.6 \end{bmatrix}$ - $W_{hh} = \begin{bmatrix} 0.1 & 0.2 & 0.3 \\ 0.4 & 0.5 & 0.6 \\ 0.7 & 0.8 & 0.9 \end{bmatrix}$ - $b_h = \begin{bmatrix} 0.1 \\ 0.2 \\ 0.3 \end{bmatrix}$ - 初始隐藏状态$h_0 = \begin{bmatrix} 0 \\ 0 \\ 0 \end{bmatrix}$ - 输入序列:$x_1 = \begin{bmatrix} 1 \\ 1 \end{bmatrix}$,$x_2 = \begin{bmatrix} 0.5 \\ 0.5 \end{bmatrix}$
使用tanh激活函数,计算$h_1$和$h_2$。
分析过程:
计算$h_1$:
首先计算线性组合: $$z_1 = W_{xh} x_1 + W_{hh} h_0 + b_h$$
$$W_{xh} x_1 = \begin{bmatrix} 0.1 & 0.2 \\ 0.3 & 0.4 \\ 0.5 & 0.6 \end{bmatrix} \begin{bmatrix} 1 \\ 1 \end{bmatrix} = \begin{bmatrix} 0.3 \\ 0.7 \\ 1.1 \end{bmatrix}$$
$$W_{hh} h_0 = \begin{bmatrix} 0 \\ 0 \\ 0 \end{bmatrix}$$
$$z_1 = \begin{bmatrix} 0.3 \\ 0.7 \\ 1.1 \end{bmatrix} + \begin{bmatrix} 0 \\ 0 \\ 0 \end{bmatrix} + \begin{bmatrix} 0.1 \\ 0.2 \\ 0.3 \end{bmatrix} = \begin{bmatrix} 0.4 \\ 0.9 \\ 1.4 \end{bmatrix}$$
应用tanh激活: $$h_1 = \tanh(z_1) = \begin{bmatrix} \tanh(0.4) \\ \tanh(0.9) \\ \tanh(1.4) \end{bmatrix} \approx \begin{bmatrix} 0.380 \\ 0.716 \\ 0.885 \end{bmatrix}$$
计算$h_2$:
$$W_{xh} x_2 = \begin{bmatrix} 0.1 & 0.2 \\ 0.3 & 0.4 \\ 0.5 & 0.6 \end{bmatrix} \begin{bmatrix} 0.5 \\ 0.5 \end{bmatrix} = \begin{bmatrix} 0.15 \\ 0.35 \\ 0.55 \end{bmatrix}$$
$$W_{hh} h_1 = \begin{bmatrix} 0.1 & 0.2 & 0.3 \\ 0.4 & 0.5 & 0.6 \\ 0.7 & 0.8 & 0.9 \end{bmatrix} \begin{bmatrix} 0.380 \\ 0.716 \\ 0.885 \end{bmatrix}$$
$$= \begin{bmatrix} 0.038 + 0.143 + 0.266 \\ 0.152 + 0.358 + 0.531 \\ 0.266 + 0.573 + 0.797 \end{bmatrix} = \begin{bmatrix} 0.447 \\ 1.041 \\ 1.636 \end{bmatrix}$$
$$z_2 = \begin{bmatrix} 0.15 \\ 0.35 \\ 0.55 \end{bmatrix} + \begin{bmatrix} 0.447 \\ 1.041 \\ 1.636 \end{bmatrix} + \begin{bmatrix} 0.1 \\ 0.2 \\ 0.3 \end{bmatrix} = \begin{bmatrix} 0.697 \\ 1.591 \\ 2.486 \end{bmatrix}$$
$$h_2 = \tanh(z_2) \approx \begin{bmatrix} 0.602 \\ 0.918 \\ 0.986 \end{bmatrix}$$
结论: - $h_1 \approx [0.380, 0.716, 0.885]^T$ - $h_2 \approx [0.602, 0.918, 0.986]^T$
例题2:LSTM门控机制分析
题目:分析LSTM的门控机制。假设在一个时间步: - 上一时刻细胞状态$C_{t-1} = 5$ - 遗忘门输出$f_t = 0.1$ - 输入门输出$i_t = 0.9$ - 候选状态$\tilde{C}_t = 0.5$
(1) 计算新的细胞状态$C_t$ (2) 分析遗忘门接近0和接近1时的不同行为 (3) 说明为什么LSTM能解决梯度消失问题
分析过程:
(1) 计算$C_t$
根据LSTM细胞状态更新公式: $$C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t$$
代入数值: $$C_t = 0.1 \times 5 + 0.9 \times 0.5$$ $$= 0.5 + 0.45$$ $$= 0.95$$
(2) 遗忘门的行为分析
情况A:$f_t \approx 0$ - 遗忘门关闭,丢弃大部分历史信息 - $C_t \approx i_t \odot \tilde{C}_t$ - 细胞状态主要由当前输入决定 - 用于“遗忘”不再相关的历史信息
情况B:$f_t \approx 1$ - 遗忘门打开,保留历史信息 - $C_t \approx C_{t-1} + i_t \odot \tilde{C}_t$ - 历史信息可以几乎无损耗地传递 - 用于长期记忆的保持
示例: - 在语言模型中,遇到句号时遗忘门应较低,重置上下文 - 在描述同一人/物时遗忘门应较高,保持信息连续性
(3) 解决梯度消失的原因
LSTM解决梯度消失的关键在于细胞状态的加法更新机制:
$$C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t$$
导数分析: $$\frac{\partial C_t}{\partial C_{t-1}} = f_t$$
当$f_t \approx 1$时,梯度可以在时间步之间几乎无损传播: $$\frac{\partial C_T}{\partial C_1} = \prod_{t=2}^T f_t \approx 1$$
相比之下,标准RNN使用乘法更新: $$h_t = \tanh(W_{hh} h_{t-1} + W_{xh} x_t)$$
梯度包含 Jacobian 矩阵的连乘,容易指数衰减或爆炸。
实际意义: LSTM可以学习在需要时保持细胞状态不变($f_t=1, i_t=0$),形成信息的高速公路,跨越数百个时间步传播梯度。
例题3:Seq2Seq注意力权重计算
题目:在Seq2Seq模型中,解码器当前状态$s_{t-1} = [1, 0]$,编码器隐藏状态为: - $h_1 = [1, 1]$,$h_2 = [2, 0]$,$h_3 = [0, 2]$
使用点积注意力(Dot-Product Attention),计算注意力权重。
分析过程:
步骤1:计算注意力分数(点积)
$$e_{tj} = s_{t-1} \cdot h_j$$
$$e_{t1} = [1, 0] \cdot [1, 1] = 1 \times 1 + 0 \times 1 = 1$$
$$e_{t2} = [1, 0] \cdot [2, 0] = 1 \times 2 + 0 \times 0 = 2$$
$$e_{t3} = [1, 0] \cdot [0, 2] = 1 \times 0 + 0 \times 2 = 0$$
步骤2:Softmax归一化
$$\alpha_{tj} = \frac{\exp(e_{tj})}{\sum_{k=1}^3 \exp(e_{tk})}$$
计算分母: $$\sum_{k=1}^3 \exp(e_{tk}) = \exp(1) + \exp(2) + \exp(0)$$ $$= 2.718 + 7.389 + 1$$ $$= 11.107$$
计算权重: $$\alpha_{t1} = \frac{2.718}{11.107} \approx 0.245$$
$$\alpha_{t2} = \frac{7.389}{11.107} \approx 0.665$$
$$\alpha_{t3} = \frac{1}{11.107} \approx 0.090$$
步骤3:计算上下文向量
$$c_t = \sum_{j=1}^3 \alpha_{tj} h_j$$ $$= 0.245 \times [1, 1] + 0.665 \times [2, 0] + 0.090 \times [0, 2]$$ $$= [0.245, 0.245] + [1.330, 0] + [0, 0.180]$$ $$= [1.575, 0.425]$$
分析: - 注意力权重:$[0.245, 0.665, 0.090]$ - 解码器关注程度:$h_2 > h_1 > h_3$ - 这是因为$s_{t-1} = [1, 0]$与$h_2 = [2, 0]$方向最相似(点积最大) - 上下文向量是编码器状态的加权平均,偏向与解码器状态相似的$h_2$
3. 训练题
一、选择题
1. RNN中“权值共享”指的是:
A. 不同层使用相同权重 B. 不同时间步使用相同权重 C. 输入和输出使用相同权重 D. 编码器和解码器使用相同权重
2. LSTM中控制“遗忘”历史信息的是:
A. 输入门 B. 遗忘门 C. 输出门 D. 更新门
3. GRU相比LSTM的主要优势是:
A. 更强的记忆能力 B. 更少的参数量 C. 更好的并行性 D. 更高的准确率
4. 在Seq2Seq模型中,注意力机制解决了什么问题?
A. 梯度消失 B. 信息瓶颈 C. 过拟合 D. 计算复杂度
5. 双向RNN的主要特点是:
A. 更深的网络结构 B. 同时利用过去和未来的信息 C. 更快的训练速度 D. 更少的参数量
二、填空题
6. RNN的三种经典门控机制是遗忘门、门和门。
7. 在LSTM中,细胞状态的更新方式是(加法/乘法),这是解决梯度消失的关键。
8. 时间反向传播的英文缩写是。
9. Seq2Seq模型由器和器两部分组成。
10. 梯度裁剪用于解决RNN训练中的问题。
三、计算题
11. 给定RNN:$h_t = \tanh(0.5 h_{t-1} + 0.3 x_t)$,$h_0 = 0$,输入序列$x = [1, 2, 1]$,计算$h_1, h_2, h_3$。
12. 在LSTM中,$C_{t-1} = 10$,$f_t = 0.2$,$i_t = 0.8$,$\tilde{C}_t = 2$,计算$C_t$。
13. 注意力计算:$s = [2, 1]$,$h_1 = [1, 0]$,$h_2 = [1, 1]$,$h_3 = [0, 1]$,使用点积注意力计算三个注意力权重。
4. 答案与解析
一、选择题答案:
1. 答案:B
解析:RNN在不同时间步使用相同的权重矩阵($W_{xh}, W_{hh}$),这是RNN能够处理变长序列的基础。
2. 答案:B
解析:遗忘门(Forget Gate)通过$f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f)$控制历史信息的保留程度。
3. 答案:B
解析:GRU将LSTM的遗忘门和输入门合并为更新门,细胞状态和隐藏状态合并,参数量约为LSTM的75%。
4. 答案:B
解析:注意力机制允许解码器动态关注输入序列的不同部分,解决了固定长度上下文向量的信息瓶颈问题。
5. 答案:B
解析:双向RNN包含前向和后向两个RNN,分别捕获过去和未来的上下文信息。
二、填空题答案:
6. 答案:输入;输出
解析:LSTM的三个门是遗忘门(Forget Gate)、输入门(Input Gate)和输出门(Output Gate)。
7. 答案:加法
解析:$C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t$,加法更新使梯度可以直接传播,缓解了梯度消失。
8. 答案:BPTT(或Backpropagation Through Time)
解析:BPTT将RNN按时间展开,使用反向传播算法计算梯度。
9. 答案:编码(Encoder);解码(Decoder)
解析:Seq2Seq(序列到序列)模型由编码器处理输入序列,解码器生成输出序列。
10. 答案:梯度爆炸
解析:当梯度过大时,梯度裁剪将其缩放到阈值以内,防止参数更新失控。
三、计算题答案:
11. 解答:
$h_1 = \tanh(0.5 \times 0 + 0.3 \times 1) = \tanh(0.3) \approx 0.291$ $h_2 = \tanh(0.5 \times 0.291 + 0.3 \times 2) = \tanh(0.146 + 0.6) = \tanh(0.746) \approx 0.633$ $h_3 = \tanh(0.5 \times 0.633 + 0.3 \times 1) = \tanh(0.317 + 0.3) = \tanh(0.617) \approx 0.549$ 因此:$h_1 \approx 0.291$,$h_2 \approx 0.633$,$h_3 \approx 0.549$
12. 解答:
$C_t = f_t \times C_{t-1} + i_t \times \tilde{C}_t$
$= 0.2 \times 10 + 0.8 \times 2$
$= 2 + 1.6$
$= 3.6$
13. 解答:
计算点积: - $e_1 = s \cdot h_1 = [2, 1] \cdot [1, 0] = 2 \times 1 + 1 \times 0 = 2$ - $e_2 = s \cdot h_2 = [2, 1] \cdot [1, 1] = 2 \times 1 + 1 \times 1 = 3$ - $e_3 = s \cdot h_3 = [2, 1] \cdot [0, 1] = 2 \times 0 + 1 \times 1 = 1$ Softmax: - $\sum \exp(e_i) = \exp(2) + \exp(3) + \exp(1) = 7.389 + 20.086 + 2.718 = 30.193$ - $\alpha_1 = 7.389 / 30.193 \approx 0.245$ - $\alpha_2 = 20.086 / 30.193 \approx 0.665$ - $\alpha_3 = 2.718 / 30.193 \approx 0.090$ 注意力权重:$[0.245, 0.665, 0.090]$