第 11 课
← 返回系列列表

Course 5:循环神经网络基础

Deep Learning Specialization — 深度学习专项课程

RNN、GRU、LSTM 原理与文本处理应用。

Course 5:循环神经网络基础

课程简介

RNN、GRU、LSTM 原理与文本处理应用。

🎬 本课程视频:Deep Learning Specialization — 深度学习专项课程


一、循环神经网络基础

循环神经网络(RNN)是处理序列数据的核心技术,适用于文本、语音、时间序列等具有时序关系的数据。

1.1 为什么需要RNN

标准神经网络处理序列数据的三个问题:
1. 输入输出长度可变:句子有长有短,全连接网络需要固定尺寸输入
2. 不共享参数:句子开头和结尾的相同单词由不同参数处理
3. 缺乏时序记忆:无法利用上下文信息

1.2 RNN的基本结构

在时间步 $t$,RNN的隐藏状态更新:

$$a^{} = g_1(W_{aa} a^{} + W_{ax} x^{} + b_a)$$
$$\hat{y}^{} = g_2(W_{ya} a^{} + b_y)$$

其中 $a^{}$ 是隐藏状态(记忆),$x^{}$ 是当前输入,$W$ 是权重矩阵,$g$ 是激活函数(通常使用Tanh)。

参数共享:$W_{aa}, W_{ax}, W_{ya}$ 在所有时间步共享——这是RNN的关键特性。

1.3 RNN架构变体

Many-to-Many(多对多):机器翻译、语音识别
- $T_x$ 和 $T_y$ 长度可以不同(使用Encoder-Decoder结构)

Many-to-One(多对一):情感分类
- 输入序列,输出单个分类结果

One-to-Many(一对多):图像描述生成
- 输入单个图像,输出描述序列

1.4 语言模型与序列生成

语言模型的任务是计算一个句子的概率 $P(y^{<1>}, y^{<2>}, ..., y^{})$。

RNN语言模型训练:
1. 输入 $x^{<1>} = \vec{0}$,输出 $\hat{y}^{<1>}$ 预测第一个词的概率分布
2. 输入 $x^{<2>} = y^{<1>}$(真实第一个词),输出 $\hat{y}^{<2>}$ 预测第二个词
3. 以此类推

损失函数:交叉熵

$$\mathcal{L} = -\sum_{t} \sum_{i} y_i^{} \log(\hat{y}_i^{})$$

训练好的语言模型可以用于生成新文本——在每个时间步根据概率分布采样下一个词,并把采样结果作为下步输入。

1.5 梯度消失与梯度爆炸

RNN的梯度在时间维度上通过链式法则传播:

$$\frac{\partial \mathcal{L}}{\partial W} = \sum_{t} \frac{\partial \mathcal{L}}{\partial a^{}} \cdot \frac{\partial a^{}}{\partial a^{}} \cdot ... \cdot \frac{\partial a^{<1>}}{\partial W}$$

其中 $\frac{\partial a^{}}{\partial a^{}} = W_{aa}^T \cdot \text{diag}(g'(a^{}))$。

如果权重矩阵的特征值小于1,经过T次幂后趋近于0——梯度消失
如果特征值大于1,经过T次幂后爆炸——梯度爆炸

梯度消失在RNN中尤其严重:早期时间步的信息无法传到后期(长期依赖问题)。梯度爆炸相对容易处理(梯度裁剪)。

1.6 GRU(门控循环单元)

GRU(2014年,Cho等人)通过引入门控机制来解决RNN的长期依赖问题。

更新门 $\Gamma_u$:决定何时更新隐藏状态

$$\Gamma_u = \sigma(W_u [a^{}, x^{}] + b_u)$$

重置门 $\Gamma_r$:决定何时忽略之前隐藏状态

$$\Gamma_r = \sigma(W_r [a^{}, x^{}] + b_r)$$

候选隐藏状态

$$\tilde{c}^{} = \tanh(W_c [\Gamma_r \odot a^{}, x^{}] + b_c)$$

最终更新

$$c^{} = \Gamma_u \odot \tilde{c}^{} + (1 - \Gamma_u) \odot c^{}$$

当 $\Gamma_u = 0$ 时,$c^{} = c^{}$——信息可以跨越多个时间步保持不变。

GRU通过更新门控制信息流,让梯度可以跨越长时间步传播。

1.7 LSTM(长短期记忆网络)

LSTM(1997年,Hochreiter & Schmidhuber)是比GRU更强大的门控RNN结构,包含三个门:

遗忘门:$f_t = \sigma(W_f [h_{t-1}, x_t] + b_f)$
输入门:$i_t = \sigma(W_i [h_{t-1}, x_t] + b_i)$
输出门:$o_t = \sigma(W_o [h_{t-1}, x_t] + b_o)$
候选记忆:$\tilde{C}t = \tanh(W_C [h{t-1}, x_t] + b_C)$
记忆更新:$C_t = f_t \odot C_{t-1} + i_t \odot \tilde{C}_t$
隐藏状态:$h_t = o_t \odot \tanh(C_t)$

LSTM的关键是细胞状态 $C_t$,信息通过遗忘门和输入门的控制流经细胞状态。遗忘门控制丢弃多少旧信息,输入门控制添加多少新信息。

LSTM vs GRU:LSTM更强大、更灵活(有独立遗忘门和输入门),GRU更简单、计算更快。在大规模数据上LSTM通常表现更好,在数据量有限时GRU可能更优。

1.8 双向RNN和深层RNN

双向RNN(BRNN):在每个时间步同时使用过去和未来的信息。适合需要完整上下文的任务(如命名实体识别)。

深层RNN(Deep RNN):在时间维度上堆叠多个RNN层。每层在不同时间尺度上学习特征表示。

延伸阅读

← Course 4:人脸识别与神经风格迁移 Course 5:自然语言处理与注意力机制 →