LSTM:从 RNN 的梯度问题到门控记忆机制

LSTM(Long Short-Term Memory) 是深度学习历史上最重要的序列模型之一。 它解决了传统 RNN 在长序列训练过程中容易出现的梯度消失、梯度爆炸以及长期依赖难以学习等问题。

虽然今天 Transformer 已经成为 NLP、LLM 和多模态模型的主流架构,但理解 LSTM 依然非常重要,因为它能够帮助我们真正理解:

序列建模 → 状态记忆 → 梯度传播 → Attention → Transformer

这一整条技术演进路线。


一、LSTM 是什么?

LSTM 全称:

Long Short-Term Memory

中文:

长短期记忆网络

它属于:

Recurrent Neural Network
       RNN
      LSTM

LSTM 最核心的思想只有一句话:

通过门控机制决定哪些信息应该保留、哪些信息应该遗忘、哪些信息应该输出。

传统神经网络:

x
Network
y

而 LSTM:

xₜ
LSTM
hₜ
LSTM
hₜ₊₁
LSTM

模型在处理当前输入的同时,还会保留之前的信息。

因此 LSTM 天然适合:

时间序列
语音
文本
股票数据
传感器数据
日志序列
用户行为序列

二、为什么需要 LSTM?

理解 LSTM,必须先理解 RNN。

假设有一个句子:

我出生在中国,后来去了美国,现在我说一口流利的 ______ 。

模型在预测最后一个词的时候,需要记住:

中国

甚至可能需要记住前面很远的信息。

传统 DNN:

Input
DNN
Output

每个输入基本独立。

而 RNN:

x₁ → RNN → h₁
x₂ → RNN → h₂
x₃ → RNN → h₃
...
xₙ → RNN → hₙ

其中:

hₜ

就是隐藏状态。

可以理解为:

hₜ 是 RNN 对过去信息的压缩记忆。


三、传统 RNN 的核心公式

RNN 的基本公式:

hₜ = tanh(Wₓxₜ + Wₕhₜ₋₁ + b)

其中:

xₜ       当前输入
hₜ₋₁     上一个隐藏状态
hₜ       当前隐藏状态
Wₓ       输入权重
Wₕ       隐藏状态权重
b        bias

结构:

        hₜ₋₁
xₜ ───→ RNN ───→ hₜ

所以:

当前状态
=
当前输入
+
过去状态

这就是 RNN 的核心。


四、RNN 最大的问题:长期依赖

假设:

x₁
x₂
x₃
...
x₁₀₀

如果:

x₁

的信息对于:

x₁₀₀

非常重要,那么 RNN 必须让这个信息经过:

99次状态传递

才能到达最终位置。

训练时则涉及:

Backpropagation Through Time

简称:

BPTT

梯度需要:

∂L/∂h₁₀₀
∂L/∂h₉₉
∂L/∂h₉₈
...
∂L/∂h₁

于是出现一个严重问题:

梯度需要经过大量连续乘法。


五、为什么会出现梯度消失?

假设每次梯度传播都会乘以:

0.5

连续10次:

0.5¹⁰ ≈ 0.00098

连续100次:

0.5¹⁰⁰ ≈ 7.9 × 10⁻³¹

梯度几乎变成:

0

于是前面的网络层几乎无法学习。

这就是:

Vanishing Gradient

梯度消失导致:

RNN 很难学习非常长距离的依赖关系。


六、LSTM 的核心思想

LSTM 不再简单地:

过去状态 + 当前输入

而是增加一个非常重要的状态:

Cell State

完整结构:

                ┌─────────────────────┐
                │     Cell State      │
                │         Cₜ          │
                └─────────────────────┘
                  Forget / Input
xₜ ───────→     LSTM     ───────→ hₜ
                 hₜ₋₁

LSTM 有两个核心状态:

hₜ
Cₜ

其中:

hₜ = Hidden State
Cₜ = Cell State

可以粗略理解为:

hₜ
→ 当前对外表现出来的状态

Cₜ
→ 内部长期记忆

七、LSTM 为什么叫“记忆网络”?

可以把:

Cₜ

想象成一条贯穿整个序列的:

Memory Highway

数据沿着:

Cₜ₋₁
Cₜ
Cₜ₊₁
Cₜ₊₂

传播。

