欢迎来到雲闪世界。欢迎来到深度学习图解之旅的第 5 部分!
今天,我们将讨论长短期记忆 (LSTM) 网络,它是上一篇文章中讨论过的常规循环神经网络 (RNN) 的升级版。我们看到,RNN 用于解决基于序列的问题,但难以在长距离上保留信息,从而导致短期记忆问题。这时,LSTM 可以拯救这一问题。它们使用与 RNN 相同的循环特性,但略有不同。让我们看看它们是如何实现这一点的。
旁注 — — 这是我写过的最喜欢的文章之一,所以我迫不及待地想带你踏上这段旅程!
我们先来看看之前 RNN 中发生了什么。我们有一个神经网络,它有一个输入x,一个隐藏层,该层由一个具有 tanh 激活函数的神经元和一个具有 sigmoid 激活函数的输出神经元组成。因此,RNN 的第一步看起来像这样:
术语 segue: 我们将每个步骤称为隐藏状态。因此,以上是我们的 RNN 的第一个隐藏状态。
在这里,我们首先将第一个输入x ₁传递给隐藏神经元以获得h₁ 。
![](https://i-blog.csdnimg.cn/direct/518e1be49b974db3847bc065eb1ff27e.png)
现在我们有两个选择:
(选项 1)将此h₁ 传递给输出神经元,仅使用这一个输入即可获得预测。从数学上讲:
![](https://i-blog.csdnimg.cn/direct/a6b9269d00a0468d87856a99ca89924a.png)
(选项 2)将此h₁ 传递到下一个隐藏状态,通过将此值传递到下一个网络的隐藏神经元。
因此第二个隐藏状态将如下所示:
![](https://i-blog.csdnimg.cn/direct/61bde8b7bf1a4f6098291b90213dcdda.png)
在这里,我们从第一个网络中的隐藏神经元获取输出,并将其与第二个输入x₂ 一起传递给当前网络中的隐藏神经元。这样做会给我们第二个隐藏层输出h₂ 。
![](https://i-blog.csdnimg.cn/direct/90af3f2c414e473f91368d21518db76b.png)
再次,从这里我们可以用h₂做两件事:
(选项 1)将其传递给输出神经元,以获得第一个 x ₁ 和第二个x₂的结果预测。
![](https://i-blog.csdnimg.cn/direct/4d8df67c49dd4159a5d2bc7003cf1361.png)
(选项 2)或者我们简单地将其按原样传递到下一个网络。
这个过程持续进行,每个状态都会从前一个网络的隐藏神经元获取输出(与新输入一起),并将其馈送到当前状态的隐藏神经元,从而生成当前隐藏层的输出。然后,我们可以将此输出传递到下一个网络或输出神经元以产生预测。
整个过程可以用以下关键方程来描述:
尽管这种方法很简单,但它有一个局限性:当我们进入最后几步时,初始步骤的信息开始消失,因为网络无法保留大量信息。输入序列越大,这个问题就越明显。显然,我们需要一种策略来增强这种记忆。
输入 LSTM。
它们通过实施一种简单但有效的策略来实现这一点:在每一步中,它们都会丢弃输入和过去步骤中不必要的信息,有效地“忘记”不重要的信息,只保留关键信息。这有点像我们的大脑处理信息的方式 — — 我们不会记住每一个细节,而只会保留我们认为必要的细节,丢弃其余部分。
LSTM 架构
考虑我们的基本 RNN 的隐藏状态。
![](https://i-blog.csdnimg.cn/direct/98f258d596f64a91a14526c6dde44b2c.png)
我们知道每个状态都以两个参与者开始:先前的隐藏状态值h ₜ₋₁和当前输入x ₜ。最终目标是产生一个隐藏状态输出h ₜ,它可以传递到下一个隐藏状态,也可以传递到输出神经元以产生预测。
LSTM 具有类似的结构,但复杂性略有提升:
![](https://i-blog.csdnimg.cn/direct/016387fc41364d059890f923d0c03379.png)
这个图可能看起来很吓人,但实际上很直观。让我们慢慢分解一下。
我们在 RNN 中设置了两个玩家,最终目标是产生一个隐藏状态输出。现在我们一开始就有三个玩家被输入到 LSTM 中 — — 之前的长期记忆 Cₜ₋₁、之前的隐藏状态输出 hₜ₋₁ 和输入 xₜ:
最终目标是产生两个输出 — — 新的长期记忆 Cₜ 和新的隐藏状态输出 hₜ:
LSTM 的主要重点是丢弃尽可能多的不必要信息,它通过三个部分实现 -
i)忘记部分
![](https://i-blog.csdnimg.cn/direct/8d289d54876e4e89b52648155007483b.png)
ii)输入部分
![](https://i-blog.csdnimg.cn/direct/4b776299ec624d63b0fc05976980310f.png)
iii)输出部分
![](https://i-blog.csdnimg.cn/direct/5b208a505d5e4e95a9e145e01dc3d2db.png)
我们注意到它们都有一个共同的紫色细胞:
这些单元被称为门。为了决定哪些信息重要,哪些不重要,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)