2016-07-12 31 views
1

Ich möchte weights und exponents für ein individuelles Modell optimal lernen, die ich angelegt habe:TensorFlow Custom Model Optimizer, der NaN zurückgibt. Warum?

weights = tf.Variable(tf.zeros([t.num_features, 1], dtype=tf.float64)) 
exponents = tf.Variable(tf.ones([t.num_features, 1], dtype=tf.float64)) 

# works fine: 
pred = tf.matmul(x, weights) 

# doesn't work: 
x_to_exponent = tf.mul(tf.sign(x), tf.pow(tf.abs(x), tf.transpose(exponents))) 
pred = tf.matmul(x_to_exponent, weights) 

cost_function = tf.reduce_mean(tf.abs(pred-y_)) 
optimizer = tf.train.GradientDescentOptimizer(t.LEARNING_RATE).minimize(cost_function) 

Das Problem, das ist, wenn es einen negativen Wert Null in x ist der Optimierer das Gewicht als NaN zurückgibt. Wenn ich einfach 0,0001 addiere, wenn x = 0, dann funktioniert alles wie erwartet. Aber sollte ich das wirklich tun müssen? Sollte der TensorFlow-Optimierer damit nicht umgehen können?

Ich habe festgestellt, Wikipedia zeigt keine activation functions, wo x zu einem Exponenten genommen wird. Warum gibt es keine Aktivierungsfunktion, die wie folgt aussieht? enter image description here

Für das obige Bild möchte ich, dass mein Programm lernt, dass der korrekte Exponent 0,5 ist.

+0

Sind Sie sicher, dass Sie wollen, dass Gewichte ein ** Exponent ** sind? Dies kann leicht in die Infinity gehen. Bitte geben Sie auch Ihren vollständigen Code an. – lejlot

+0

Ja - Ich möchte herausfinden, welchen Exponenten ich für meine Eingabedaten verwenden muss, um die richtigen Vorhersagen treffen zu können. Der Exponent wird normalerweise zwischen 0-1 liegen und sollte nicht in die Unendlichkeit gehen. Zum Beispiel, wenn das obige Bild das Modell war, versuchen wir den korrekten Exponenten vorherzusagen, den wir lernen müssen, ist 0,5. –

+0

@lejlot Ich habe den Code aktualisiert, um klarer zu zeigen, was funktioniert und was nicht funktioniert. Es gab auch einen Fehler, den ich korrigiert habe. –

Antwort

0

Dies ist korrektes Verhalten am TensorFlow-Teil, da der Gradient dort unendlich ist (und viele Berechnungen, die mathematisch Unendlich sein sollten, am Ende NaN wegen unbestimmter Grenzen).

Wenn Sie das Problem umgehen möchten, funktioniert möglicherweise eine leicht verallgemeinerte Version des Gradienten-Clipping. Sie können die Steigungen über Optimizer.compute_gradients zu bekommen, sie manuell wie

safe_grad = tf.clip_by_value(tf.select(tf.is_nan(grad), 0, grad), -lim, lim) 

und dann die abgeschnitten Gradienten Optimizer.apply_gradients gelangen über etwas stutzen. Das Clipping wird notwendig sein, um nicht für Werte nahe der Singularität zu explodieren, wo der Gradient beliebig groß sein kann.

Warnung: Es kann nicht garantiert werden, dass dies funktioniert, insbesondere in tieferen Netzwerken, in denen die Nans große Bereiche des Netzwerks verschmutzen können.

+0

Danke für die Tipps! Ich werde hier zurückkommen, wenn sich mein Verständnis verbessert hat und ich bereit bin, eine solche Lösung zu implementieren. –

Verwandte Themen