2016-10-08 4 views
3

Also habe ich ein sehr einfaches NN-Skript in Tensorflow geschrieben, und es fällt mir schwer, herauszufinden, woher etwas "Zufälligkeit" kommt.Determinismus in Tensorflow-Gradienten-Updates?

ich die

  • Gewichte aufgenommen haben,
  • Gradients,
  • Logits

meines Netzes, wie ich trainieren, und für die erste Iteration ist es klar, dass alles beginnt aus dem gleichen. Ich habe einen SEED-Wert sowohl für die Art, wie Daten eingelesen werden, als auch einen SEED-Wert für die Initialisierung der Gewichte des Netzes. Diese ändere ich nie.

Mein Problem ist, dass zu sagen, auf die zweite Iteration jeden re-run ich tue, beginne ich den Gradienten divergieren, um zu sehen, (um einen kleinen Betrag, wie etwa 1e-6 oder so). Im Laufe der Zeit führt dies jedoch zu nicht wiederholbarem Verhalten.

Was könnte die Ursache dafür sein? Ich weiß nicht, wo jede mögliche Quelle der Zufälligkeit könnte aus kommen ...

Dank

+0

Verwenden Sie GPU? Verschiedene ops auf GPU sind nicht deterministisch aufgrund ihrer Verwendung von CUDA atomics (wie tf.reduce_sum) –

+0

Auch gibt einige SSE Optimierungen sind, die in nicht-deterministischen Ergebnissen führen, könnten Sie versuchen, eine TensorFlow ohne Optimierungen kompilieren, um zu sehen, ob das der ist Fall (Details - http://blog.nag.com/2011/02/wandering-precision.html) –

+0

Hallo @ YaroslavBulatov ja, ich benutze tatsächlich eine GPU. – Spacey

Antwort

5

Es gibt eine gute Chance, dass Sie deterministische Ergebnisse erhalten können, wenn Sie Ihr Netzwerk auf CPU (export CUDA_VISIBLE_DEVICES=) laufen, mit Single-Thread in Eigener Thread-Pool (tf.Session(config=tf.ConfigProto(intra_op_parallelism_threads=1)), ein Python-Thread (keine Multithread-Warteschlangen-Runner, die Sie von Ops wie erhalten) und eine einzige wohldefinierte Operationsreihenfolge. Auch die Verwendung von inter_op_parallelism_threads=1 kann in einigen Szenarien hilfreich sein.

Ein Problem ist, dass die Gleitkomma-Addition/Multiplikation nicht-assoziativ ist, so dass ein narrensicherer Weg, um deterministische Ergebnisse zu erhalten, ganzzahlige arithmetische oder quantisierte Werte ist.

dass Barring, könnten Sie isolieren, welche Operation ist nicht deterministisch, und versuchen, dass op zu vermeiden, mit. Zum Beispiel gibt es tf.add_n op, was nichts über die Reihenfolge sagt, in der es die Werte summiert, aber unterschiedliche Ordnungen führen zu unterschiedlichen Ergebnissen.

deterministische Ergebnisse zu erhalten ist ein bisschen einen harten Kampf, weil Determinismus in Konflikt mit Leistung, und die Leistung ist in der Regel das Ziel, die mehr Aufmerksamkeit bekommt. Eine Alternative zu versuchen, genau die gleichen Zahlen auf Wiederholungen haben, ist auf numerische Stabilität konzentrieren - wenn Ihr Algorithmus stabil ist, dann werden Sie reproduzierbare Ergebnisse (dh gleiche Anzahl von Fehlklassifikationen) erhalten, obwohl genaue Parameterwerte etwas unterschiedlich sein

+0

(1/2) Danke Yaroslav, ein paar Dinge: 1) Aber gibt es eine einfache Möglichkeit, TF zu zwingen, nur CPU zu verwenden? (Ich denke, vielleicht erweitern (Export CUDA_VISIBLE_DEVICES =)) etwas? Soll ich das nur wortwörtlich in die Kommandozeile eingeben?2) In Bezug auf die Ganzzahlen/Gleitkommawerte - sagst du, dass ein Experiment, das ich tun kann, ist, alle meine Parameter (und verwandte Werte) zu tf.int16 zum Beispiel anstelle von tf.float32, wie sie jetzt sind, zu versuchen und Reproduzierbarkeit erhalten, da Integer-Arithmetik nicht unter den gleichen Gleitkomma-Problemen leidet, die Sie hervorgehoben haben? – Spacey

+0

(2/2) Auf die Reproduzierbarkeit, ja, ich wollte versuchen, dies wegen eines Fehlers zu bekommen, den ich versuche, auf den Grund zu gehen. Grundsätzlich explodiert mein (Daten) Verlust zu sehr hohen Werten (manchmal sogar ein NaN), während mein Training fortschreitet. Dies scheint jedoch nur dann der Fall zu sein, wenn der (Daten-) Verlust anfänglich extrem niedrige Werte erreicht hat. Manchmal erholt sich das Netz, aber manchmal nicht, also ist dies eigentlich das Hauptproblem. : -/Das komische Ding ist, dass ich alle TF-Funktionen verwende, und das Diagramm ist sogar eine skelettierte Version von (https://www.tensorflow.org/versions/r0.11/tutorials/deep_cnn/index.html). – Spacey

+0

"Verlust explodiert" ist ein häufiges Phänomen, und es ist eine Eigenschaft der stochastischen Gradientenabstieg. Eine übliche Lösung besteht darin, die Lernrate zu senken und/oder eine Regularisierung hinzuzufügen. –

Verwandte Themen