2017-07-26 1 views
1

Ich lerne, wie man mit Optimizern ein Modell im Tensor Flow trainiert. Also baute ich ein lineares Modell, erstellte einen Spielzeugdatensatz und trainierte das lineare Modell mit AdamOptimizer und GradientDescentOptimizer.Warum funktioniert Adam Optimizer nicht?

Das ist mein Auszug:

# Training a linear model with Adam optimizer 

import tensorflow as tf 
import numpy as np 

# Training dataset 
Xs_ = np.random.random(48).reshape(12, 4) 
Yt_ = np.random.random(12).reshape(12, 1) 

Xs2_ = np.array([1, 2, 3, 4, 
       5, 6, 7, 8, 
       9, 10, 11, 12, 
       13, 14, 15, 16]).reshape(4, 4) 
Yt2_ = np.array([1, 2, 3, 4]).reshape(4, 1) 

# inference 
Xs = tf.placeholder(shape=(None, 4), dtype=tf.float32) 
W = tf.Variable(np.zeros((4,1), dtype=np.float32)) 
b = tf.Variable(np.ones((1, 1), dtype=np.float32)) 
Ys = tf.add(tf.matmul(Xs, W), b) 

Yt = tf.placeholder(shape=(None, 1), dtype=tf.float32) 

# loss 
loss = tf.reduce_mean(tf.squared_difference(Yt, Ys)) 

# training 
optimizer = tf.train.AdamOptimizer(learning_rate=1e-4, beta1=0.99, epsilon=0.1) 
optimizer2 = tf.train.GradientDescentOptimizer(learning_rate=0.01) 
train = optimizer.minimize(loss) 
train2 = optimizer2.minimize(loss) 


# Executing the graph with Adam Optimizer 
with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 

    feed_dict = {Yt: Yt2_, Xs: Xs2_} 
    sess.run(train, feed_dict) 

    print "Adam trained vars (W, b)", sess.run([W, b], feed_dict) 

# Executing the graph with Gradient Descent Optimizer 
with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 

    feed_dict = {Yt: Yt2_, Xs: Xs2_} 
    sess.run(train2, feed_dict) 

    print "GD trained vars (W, b)", sess.run([W, b], feed_dict) 

Und hier ist der Ausgang Ich sehe:

Adam trained vars (W, b) [array([[ 9.07433059e-05], 
     [ 9.14905831e-05], 
     [ 9.21262108e-05], 
     [ 9.26734720e-05]], dtype=float32), array([[ 1.00004864]], dtype=float32)] 
GD trained vars (W, b) [array([[ 0.31  ], 
     [ 0.34  ], 
     [ 0.37  ], 
     [ 0.39999998]], dtype=float32), array([[ 1.02999997]], dtype=float32)] 

ich mit unterschiedlichen Lernraten experimentiert, Betas und Epsilons; aber irgendwie aktualisiert AdamOptimizer nicht die Variablen (W und b).

Ich sah auch, dass ein paar Leute Gradienten separat berechnen und dann auf die Variablen anwenden, anstatt direkt AdamOptimizer().minimize(_loss_function_) zu verwenden.

Ich bin neu bei TensorFlow und bin mir nicht sicher, ob mir etwas fehlt. Bitte geben Sie einige Einblicke. Vielen Dank!

+0

In beiden Fällen führen Sie nur einen Schritt des Gradientenabfalls durch. Adam hat standardmäßig ein großes Momentum (Trägheit), also dauert es eine Weile, um zu beschleunigen. SGD hingegen beschleunigt sofort, da es keine Dynamik hat. Führen Sie weitere Iterationen aus und Sie werden sehen, dass W entsprechend aktualisiert wird. –

+0

Danke, das war hilfreich! Bitte fügen Sie dies als Antwort hinzu. – RahulDamineni

Antwort

2

In beiden Fällen führen Sie nur einen Schritt des Gradientenabfalls durch. Adam hat standardmäßig ein großes Momentum (Trägheit), also dauert es eine Weile, um zu beschleunigen. SGD hingegen beschleunigt sofort, da es keine Dynamik hat. Führen Sie weitere Iterationen durch und Sie werden sehen, dass der Wert von W entsprechend erhöht wird.

1

Von der Ausgabe werden die Variablen aktualisiert. Sie initialisieren W mit Nullen und b mit denen und deutlich sehen Sie, dass sie sich geändert haben. Ich bin mir nicht sicher, warum du denkst, dass sie sich nicht verändert haben. Vielleicht findest du die Veränderung zu klein? Ihre Lernrate ist auch kleiner (was ungewöhnlich ist - normalerweise können Sie eine größere Lernrate im Vergleich zu SGD verwenden). Sieh dir trotzdem die Formel von Adam an - sie benutzt den Impuls sowohl für den Gradienten als auch für den quadratischen Gradienten, der mit Null initialisiert wird. Es dauert also ein paar Schritte für schnellere/größere Updates. Wie auch immer, dein Code sieht korrekt aus.

+0

Ich sehe einen kleinen Unterschied, aber sollten die Werte von AdamOptimizers "W" nicht etwas näher an GDs "W" sein? Da trainiere ich beide mit den gleichen Eingaben? – RahulDamineni

+0

Danke! Die Ergebnisse sind konsistent nach dem Training für höhere Epochen. – RahulDamineni