LSTM 不会每一步都彻底重写记忆。

而是通过:

Forget Gate
Input Gate
Output Gate

控制:

忘掉什么
记住什么
输出什么

这就是 LSTM 最核心的设计。


八、LSTM 的三个 Gate

LSTM 有三个主要门:

Forget Gate
Input Gate
Output Gate

可以理解成一个“记忆管理系统”。

              LSTM
       ┌────────┼────────┐
       ↓        ↓        ↓
    Forget     Input    Output
      Gate      Gate      Gate
       │         │         │
       ↓         ↓         ↓
     忘记       写入       输出

九、Forget Gate:应该忘记什么?

Forget Gate:

决定之前的记忆哪些应该被删除。

公式:

fₜ = σ(W_f[hₜ₋₁, xₜ] + b_f)

其中:

σ = Sigmoid

输出范围:

0 ~ 1

例如:

fₜ = 0.1

表示:

这个信息基本忘掉

如果:

fₜ = 0.9

表示:

这个信息大部分保留

所以可以理解成:

0 → Forget
1 → Keep

十、Input Gate:应该记住什么?

Input Gate 决定:

当前输入中哪些信息值得写入长期记忆。

首先计算:

iₜ = σ(W_i[hₜ₋₁, xₜ] + b_i)

然后产生候选记忆:

C̃ₜ = tanh(W_c[hₜ₋₁, xₜ] + b_c)

这里有两个概念:

iₜ
→ 写入多少

C̃ₜ
→ 写入什么

十一、Cell State 如何更新?

这是 LSTM 最核心的公式之一:

Cₜ = fₜ ⊙ Cₜ₋₁ + iₜ ⊙ C̃ₜ

拆开:

旧记忆
fₜ × Cₜ₋₁

表示:

保留多少旧信息。

然后:

新信息
iₜ × C̃ₜ

表示:

写入多少新信息。

最终:

新记忆
=
旧记忆 × Forget Gate
+
新信息 × Input Gate

这就是 LSTM 的核心机制。


十二、Output Gate:应该输出什么?

LSTM 内部可能保存了大量信息。

但不是所有信息都需要输出。

因此有:

oₜ = σ(W_o[hₜ₋₁, xₜ] + b_o)

最终:

hₜ = oₜ ⊙ tanh(Cₜ)

所以:

Cell State
  tanh()
Output Gate
Hidden State

十三、LSTM 完整数学公式

把整个 LSTM 放在一起:

Forget Gate

fₜ = σ(W_f[hₜ₋₁, xₜ] + b_f)

Input Gate

iₜ = σ(W_i[hₜ₋₁, xₜ] + b_i)

Candidate Cell State

C̃ₜ = tanh(W_c[hₜ₋₁, xₜ] + b_c)

Cell State

Cₜ = fₜ ⊙ Cₜ₋₁ + iₜ ⊙ C̃ₜ

Output Gate

oₜ = σ(W_o[hₜ₋₁, xₜ] + b_o)

Hidden State

hₜ = oₜ ⊙ tanh(Cₜ)

这六个公式就是标准 LSTM 的数学核心。


十四、为什么 LSTM 能缓解梯度消失?

重点观察:

Cₜ = fₜ ⊙ Cₜ₋₁ + iₜ ⊙ C̃ₜ

传统 RNN:

hₜ = tanh(...)

每一步都经历:

非线性变换

而 LSTM 有一条:

Cell State

允许信息进行相对直接的传播。

梯度可以沿着:

Cₜ₋₁
Cₜ
Cₜ₊₁

传播。

这就是所谓的:

Memory Highway

它显著缓解了长期依赖学习中的梯度消失问题。

注意:

LSTM 是“缓解”而不是数学意义上彻底消除梯度消失。


十五、一个非常直观的类比

可以把 LSTM 想象成一个项目经理。

每天都会收到新的信息:

xₜ

项目经理脑子里有:

长期记忆 Cₜ

同时还需要决定:

Forget Gate

这个信息已经没用了
→ 删除

Input Gate

这个新信息非常重要
→ 记录

Output Gate

这个信息现在需要告诉团队
→ 输出

因此:

LSTM
=
记忆
+
遗忘
+
写入
+
读取

十六、LSTM 与普通 RNN 的结构区别

普通 RNN:

