一文看懂 LSTM:长短期记忆网络的原理、图示、代码与应用全解析

1. 引言

我们所处的世界,充满了与“顺序”密切相关的数据。

  • 你在写一句话,后面的词依赖前文。

  • 你在听音乐,音符按时间先后构成旋律。

  • 股票、温度、传感器信号、电力消耗,都属于时间序列。

这些数据都有一个共同点:它们的当前状态,受到过去信息的影响。

这类任务被称为序列建模(Sequence Modeling),它的核心目标是:

让模型理解时间上的依赖关系,能处理有前后顺序的数据。

在自然语言处理(NLP)、语音识别、机器翻译、时间序列预测等领域,序列建模都是基础能力。

1.1 RNN 的提出与瓶颈

为了实现对时间顺序的理解,循环神经网络(Recurrent Neural Network, RNN)应运而生。

RNN 的核心思想是:

把之前时刻的状态作为“记忆”传递到当前时刻,让模型拥有“时间记忆”。

在每一个时间步 t,RNN 接收当前输入 x_t 和上一个时刻的隐藏状态 h_{t-1},计算出当前隐藏状态 h_t

这种机制非常适合建模语句、语音、时间序列数据的上下文依赖。

但在实际应用中,RNN 遇到了两个重大瓶颈:

  • 梯度消失/爆炸:在训练长序列时,误差信号需要层层反向传播。当时间步过多,梯度会指数级衰减或膨胀,导致训练不稳定。

  • 长期依赖难以学习:RNN 虽然可以传递信息,但只能记住有限步长内的内容,难以学习“远距离的依赖”。

比如在翻译一段话时,句首的主语可能影响句尾的动词,而 RNN 很可能“记不住”这些长程依赖。

1.2 为什么我们需要 LSTM

为了解决 RNN 结构在长期依赖建模上的缺陷,1997 年,Hochreiter 和 Schmidhuber 提出了 LSTM(Long Short-Term Memory)。

LSTM 在 RNN 的基础上,做了如下关键增强:

  1. 引入了一个“单元状态(Cell State)”作为长期记忆通道,类似一条传送带,可以让信息跨时间传播而不容易被遗忘。

  2. 使用了门控机制(Gating Mechanism),通过:

- **遗忘门(Forget Gate)** 决定保留多少旧信息,
  
- **输入门(Input Gate)** 决定写入多少新信息,
  
- **输出门(Output Gate)** 控制输出多少记忆内容。

通过这套结构,LSTM 能有效缓解梯度消失的问题,保留长期信息,捕捉远程依赖。

LSTM 在各种序列建模任务中表现卓越,广泛用于:

  • 文本分类、情感分析、机器翻译(NLP)

  • 语音识别

  • 时间序列预测(如天气、金融)

随着计算资源的发展,虽然 Transformer 等新模型逐渐成为主流,但 LSTM 依然在许多轻量级任务和嵌入式设备中有着不可替代的价值。

2. RNN 回顾

也可参考之前的一篇文章《认识RNN》

2.1. 基础结构与工作机制

为了更好理解 LSTM,我们先回顾一下 RNN 的基本结构。

RNN 的基本单元是一个“循环结构”:
它在每一个时间步 t 接收两个输入:

  • 当前输入向量 x_t

  • 上一个时刻的隐藏状态 h_{t-1}

输出新的隐藏状态 h_t

h_t = tanh(W_x * x_t + W_h * h_{t-1} + b)

这个隐藏状态 h_t 既作为当前的输出,也会作为下一时刻的“记忆”,传递下去。

因此,RNN 可以把序列中的每一个时间步都串联起来,实现“有记忆的序列建模”。

2.2. RNN 的梯度消失与爆炸问题

理论上,RNN 可以处理任意长度的序列,因为它有循环机制来“记住”过去的信息。

但在实际训练中,随着时间步增多,RNN 容易出现两种现象:

  • 梯度消失(Vanishing Gradient):误差信号在反向传播过程中不断变小,前面时间步的参数无法有效更新。

  • 梯度爆炸(Exploding Gradient):部分路径上梯度不断放大,导致模型参数剧烈变化甚至发散。

