LSTM 的输入究竟是什么?

What is the input to LSTM exactly?

我有一个更理论化的问题,我找不到答案。 可以说我输入了一个数字列表:

input = [0,5,0,4,3,3,2,1]

假设第一个隐藏层由 3 个 LSTM 节点组成。 现在列表如何呈现给 LSTM(时间步长 = 8)?

我的第一个想法是:

Input timestep 1:
node 1 = 0, node 2 = 0, node 3 = 0
Input timestep 2:
node 1 = 5, node 2 = 5, node 3 = 5
...

所以每个节点在每个时间步长中看到相同的输入。

我的第二个想法是:

Input timestep 1:
node 1 = 0, node 2 = 5, node 3 = 0
Input timestep 2:
node 1 = 5, node 2 = 0, node 3 = 4
...
Input timestep 8:
node 1 = 1, node 2 = -, node 3 = -

在每个时间步中,每个节点都会获得不同的输入,输入就像在列表上从左向右移动的滑动 window。在这种情况下,列表中的每个元素(每个数字)呈现给 LSTM 的频率不均。

我最后的想法是:

Input timestep 1:
node 1 = 0, node 2 = 5, node 3 = 0
next timestep:
node 1 = 4, node 2 = 3, node 3 = 3
last timestep:
node 1 = 2, node 2 = 1, node 3 = -

所以每个节点再次获得不同的输入,但这次 window 不会在列表上滑动而是跳跃。在这种情况下,每个数字只呈现给 LSTM 一次。

我猜第一个想法是它是如何工作的,但我不知道。还是完全不同?

RNN 通常用于识别 序列 数据中的模式,即必须将序列输入单元格才能捕获它。您的第一个想法 没有 输入序列,因此网络无法识别任何有意义的信息,例如 "the next symbol is likely to be smaller than the current one, except when there's a 0"。

大多数情况下的输入是这样的:

... 其中 (x[0], x[1], ...) 是输入。


你的第二个和第三个想法的不同之处仅在于将长数据拆分为子序列的方式,实际上这两种选择都是可能的,具体取决于数据的性质:

  • [0,5,0,4,3,3,2,1]一个大句子时,您想从它的所有部分捕捉规则。为此,您需要将所有长度为 3 的子序列输入网络,因为任何三元组都可能有意义。 (旁注:还有一个 stateful RNN 的变体来帮助处理这个问题,但这实际上是一个技术细节)

  • [0,5,0][4,3,3][2,1]不同的句时,学习没有意义像 [0,4,3] 这样的依存关系,其中一个序列以前一个句子的最后一个单词开始。每个句子都可能是独立的,但在一个句子中,你希望滑过大小为 3 的所有 windows。(旁注:有状态 RNN 在这种情况下也很有用,例如,当有一个故事和前一句的意思可能会影响到现在的理解)。

所以最后两个猜测非常接近正确。

图片来自this post,强烈推荐阅读