Long Short-Term Memory (LSTM)
LSTM 是一种循环网络,其门控细胞状态能够在长序列中传递信息。内容涵盖其门控机制、方程、与 GRU 的比较以及代码。
长短期记忆网络(LSTM)是一种循环神经网络(RNN)架构。它在简单 RNN 的隐藏状态旁增加了一个门控记忆——细胞状态,因此能够跨越数百或数千个时间步传递信息。Sepp Hochreiter 和 Jürgen Schmidhuber 于 1997 年提出了 LSTM,以解决梯度消失问题;该问题会使简单 RNN 难以学习长距离依赖关系。他们的论文报告称,LSTM 能跨越超过 1,000 个时间步的间隔建立联系。2010 年代,LSTM 曾用于语音识别、机器翻译和手写识别,后来大多数语言任务转而采用 Transformer。在时间序列分析、传感器数据流和端侧模型中,LSTM 仍很常见,因为这些场景看重固定大小的状态和每步固定的计算开销。
LSTM 单元的工作原理#
在每个时间步 t,LSTM 读取输入 xₜ 和前一个隐藏状态 hₜ₋₁,并计算三个门和一个候选值,每项都有各自的权重。门使用 sigmoid 函数,因此每个元素都在 0 到 1 之间;候选值使用 tanh,因此在 −1 到 1 之间:
- 遗忘门:fₜ = σ(W_f xₜ + U_f hₜ₋₁ + b_f),决定保留旧细胞状态中每个元素的多少。
- 输入门:iₜ = σ(W_i xₜ + U_i hₜ₋₁ + b_i),决定写入多少候选值。
- 候选值:gₜ = tanh(W_g xₜ + U_g hₜ₋₁ + b_g),提出新的内容。
- 输出门:oₜ = σ(W_o xₜ + U_o hₜ₋₁ + b_o),决定向外输出多少细胞状态内容。
然后,两个状态按以下方式更新:cₜ = fₜ ⊙ cₜ₋₁ + iₜ ⊙ gₜ,hₜ = oₜ ⊙ tanh(cₜ),其中 ⊙ 表示逐元素相乘。细胞状态是长期记忆,隐藏状态则是短期输出,会馈入下一层和下一步。
细胞状态采用加法更新。cₜ 对 cₜ₋₁ 的梯度逐元素等于 fₜ,因此,当遗忘门接近 1 时,误差信号几乎不变地向后传递,并跨越多个时间步;原论文将这条路径称为“恒定误差环”。1997 年的 LSTM 没有遗忘门,细胞只能累积信息。Felix Gers、Schmidhuber 和 Fred Cummins 于 2000 年加入遗忘门,使细胞能够重置;如今所有标准 LSTM 都包含遗忘门。Rafal Jozefowicz 及其同事于 2015 年建议将遗忘门偏置初始化为 1,这能让训练初期的门保持开启状态,使网络一开始就倾向于记住信息。
PyTorch 中的 LSTM#
PyTorch 的 nn.LSTM 会在整个序列上运行该单元,并返回每一步的隐藏状态以及最终的隐藏状态和细胞状态。下面的代码片段根据逐帧特征向量对短视频片段分类,例如这些特征向量可以由卷积神经网络(CNN)从每一帧中提取:
import torch
from torch import nn
# 8 video clips, 16 frames each, 512 features per frame: (batch, time, features)
clips = torch.randn(8, 16, 512)
# One LSTM layer with a 128-dim hidden state, and a classifier over 5 actions
lstm = nn.LSTM(input_size=512, hidden_size=128, batch_first=True)
classifier = nn.Linear(128, 5)
# output holds h at every step; h_n and c_n are the final hidden and cell states
output, (h_n, c_n) = lstm(clips)
logits = classifier(h_n[-1])
print(f"output {tuple(output.shape)}, h_n {tuple(h_n.shape)}, c_n {tuple(c_n.shape)}, logits {tuple(logits.shape)}")
# Each weight matrix stacks four blocks of 128 rows: input gate, forget gate, candidate, output gate
print(f"Input weights {tuple(lstm.weight_ih_l0.shape)}, recurrent weights {tuple(lstm.weight_hh_l0.shape)}")它会输出 output (8, 16, 128), h_n (1, 8, 128), c_n (1, 8, 128), logits (8, 5) 和 Input weights (512, 512), recurrent weights (512, 128)。最终隐藏状态会汇总每段 16 帧视频的信息,供五分类器使用;每个权重矩阵有 4 × 128 = 512 行,因为 PyTorch 将四个门块存储在一个矩阵中。
LSTM 与相关架构的比较#
- 简单 RNN:在每一步通过一个 tanh 层重写整个状态,因此梯度会随序列长度呈几何级数缩小或增大,难以学习长距离依赖关系。
- GRU:将细胞状态和隐藏状态合并,并使用两个门而不是三个门,因此在宽度相同时有三个权重块,参数量为 LSTM 的四分之三。两者在不同任务中没有一种始终占优。
- Transformer:通过自注意力并行处理所有位置,在 GPU 上训练快得多,并可直接访问远距离上下文,因此 Transformer 取代了语言建模和翻译领域中的 LSTM。注意力的开销会随上下文长度增长,而 LSTM 每新增一步的计算量和内存用量都相同。
- xLSTM:Hochreiter 团队于 2024 年提出了 xLSTM,加入指数门控和可并行训练的矩阵记忆。其 70 亿参数语言模型 xLSTM 7B 于 ICML 2025 发表,性能与相近规模的 Transformer 模型相当,推理速度更快。
应用场景#
- 语音识别:Google 于 2015 年将语音搜索切换到采用连接主义时序分类(CTC)训练的 LSTM 声学模型;端侧识别器长期以来也依赖堆叠式 LSTM。
- 机器翻译:Google 于 2016 年推出的神经机器翻译系统,在编码器和解码器中各堆叠了八层 LSTM。
- 洪水预报:Google 的洪水预报系统在《Nature》2024 年发表的论文中进行了介绍。该系统使用 LSTM 网络根据天气数据预测河流流量,并可提前最多五天预测没有水文站流域中的极端洪水。
- 动作识别:CNN 对每一帧视频进行编码,LSTM 读取帧特征序列并为片段分类,上面的代码片段采用的就是这种结构。
- 轨迹预测:Social LSTM 为每名行人运行一个 LSTM,并聚合附近行人的隐藏状态,以预测人群中的行进路径。YOLO26 在跟踪模式下会为每个人分配跨视频帧保持不变的 ID,从而将逐帧检测结果转换为此类预测器所需的位置历史记录。










