====== 第七章 循环神经网络 ====== ===== 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]$