深度学习图解,第 5 部分:长短期记忆 (LSTM)关于 LSTM 内部工作原理的图解和直观指南

      欢迎来到雲闪世界。欢迎来到深度学习图解之旅的第 5 部分!

       今天,我们将讨论长短期记忆 (LSTM) 网络,它是上一篇文章中讨论过的常规循环神经网络 (RNN) 的升级版。我们看到,RNN 用于解决基于序列的问题,但难以在长距离上保留信息,从而导致短期记忆问题。这时,LSTM 可以拯救这一问题。它们使用与 RNN 相同的循环特性,但略有不同。让我们看看它们是如何实现这一点的。

旁注 — — 这是我写过的最喜欢的文章之一,所以我迫不及待地想带你踏上这段旅程!

我们先来看看之前 RNN 中发生了什么。我们有一个神经网络,它有一个输入x,一个隐藏层,该层由一个具有 tanh 激活函数的神经元和一个具有 sigmoid 激活函数的输出神经元组成。因此,RNN 的第一步看起来像这样:

术语 segue: 我们将每个步骤称为隐藏状态。因此,以上是我们的 RNN 的第一个隐藏状态。

在这里,我们首先将第一个输入x传递给隐藏神经元以获得h₁ ​。

h₁ = 第一个隐藏状态输出

现在我们有两个选择:

(选项 1)将此h₁​ 传递给输出神经元,仅使用这一个输入即可获得预测。从数学上讲:

y ₁_hat = 第一个隐藏状态预测

(选项 2)将此h₁​ 传递到下一个隐藏状态,通过将此值传递到下一个网络的隐藏神经元。

因此第二个隐藏状态将如下所示:

第一和第二个隐藏状态

在这里,我们从第一个网络中的隐藏神经元获取输出,并将其与第二个输入x₂​ 一起传递给当前网络中的隐藏神经元。这样做会给我们第二个隐藏层输出h₂ ​。

h₂ = 第二个隐藏状态输出

再次,从这里我们可以用h₂做两件事:

(选项 1)将其传递给输出神经元,以获得第一个 x ₁ 和第二个x₂的结果预测。

y₂_hat = 第二个隐藏状态预测

(选项 2)或者我们简单地将其按原样传递到下一个网络。

这个过程持续进行,每个状态都会从前一个网络的隐藏神经元获取输出(与新输入一起),并将其馈送到当前状态的隐藏神经元,从而生成当前隐藏层的输出。然后,我们可以将此输出传递到下一个网络或输出神经元以产生预测。

整个过程可以用以下关键方程来描述:

       尽管这种方法很简单,但它有一个局限性:当我们进入最后几步时,初始步骤的信息开始消失,因为网络无法保留大量信息。输入序列越大,这个问题就越明显。显然,我们需要一种策略来增强这种记忆。

输入 LSTM。

它们通过实施一种简单但有效的策略来实现这一点:在每一步中,它们都会丢弃输入和过去步骤中不必要的信息,有效地“忘记”不重要的信息,只保留关键信息。这有点像我们的大脑处理信息的方式 — — 我们不会记住每一个细节,而只会保留我们认为必要的细节,丢弃其余部分。

LSTM 架构

考虑我们的基本 RNN 的隐藏状态。

RNN 的隐藏状态

我们知道每个状态都以两个参与者开始:先前的隐藏状态值h ₜ₋₁当前输入x。最终目标是产生一个隐藏状态输出h,它可以传递到下一个隐藏状态,也可以传递到输出神经元以产生预测。

LSTM 具有类似的结构,但复杂性略有提升:

LSTM 的隐藏状态

这个图可能看起来很吓人,但实际上很直观。让我们慢慢分解一下。

我们在 RNN 中设置了两个玩家,最终目标是产生一个隐藏状态输出。现在我们一开始就有三个玩家被输入到 LSTM 中 — — 之前的长期记忆 Cₜ₋₁、之前的隐藏状态输出 hₜ₋₁ 和输入 xₜ:

最终目标是产生两个输出 — — 新的长期记忆 Cₜ 和新的隐藏状态输出 hₜ:

LSTM 的主要重点是丢弃尽可能多的不必要信息,它通过三个部分实现 -

i)忘记部分

第 1 部分 — 忘记部分

ii)输入部分

第 2 部分 — 输入部分

iii)输出部分

第 3 节 — 输出部分

我们注意到它们都有一个共同的紫色细胞:

这些单元被称为门。为了决定哪些信息重要,哪些不重要,LSTM 使用这些门,它们本质上是具有 S 形激活函数的神经元。

这些门决定在各自的部分保留多少比例的信息,实际上充当着守门人的角色,只让一定比例的信息通过。

在这种情况下,使用 S 型函数是具有战略意义的,因为它输出的值范围从 0 到 1,这直接对应于我们想要保留的信息比例。例如,值为 1 表示将保留所有信息,值为 0.5 表示仅保留一半信息,值为 0 表示将丢弃所有信息。

