手把手人工神经网络系列(五):长短期记忆网络(LSTM)
温馨提示:若页面不能正常显示数学公式和代码,请阅读原文获得更好的阅读体验。
作者: 朱宁馨 (日本立命馆大学)
邮箱: nr1349hi@ed.ritsumei.ac.jp
编者按:本文主要摘译自下文,特此感谢!
Source:Shreya Rao, 2024, Blog, Deep Learning Illustrated, Part 5: Long Short-Term Memory (LSTM). Link
- Title: 手把手人工神经网络系列(五):长短期记忆网络(LSTM)
- Keywords: 循环神经网络, RNN, 细胞状态, Cell State, 门控机制, 遗忘门, LSTM, Long Short-Term Memory
专题:手把手人工神经网络 系列推文
假设我们现在有一段文本:"今天我去餐厅吃饭,菜很好吃,但是排队时间有一点长。"这句话是好评,还是差评?
人类在理解这类句子时,会综合考虑整句中的转折关系以及先后出现的评价信息。但如果把这句话扔给模型,结果就未必如此了。普通神经网络或简单循环神经网络(Recurrent Neural Networks,RNN)往往只能关注到最近的几个词,对很早出现的关键信息难以保留——这就是典型的长期依赖问题。
要得到我们真正想要的答案,模型应该像一个认真吃饭、边吃边总结的顾客:能把前面发生过的重要事情记到后面去;遇到转折词时,能更新自己的看法;还能把一些不那么重要的小细节慢慢遗忘掉,不然记忆会被塞爆。
为了解决这种"既要记住长远,又不能什么都记"的问题,人们在循环神经网络的基础上加了一个"记忆模块"和一套"门控机制",这就是本文的主角:长短期记忆网络(LSTM,Long Short-Term Memory)。
1. 回顾:RNN 之前在做什么?
RNN 的核心是其循环结构:在每一个时间步,网络不仅接收当前输入,还接收前一时间步的隐藏状态。正是这一设计,使得网络能够记住并利用之前的信息。
考虑一个最简单的网络:输入是 xx,隐藏层只有一个使用 tanhtanh 激活函数的神经元,输出层只有一个使用 sigmoidsigmoid 激活函数的神经元。RNN 的第一步如下图所示:

我们把每一个这样的步骤称为一个隐藏状态(hidden state),上图就是这个 RNN 的第一个隐藏状态。在这里,我们把第一个输入 x1x1 传入隐藏层神经元,得到:
h1=tanh(wx⋅x1+bh)h1=tanh(wx⋅x1+bh)
从这里开始,我们有两种选择。
(选项 1) 把 h1h1 传给输出层神经元,只用这一个输入做一次预测:
y^1=sigmoid(wy⋅h1+by)y^1=sigmoid(wy⋅h1+by)
其中,y^1y^1 是第一个隐藏状态对应的预测值。
(选项 2) 把 h1h1 传给下一个隐藏状态,作为下一步的输入之一。第二个隐藏状态如下图所示:

在这里,我们把第一个隐藏神经元的输出 h1h1 和第二个输入 x2x2 一起喂给当前的隐藏神经元,得到第二个隐藏状态的输出:
h2=tanh(wh⋅h1+wx⋅x2+bh)h2=tanh(wh⋅h1+wx⋅x2+bh)
同样地,对 h2h2 我们也可以做两件事:
(选项 1) 把它传给输出神经元做一次预测。这次的预测是 x1x1 和 x2x2 综合作用的结果:
y^2=sigmoid(wy⋅h2+by)y^2=sigmoid(wy⋅h2+by)
(选项 2) 把它原封不动地传给下一个隐藏状态。
这个过程会一直持续下去:每个状态拿到前一个隐藏神经元的输出,再加上当前的新输入,生成当前隐藏层的输出;这个输出既可以传给下一个状态,也可以传给输出神经元生成预测。

整个过程可以用两条公式概括:
ht=tanh(wh⋅ht−1+wx⋅xt+bh)ht=tanh(wh⋅ht−1+wx⋅xt+bh)
y^t=sigmoid(wy⋅ht+by)y^t=sigmoid(wy⋅ht+by)
这个方法看上去很简单,但有一个局限:走到序列后面的步骤时,前面步骤的信息会逐渐"褪色",因为网络没能保留住足够多的早期信息。输入序列越长,问题越明显。显然,我们需要一个办法来增强这种"记忆能力"。
2. LSTM 登场
LSTM 并没有推倒重来:它保留了 RNN 的循环骨架,只是在每个隐藏状态内部动了点手脚。它的策略简单而有效:在每一步,它会从当前输入和以往步骤中丢弃不必要的信息——"忘掉"不重要的内容,只保留真正关键的部分。这有点像我们大脑处理信息的方式:我们不会记住每一个细节,只会记住对自己来说必要的部分,其余的就丢掉了。
LSTM 的核心是引入了一个细胞状态(Cell State),记作 CtCt,也称为"长期记忆",并通过三个门控(Gate)机制来精细控制信息在细胞状态中的流动:
- 细胞状态(Cell State):像一条"传送带",贯穿整个链条。信息可以在上面轻松流动,且每一步只有少量的线性操作,因此能以较小的衰减被保留下来——这正是 LSTM 解决长期依赖问题的关键。
- 遗忘门(Forget Gate):决定要忘记哪些信息,即从上一时刻的细胞状态 Ct−1Ct−1 中丢弃多少内容。
- 输入门(Input Gate):决定要记住哪些新信息,即当前输入 xtxt 和上一时刻的隐藏状态 ht−1ht−1 中有多少新信息流入细胞状态。
- 输出门(Output Gate):决定输出哪些信息,即细胞状态 CtCt 中哪些内容被用于计算当前时刻的隐藏状态 htht。
通过这三个门的控制,LSTM 能够在时间序列数据中选择性地记住和忘记信息,从而在需要的时候精确地做出预测或分类。
2.1 LSTM 的结构
先回看基础 RNN 的某一个隐藏状态:

每个状态一开始有两个"参与者"——前一时刻的隐藏状态 ht−1ht−1 和当前输入 xtxt,最终目标是产生一个新的隐藏状态输出 htht,传给下一个隐藏状态,或传给输出神经元做预测。
LSTM 的结构与此类似,但复杂度略高一点:

这个图看起来很复杂,但其实很直观。接下来我们拆开分步骤看。
在 RNN 里,一开始只有两个参与者;而在 LSTM 里,一开始有三个输入:之前的长期记忆 Ct−1Ct−1、之前的隐藏状态输出 ht−1ht−1、当前输入 xtxt。

最终要产生两个输出:新的长期记忆 CtCt 和新的隐藏状态输出 htht。

LSTM 的主要目标是尽可能丢弃掉不必要的信息,它通过三个"模块"来完成这件事:
- 遗忘模块(forget section)

- 输入模块(input section)

- 输出模块(output section)

我们会发现,这三个模块里都有一个共同的紫色小方块:
更多推荐



所有评论(0)