长短期记忆(LSTM)递归神经网络背后的直觉是什么?


11

循环神经网络(RNN)背后的想法对我很清楚。我以以下方式理解它:
我们有一系列观察()(或换句话说,多元时间序列)。每个单个观测是一个维数值向量。在RNN模型中,我们假定下一个观测值是先前观测值以及先前的“隐藏状态”,其中隐藏状态也由数字表示向量(观察状态和隐藏状态的尺寸可以不同)。还假定隐藏状态本身取决于先前的观察和隐藏状态:Ø1个Ø2ØñØ一世ñØ一世+1个Ø一世H一世

Ø一世H一世=FØ一世-1个H一世-1个

最后,在RNN模型中,函数F被假定为神经网络。我们使用可用数据(观察序列)训练(拟合)神经网络。我们训练的目标是能够使用先前的观察结果尽可能准确地预测下一个观察结果。

现在,LSTM网络是对RNN网络的修改。据我了解,LSTM背后的动机是解决RNN特有的短存储问题(常规RNN在相关事件之间存在时间间隔过长的问题)。

我了解LSTM网络是如何工作的。这是我发现的LSTM的最佳解释。基本思想如下:

除了隐藏状态向量之外,我们还引入了一种所谓的“单元状态”向量,该向量具有与隐藏状态向量(C一世)相同的大小(维数)。我认为引入了“细胞状态”向量来建模长期记忆。与常规RNN一样,LSTM网络将观察到的和隐藏的状态作为输入。使用此输入,我们可以通过以下方式计算新的“单元状态”:

C一世+1个=ω1个Ø一世H一世C一世+ω2Ø一世H一世C一世ñŤØ一世H一世

其中的功能ω1个ω2C一世ñŤ由神经网络建模。为了简化表达式,我只需要删除参数:

C一世+1个=ω1个C一世+ω2C一世ñŤ

因此,我们可以看到新的“单元状态向量”(C一世)是旧状态向量(C一世-1个)和“中间”单元状态向量(C一世ñŤ)的加权和。向量之间的乘法是逐分量的(我们将两个N维向量相乘,结果得到另一个N维向量)。换句话说,我们使用特定分量的权重来混合两个单元状态向量(旧的和中间的一个)。

这是所描述的操作之间的直觉。单元状态向量可以解释为存储向量。第二权重矢量ω2(由神经网络计算出的)是一个“保持”(或忘记)栅极。它的值决定我们是保留还是忘记(擦除)单元状态向量(或长期记忆向量)中的相应值。所述第一权重向量(ω1个),这是由另一神经网络计算出的,被称为“写入”或“记忆”门。它决定是否必须保存新的内存(“中间”单元状态向量)(或更准确地说,是否必须保存/写入新的内存)。“中级”ω1个向量)。实际上,这将是更准确的说,与两个权重向量(ω1个ω2)我们“混”新老内存。

因此,在上述混合(或忘记和记忆)之后,我们有了一个新的细胞状态向量。然后,我们通过使用另一个神经网络来计算“中间”隐藏状态(像以前一样,我们使用观察状态Ø一世和隐藏状态H一世作为输入)。最后,我们将新的单元格状态(内存)与“中间”隐藏状态(H一世ñŤ)结合起来,以获得实际输出的新(或“最终”)隐藏状态:

H一世+1个=H一世ñŤ小号C一世+1个

其中小号是应用于单元状态向量每个分量的S型函数。

因此,我的问题是:为什么该架构(或精确程度)可以解决问题?

我特别不理解以下内容:

  1. 我们使用神经网络生成“中间”内存(单元状态向量),将其与“旧”内存(或单元状态)混合以获得“新”内存(单元状态)。混合的加权因子也由神经网络计算。但是为什么我们不能仅使用一个神经网络来计算“新”细胞状态(或记忆)。或者换句话说,为什么我们不能将观察到的状态,隐藏状态和旧内存用作计算“新”内存的神经网络的输入?
  2. 最后,我们使用观察到的状态和隐藏状态来计算新的隐藏状态,然后使用“新”单元状态(或(长期)记忆)来校正新计算出的隐藏状态的组成部分。换句话说,像元状态的成分被用作权重,它们仅减少了计算出的隐藏状态的相应成分。但是为什么以这种特定方式使用细胞状态向量?我们为什么不能通过将细胞状态向量(长期记忆)放入神经网络的输入(也将观察到的和隐藏状态作为输入)来计算新的隐藏状态?