xₜ
┌───────────┐
│    RNN    │
│           │
│  tanh     │
└───────────┘
hₜ

LSTM:

                Cₜ₋₁
          ┌───────┴───────┐
          │               │
       Forget          Input
          │               │
          └───────┬───────┘
                 Cₜ
               Output
                 hₜ

LSTM 内部明显更加复杂。

但是这种复杂性换来了:

更强的长期记忆能力。


十七、为什么 LSTM 使用 Sigmoid?

三个 Gate:

fₜ
iₜ
oₜ

都需要表达:

0 ~ 1

因此使用:

Sigmoid

例如:

0

表示:

完全关闭

而:

1

表示:

完全打开

所以 Sigmoid 非常适合作为:

Gate

十八、为什么 Candidate 使用 Tanh?

候选记忆:

C̃ₜ

需要表示:

正的信息
+
负的信息

因此:

tanh

输出:

-1 ~ 1

比 Sigmoid 更适合表示有正负方向的信息。

因此经典 LSTM:

Gate
→ Sigmoid

Candidate
→ Tanh

十九、LSTM 的参数量

假设:

input_size = D
hidden_size = H

LSTM 有四组主要计算:

Forget
Input
Candidate
Output

每一组都有:

Input Weight
Hidden Weight
Bias

所以参数量大致:

4 × (D×H + H×H + H)

即:

4H(D + H + 1)

例如:

D = 128
H = 256

参数:

4 × 256 × (128 + 256 + 1)

约:

394,240

这比普通 RNN:

H(D + H + 1)

大约多四倍。

因此:

LSTM 的表达能力增强,同时计算成本也明显增加。


二十、PyTorch 实现 LSTM

PyTorch:

import torch
import torch.nn as nn

lstm = nn.LSTM(
    input_size=128,
    hidden_size=256,
    num_layers=2,
    batch_first=True
)

输入:

[batch_size, sequence_length, input_size]

例如:

[32, 100, 128]

表示:

Batch = 32
Sequence = 100
Feature = 128

输出:

output, (h_n, c_n) = lstm(x)

其中:

output
h_n
c_n

分别对应不同层面的序列输出和最终状态。


二十一、完整 LSTM 分类模型

例如文本分类:

import torch
import torch.nn as nn


class LSTMClassifier(nn.Module):

    def __init__(
        self,
        input_size,
        hidden_size,
        num_layers,
        num_classes
    ):
        super().__init__()

        self.lstm = nn.LSTM(
            input_size=input_size,
            hidden_size=hidden_size,
            num_layers=num_layers,
            batch_first=True
        )

        self.fc = nn.Linear(
            hidden_size,
            num_classes
        )

    def forward(self, x):

        output, (h_n, c_n) = self.lstm(x)

        last_hidden = h_n[-1]

        output = self.fc(last_hidden)

        return output

结构:

Input Sequence
Embedding / Features
LSTM
Last Hidden State
Fully Connected
Classification

二十二、LSTM 中的 hc

这是初学者非常容易混淆的地方。

LSTM:

output, (h_n, c_n) = lstm(x)

有:

h_n
c_n

h_n

Hidden State

可以理解成:

当前时刻对外暴露的状态。

c_n

Cell State

可以理解成:

LSTM 内部长期记忆。

简单记:

h = hidden
c = cell

二十三、output 和 h_n 的区别

假设:

batch = 32
sequence = 100
hidden = 256

那么:

output
=
[32, 100, 256]

表示:

每一个时间步的 Hidden State。

而:

h_n

通常是:

[num_layers, batch, hidden]

表示:

每一层最后一个时间步的 Hidden State。

例如:

[2, 32, 256]

表示:

2 layers
32 batch
256 hidden

二十四、Many-to-One

LSTM 很适合:

Sequence
Single Output

例如:

一整段文本
情感分类

结构:

x₁ → LSTM
x₂ → LSTM
x₃ → LSTM
...
xₙ → LSTM
          hₙ
       Classifier
          Positive

典型:

Sentiment Analysis

二十五、Many-to-Many

也可以:

Sequence
Sequence

例如:

输入:
我 爱 北京

输出:
I love Beijing

或者:

Token
NER
Token Label

例如:

我       O
爱       O
北京     B-LOC

二十六、Many-to-One 和 Many-to-Many

