Wie berechnet Tensorflow `tf.train.Optimizer` Gradienten?

10

Ich folge dem Tensorflow Mnist-Tutorial ( https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_softmax.py ).

Das Tutorial verwendet tf.train.Optimizer.minimize(speziell tf.train.GradientDescentOptimizer). Ich sehe keine Argumente, die irgendwo übergeben werden, um Farbverläufe zu definieren.

Verwendet der Tensorfluss standardmäßig eine numerische Differenzierung?

Gibt es eine Möglichkeit, Farbverläufe so zu übergeben, wie Sie es können scipy.optimize.minimize?

Limscoder
quelle

Antworten:

16

Es ist keine numerische Differenzierung, sondern eine automatische Differenzierung . Dies ist einer der Hauptgründe für die Existenz von Tensorflow: Durch Angabe von Operationen in einem Tensorflow-Diagramm (mit Operationen auf Tensors usw.) kann es automatisch der Kettenregel durch das Diagramm folgen und, da es die Ableitungen jeder einzelnen Operation kennt, die Sie kennen angeben, es kann sie automatisch kombinieren.

Wenn Sie dies aus irgendeinem Grund stückweise überschreiben möchten, ist dies mit möglich gradient_override_map.

Dougal
quelle
Ist die automatische Differenzierung nicht eine numerische Differenzierung?
Aerin
@ BYOR Nein; Schauen Sie sich den Wikipedia-Link oben an. Was Tensorflow tut, liegt tatsächlich irgendwo zwischen "echtem" Autodiff im Rückwärtsmodus und symbolischer Differenzierung.
Dougal
@Dougal Ich benutze den eifrigen Modus ohne Grafik, ohne tf.Funktionsdekorateur. Woher kennt die automatische Differenzierung die Beziehung zwischen Tensoren?
datdinhquoc
1
@datdinhquoc Es ist der gleiche grundlegende Algorithmus, nur etwas komplizierter einer Implementierung.
Dougal
9

Es verwendet die automatische Differenzierung. Wo es Kettenregeln verwendet und im Diagramm Backword verwendet, um Farbverläufe zuzuweisen.

Nehmen wir an, wir haben einen Tensor C Dieser Tensor C wurde nach einer Reihe von Operationen erstellt. Nehmen wir an, wir addieren, multiplizieren, durchlaufen eine Nichtlinearität usw.

Wenn dieses C also von einem Satz von Tensoren abhängt, die Xk genannt werden, müssen wir die Gradienten erhalten

Tensorflow verfolgt immer den Betriebsweg. Ich meine das sequentielle Verhalten der Knoten und wie Daten zwischen ihnen fließen. Das macht die Grafik Geben Sie hier die Bildbeschreibung ein

Wenn wir die Ableitungen der Kosten für X-Eingaben erhalten müssen, wird zuerst der Pfad von der X-Eingabe zu den Kosten geladen, indem der Graph erweitert wird.

Dann beginnt es in der Reihenfolge der Flüsse. Verteilen Sie dann die Farbverläufe mit der Kettenregel. (Wie Backpropagation)

Wenn Sie die Quellcodes lesen, die zu tf.gradients () gehören, können Sie feststellen, dass Tensorflow diesen Gradientenverteilungsteil auf nette Weise ausgeführt hat.

Während der Rückverfolgung von tf mit dem Graphen interagiert TF im Backword-Pass auf verschiedene Knoten. Innerhalb dieser Knoten gibt es Operationen, die wir (ops) matmal, softmax, relu, batch_normalization usw. nennen. Wir laden diese ops also automatisch in die Graph

Dieser neue Knoten bildet die partielle Ableitung der Operationen. get_gradient ()

Lassen Sie uns ein wenig über diese neu hinzugefügten Knoten sprechen

Innerhalb dieser Knoten fügen wir zwei Dinge hinzu: 1. Ableitung, die wir berechnet haben) 2. Auch die Eingaben für den entsprechenden Opp im Vorwärtsdurchlauf

Nach der Kettenregel können wir also berechnen

Das ist also dasselbe wie bei einer Backword-API

Tensorflow denkt also immer über die Reihenfolge des Graphen nach, um eine automatische Differenzierung durchzuführen

Da wir wissen, dass wir Vorwärtsdurchlaufvariablen benötigen, um die Gradienten zu berechnen, müssen wir Zwischenwerte auch in Tensoren speichern. Dies kann den Speicher reduzieren. Für viele Operationen wissen wir, wie man Gradienten berechnet und verteilt.

Shamane Siriwardhana
quelle
1
Ich benutze den Eifrigen Modus ohne Grafik, ohne Funktionsdekorateur. Woher kennt die automatische Differenzierung die Beziehung zwischen Tensoren?
datdinhquoc