添加:

这是一段视频,可能有助于阐明如何组织不同的门(“保持”,“写入”和“读取”)。


1
您似乎比我更了解LSTM,所以我不会提供实际的答案,因为它可能不是您想要的:LSTM门(主要是“忘记门”)可以将激活和渐变保持很长时间。有必要的。因此,对于任意大的n,在时间t之前的信息可​​以一直保持可用,直到时间t + n。
rcpinto

@rcpinto,我还认为,提出的“体系结构”背后的主要思想是使信息能够长时间保存(许多时间步长)。但是我不明白到底是什么使它成为可能。这两个闸门网络(“保持”和“写入”)可能会知道保持权重应该很大,而写入权重应该很小(然后我们将内存保持很长时间)。但是,仅靠一个网络就不能做到吗?神经网络(将隐藏状态(内存)和可观察状态作为输入)无法学习应该保持隐藏状态不变吗?
罗马

实际上,只需将递归权重矩阵设置为恒等式,它将始终保持最后一次激活。问题始终存在,这意味着新的输入将累积并迅速使神经元激活饱和,这也是一种遗忘。因此,擦除先前存储器或阻止新存储器形成的能力至关重要。
rcpinto

@rcpinto,但是在单个神经网络中无法实现“擦除先前内存或阻止新内存形成的功能”吗?神经网络获取存储向量(或隐藏状态向量)和观察到的状态向量作为输入。这样的网络是否不能根据观察到的状态向量中的分量值“决定”保留或替换隐藏状态的某些分量(其内存)?
罗马

LSTM可以做到这一点,因为门根据电流输入和状态打开或关闭。在简单的RNN中没有这样的概念。在这种情况下,状态本身总是直接和立即对输入/状态作出反应,从而防止其“选择”是否存储新信息。而且,没有擦除某些存储内存的机制,它总是根据输入到神经元的权重来累积,并且这些权重在训练后不会改变。由于LSTM门是可乘的,因此它们可在推理过程中模拟重量变化,并对当前输入/状态做出反应。
rcpinto

Answers:


1

据我了解的问题,您所看到的基本上是将输入,先前的隐藏状态和先前的单元状态连接起来,并使其经过一个或几个完全连接的层以计算输出的隐藏状态和单元状态,而不是独立地计算“门会与单元格状态进行算术交互的更新。这基本上将创建一个仅输出部分隐藏状态的常规RNN。

不这样做的主要原因是LSTM的单元状态计算结构可确保通过长序列的错误持续不断。如果您使用权重直接计算单元状态,则需要在每个时间步向后传播!避免这样的操作在很大程度上解决了消失/爆炸梯度的问题,否则梯度会困扰RNN。

另外,能够在较长的时间内轻松保留信息的功能是一项不错的奖励。直观地讲,网络从头开始学习以保持较长时间跨度的小区状态将更加困难。

值得注意的是,LSTM的最常见替代方案GRU同样可以计算隐藏状态更新,而无需学习直接对隐藏状态本身进行操作的权重。


0

如果我已正确理解,您的两个问题都可以归结为这一点。我们在两个地方都使用tanh和Sigmoid来处理信息。取而代之的是,我们应该使用一个单一的神经网络来接收所有信息。

我不知道使用单个神经网络的弊端。在我看来,我们可以使用具有S形非线性的单个神经网络来正确学习将适当使用的矢量(在第一种情况下添加到单元状态,在第二种情况下作为隐藏状态传递)。

但是,我们现在的工作方式将任务分为两部分,其中一部分使用S形非线性来了解要保留的数据量。使用tanh作为非线性的另一部分只是完成学习重要信息的任务。

简而言之,Sigmoid会学习保存多少,tanh会学习保存什么,将其分为两个部分将使培训更加容易。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.