总结:

Many-to-One

x1
x2
x3
LSTM
y

应用:

文本分类
情感分析
异常检测

Many-to-Many:

x1 → y1
x2 → y2
x3 → y3

应用:

序列标注
NER
时间序列预测

二十七、Bidirectional LSTM

普通 LSTM:

过去 → 现在

Bidirectional LSTM:

过去 → 现在
现在 ← 未来

即:

Forward LSTM
Backward LSTM
Concatenate

例如:

x1 → x2 → x3 → x4

x1 ← x2 ← x3 ← x4

最后:

hₜ = [h_forward ; h_backward]

因此模型同时利用:

过去信息
+
未来信息

二十八、为什么 NLP 中 BiLSTM 很有价值?

例如:

我去银行存钱

判断:

银行

的含义时,前后文都很重要。

BiLSTM可以:

Forward
→ 利用左侧上下文

Backward
→ 利用右侧上下文

因此:

双向 LSTM 在传统 NLP 任务中非常有效。


二十九、Stacked LSTM

可以堆叠多层 LSTM:

Input
LSTM Layer 1
LSTM Layer 2
LSTM Layer 3
Output

例如:

nn.LSTM(
    input_size=128,
    hidden_size=256,
    num_layers=3
)

这样可以学习:

低层序列特征
中层序列特征
高层序列特征

类似 DNN 的:

Deep Representation Learning

三十、LSTM 的 Dropout

当:

num_layers > 1

可以使用:

nn.LSTM(
    input_size=128,
    hidden_size=256,
    num_layers=3,
    dropout=0.2
)

Dropout主要作用于:

不同 LSTM 层之间的连接。

它可以降低:

Overfitting

三十一、LSTM 与时间序列

LSTM 曾经在时间序列预测中非常流行。

例如股票:

Day1
Day2
Day3
...
Day30
Prediction Day31

输入:

Open
High
Low
Close
Volume

可以构建:

[30, 5]

送入:

LSTM
Hidden State
Linear
Price

三十二、LSTM 与异常检测

例如服务器监控:

CPU
Memory
QPS
Latency
Error Rate

每分钟:

t1
t2
t3
...
t100

LSTM学习正常模式:

Normal Sequence
LSTM
Prediction

如果:

Prediction

与实际值差异很大:

Error > Threshold

可以判断:

Anomaly

三十三、LSTM 与日志分析

如果系统日志:

Login
Query
Payment
Order
Logout

可以看成:

Event Sequence

LSTM可以学习:

正常行为模式

然后发现:

异常行为

例如:

Login
Login
Login
Admin
Delete

可能具有异常模式。


三十四、LSTM 的主要缺点

虽然 LSTM 很优秀,但它存在明显缺点。

1. 顺序计算

LSTM:

x1
x2
x3
x4

必须按照时间顺序处理。

因此:

很难充分利用 GPU 的并行计算能力。


2. 长序列效率低

例如:

Sequence Length = 10000

LSTM需要:

10000 steps

依次计算。

Transformer则可以:

Parallel Attention

大规模训练更加高效。


3. 参数多

相比普通 RNN:

LSTM
≈ 4 × 参数量

计算成本更高。


三十五、GRU 为什么出现?

LSTM:

Forget Gate
Input Gate
Output Gate
Cell State
Hidden State

结构比较复杂。

于是出现:

GRU

全称:

Gated Recurrent Unit

GRU的核心思想:

用更少的门实现类似的记忆机制。

主要包括:

Update Gate
Reset Gate

没有独立的:

Cell State

因此结构更加简单。


三十六、LSTM vs GRU

特性LSTMGRU
Forget Gate融合到 Update
Input Gate融合
Output Gate没有独立
Cell State没有
Hidden State
参数量较多较少
计算速度较慢较快
长期依赖
模型复杂度较低

可以简单理解:

LSTM
→ 更完整的记忆机制

GRU
→ 更简洁的门控机制

三十七、LSTM 为什么最终被 Transformer 超越?

这是理解现代 AI 架构演进非常重要的问题。

LSTM:

x1 → x2 → x3 → x4 → ... → xn

信息必须一步一步传播。

Transformer:

x1 ─┐
x2 ─┤
x3 ─┼→ Self-Attention
x4 ─┤
x5 ─┘

