这是本文档旧的修订版!


第七章 循环神经网络

序列数据的特性:

序列数据是指数据点之间存在时间或顺序依赖关系的数据,与自然语言、时间序列、音频、视频等密切相关。序列数据的核心特点是:

1. 变长性:序列长度不固定 2. 顺序性:数据点的顺序包含重要信息 3. 依赖性:当前状态依赖于历史状态

传统神经网络的局限:

前馈神经网络(FNN)和卷积神经网络(CNN)处理固定尺寸输入,难以直接建模序列依赖关系。传统方法如N-gram模型、隐马尔可夫模型(HMM)存在维度灾难或表达能力有限的问题。

循环神经网络的诞生:

循环神经网络(Recurrent Neural Network,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.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.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.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.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.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.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优点

题目:考虑一个简单的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$

题目:分析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$),形成信息的高速公路,跨越数百个时间步传播梯度。

题目:在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$

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]$,使用点积注意力计算三个注意力权重。

一、选择题答案:

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]$

该主题尚不存在

您访问的页面并不存在。如果允许,您可以使用创建该页面按钮来创建它。

  • 深度学习/循环神经网络.1772454440.txt.gz
  • 最后更改: 2026/03/02 20:27
  • 张叶安