当输入是批量优先而不是时间优先时,RNN 是否学习不同的依赖模式?
最佳答案
(编辑:抱歉,我最初的论点是为什么它有道理,但我意识到它没有所以这有点过时了。)
我还没有找到这背后的 TF 组推理,但它确实没有具有计算意义,因为操作是用 C++ 编写的。
直觉上,我们希望在同一时间步上混合(相乘/相加等)来自同一序列的不同特征。不同的时间步不能并行完成,而批处理/序列可以并行执行,因此 feature>batch/sequence>timestep。
通过 default Numpy and C++ uses row-major (C-like) 内存布局 so
[[ 0. 1. 2.]
[ 3. 4. 5.]
[ 6. 7. 8.]]
像 [0,1,2,3,4,5,6,7,8]
一样放在内存中。这意味着如果我们有
x = np.zeros([time,batch,feature])
( tensorflow 中的time_major=True
)
在行优先内存中,我们得到类似 x[0,0,0],x[0,0,1],x[0,0,2],…,x[0,1 ,0],...
所以前。来自相同序列和时间步长的权重和向量的点积 (w*x[t,b,:]
) 是最连续的操作,紧随其后的是下一个序列 w*x[t,b +1,:]
等。这就是我们在训练期间想要的。
使用 time_major=False
默认情况下,我们有 [batch,time,feature] 因此来自相同序列但不同时间步的 ex 特征更连续,即 w*x[batch,t, :]
后跟 w*x[batch,t+1,:]
等。如果推出 RNN,一次预测一个序列可能会更快,但这是推测.
如果你出于与我相同的原因来到这个问题,我学会了小心稍微不直观的 Numpy 索引,它意味着 pythonic,不一定是 Row Major。看这个。正如预期的那样:
x = np.zeros([3,3])
x[0:9].flat = np.arange(10)
print x
> [[ 0. 1. 2.]
> [ 3. 4. 5.]
> [ 6. 7. 8.]]
我们还期望 x[1] == x[0,1]
但是
print x[1]
> [ 3. 4. 5.]
print x[np.arange(10)<=4]
> IndexError: index 3 is out of bounds for axis 0 with size 3
关于python - 批处理主要 VS 时间主要 LSTM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42130491/