1

Ich möchte die Gradienten von den Eingängen eines neuronalen Netzes zum Ausgang berechnen. Ich habe folgende Tensoren:Tensorflow: Gradientenberechnung von Eingang zu Ausgang

Input: (num_timesteps, features) 

Output: (num_timesteps, 1) 

Für die Gradienten von den Eingängen zu den gesamten Ausgangsvektor ich folgendes verwenden:

tf.gradients(Output, Input) 

Da ich die Gradienten für jeden einzelnen timesample I berechnen möchte möchte

tf.gradients(Output[i], Input) 

für jeden i berechnen.

Was ist der beste Weg, das zu tun?

Antwort

1

Erstens, nehme ich an Sie die Steigung von Outputin Bezug auf bedeuten die Input.

Nun the result beider dieser Anrufe:

  • dO = tf.gradients(Output, Input)
  • dO_i = tf.gradients(Output[i], Input) (für jede gültige i)

wird eine Liste mit einem einzigen Element sein - ein Tensor mit der gleiche Form als Input, nämlich eine [num_timesteps, features] Matrix. Auch, wenn Sie alle Matrizen dO_i (über alle gültigen i) summieren, ist genau die Matrix dO.

In diesem Sinne zurück zu Ihrer Frage. In vielen Fällen sind einzelne Zeilen aus der Input unabhängig, dh Output[i] wird nur aus Input[i] berechnet und kennt keine anderen Eingaben (typischer Fall: Batch-Verarbeitung ohne Batchnorm). Wenn das der Fall ist, dann wird dO Ihnen alle Einzelteile dO_i auf einmal geben.

Dies liegt daran, jede dO_i Matrix wie folgt aussehen wird:

[[ 0. 0. 0.] 
[ 0. 0. 0.] 
... 
[ 0. 0. 0.] 
[ xxx xxx xxx]  <- i-th row 
[ 0. 0. 0.] 
... 
[ 0. 0. 0.]] 

Alle Zeilen 0 sein werden, mit Ausnahme der i -te ein. Also nur durch die Berechnung einer Matrix dO, können Sie leicht alle dO_i bekommen. Dies ist sehr effizient.

Wenn dies jedoch nicht Ihr Fall ist und alle Output[i] von allen Eingaben abhängen, gibt es keine Möglichkeit, einzelne dO_i nur aus ihrer Summe zu extrahieren. Sie haben keine andere Wahl als jeden Gradient einzeln zu berechnen: Iterieren Sie einfach über i und führen Sie tf.gradients aus.

Verwandte Themen