在之前的博文中,我们介绍了循环神经网络的长程依赖问题及改进方案,可以参考:循环神经网络 - 长程依赖问题及改进方案-CSDN博客
但是改进方案只是可以缓解梯度消失,并不能彻底解决梯度爆炸问题和记忆容量(Memory Capacity)问题。
长短期记忆网络(Long Short-Term Memory Network,LSTM)是循环神经网络的一个变体,可以有效地解决简单循环神经网络的梯度爆炸或消失问题。
在普通 RNN 中,由于每一步的隐藏状态只通过简单的递归更新,长时间以来传递的梯度可能会迅速消失或爆炸,导致模型无法捕捉长距离依赖。LSTM 通过引入记忆单元 c_t 和门控机制,将信息在时间步之间直接传递,且引入了"跳跃"连接(将 c_{t-1} 直接影响 ct 经过线性组合而非多次非线性变换),这样就能更稳定地传递梯度信息,捕捉长程依赖。具体来说:
-
遗忘门 控制过去的记忆保留程度;
-
输入门与候选记忆 决定如何加入新信息;
-
输出门 决定如何输出对后续步骤有用的信息。
这种设计有效减弱了反向传播过程中梯度消失或爆炸的问题,使得 LSTM 能够记住和利用长时间跨度中的关键信息,这正是许多语言模型、语音处理和其他序列数据任务中的核心需求。
本文,我们来认识长短期记忆网络的相关概念,探究一下其解决梯度爆炸或消失的原理。
长短期记忆网络(LSTM)的内部状态主要指其"记忆细胞"(cell state,通常记为 c_t)以及与之相关的隐藏状态(hidden state,通常记为 h_t)。这两个状态共同决定了 LSTM 如何存储、传递和更新信息,使其能够捕获长程依赖。下面通过语言描述 LSTM 内部状态的构成、更新机制及其关键作用。
1. 内部状态的构成
-
记忆单元(Cell State c_t)
记忆单元是 LSTM 的核心,它像一条传送带,沿着整个序列传递信息。其主要作用是保持长期信息,并且通过特定的门控机制有选择地"遗忘"或者"保留"信息。由于这种传递过程主要依靠乘法操作(例如和遗忘门 f_t 相乘),可以在一定程度上减缓梯度消失的问题。
-
隐藏状态(Hidden State h_t)
隐藏状态可以被看作是当前时刻对外的输出,也是在当前时间步经过非线性激活(通常是 tanh)处理后的记忆状态。它既包含了长期记忆 c_t 的信息,也反映了对当前输入的即时响应。隐藏状态经过输出门 o_t 的调制之后,是最终传递给下一层或后续运算的信号。
2. 内部状态的更新机制
LSTM 通过三个门来更新内部状态,它们分别是:
-
遗忘门(Forget Gate)
遗忘门决定了保留上一时刻记忆单元 c_{t-1} 中哪些信息。
数学表达:
其中 σ 是 sigmoid 函数,其输出在 [0,1] 之间。输出值越接近 1,表示对应维度的信息越应该保留,反之则"遗忘"。
-
输入门(Input Gate)
输入门决定了当前输入 x_t 中哪些新信息以及通过候选记忆
将加入到记忆单元中。
数学表达:
-
记忆单元更新
最后,新的记忆单元 c_t 通过结合遗忘门与输入门的作用得到更新:
这里"⊙"表示逐元素相乘。这意味着,上一时刻的记忆经过遗忘门滤波后和新生成的信息按比例混合,从而构成当前的记忆单元。
-
输出门(Output Gate)
输出门决定了如何从记忆单元中提取信息生成当前的隐藏状态:
最终得到隐藏状态:
3. 举例说明
设想一个简单的文本生成任务------例如生成一句话。假设模型需要捕获长句子中前后字符之间的依赖关系。在处理输入"今天天气很好"时:
-
当模型接收到"今天"时,会在记忆单元 c_t 中保存与"今天"相关的信息(比如时间概念)。
-
接下来,当输入"天气"时,遗忘门 f_t 控制是否保留"今天"的信息,同时输入门 i_t 选择性地将与"天气"相关的新特征加入记忆单元。
-
当进一步输入"很好"时,记忆单元中的"今天"和"天气"信息经由输出门调制,影响最终隐藏状态 h_t 的计算,进而帮助模型生成连贯的输出。
在这个过程中,整个句子中远距离("今天"与"很好"之间)的依赖通过记忆单元传递,LSTM 的三个门结构允许模型有选择地更新和维持这些信息。尽管内部使用的激活函数(如 sigmoid 和 tanh)本身很简单,但通过逐层的线性变换与非线性激活的复合,LSTM 能够捕捉和表达复杂的语义依赖关系,支持长程信息的有效传递。
4. 关键理解
-
记忆单元 c_t 是信息的长期存储器,可以跨越多个时间步稳定传递关键信息。
-
门控机制(遗忘门、输入门、输出门)决定了信息如何在各个时间步之间选择性地保留或更新。
-
隐藏状态 h_t 则是经过记忆单元筛选和调制后的信息,供下一层或下一时间步使用。
5. 对于候选记忆的理解
在长短期记忆网络(LSTM)中,"候选记忆"指的是在当前时间步下,根据输入和前一隐藏状态生成的一组新信息,用来在更新记忆单元时候选加入到长期记忆中的数据。它通常用符号 表示,计算公式为:

这里,表示将前一时刻的隐藏状态和当前输入拼接在一起,经过一个线性变换(由权重矩阵 W_c 和偏置 b_c 定义)后,再通过 tanh 激活函数映射到区间 [−1,1] 内,就得到了"候选记忆"。
为什么需要候选记忆?
候选记忆的作用在于:
-
提供新信息的备选项:当前时间步的输入常常携带有新的信息,候选记忆就是对这些新信息的一种初步加工和表示。但新信息不是全部都适合直接加入到长期记忆中。
-
由输入门决定是否更新:在 LSTM 中,还有一个输入门(Input Gate),其计算公式为:
输入门 i_t 的值(介于0和1之间)将会与候选记忆逐元素相乘,形成对记忆单元的增量更新:
这意味着,对于候选记忆中的每个元素,如果输入门对应的数值较大(接近1),那么该部分候选信息将被更多地写入到长期记忆;如果较小(接近0),则该部分新信息基本被忽略。
举例说明
假设你正利用 LSTM 处理一句话:"我爱自然语言处理"。我们来看一下某个时间步的情况:
-
前一时刻隐含状态h_{t-1}
假设在处理到"爱"这个词时,隐藏状态已经捕捉到了前面"我爱"这部分的语义信息,即可以表示为 h_{t-1}。
-
当前输入 x_t
当前输入为"自然语言处理"中某个字符或词的表示,这个表示包含了与当前新信息相关的语义特征。
-
候选记忆计算
这里,0.8 可能表示当前输入中对于"自然"这个概念的一个强烈信号,-0.3 表示某些信息的负面特征,而 0.4 表示另一个中等程度的特征。
-
输入门的作用
同时,输入门 i_t 计算出的向量决定了候选记忆哪些部分真正被写入记忆单元。如果 i_t 计算得到:
则实际更新记忆单元的增量就是逐元素相乘:
这表示,记忆单元在这一时刻将吸收主要来自候选记忆的 0.72 和 0.28 两个分量,而将 -0.06 的新信息(可视为低权重或噪声)几乎忽略掉。
-
整体更新
最终,记忆单元 c_t 的更新会结合上一时刻保留的信息(由遗忘门控制)与这一时刻更新的信息:
这样,就构成了 LSTM 内部记忆状态的动态更新。
-
候选记忆是对当前输入与前一隐藏状态进行线性组合和非线性映射后的"新信息"表示,它代表了当前时刻可以加入到长期记忆中的潜在内容。
-
输入门决定最终哪些候选信息真正更新进记忆单元。
-
举例中,通过具体向量的生成、输入门的筛选、以及逐元素相乘,展示了候选记忆如何帮助 LSTM 有选择地吸收新输入的信息,从而逐步构建出对长程信息的有效记忆。
这种设计使得 LSTM 能够在动态更新中捕捉到句子、语音或其他序列数据中复杂、非线性的长期依赖关系,而候选记忆作为一种临时的备选信息起到了关键作用。
即使网络中的激活函数和门机制看似简单,通过不断的层级组合以及权重参数的学习,LSTM 能在整个序列上捕捉和表达复杂的长期依赖和非线性关系,这正是其在自然语言处理、语音识别、时间序列预测等任务中大放异彩的原因。
这样的内部状态设计正是 LSTM 能够"记住"关键信息,同时对无用信息进行"忘记",从而有效解决传统 RNN 长程依赖问题的核心所在。