这使得 RNN 在面对较长的输入序列时,难以捕捉远距离的依赖关系,模型效果大打折扣。

举个例子:你要预测一篇文章最后一句话是否表示肯定,而线索出现在文章开头。如果梯度无法传播到文章开头部分,模型就无法学到这种依赖。

虽然可以通过梯度裁剪(gradient clipping)等技术部分缓解,但这仍是 RNN 天生的结构性缺陷。

2.3. RNN的字符序列预测

我们通过 PyTorch 中的 nn.RNN 模块做一个简单演示。

任务:根据字符序列“Hell”,预测下一个字符“o”。

import torch
import torch.nn as nn
# 定义一个简单的 RNN
rnn = nn.RNN(input_size=10, hidden_size=20, num_layers=1)
# 构造输入:序列长度=5,batch_size=3,特征维度=10
input = torch.randn(5, 3, 10)
# 初始隐藏状态 h0,全零
h0 = torch.zeros(1, 3, 20)
# 前向传播output, 
hn = rnn(input, h0)

尽管代码上非常简洁,但如果字符序列过长,上述 RNN 在实际学习中会遇到我们提到的梯度问题。

3. LSTM 基本结构

3.1. LSTM 的整体结构

LSTM 与传统 RNN 相比,在每一个时间步 t,不仅维护一个隐藏状态 h_t,还引入了一个长期记忆单元 c_t。信息的传递和更新通过一系列“门”来控制。

LSTM 的核心结构如下:

  • 遗忘门(Forget Gate)

  • 输入门(Input Gate)

  • 候选记忆(Candidate Memory)

  • 单元状态更新(Cell State Update)

  • 输出门(Output Gate)

我们可以用如下图解来展示整个信息流动过程:

(此处插入图示:LSTM 单元结构图,含门控与状态流程)

3.2. LSTM 的数学公式推导

下面我们一步步分析每个公式代表的含义和背后的机制。设:

  • 当前输入:x_t

  • 上一时刻的隐藏状态:h_{t-1}

  • 上一时刻的细胞状态(长期记忆):c_{t-1}

我们会将 x_th_{t-1} 拼接为一个整体 [h_{t-1}, x_t],然后分别输入到不同的门中。

步骤 1:遗忘门(Forget Gate)
f_t = σ(W_f·[h_{t−1}, x_t] + b_f)

