无状态 LSTM 和普通前馈 NN 有什么区别?

数据挖掘 机器学习 神经网络 lstm rnn
2021-09-24 06:58:06

据我了解,LSTM 的全部意义在于让网络在数据中建立长期依赖关系,即现在发生的事件可能以某种方式由过去某个时间发生的事情决定,而这可能不在当前呈现的数据批次,但之前有许多序列或批次。

所以我知道有状态的LSTM 会这样做,并且网络将保留状态直到reset_states()被调用。但是对于无状态LSTM,在批次之间不保留状态,那么这与普通的前馈感知器网络有什么不同呢?

我假设即使在无状态 LSTM 中你不像在有状态模型中那样控制状态,在序列之间传递时仍然保留一些状态?它是在批次之间传递的吗?

我可以理解为什么有人会使用有状态 LSTM,但为什么有人会使用无状态 LSTM 而不是前馈感知器网络?反之亦然,为什么有人会使用常规的 FF 而不是无状态的 LSTM?

1个回答

从理论上讲,无状态 LSTM 给出与有状态 LSTM 相同的结果,但它们之间几乎没有优缺点。无状态 LSTM 要求您以特定方式构建数据,从而提高性能,而有状态 LSTM 可以有不同的时间步长,但会降低性能。

无状态 LSTM 确实有状态,只是实现方式不同。而不是通过不断调用reset_states()数据来自己管理它,而是以这样一种方式来管理它,即当一系列时间步长结束时它会自动重置。

让我们创建一个明确的示例。假设您有一些标签数据y[i]在哪里i是索引,输入数据x[i, t]在哪里i对应于您的标签索引,并且t是在什么时间步长观察到的。xys 可以是向量、矩阵或任何类型的张量。)

假设您有 4 个输出标签(不是 4 个类),每个标签有 2 到 4 个时间步长。您的数据可能如下所示:

                   x[0, 0], x[0, 1]  ->  y[0]
          x[1, 0], x[1, 1], x[1, 2]  ->  y[1]
 x[2, 0], x[2, 1], x[2, 2], x[2, 3]  ->  y[2]
                   x[3, 0], x[3, 1]  ->  y[3]

这是有状态 LSTM 可以处理的数据类型。但是在每个标签的末尾,您必须调用reset_states()以表明您不再依赖于之前的系列xs。这很慢。

使用无状态 LSTM,您可以填充 以x得到一个矩形矩阵:

 0        0        x[0, 0], x[0, 1]  ->  y[0]
 0        x[1, 0], x[1, 1], x[1, 2]  ->  y[1]
 x[2, 0], x[2, 1], x[2, 2], x[2, 3]  ->  y[2]
 0        0        x[3, 0], x[3, 1]  ->  y[3]

在这种情况下,每个标签都有一个隐式的状态重置。这种方法的性能要高得多。但是可能会出现用空数据阻塞数据的问题。就我个人而言,我倾向于为每个x向量添加一个二进制标志,以向 LSTM 中的网络表明它可能应该忽略数据。

我不确定如何实现无状态 LSTM 的具体细节,但我认为这可能是关于展开 LSTM 单元

最终,无状态和有状态 LSTM 都做同样的事情,只是实现方式不同。

为什么有人会使用无状态 LSTM 而不是前馈感知器网络?

好吧,具有讽刺意味的是,这是因为无状态 LSTM 有状态,这意味着它可以在进行预测时考虑之前的时间步长输入值。