5

Erfahren RNNs andere Abhängigkeitsmuster, wenn die Eingabe Batch-Haupt-im Gegensatz zu Zeit-Haupt ist?Batch-Haupt vs Zeit-Haupt LSTM

+0

führt Ich habe keine konkrete Antwort, aber es ist kontextabhängig, mit zum Beispiel Chargen von Matrizen miteinander multipliziert werden, die Charge-Major wollen Speicher (da jedes Matmul unabhängig ist) und ebenso zum Anwenden derselben Faltung auf mehrere Bilder. Bildverarbeitung ist eine Hauptanwendung von TensorFlow, daher ist es nicht allzu überraschend, dass die Konvention an Stellen versickert, an denen sie nicht optimal ist. –

+0

Was ist im Zusammenhang mit einem statischen LSTM. Ich dachte, es gäbe vielleicht einige emergente Eigenschaften in der Ausrichtung von Zeitschritten innerhalb eines Stapels, aber ich nehme an, diese würden auch in der Zeit-Hauptform entdeckt werden. – ssjadon

+0

Ich denke, LSTMs wollen immer Zeit-Dur haben, da sie basierend auf Zeit für ihre Eingaben schneiden werden. Andere Arten von RNNs könnten Ausnahmen sein, vielleicht möchte etwas wie WaveNet Batch-Major. –

Antwort

4

(Edit: sorry war mein erstes Argument, warum es Sinn macht aber ich erkennen, dass es nicht so ist dies ein wenig OT.)

Ich habe die TF-Gruppen Argumentation nicht gefunden hinter diesem aber tut nicht macht rechnerischen Sinn wie Ops in C++ geschrieben sind.

Intuitiv wollen wir verschiedene Features aus der gleichen Sequenz auf dem gleichen Zeitschritt mischen (multiplizieren/hinzufügen usw.). Unterschiedliche Zeitschritte können nicht parallel durchgeführt werden, während Batch/Sequenzen so mit> Batch/Sequenz> Zeitschritt versehen werden können.

von default Numpy and C++ uses row-major (C-like) Speicherlayout so

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

legt wie [0,1,2,3,4,5,6,7,8] im Speicher. Das bedeutet, dass, wenn wir

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

(time_major=True in tensorflow) haben

In Row-Hauptspeicher wir ein Layout wie x[0,0,0],x[0,0,1],x[0,0,2],…,x[0,1,0],... so ex erhalten. Skalarprodukt von Gewichten und Vektoren aus der gleichen Sequenz und dem gleichen Zeitschritt (w*x[t,b,:]) ist der nächstfolgende Vorgang gefolgt von der nächsten Sequenz w*x[t,b+1,:] usw. Dies ist, was wir während des Trainings wollen.

Mit time_major=False die Standardeinstellung ist haben wir [Batch, Zeit, Funktion] so ex Merkmale aus derselben Sequenz aber unterschiedliche Zeitschritte sind mehr zusammenhängenden dh w*x[batch,t,:] gefolgt von w*x[batch,t+1,:] usw. schneller sein könnte für die Vorhersage einer Sequenz zu einer Zeit, wenn RNN wird ausgerollt, aber das ist Spekulation.

Wenn Sie aus dem gleichen Grund wie ich zu dieser Frage gekommen sind, habe ich gelernt, vorsichtig zu sein mit der leicht nicht intuitiven Numpy-Indizierung, die Python sein soll, nicht unbedingt Row Major. Schau dir das an. Wie erwartet:

x = np.zeros([3,3]) 
x[0:9].flat = np.arange(10) 
print x 
> [[ 0. 1. 2.] 
> [ 3. 4. 5.] 
> [ 6. 7. 8.]] 

würden wir erwarten, auch x[1] == x[0,1] aber

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 für die Effizienzaufschlüsselung. Ich kam zu dieser Frage von einer Kuriosität, ob ein wiederkehrendes Netz verschiedene Abhängigkeitsmuster mit Batch-Haupt-Input lernen wird. – ssjadon

+0

Ich sah jetzt, dass meine Antwort völlig irrelevant war, sorry dafür. Was die Abhängigkeitsmuster betrifft (ich interpretiere sie als Muster), kann ich nicht erkennen, warum dies der Fall ist. Wenn ja, würde ich es als einen Fehler bezeichnen – ragulpr

1

Es gibt keinen Unterschied in dem, was das Modell lernt.

Zum Zeitpunkt t, benötigen RNNs Ergebnisse von t-1, daher müssen wir Dinge Zeit-Haupt-berechnen. Wenn time_major=False, überträgt TensorFlow einen Stapel von Sequenzen von (batch_size, max_sequence_length) zu (max_sequence_length, batch_size) *. Es verarbeitet den transponierten Stapel jeweils eine Zeile: Bei t = 0 wird das erste Element jeder Sequenz verarbeitet, verborgene Zustände und Ausgänge berechnet; Bei t = max_sequence_length wird das letzte Element jeder Sequenz verarbeitet.

Wenn Ihre Daten bereits eine Uhrzeit haben, verwenden Sie time_major=True, wodurch eine Transponierung vermieden wird. Aber es macht keinen Sinn, Ihre Daten manuell zu transponieren, bevor Sie sie TensorFlow zuführen.

* Wenn Sie mehrdimensionale Eingänge haben (z.Sequenzen von Worteinbettungen: (batch_size, max_sequence_length, embedding_size)), Achsen 0 und 1 sind transponiert, was zu (max_sequence_length, batch_size, embedding_size)