我有一个更理论的问题,但无法找到答案。 可以说我有一个数字列表作为输入:
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 一次。
我猜第一个想法是它是如何工作的,但我不知道。还是完全不同?
最佳答案
RNN 通常用于识别序列数据中的模式,即必须将序列馈送到细胞才能捕获它。您的第一个想法不会输入序列,因此网络无法识别任何有意义的信息,例如“下一个符号可能比当前符号小,除非有一个符号” 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 的窗口上滑动。(旁注:有状态 RNN 在这种情况下也很有用,例如,当有一个故事及其含义时前一句可能会影响当前一句的理解)。
所以最后两个猜测非常接近正确。
图片来自this post ,我强烈推荐阅读。
关于machine-learning - LSTM 的输入到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49883290/