现在让我们来看看所有这些门的公式。如果你仔细观察隐藏状态图,我们会发现它们都有相同的输入x ₜ 和h ₜ₋₁,但权重和偏差项不同。

它们都有相同的数学公式,但我们需要适当地交换权重和偏差值。

由于 S 型函数的工作原理,每个值都会产生 0 到 1 之间的值,这将决定我们想要保留每个部分中某些信息的比例。

注意: 您会注意到,我们只是使用权重的向量符号。这仅意味着我们将 xₜ 和 hₜ₋₁ 与它们各自的权重(用W表示)相乘。

忘记部分

本节的主要目的是找出我们想要忘记的长期记忆的比例。所以我们在这里所做的就是从遗忘门中获取这个比例(0–1 之间的值)……

…并将其与之前的长期记忆相乘:

此乘积为我们提供遗忘门认为重要的先前长期记忆的准确信息,并忘记其余信息。因此,遗忘门比例 fₜ 越接近 1,我们保留的先前长期记忆就越多。

注意:蓝色气泡内的“x”符号表示乘法运算。此符号在整个图表中始终使用。本质上,这些蓝色气泡表示输入经过气泡中描绘的数学运算。

输入部分

本节的主要目的是创建新的长期记忆,分为2个步骤。

(步骤 1)创建新的长期记忆候选者C(tilda) ₜ。我们利用这个神经元和tanh激活函数获得新的长期记忆候选者:

我们在这里看到,这个神经元的输入是x ₜ,​ 和h ₜ₋₁,类似于门。因此,将它们传递到神经元……

…我们得到了输出,它是新的长期记忆的候选。

现在我们只想保留候选者的必要信息。这就是输入门发挥作用的地方。我们使用从输入门获得的比例……

…通过将此输入门比例与候选者相乘,仅保留候选者的必要数据:

(步骤 2)现在为了获得最终的长期记忆,我们把决定保留在遗忘部分的旧长期记忆拿来……

…并将其添加到我们决定在此输入部分保留的新候选人数量中:

好了,我们完成了游戏的第一个任务,我们创建了一个新的长期记忆!接下来,我们需要生成一个新的隐藏状态输出。

输出部分

本节的主要目的是创建一个新的隐藏状态输出。这很简单。我们在这里所做的就是获取新的长期记忆 Cₜ,并将其传递给tanh函数……

…然后将其与输出门比例相乘…

新的隐藏状态输出

…这给了我们新的隐藏状态输出!

就这样,我们完成了第二项任务 — — 产生一个新的隐藏状态输出!

现在我们可以将这些新的输出传递到下一个隐藏状态,以再次重复相同的过程。

我们还看到每个隐藏状态都有一个输出神经元:

就像在 RNN 中一样,每个状态都可以产生各自的输出。与 RNN 类似,我们使用隐藏状态输出 hₜ 来产生预测。因此将 hₜ 传递给输出神经元……

…我们得到了这个隐藏状态的预测!

   到此结束。正如我们所见,LSTM 通过更好地处理序列数据中的长期依赖关系,将 RNN 提升到了一个新的水平。我们看到 LSTM 如何巧妙地保留重要信息并丢弃无关信息,就像我们的大脑一样。这种记住扩展序列中重要细节的能力使 LSTM 在自然语言处理、语音识别和时间序列预测等任务中特别有用。

感谢关注雲闪世界​​​​​​​。(亚马逊aws谷歌GCP服务​​​​​​​协助解决云计算及产业相关解决方案)


 订阅频道(https://t.me/awsgoogvps_Host)
 TG交流群(t.me/awsgoogvpsHost)

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 02:36:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 02:36:02       102 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 02:36:02       83 阅读
  4. Python语言-面向对象

    2024-07-22 02:36:02       92 阅读

热门阅读

  1. Windows图形界面(GUI)-DLG-C/C++ - 列表视图(ListView)

    2024-07-22 02:36:02       27 阅读
  2. 大规模语言模型从理论到实践 高效模型微调

    2024-07-22 02:36:02       25 阅读
  3. [11 Qt CMake开发]

    2024-07-22 02:36:02       25 阅读
  4. 显示隐式-》初始化 & 类型转换

    2024-07-22 02:36:02       24 阅读
  5. ReentrantLock源码

    2024-07-22 02:36:02       25 阅读
  6. 向量数据库Milvus

    2024-07-22 02:36:02       30 阅读
  7. 在 ASP.NET Core Web API 中实现审计跟踪

    2024-07-22 02:36:02       20 阅读
  8. leetcode-56. 合并区间

    2024-07-22 02:36:02       23 阅读
  9. 后端开发: 如何去使用公共组件

    2024-07-22 02:36:02       23 阅读
  10. 初步认识css(1)

    2024-07-22 02:36:02       22 阅读