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 的基础上,做了如下关键增强:
-
引入了一个“单元状态(Cell State)”作为长期记忆通道,类似一条传送带,可以让信息跨时间传播而不容易被遗忘。
-
使用了门控机制(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)
我们可以用如下图解来展示整个信息流动过程:

3.2. LSTM 的数学公式推导
下面我们一步步分析每个公式代表的含义和背后的机制。设:
-
当前输入:
x_t -
上一时刻的隐藏状态:
h_{t-1} -
上一时刻的细胞状态(长期记忆):
c_{t-1}
我们会将 x_t 和 h_{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 才是最终输出,它既保留了记忆状态中的信息,又经过了一层筛选(输出门)。

最低0.47元/天 解锁文章
718

被折叠的 条评论
为什么被折叠?