一个 Token 可以直接关注:

任何其他 Token

例如:

x₁ ───────────────→ x₁₀₀

不需要:

x₂
x₃
x₄
...
x₉₉

一个一个传递。

这就是:

Self-Attention 对长距离依赖的巨大优势。


三十八、LSTM 与 Transformer 的根本区别

LSTM:

Memory-Based

依赖:

Hidden State
Cell State

Transformer:

Attention-Based

依赖:

Attention Matrix

LSTM:

过去
状态
现在

Transformer:

所有Token
Attention
Context

因此 Transformer 更容易进行:

Large Scale Parallel Training

三十九、LSTM 与 Attention 的结合

在 Transformer 之前,还有一个非常重要的阶段:

LSTM + Attention

例如 Encoder:

x1 → LSTM → h1
x2 → LSTM → h2
x3 → LSTM → h3
x4 → LSTM → h4

传统 Decoder可能只使用:

h4

问题是:

h4需要压缩整个输入序列。

Attention则允许:

Decoder
Attention
  ├── h1
  ├── h2
  ├── h3
  └── h4

动态选择重要信息。

这成为 Transformer 出现前的重要技术过渡。


四十、LSTM → Attention → Transformer

可以把技术演进理解成:

RNN
LSTM
解决长期记忆
LSTM + Attention
减少信息压缩问题
Transformer
Self-Attention
大规模并行计算
BERT / GPT
LLM

这条技术路线非常重要。


四十一、LSTM 对理解 LLM 有什么价值?

现在学习 LSTM 仍然有很大意义。

因为它能帮助理解:

1. State

hₜ
Cₜ

为什么序列模型需要状态。

2. Memory

为什么:

过去的信息

会影响:

当前预测

3. Gradient

理解:

Vanishing Gradient

4. Attention

理解:

为什么 Transformer 不再依赖传统 RNN 的顺序记忆。

5. Sequence Modeling

理解:

Token
Sequence
Context
Dependency

这些概念对 LLM 都非常重要。


四十二、从 AI 工程师角度理解 LSTM

如果从工程角度看,LSTM 可以理解成:

Input Event
State
Memory Update
Output
Next Event

这和传统后端系统中的:

Request
Session State
State Update
Response

有一定的类比。

例如:

User Event
LSTM
User State
Next Action Prediction

这类思路可以用于:

推荐系统
用户行为预测
异常检测
时间序列
事件预测

四十三、LSTM 训练过程

完整训练过程:

Training Data
Sequence
Embedding / Feature
LSTM
Prediction
Loss
BPTT
Gradient
Optimizer
Update Parameters

注意:

LSTM仍然使用:

Backpropagation

只是由于存在时间维度,所以称为:

Backpropagation Through Time

即:

BPTT

四十四、BPTT 是怎么回事?

假设:

x1 → LSTM → h1
x2 → LSTM → h2
x3 → LSTM → h3
x4 → LSTM → h4

最终:

h4
Loss

反向传播:

Loss
h4
h3
h2
h1

所以叫:

Backpropagation
Through
Time

这也是为什么序列越长,训练越困难。


四十五、LSTM 的工程优化

生产环境中使用 LSTM,需要考虑:

Sequence Length
Batch Size
Hidden Size
Number of Layers
Bidirectional
GPU Memory
Padding
Packing

特别是:

Variable Length Sequence

例如:

Sequence A = 10
Sequence B = 50
Sequence C = 100

通常需要:

Padding

或者:

PackedSequence

减少无效计算。


四十六、LSTM 中 Padding 的问题

假设:

A = [x1,x2,x3]

B = [x1,x2,x3,x4,x5]

统一长度:

A = [x1,x2,x3,PAD,PAD]
B = [x1,x2,x3,x4,x5]

那么:

PAD

实际上没有意义。

因此需要:

Masking

或者 PyTorch:

pack_padded_sequence()

让 LSTM 尽可能避免处理无效 Padding。


四十七、LSTM 的典型应用场景

今天 LSTM 虽然不再是 NLP 主流,但仍然适合很多场景。

时间序列

CPU
Memory
Temperature
Stock
Demand
Traffic

工业

Sensor
Machine State
Failure Prediction

推荐

User Behavior Sequence

异常检测

Log Sequence
Transaction Sequence

语音

