理解 LSTM 及其图示

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kMD8d5R/article/details/82784789

640?wx_fmt=gif

作者:徐瑞龙,量化分析师,R语言中文社区专栏作者

博客专栏:

https://www.cnblogs.com/xuruilong100


本文翻译自 Shi Yan 的博文 Understanding LSTM and its diagrams,原文阐释了作者对 Christopher Olah 博文 Understanding LSTM Networks 更加通俗的理解。


我不擅长解释 LSTM,写下这段文字是为了我个人记忆方便。我认为 Christopher Olah 的那篇博文是关于 LSTM 最棒的资料。如果想要学习 LSTM 的话,请移步到原始的文章链接。(我会在这里画一些更漂亮的图示)

尽管我们不知道大脑的运行机制,但我们依然能够感觉到它应该有一个逻辑单元和一个记忆单元。我们基于推理和经验得到的这个结论,就像电脑一样,我们也有逻辑单元、CPU 和 GPU,以及内存。

但是,当你观察一个神经网络的时候,它工作起来就像一个黑箱。你从一端出入,再从另一端得到输出。整个决策过程几乎完全取决于当前的输入。

我觉得,说神经网络完全没有记忆是不恰当的。无论怎样,学习得到的权重可以看作是训练数据的一种记忆。但是这种记忆更加静态。有些时候我们需要为后面的使用记住一些输入。这种例子很多,比如股票市场。为了做出好的投资决策,我们至少要从一个时间窗口回溯股票数据。

若要让神经网络接受时间序列数据,最简单的方法就是将若干神经网络连接在一起。每个神经网络只处理一步。你需要向神经网络提供一个时间窗口上所有步的数据,而不是单一步。

许多时候,你处理的数据具有周期模式。举个简单的例子,你需要预测圣诞树的销量。这是件季节性很强的事,每年只有一个高峰出现。一个好的预测策略是回溯一年前的数据。对于这类问题,你需要包含很早以前的数据,或者很强的记忆。你需要知道那哪些有价值的数据需要记住,哪些没用数据要忘记。

理论上,简单连接的神经网络称为递归神经网络,是可以工作的。但实践中面临两个难题:梯度消失和梯度爆炸,这会使神经网络无法使用。

后来出现的 LSTM(长短期记忆网络)通过引入记忆单元(即神经网络的细胞)来解决上述问题。LSTM 模块的图示如下:

640?wx_fmt=png

640?wx_fmt=png

初看起来非常复杂。让我们忽略中间部分,只看单元的输入和输出。网络有三个输入,640?wx_fmt=png是当前的输入;640?wx_fmt=png是上一个 LSTM 单元的输出;640?wx_fmt=png是我认为最重要的输入——上一个 LSTM 单元的“记忆”。640?wx_fmt=png是当前网络的输出,640?wx_fmt=png是当前单元的记忆。

所以,一个单元接收当前的输入、前一个输出和前一个记忆做出决策,并且产生新的输出,更新记忆。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

中间部分记忆640?wx_fmt=png产生变化的方式非常类似于从管道中导出水流。把记忆想象成管道中的水流。你想要改变记忆流,而这种改变有两个阀门控制。

第一个阀门是遗忘阀门。如果你关掉阀门,旧的记忆不会被保留;如果完全打开,旧的记忆就会完全通过。

第二个阀门是新记忆阀门。新的记忆会通过一个 T 形连接,并于同旧的记忆混合。第二个阀门决定要通过多少新的记忆。

640?wx_fmt=png

在图示中,顶部的管道是记忆管道。输入是旧的记忆(以向量的形式)。通过的第一个640?wx_fmt=png是遗忘阀门,事实上这是一个逐点乘法运算。如果你将旧的记忆640?wx_fmt=png与一个接近 0 的向量相乘,这意味着你想要忘记绝大部分记忆。如果你让遗忘阀门等于 1 ,旧的记忆就会完全通过。

记忆流通过的第二个运算是加法运算符 640?wx_fmt=png,即逐点相加,它的功能类似 T 形连接。新旧记忆通过这个运算混合。另一个阀门控制多少新的记忆来和旧的记忆混合,就是640?wx_fmt=png下面的640?wx_fmt=png

