温馨提示:若页面不能正常显示数学公式和代码,请阅读原文获得更好的阅读体验。

作者: 朱宁馨 (日本立命馆大学)
邮箱: 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,隐藏层只有一个使用 tanh⁡tanh 激活函数的神经元,输出层只有一个使用 sigmoidsigmoid 激活函数的神经元。RNN 的第一步如下图所示:

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) 把它原封不动地传给下一个隐藏状态。

这个过程会一直持续下去:每个状态拿到前一个隐藏神经元的输出,再加上当前的新输入,生成当前隐藏层的输出;这个输出既可以传给下一个状态,也可以传给输出神经元生成预测。

选项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 的某一个隐藏状态:

RNN的某一个隐藏状态

每个状态一开始有两个"参与者"——前一时刻的隐藏状态 ht−1ht−1​ 和当前输入 xtxt​,最终目标是产生一个新的隐藏状态输出 htht​,传给下一个隐藏状态,或传给输出神经元做预测。

LSTM 的结构与此类似,但复杂度略高一点:

LSTM结构

这个图看起来很复杂,但其实很直观。接下来我们拆开分步骤看。

在 RNN 里,一开始只有两个参与者;而在 LSTM 里,一开始有三个输入:之前的长期记忆 Ct−1Ct−1​、之前的隐藏状态输出 ht−1ht−1​、当前输入 xtxt​。

LSTM输入

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

LSTM输出

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

  • 遗忘模块(forget section)

遗忘模块

  • 输入模块(input section)

输入模块

  • 输出模块(output section)

输出模块

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

温馨提示:若页面不能正常显示数学公式和代码,请阅读原文获得更好的阅读体验。

Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