深度学习图解,第五部分:长短期记忆(LSTM)

原文:towardsdatascience.com/deep-learning-illustrated-part-5-long-short-term-memory-lstm-d379fbbc9bc6

欢迎来到我们深度学习图解系列的第五部分!

深度学习,图解

今天我们将讨论长短期记忆(LSTM)网络,它是我们之前在上一篇文章中讨论的常规循环神经网络(RNN)的升级版。我们了解到 RNN 用于解决基于序列的问题,但在长距离信息保持方面存在困难,导致短期记忆问题。正是在这里,LSTMs 出现以拯救这一天。它们使用与 RNN 相同的循环方面,但有所变化。那么让我们看看它们是如何实现这一点的。

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


首先,让我们看看之前我们的 RNN 发生了什么。我们有一个输入x的神经网络,一个包含一个具有 tanh 激活函数的神经元的一个隐藏层,以及一个具有 sigmoid 激活函数的输出神经元。所以 RNN 的第一步看起来大概是这样的:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/fbc55190c3e4e0e78890a8d2b46a4dd7.png

**术语过渡:**我们将每个步骤称为一个隐藏状态。所以上面的是我们 RNN 的第一个隐藏状态。

在这里,我们首先将我们的第一个输入,_x,传递给隐藏神经元以得到h₁

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/fd143c61f5764893f5a00edfac3c397b.png

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

从这里我们有两个选择:

(选项 1)将这个h₁传递给输出神经元,仅使用这个一个输入来得到一个预测。数学上表示为:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/9e55df7e021eac17bca07203bec0ab34.png

y_₁hat = 第一个隐藏状态预测

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

所以第二个隐藏状态看起来会是这样:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a5a35ffb60ccd12a2966569edc9f7227.png

第一个和第二个隐藏状态

在这里,我们将第一个网络的隐藏神经元的输出传递到当前网络的隐藏神经元,同时传递第二个输入,x₂。这样做给我们带来了第二个隐藏层输出,h₂

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/284dd0d52b382bd9b48956d7d8fd5b93.png

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

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

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

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f9ffbe0ae49efeafda140864e2a394b2.png

y_₂hat = 第二个隐藏状态预测

(选项 2) 或者我们直接将其传递到下一个网络。

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

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f40d44a6419ab5f39d1019586276ff23.png

整个过程可以通过这些关键方程来捕捉:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/03cf66d99e1c45ba7981714e9712b105.png

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

这就是 LSTM 的作用。

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

LSTM 架构

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

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/7bd37b337b1b30c32a23b9937bc1e97f.png

RNN 的隐藏状态

我们知道每个状态都始于两个玩家:前一个隐藏状态值 _h_ₜ₋₁当前输入 _x_ₜ。最终目标是生成一个 隐藏状态输出 _h_ₜ,它可以传递到下一个隐藏状态,或者传递到输出神经元以生成预测。

LSTM 具有类似的结构,但复杂度略有提高:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/941b77ef3c261e938cebe90bbc9b7733.png

LSTM 的隐藏状态

这个图表可能看起来令人畏惧,但实际上是直观的。让我们慢慢分析它。

在 RNN 中,我们有两个玩家,目标是生成隐藏状态输出。现在我们在 LSTM 的开始时有三个玩家输入——前一个长期记忆 Cₜ₋₁、前一个隐藏状态输出 hₜ₋₁ 和输入 xₜ:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/c3bd726d24fefc0096a8c11bafca58a9.png

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

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/69ea000ea9c86ddfc3805d50c1e0253f.png

LSTM 的主要重点是尽可能丢弃不必要的信息,它在三个部分中实现这一目标——

i) 忘记部分

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/3471aa7e9878f57a1227712936fba225.png

第一部分 – 忘记部分

ii) 输入部分

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/22442736f679359cf645a541d9bf0f43.png

第二部分 – 输入部分

iii) 以及输出部分

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/642b69a65ea664b20c0c147b5687a4d8.png

第三部分 – 输出部分

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

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/655d7c36a6c2546bdcb142bace8be2fb.png

这些细胞被称为门。为了决定哪些信息是重要的,哪些不是,LSTMs 使用这些门,这些门实际上是具有 Sigmoid 激活函数的神经元。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/09377e048c0bc7b58596e6f8d14045d7.png

