批量主要与时间主要LSTM

时间:2017-02-09 07:18:49

标签: python tensorflow deep-learning lstm recurrent-neural-network

当输入是批量主要而不是时间主要时,RNN是否学习不同的依赖模式?

2 个答案:

答案 0 :(得分:5)

(编辑:抱歉,我的初步论证是为什么它有意义但我意识到它所以这是一点点OT。)

我还没有找到TF组的推理,但 没有计算意义,因为ops是用C ++编写的。

直观地说,我们希望在相同的时间步长中混合(乘法/添加等)来自相同序列的不同特征。不同的时间步长不能并行完成,而批次/序列可以如此特征>批次/序列>时间步。

通过default Numpy and C++ uses row-major(类C)内存布局,所以

[[ 0.  1.  2.]
 [ 3.  4.  5.]
 [ 6.  7.  8.]]

在记忆中像[0,1,2,3,4,5,6,7,8]一样铺设。这意味着,如果我们有

x = np.zeros([time,batch,feature])

(张量流中的time_major=True

在Row-major内存中,我们得到一个类似x[0,0,0],x[0,0,1],x[0,0,2],…,x[0,1,0],...的布局,所以ex。来自相同序列和时间步长(w*x[t,b,:])的权重和向量的点积是最接续的操作,接着是下一个序列w*x[t,b+1,:]等。这是我们在训练期间想要的。

默认情况下time_major=False我们有[批次,时间,功能]所以来自相同序列的ex功能但不同的时间步长更连续,即w*x[batch,t,:]后跟w*x[batch,t+1,:]等。这可能如果推出RNN,那么一次预测一个序列会更快,但这是推测。

如果你出于同样的原因来看这个问题的话,我学会了要小心那些稍微不直观的Numpy-indexing,它意味着是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

答案 1 :(得分:2)

模型学习的内容没有区别。

在时间t,RNN需要来自t-1的结果,因此我们需要计算时间主要的东西。如果time_major=False,TensorFlow会将一批序列从(batch_size, max_sequence_length)转换为(max_sequence_length, batch_size) *。它一次处理一行转置批处理:在t = 0时,处理每个序列的第一个元素,计算隐藏状态和输出;在t = max_sequence_length时,处理每个序列的最后一个元素。

因此,如果您的数据已经是时间专业,请使用time_major=True,这样可以避免转置。但是,在将数据提供给TensorFlow之前手动转置数据并不是很重要。

*如果你有多维输入(例如字嵌入序列:(batch_size, max_sequence_length, embedding_size)),则转换轴0和1,导致(max_sequence_length, batch_size, embedding_size)