批量主要与时间主要LSTM

ssj*_*don 7 python deep-learning lstm tensorflow recurrent-neural-network

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

rag*_*lpr 5

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

我没有找到TF组的推理背后但它确实 没有计算意义,因为ops是用C++编写的.

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

通过默认与NumPy和C++使用行为主(C类)的内存布局,

[[ 0.  1.  2.]
 [ 3.  4.  5.]
 [ 6.  7.  8.]]
Run Code Online (Sandbox Code Playgroud)

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

x = np.zeros([time,batch,feature])
Run Code Online (Sandbox Code Playgroud)

(time_major=True在tensorflow中)

在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这是默认的,我们有[批次,时间,功能]从相同的序列,但不同的时间步长如此前的特点是多个连续的即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.]]
Run Code Online (Sandbox Code Playgroud)

我们也期望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
Run Code Online (Sandbox Code Playgroud)


Mat*_*rro 5

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

在时间步长 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)