循环神经网络 (RNN) 与 LSTM 课程笔记
约 1903 字大约 6 分钟
循环神经网络 (RNN) 与 LSTM 课程笔记
一、从全连接网络到循环神经网络 (RNN)
1.1 动机与核心问题
- 语言数据具有时间上的关联性,神经网络需要具备处理这种序列依赖关系的能力。
- 假设输入为词向量序列:
[X1, X2, X3, X4]。
1.2 标准RNN工作原理
RNN通过将上一步的激活输出与当前输入结合,实现信息的“循环”传递。
前向传播步骤:
- 第一步:输入
X1和初始激活值A0(通常设为全零向量),得到A1。 - 第二步:输入
X2和上一步的A1,得到A2。 - 第三步及以后:重复此过程,输入
Xt和A(t-1),得到At。 - 最终输出:将最后一步的激活值(如
A4)送入输出层(如 softmax),得到最终预测。
关键特性:
- 激活函数:通常使用 tanh,也可使用 ReLU。
- 统一性处理:第一步会手动添加一个初始激活输入(如全零向量),以保持每一步操作结构一致。
1.3 RNN的结构图表示
- 循环视图:展示网络在时间维度上的循环结构。
- 展开视图:将网络在时间上的逐步行为在空间上展开,清晰展示每个时间步的数据流。
- 注意:展开图中的多个模块是同一个网络在不同时间步的状态,并非空间上多个独立网络。
1.4 为何RNN能处理序列依赖?
RNN通过合并历史信息(前一步的激活值)与当前输入,使网络能够学习上下文依赖关系。
示例:情感分析
好看-> 正向激活。不 好看-> “不”的负向激活与“好看”的正向激活合并,可能消解正向效应,导致负向输出。非常 好看-> “非常”的增强激活与“好看”合并,强化正向输出。非常 不 好看-> 增强的否定效应进一步消解正向词汇,得到更强的负面输出。
二、多层循环神经网络
可以将多个RNN层堆叠,形成深层架构。
2.1 数据流(以两层为例)
- 时间步 t:
- 第一层输入:
X_t和A1_(t-1),输出A1_t。 - 第二层输入:
A1_t和A2_(t-1),输出A2_t。
- 第一层输入:
- 最后一层的最终输出送入分类层。
2.2 训练特点
- 不宜过深:由于在时间维度展开后网络很大,训练困难,通常2-3层即可。
- 反向传播:误差从最后输出层开始,沿时间反向传播(BPTT)。
三、长短期记忆网络 (LSTM)
标准RNN难以处理长距离依赖问题。LSTM通过引入“细胞状态”和“门控机制”来改善。
3.1 核心思想:细胞状态与门控
- 细胞状态 (Cell State):贯穿整个序列的“传送带”,用于保存长期记忆。是LSTM能处理长依赖的关键。
- 门控机制:控制信息的流入、保留和流出。
- 遗忘门:决定从细胞状态中丢弃哪些信息。
- 输入门(更新门):决定将哪些新信息存入细胞状态。
- 输出门:基于细胞状态,决定该时间步的输出。
3.2 LSTM工作流程(单步)
- 合并输入:将上一步的隐藏状态
h_(t-1)和当前输入X_t合并。 - 遗忘门:通过一个 sigmoid 层,输出0-1之间的值,与上一步细胞状态
C_(t-1)相乘,决定遗忘多少旧信息。0:完全遗忘;1:完全保留。
- 输入门:
- 通过一个 sigmoid 层(输入门)决定更新哪些值。
- 通过一个 tanh 层创建新的候选值向量
~C_t。 - 将这两部分结合来更新细胞状态。
- 更新细胞状态:
C_t = f_t * C_(t-1) + i_t * ~C_tf_t: 遗忘门输出i_t: 输入门输出
- 输出门:
- 通过一个 sigmoid 层决定输出哪些细胞状态内容。
- 将细胞状态
C_t通过 tanh 处理并与输出门结果相乘,得到当前隐藏状态h_t(即本步输出)。
3.3 LSTM的优势
- 长时记忆:重要的信息(如“四川”)可以通过细胞状态传递很长的距离。
- 短时记忆/遗忘:不重要的信息(如“性格”)可以被快速遗忘。
- 有效缓解了标准RNN的梯度消失/爆炸问题,更能捕捉长序列中的依赖关系。
四、其他循环神经网络结构
- GRU (Gated Recurrent Unit):LSTM的一种流行变体,结构更简单(合并了细胞状态和隐藏状态,使用更少的门),效果常与LSTM接近,计算效率更高。
- 建议阅读博客 《Understanding LSTM Networks》 以深入了解LSTM及其变体。
五、实战:基于LSTM的文本情感分类
5.1 模型构建关键步骤
- 移除用于全连接网络的特征平铺层 (
Flatten)。 - 在嵌入层后堆叠LSTM层。
from keras.layers import LSTM model.add(LSTM(128, return_sequences=True)) # 第一层,返回所有时间步输出 model.add(LSTM(128)) # 第二层,默认只返回最后时间步输出 - 参数
return_sequences:True:每一时间步都输出结果,用于堆叠下一循环层。False(默认):只输出最后时间步的结果,用于连接分类层。
5.2 使用预训练词向量
流程:
- 加载预训练的词向量文件(如
Chinese-Word-Vectors),得到一个{word: vector}的字典。 - 根据任务自身的词汇表索引,创建一个初始化为零的嵌入矩阵
embedding_matrix(形状为[vocab_size, embedding_dim])。 - 遍历自身词汇表,如果词在预训练字典中,则将对应的向量填入
embedding_matrix的相应行。 - 将嵌入层的权重 (
weights) 初始化为该embedding_matrix,并冻结 (trainable=False) 该层,使其不参与训练。
优势:
- 利用在大规模语料上训练得到的语义信息。
- 特别是在自身任务数据量不足时,能显著提升模型性能。
5.3 实验结果对比(趋势)
| 模型 | 词向量处理方式 | 测试准确率(趋势) |
|---|---|---|
| 全连接网络 | 随机初始化,不训练 | 最差 |
| 全连接网络 | 随机初始化,参与训练 | 中等 |
| 全连接网络 | 使用预训练词向量 | 较好 (~87%) |
| LSTM | 随机初始化,不训练 | 优于全连接 |
| LSTM | 随机初始化,参与训练 | 中等,与全连接相近* |
| LSTM | 使用预训练词向量 | 最好 (~89.4%) |
注:当嵌入层参与训练时,由于其参数量巨大,可能成为训练重心,导致不同网络架构间的性能差异缩小。
总结
本节课深入讲解了处理序列数据的循环神经网络。我们从标准RNN的基本原理和结构出发,解释了其如何通过隐藏状态的循环传递来捕捉序列的短期依赖关系。针对标准RNN在长距离依赖上的不足,重点剖析了LSTM的核心机制——通过细胞状态和遗忘门、输入门、输出门三个门控单元,实现了对信息的长短期记忆与选择性传递,显著提升了长序列建模能力。此外,简要介绍了LSTM的流行变体GRU。在实践部分,演示了将全连接网络改造为LSTM情感分类模型的过程,并强调了使用预训练词向量对于提升模型性能,尤其是在数据有限情况下的重要性。实验表明,LSTM + 预训练词向量的组合在该任务上取得了最佳效果。