解释:

  • 越接近 1,表示“保留”;越接近 0,表示“忘记”。

  • W_f遗忘门的权重矩阵,作用是将 [h_{t−1}, x_t] 映射为隐藏状态大小 H 的向量(维度 [H, H+D]

  • [h_{t−1}, x_t]:将上一隐藏状态与当前输入拼接起来(维度 [H+D]

  • b_f:遗忘门的偏置项(维度 [H]

  • σ:Sigmoid 激活函数,输出范围为 (0, 1)这个门的输出是一个介于 0 和 1 之间的向量,表示对旧记忆 c_{t-1} 的保留程度。

  • f_t:一个“门控向量”,表示对 c_{t−1} 的保留程度。越接近 1,表示“记住”;越接近 0,表示“忘掉”。

步骤 2:输入门(Input Gate)
i_t = σ(W_i·[h_{t−1}, x_t] + b_i)

解释:

  • 输入门决定新信息 ĉ_t 要写入多少到当前的 Cell 状态中。

  • 它也是一个 0~1 的门控向量。

步骤 3:候选记忆(Candidate Memory)
ĉ_t = tanh(W_c·[h_{t−1}, x_t] + b_c)

解释:

  • 这是准备写入 Cell 状态的“新候选内容”。

  • tanh 将输出值限制在 -1 到 1,形成一个“新记忆提案”。

步骤 4:更新细胞状态(Cell State Update)
c_t = f_t * c_{t−1} + i_t * ĉ_t

解释:

  • f_t * c_{t−1} 表示:保留一部分旧的记忆。

  • i_t * ĉ_t 表示:写入一部分新的候选记忆。

  • 两部分相加形成新的长期记忆 c_t

步骤 5:输出门(Output Gate)
o_t = σ(W_o·[h_{t−1}, x_t] + b_o)

解释:

  • 输出门决定当前要输出多少内容。
步骤 6:输出隐藏状态(Hidden State)
h_t = o_t * tanh(c_t)

解释:

  • 将当前记忆 c_t 激活后,乘以输出门 o_t,生成新的隐藏状态 h_t

  • 这个 h_t 不仅是本时刻的输出,也会传递给下一时刻。

总结:
LSTM 通过三个门(遗忘、输入、输出)和一个记忆状态 c_t,实现对信息的智能选择性控制。

3.3. 信息流动的直觉理解

你可以把 LSTM 想成一个“智能记忆盒”:它根据上下文不断决定:该记住什么、该忘记什么、该输出什么。

  • 遗忘门像是“橡皮”,决定擦掉多少旧记忆

  • 输入门像是“笔”,决定写入多少新内容

  • 输出门像是“窗口”,决定展示多少内部记忆

因此,LSTM 在长序列任务中能保留关键的远程信息,而不会像传统 RNN 那样迅速遗忘。

在这里插入图片描述

4. LSTM 的信息流动过程

在 LSTM 网络中,信息的传递不仅仅是一次简单的前向传播。LSTM 的设计核心在于其精巧的 门控机制,它使得网络能够有选择地记住或遗忘信息,从而解决传统 RNN 在长序列中遇到的梯度消失问题。下面我们依次拆解每一个关键步骤,带你理解信息是如何一步步被处理、保留和传递的。

4.1. 输入到状态的传递机制

每一个时间步(time step)t,LSTM 接收两个主要输入:

  • 当前时刻的输入向量 xt​

  • 上一个时间步的隐藏状态 ht−1​

但与传统 RNN 不同的是,LSTM 还有一个额外的 记忆单元状态 ct−1​,它像一条“传送带”一样横贯整个序列,在每一步都参与运算。

在当前时刻 t,LSTM 会做以下几件事:

  • 结合 xt​ 和 ht−1​,通过三组门结构决定:保留多少旧信息、添加多少新信息、以及输出多少当前信息。

  • 根据这些门控的结果,更新记忆状态 ct​,并计算新的隐藏状态 ht​。

这相当于一次“加工”,旧的信息经过一层层筛选和增强,变成新的状态,继续传递给下一个时刻。

4.2. 遗忘门:决定“记住”还是“忘掉”

LSTM 的第一个门叫做 遗忘门(Forget Gate),它负责决定之前的记忆(ct−1​)中,有多少内容需要保留、多少需要遗忘。

遗忘门的公式如下:

ft​=σ(Wf​⋅[ht−1​,xt​]+bf​)

这里:

  • ft​ 是遗忘门的输出,取值在 0 到 1 之间,维度与 ct−1​ 相同。

  • σ 是 sigmoid 函数,可以将值压缩到 (0,1) 区间。

  • 当某个元素接近 0,表示“忘掉”;接近 1,表示“保留”。

通过与旧的记忆状态相乘:

ct​=ft​⊙ct−1​

就实现了“有选择地忘记”。

4.3. 输入门:控制新信息的加入

仅仅忘记还不够,我们还需要从当前输入中提取有用的信息,加入到记忆中,这就是 输入门(Input Gate) 的职责。

输入门有两个组成部分:

  • 输入门值 it​,决定“是否允许新信息进入”;

  • 候选记忆值 c~t​,是当前输入下提取出来的“新知识”。

具体计算如下:

it​=σ(Wi​⋅[ht−1​,xt​]+bi​) c~t​=tanh(Wc​⋅[ht−1​,xt​]+bc​)

最终,新的记忆状态更新为:

ct​=ft​⊙ct−1​+it​⊙c~t​

也就是说:旧的记忆部分地遗忘,同时也部分地加入了新的知识。

4.4. 输出门:决定“输出什么”给下一层

现在我们已经更新了记忆单元 ct​,但我们并不会直接把它作为输出传递出去。LSTM 还会经过一个 输出门(Output Gate),它负责从记忆中选出当前需要输出的部分。

计算如下:

ot​=σ(Wo​⋅[ht−1​,xt​]+bo​) ht​=ot​⊙tanh(ct​)

注意这里的 ht​ 才是最终输出,它既保留了记忆状态中的信息,又经过了一层筛选(输出门)。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勤奋的知更鸟

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值