5

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

+0

我没有具体的答案,但它是依赖于上下文的,例如批次的矩阵相乘在一起想要批次存储(因为每个matmul都是独立的),同样也适用于对多个图像应用相同的卷积。图像处理是TensorFlow的一个主要用途,所以这个公约渗透到可能不是最佳的地方并不令人感到意外。 –

+0

在静态LSTM的情况下怎么样。我想也许在一批中的时间步骤中有一些突出的属性,但我想这些也会以时间主要形式被发现。 – ssjadon

+0

我认为LSTMs总是需要时间专业,因为他们会根据时间进行切片以获取他们的输入。其他类型的RNN可能是例外情况,也许像WaveNet之类的需要批次专业。效率分解为 –

回答

4

(编辑:对不起,我最初的论点就是为什么它有道理但我意识到,这所以这是一个有点OT)。

我还没有发现有TF的群体推理在这之后,但它确实使计算有意义,因为操作系统是用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]) 

(在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它是默认我们有[批次,时间,功能]距离相同的序列,但不同的时间步长,以便前特性是多个连续的即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 
+0

+ 1。我对这个问题感到好奇,是否经常性网络会以批量主要输入学习不同的依赖模式。 – ssjadon

+0

我现在看到我的回答完全不相关,对此表示遗憾。至于依赖模式(我解释为模式),我不明白为什么会这样。如果是这样,我会指定它一个错误 – ragulpr

1

没有在模型中尝到了没有什么区别。

在时间步t,RNNs需要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)