从理论上讲,无状态 LSTM 给出与有状态 LSTM 相同的结果,但它们之间几乎没有优缺点。无状态 LSTM 要求您以特定方式构建数据,从而提高性能,而有状态 LSTM 可以有不同的时间步长,但会降低性能。
无状态 LSTM 确实有状态,只是实现方式不同。而不是通过不断调用reset_states()
数据来自己管理它,而是以这样一种方式来管理它,即当一系列时间步长结束时它会自动重置。
让我们创建一个明确的示例。假设您有一些标签数据y[i]
在哪里i
是索引,输入数据x[i, t]
在哪里i
对应于您的标签索引,并且t
是在什么时间步长观察到的。(x
和y
s 可以是向量、矩阵或任何类型的张量。)
假设您有 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()
以表明您不再依赖于之前的系列x
s。这很慢。
使用无状态 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 有状态,这意味着它可以在进行预测时考虑之前的时间步长输入值。