社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

深度学习图解:LSTM

FinTechHi • 11 月前 • 233 次点击  

LSTM是RNN的升级版。

RNN 用于解决时序问题,但难以长距离保留信息,从而导致短期记忆问题,所以LSTM 就出现了,其利用了RNN的循环特性,但又略有不同。

回到RNN,有一个神经网络,输入为x,一个隐藏层,其中包含一个使用 tanh 激活函数的神经元,以及一个使用 sigmoid 激活函数的输出神经元:

将每一步称为一个隐藏状态。所以上图是 RNN 的第一个隐藏状态。

第一个输入x ₁传递给隐藏神经元以获得h₁

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

现在有两个方案:

方案1:将这个h₁ 传递给输出神经元,仅使用这一个输出即可获得预测。

其中y₁^为第一个隐藏状态预测结果。

上面随意选择了 S 型激活函数作为输出激活函数,实际中可根据要解决的问题类型,可以选择Softmax、ReLU、线性函数等等。

方案2:将此h₁ 传递到下一个隐藏状态,方法是将此值传递到下一个状态的神经元。

如下图所示:

将第一个网络中隐藏神经元的输出与第二个输入x₂ 一起传递给当前网络中的隐藏神经元。这样做就得到了第二个隐藏层的输出h₂ 。

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

同样用h₂也有两个方案

方案1:将其传递给输出神经元以获得由第一个输入x₁和第二个输入x₂得出的预测。

其中y₂^为 第2个隐藏状态预测。

方案2:直接将其传递到下一个网络。

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

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

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

要解决这个问题:在每一步中,它们会丢弃输入和过去步骤中不必要的信息,有效地“忘记”不重要的信息,只保留关键信息。这有点像我们大脑处理信息的方式——我们不会记住每一个细节,只会保留我们认为必要的细节,丢弃其余部分。

回到RNN 的隐藏状态:

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

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

在 RNN 中设置了两个输入,最终目标是生成一个隐藏状态输出。

而现在一开始就有三个输入,它们被输入到 LSTM 中——之前的长期记忆Cₜ₋₁、之前的隐藏状态输出hₜ₋₁以及输入xₜ

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

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

1)忘记部分

2)输入部分

3)输出部分

上图中有一个共同的紫色的单元,这些单元被称为门。

为了判断哪些信息重要,哪些不重要,LSTM 使用这些门,它们本质上是具有 S 型激活函数的神经元。

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

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

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

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

每个值都会产生 0 到 1 之间的值,因为这就是 S 型函数的工作原理,它将决定我们想要保留每个部分中特定信息的比例。这里你会注意到我们只是使用了权重的向量表示法。这意味着我们要将xₜhₜ₋₁w表示)相乘。

在这里所做的就是从遗忘门中获取这个比例(0-1 之间的值)……

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

这个乘积给出了遗忘门认为重要的先前长期记忆的精确值,并忘记了其余部分。

因此,遗忘门比例 fₜ 越接近 1,我们保留的先前长期记忆就越多。

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

创建LSTM可分2个步骤:

1.创建新的长期记忆候选C(tilda) ₜ。

使用带有tanh激活函数的神经元来获取新的长期记忆候选:

这个神经元的输入是x ₜ 和h ₜ₋₁,类似于门电路。所以,将它们传递到神经元。

上面的输出是新的LSTM的“候选”。

现在我们只想保留候选集的必要信息。这时输入门就派上用场了。我们使用从输入门获得的比例:

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

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

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

上面就完成了一个LSTM的创建,接下来需要生成一个新的隐藏状态输出。

1.输出部分

获取新的长期记忆Cₜ,并将其传递给tanh函数:

然后将其与输出门比例Oₜ相乘:

则输出了新的隐藏状态。

2.将这些新的输出传递到下一个隐藏状态,再次重复相同的过程。

可以看到每个隐藏状态都有一个输出神经元:

就像在 RNN 中一样,每个状态都可以产生各自的输出。

与 RNN 类似,使用隐藏状态的输出 hₜ 来生成预测。因此,将 hₜ 传递给输出神经元:

这样就得到了这个隐藏状态的预测结果。

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

本文由本公众号翻译编辑,原文地址为:

https://medium.com/@shreya.rao/list/deep-learning-illustrated-ae6c27de1640

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/184299