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)