Audio Feature Sequence

NLP

Sequence Classification
NER
Text Classification

尤其在:

数据量有限、模型规模不大、实时性要求高的场景中,LSTM 依然可能具有工程价值。


四十八、LSTM 最重要的知识结构

如果准备 AI Engineer / Machine Learning Engineer 面试,可以建立下面的知识树:

LSTM
 ├── RNN
 │    ├── Hidden State
 │    ├── Recurrence
 │    └── BPTT
 ├── Problem
 │    ├── Vanishing Gradient
 │    └── Long-Term Dependency
 ├── Memory
 │    ├── Hidden State
 │    └── Cell State
 ├── Gates
 │    ├── Forget Gate
 │    ├── Input Gate
 │    └── Output Gate
 ├── Activation
 │    ├── Sigmoid
 │    └── Tanh
 ├── Architecture
 │    ├── Stacked LSTM
 │    ├── BiLSTM
 │    └── LSTM + Attention
 └── Modern Evolution
      └── Transformer

四十九、面试中最容易问的 LSTM 问题

Q1:LSTM 为什么能够解决 RNN 的长期依赖问题?

核心:

Cell State
+
Gated Mechanism

通过:

Forget Gate
Input Gate
Output Gate

控制信息流。


Q2:LSTM 为什么有两个 State?

hₜ
→ Hidden State

Cₜ
→ Cell State

其中:

Cₜ

负责更加长期的信息传递。


Q3:为什么 Gate 使用 Sigmoid?

因为:

Sigmoid ∈ (0,1)

可以自然表示:

关闭程度
保留程度

Q4:Candidate 为什么使用 Tanh?

因为:

Tanh ∈ (-1,1)

能够表达:

正向信息
+
负向信息

Q5:LSTM 为什么比 RNN 参数更多?

因为 LSTM 有四组核心计算:

Forget
Input
Candidate
Output

因此参数量约为普通 RNN 的四倍。


Q6:LSTM 为什么最终被 Transformer 替代?

主要原因:

LSTM
→ Sequential Computation

Transformer
→ Parallel Attention

Transformer 更适合:

GPU
TPU
Large Dataset
Long Sequence
Large Model

五十、最终总结

LSTM 可以浓缩成下面这一张图:

                    LSTM
              ┌──────┴──────┐
              ↓             ↓
          Hidden State   Cell State
              │             │
              │             │
              └──────┬──────┘
              ┌─────────────┐
              │             │
           Forget         Input
            Gate           Gate
              │             │
              └──────┬──────┘
                 Memory
                 Output Gate
                    hₜ

最重要的公式:

fₜ = σ(W_f[hₜ₋₁,xₜ] + b_f)

iₜ = σ(W_i[hₜ₋₁,xₜ] + b_i)

C̃ₜ = tanh(W_c[hₜ₋₁,xₜ] + b_c)

Cₜ = fₜ ⊙ Cₜ₋₁ + iₜ ⊙ C̃ₜ

oₜ = σ(W_o[hₜ₋₁,xₜ] + b_o)

hₜ = oₜ ⊙ tanh(Cₜ)

真正理解 LSTM,需要抓住三个关键词:

State
Memory
Gate

而从整个 AI 技术演进来看:

DNN
RNN
LSTM
LSTM + Attention
Transformer
BERT / GPT
LLM
Agent

其中 LSTM 最重要的历史贡献是:

它第一次非常成功地把“记忆”和“信息流控制”结合起来,让神经网络能够更加有效地学习长期依赖。

而 Transformer 的革命性突破,则是进一步把:

“依靠递归状态记忆过去”

转变成:

“通过 Attention 直接访问上下文”

这也是从传统序列模型走向今天 LLM 的关键一步。


建议下一篇

如果按照你现在的 DNN → CNN → LSTM 学习脉络继续,下一篇最值得深入的是:

《Transformer 深度技术博客:从 Self-Attention、Multi-Head Attention 到 GPT/LLM》

重点可以直接进入源码级和数学级分析:

LSTM
为什么需要 Attention
Self-Attention 数学原理
Q / K / V
Scaled Dot-Product Attention
Multi-Head Attention
Positional Encoding
Transformer Encoder / Decoder
GPT
LLM
Vincent zhai
Vincent zhai
Full-Stack Engineer