当前位置: 首页>>算法&结构>>正文


理解LSTM及其图示符号

qingchuan 算法&结构 , , 去评论

虽然我们不知道大脑的功能如何,但我们感觉它必须有一个逻辑单元和一个记忆单元,然后通过推理和经验做出决定。所以类似的对于计算机来说,我们有逻辑单元,CPU和GPU,当然也有记忆(内存)单元。

但是当你看一个神经网络时,它的功能就像一个黑匣子。你从一边输入一些输入,你从另一边接收一些输出。它做出的决定主要基于当前的输入。

我认为说神经网络完全没有记忆是不公平的。毕竟,这些学习的权重是对训练数据的某种记忆 。但是这个记忆更加静态。有时我们想记住一个输入以备后用。这种情况有很多例子,比如股票市场。为了做出良好的投资判断,我们必须至少从时间窗口查看股票数据。

让神经网络接受时间序列数据的简单方法是将几个神经网络连接在一起。每个神经网络处理一个时间步。不是在每个单独的时间步骤提供数据,而是在窗口或上下文中的所有时间步骤向神经网络提供数据。

很多时候,需要处理具有周期性模式的数据。作为一个比较简陋的例子,假设你想预测圣诞树销售量。这是一个非常季节性的事情,并且可能每年仅高峰一次。所以预测圣诞树销售的好策略是从一年前的数据中查看数据。对于这类问题,您需要有一个很大的背景来包含古老的数据点,或者您拥有良好的记忆。你知道什么数据是值得记住的,以备后用,什么东西在无用时需要被遗忘。

理论上,单纯连接的神经网络,即所谓的递归神经网络可以解决上述问题。但实际上,它有两个问题:梯度消失和梯度爆炸,这使它在实践中无法使用。

之后,LSTM(长期短期记忆)被发明出来,它通过明确引入一个内存单元来解决这个问题,称为单元入网。这是LSTM构建模块的示意图。

乍一看很吓人。让我们忽略内部,但只查看单元的输入和输出。该网络需要三个输入。 X_t是当前时间步的输入。 h_t-1是前一个LSTM单元的输出,C_t-1是前一个单元的记忆,我认为这是最重要的输入。至于输出,h_t是当前网络的输出。 C_t是当前单元的记忆。

因此,这个单元通过考虑当前输入,先前输出和先前的存储器来做出决定。它会产生一个新的输出并改变它的记忆 。

其内部 记忆 C_t变化的方式与通过管道输送水是非常相似的。假设记忆是水,它会流入管道。你想要改变这种记忆流程,这种变化是由两个阀门控制的。

第一个阀门被称为遗忘阀门。如果关闭它,则不会保留旧的记忆。如果你完全打开这个阀门,所有旧的记忆都会通过。

第二个阀是新的记忆阀。新的记忆将通过上面的T形接头进入,并与旧内存合并。第二个阀门应该控制多少新记忆。

在LSTM图上,顶部的“pipe”是记忆管道。输入是旧的记忆(一个向量)。它通过的第一个交叉是遗忘阀。它实际上是一个element-wise乘法运算。所以如果你用一个接近0的向量乘以旧的记忆C_t-1,这意味着你想忘记大部分旧记忆。如果您的忘记阀门等于1,则让旧记忆通过。

然后记忆流将经过的第二个操作是这个 +操作符。该运算符表示piece-wise总和。它类似于T形接头管。新的内存和旧的内存将通过此操作合并。另一个阀门(+符号下面的✖)控制旧存储器应添加多少新记忆。

完成这两个操作后,您将旧记忆C_t-1更改为新记忆C_t。

现在让我们看看阀门。第一个被称为遗忘阀。它由一个简单的单层神经网络控制。神经网络的输入是h_t-1,前一个LSTM块的输出X_t,当前LSTM块的输入C_t-1,前一块的记忆以及最后的偏置矢量b_0。这个神经网络有一个sigmoid函数作为激活,它的输出矢量是遗忘阀,它将通过element-wise乘法应用到旧记忆C_t-1。

现在第二个阀被称为新的记忆阀。再次,它是一个简单的单层神经网络,其输入与遗忘阀相同。这个阀门控制着新记忆应该影响旧记忆的程度。

新的记忆本身是由另一个神经网络产生的。它也是一个单层网络,但使用tanh作为激活功能。该网络的输出将element-wise多个新的记忆阀门,并添加到旧的记忆中,形成新的记忆。

这两个符号是遗忘阀和新的记忆阀。

最后,我们需要为这个LSTM单元生成输出。该步骤具有由新记忆,先前输出h_t-1,输入X_t和偏置矢量控制的输出阀。该阀门控制多少新的存储器应该输出到下一个LSTM单元。

上图是受克里斯托弗的博客文章的启发。但大多数时候,你会看到如下图。这两种变化的主要区别在于下图不会将记忆单元C视为单元的输入。相反,它将它视为内部事物“Cell”。

我喜欢克里斯托弗的图,因为它明确地显示了这个记忆C如何从前一个单元传递到下一个单元。但是在下面的图片中,你不能很容易地看到C_t-1实际上来自前一个单元。而C_t是输出的一部分。

我不喜欢下面的图表的第二个原因是你在单元内执行的计算应该是有序的,但是你不能从下面的图表清楚地看到它。例如,要计算本机的输出,您需要准备好新的记忆C_t。因此,第一步应该是评估C_t。

下图尝试用虚线和实线表示此“delay”或“order”(此图片中有错误)。虚线表示旧老的记忆。实线表示新的记忆 。操作要求新的记忆必须等到C_t可用。

但是这两个图基本上是一样的。在这里,我想使用第一个图的相同符号和颜色重新绘制上图:

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

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

这些是两个阀门和element-wise总和来合并旧记忆和新记忆,以形成C_t(绿色,流回大“Cell”):

这是LSTM单元的输出阀和输出:

参考资料

本文由《纯净的天空》出品。文章地址: https://vimsky.com/article/3851.html,未经允许,请勿转载。