LSTM的输入究竟是什么?

时间:2018-04-17 16:35:43

标签: machine-learning neural-network deep-learning lstm rnn

我有一个更理论化的问题,我无法找到答案。 假设我输入了一个数字列表:

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 = -

在每个时间步中每个节点获得不同的输入,输入就像一个从列表左右移动的滑动窗口。在这种情况下,列表中的每个元素(每个数字)经常以不等的方式呈现给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 = -

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

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

1 个答案:

答案 0 :(得分:2)

RNN通常用于识别顺序数据中的模式,即必须将序列馈送到单元格才能捕获它。你的第一个想法是顺序输入,因此网络无法识别任何有意义的信息,例如“下一个符号可能小于当前符号,除非有一个0" 。

以下是大多数情况下输入的外观:

rnn

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

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

  • [0,5,0,4,3,3,2,1]一个大句子时,您希望从其所有部分捕获规则。为此,您将所有长度为3的子序列提供给网络,因为任何三元组都是有意义的。 (旁注:还有stateful RNN的变体来帮助解决这个问题,但它确实是一个技术细节)

  • [0,5,0][4,3,3][2,1] 不同的句子时,学习{{1}之类的依赖关系是没有意义的},其中一个用前一个句子的最后一个单词开始序列。每个句子可能是独立的,但在一个句子中你想要在所有大小为3的窗口上滑动。(旁注:有状态的RNN在这种情况下也很有用,例如当有故事和意义时上一句可能影响对当前的理解。)

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

图片来自this post,我强烈建议您阅读。