两步运算之后,你就将旧的记忆640?wx_fmt=png变成了新的记忆640?wx_fmt=png

640?wx_fmt=png

现在让我们看看阀门。第一个阀门称为遗忘阀门。它由一个单层神经网络控制。它的输入是640?wx_fmt=png(前一个 LSTM 模块的输出)、640?wx_fmt=png当前 LSTM 模块的输入)、640?wx_fmt=png前一个模块的记忆)和最终的偏移向量640?wx_fmt=png。这个神经网络有一个 S 形激活函数,它的输出向量是遗忘阀门,用来和旧的记忆640?wx_fmt=png 做逐点乘法。

640?wx_fmt=png

第二个阀门称为新记忆阀门。它也是一个单层神经网络,接收的输入和遗忘阀门一样。这个阀门用来控制多少新的记忆用来影响旧的记忆。

但是,新的记忆却由另一个神经网络产生。这也是一个单层神经网络,但是用 tanh 作为激活函数。这个神经网络的输出将会和新记忆阀门的输出做逐点乘法,然后和旧的记忆相加产生新的记忆。

640?wx_fmt=png

两个640?wx_fmt=png是遗忘阀门和新记忆阀门。

640?wx_fmt=png

最终,我们需要产生这个 LSTM 单元的输出。这一步有一个输出阀门,它被新的记忆、前一个输出640?wx_fmt=png、当前输入640?wx_fmt=png和偏移向量共同控制。这个阀门控制向下一个 LSTM 单元输出多少新的记忆。

前一个图是受到 Christopher 博文的启发。但是通常情况下,你会看到下面的图。两幅图之间的主要差异是后一个图没有将记忆单元 C 作为 LSTM 单元的输入。相反,它把它(记忆单元)内化成了“细胞”。

我喜欢 Christopher 的图,它清晰地展示了记忆 C 如何从前一个单元传递到下一个单元。在下面的图中,你不能轻易的发现640?wx_fmt=png来自上一个单元,以及640?wx_fmt=png是输出的一部分。

我不喜欢下面的图的第二个原因是,单元中的计算是有顺序的,但是你不能直接从图中看出来。例如,为了计算单元的输出,你需要有新的记忆640?wx_fmt=png。因此,第一步应该是计算640?wx_fmt=png

下面的图试图通过实线和虚线来强调这种“延迟”或“顺序”。虚线是开始就已经就绪的旧的记忆。实线是新的记忆。计算要求新的记忆要等待 640?wx_fmt=png的就绪。

640?wx_fmt=png

但是这两幅图是一样的。这里,我用和第一幅图相同的符号和颜色重画上面的图:

640?wx_fmt=png

这是遗忘门(阀门)关闭旧的记忆。

640?wx_fmt=png

这是新记忆阀门和新的记忆:

640?wx_fmt=png

这是两个阀门和逐点加法将新旧记忆混合以产生640?wx_fmt=png(绿色的,在大 “Cell” 后面)。

640?wx_fmt=png

这是输出阀门和 LSTM 单元的输出。

640?wx_fmt=png


往期回顾

时间序列分析工具箱——timetk

时间序列分析工具箱——tidyquant

时间序列分析工具箱——sweep

基于 Keras 用深度学习预测时间序列

基于 Keras 用 LSTM 网络做时间序列预测

时间序列深度学习:状态 LSTM 模型预测太阳黑子(一)

时间序列深度学习:状态 LSTM 模型预测太阳黑子(二)

时间序列深度学习:seq2seq 模型预测太阳黑子

R中的设计模式


640?wx_fmt=jpeg

公众号后台回复关键字即可学习

回复 爬虫            爬虫三大案例实战  
回复 
Python       1小时破冰入门

回复 数据挖掘     R语言入门及数据挖掘
回复 
人工智能     三个月入门人工智能
回复 数据分析师  数据分析师成长之路 
回复 机器学习      机器学习的商业应用
回复 数据科学      数据科学实战
回复 常用算法      常用数据挖掘算法

猜你喜欢

转载自blog.csdn.net/kMD8d5R/article/details/82784789