这些门决定了它们各自部分中要保留的信息比例,实际上充当了门卫,只允许一定比例的信息通过。

在这个上下文中使用 Sigmoid 函数是策略性的,因为它输出的值介于 0 到 1 之间,这直接对应于我们打算保留的信息比例。例如,值为 1 表示所有信息都将被保留,值为 0.5 表示只有一半的信息将被保留,而值为 0 表示所有信息都将被丢弃。

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

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/7ccf5862d755b54b2c6b695be273f88b.png

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

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/3f5ad780ff13e4c79ebca286c034913d.png

这些都会产生介于 0 到 1 之间的值,因为这就是 Sigmoid 函数的工作方式,这将决定我们想要在每个部分中保留哪些信息的比例。

注意:**在这里,你会注意到我们只是在使用权重的向量表示。这意味着我们将用W表示的相应权重乘以 xₜ和 hₜ₋₁。

忘记部分

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/3471aa7e9878f57a1227712936fba225.png

本节的主要目的是确定我们想要忘记长期记忆中的多少比例。因此,我们在这里所做的一切就是从这个比例(一个 0 到 1 之间的值)中取出忘记门…

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/8c7161a9018da5c37415913da207453f.png

…然后将它与先前的长期记忆相乘:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/7cbb1ce3c4542304b6b2d18bb758fbeb.png

**这个乘积给出了忘记门认为重要的确切先前长期记忆,并忘记了其余部分。**所以忘记门的比例 fₜ越接近 1,我们保留的先前长期记忆就越多。

注意:蓝色气泡内的“x”符号表示乘法操作。这种表示法在图中是一致的。本质上,这些蓝色气泡表示输入将受到气泡中描述的数学运算的影响。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/cb37b3503f433d9e5d9b2d5459ac9906.png

输入部分

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/22442736f679359cf645a541d9bf0f43.png

本节的主要目的是创建一个新的长期记忆,这分为两个步骤来完成。

(步骤 1) 创建一个新长期记忆的候选者,记作 _C(tilde)_ₜ。我们使用具有 tanh 激活函数的神经元来获取这个新长期记忆的候选者:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/5e368ecd5668b62d2507b17eed470876.png

我们在这里看到这个神经元的输入是 _x_ₜ 和 _h_ₜ₋₁,类似于门。所以,将它们通过神经元…

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a493040d23c2ba9a4ce496c0a4e92977.png

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

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

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/37588bb11c7252820590e35ee3541bb3.png

…通过将这个输入门的系数与候选者相乘来保留必要的候选数据:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/6df713a7c9c518f7dc065f38c88cb5b2.png

(步骤 2) 现在为了得到最终的长期记忆,我们取之前在遗忘部分决定保留的旧长期记忆…

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/7cbb1ce3c4542304b6b2d18bb758fbeb.png

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

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b090025749c5697e5d5f70f05d7d9366.png

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

输出部分

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/642b69a65ea664b20c0c147b5687a4d8.png

这一部分的主要目的是创建一个新的隐藏状态输出。这相当直接。我们在这里所做的一切只是取新的长期记忆 Cₜ,通过 tanh 函数传递它…

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a498d0772f77c15a5f34e0c1206c2ee1.png

…然后乘以输出门的系数…

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d321eef9a9e0155ecd9700409f7be2e6.png

新的隐藏状态输出

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

就这样,我们完成了任务 2 – 生成新的隐藏状态输出!

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

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/db37c71bffb2edf2f2b9118f4928c24e.png

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

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/e8f28d584d1291c7f5626c0f096c729c.png

就像在 RNN 中一样,每个状态都可以产生自己的独立输出。并且类似于 RNNs,我们使用隐藏状态输出 hₜ 来产生预测。所以将 hₜ 传递到输出神经元…

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/c57a4f319b45e168ee654a14577b4dd3.png

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

这样就完成了。正如我们所见,LSTMs 通过更好地处理序列数据中的长期依赖,将 RNNs 推向了新的高度。我们看到了 LSTMs 如何巧妙地保留关键信息并丢弃无关信息,就像我们的大脑一样。这种在扩展序列中记住重要细节的能力使得 LSTMs 特别适合自然语言处理、语音识别和时间序列预测等任务。

LinkedIn上与我联系或通过电子邮件[email protected]给我留言,如果您有任何问题或评论!

注意:除非另有说明,所有插图均由作者绘制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值