长短时记忆网络 (LSTM/GRU):解决梯度消失,捕捉长距离依赖
📂 所属阶段:第二阶段 — 深度学习与序列模型(进阶篇)
🎯 前置知识:循环神经网络 (RNN) 基础
🔗 相关章节:循环神经网络 (RNN) · 序列到序列模型 (Seq2Seq)
1. LSTM 核心思想:给RNN装个“信息保险箱”
1.1 痛点:普通RNN的“短视”
普通RNN处理长序列时,前面的有用信息很容易被后面的信息覆盖甚至冲掉——这就是“梯度消失”导致的结果:反向传播时,越靠前的参数,权重更新的“信号”越弱,几乎学不到长距离的关联(比如翻译任务中“主语单复数”和“动词结尾”的对应)。
LSTM的核心改进,就是引入了「细胞状态」(Cell State) 这条“几乎不减速的信息传送带”,再搭配三个「可学习的信息门」 来精准控制:
- 什么时候把新信息存进传送带?
- 什么时候把旧信息从传送带上扔掉?
- 什么时候从传送带上取信息输出给下一层/下一个时刻?
1.2 拆解LSTM的计算流程
为了避免数学公式,我们用一个「文本情感分析」的具体场景(比如输入:“这部电影开场有点闷,但结局太治愈太戳泪点了!”),来一步步看每个门和细胞状态的工作:
第一步:遗忘门(Filter Gate)
先“清理”上一时刻细胞状态里的信息——比如开场的“有点闷”,看到后面的“但结局”就应该降低甚至忘掉它的权重。
遗忘门的逻辑:把上一时刻的隐藏状态 h_prev(相当于上一时刻的“短期临时记忆”)和当前时刻的输入 x_now(“但结局”的词向量/特征)拼在一起,经过可学习的调节参数后,用「0-1开关函数」处理——输出1代表“全留”,0代表“全删”,中间值代表“留一部分”。
第二步:输入门(Write Gate)+ 临时候选状态
接下来决定“往细胞状态里加什么新信息”,分两个小步骤:
- 输入选择门:同样拼
h_prev和x_now,用开关函数选出哪些临时信息值得存; - 临时候选状态:还是拼
h_prev和x_now,用「-1到1的缩放函数」生成当前时刻的“新内容草稿”; - 把“选择门的结果”和“草稿”相乘——只有被选中的内容才会真正写入传送带。
第三步:更新细胞状态(Update Conveyor)
核心步骤!有了前面的“清理结果”和“写入结果”,就能更新传送带了:
- 先拿“清理结果”乘以上一时刻的细胞状态(旧传送带内容);
- 再加上“写入结果”;
- 得到当前时刻的细胞状态——这就是LSTM能保存长距离信息的关键!
第四步:输出门(Output Gate)+ 隐藏状态
最后决定“从传送带里取什么信息,输出给下一个时刻/全连接层”:
- 输出选择门:还是拼
h_prev和x_now,用开关函数选出哪些传送带内容要输出; - 缩放传送带内容:把当前时刻的细胞状态用缩放函数压缩到-1到1;
- 把“选择门的结果”和“压缩后的内容”相乘——得到当前时刻的隐藏状态(短期临时记忆)。
1.3 PyTorch LSTM 实战类实现
我们直接写一个双向LSTM情感分类模型——双向LSTM能同时看“前文”和“后文”,情感分析这类任务效果更好:
2. GRU:LSTM的“轻量精简版”
2.1 GRU的改进思路
2014年Cho等人提出了门控循环单元(GRU),直接把LSTM的三个门合并成两个,还去掉了独立的细胞状态——把“长期记忆”和“短期临时记忆”合并成了一个隐藏状态:
2.2 PyTorch GRU 实战类实现
同样写一个双向GRU情感分类器,代码结构和LSTM几乎完全一致,只是把nn.LSTM换成nn.GRU,少了对细胞状态的处理:
3. 实战片段:快速跑通情感分类训练
3.1 训练与验证单轮函数
我们补充上训练时常用的梯度裁剪(防止梯度爆炸)和准确率计算:
3.2 极简推理函数
最后写一个不带Tokenizer细节的推理函数(实际使用时直接替换成你用的Tokenizer,比如Hugging Face的AutoTokenizer):
4. 2026年的选择建议
4.1 LSTM vs GRU 简单对比
4.2 2026年的实际应用情况
虽然LSTM/GRU是序列模型的经典入门知识,但在当前的NLP、甚至部分语音识别场景中,Transformer架构的预训练模型(如BERT、GPT、Whisper)已经几乎完全替代了它们的位置:
- 预训练模型有海量无标注数据的知识,下游任务微调效果远好于从零训练的LSTM/GRU;
- 现在的硬件(如A100、H100 GPU)对Transformer的自注意力机制优化得非常好,训练速度甚至不比多层LSTM慢。
4.3 什么时候还会用LSTM/GRU?
目前它们主要用于:
- 需要严格 低延迟/低参数量 的边缘设备场景;
- 严格要求按顺序处理输入输出、且不需要长距离全局依赖的小任务;
- 学术研究的对比实验(验证新模型的效果时,常用LSTM/GRU做baseline)。
🔗 扩展阅读

