2016-06-20 391 views
14

文檔對此不太清楚。我想通過opt.compute_gradients(E, [v])可以獲得的梯度包含∂E/∂x = g(x),對於v存儲的張量的每個元素xopt.apply_gradients(grads_and_vars)本質上是執行x ← -η·g(x),其中η是學習率?這意味着如果我想爲變量添加一個正的附加變量p,我需要更改g(x) ← g(x) - (1/η)p,例如,像這樣:什麼是opt.apply_gradients()在TensorFlow中做什麼?

opt = tf.train.GradientDescentOptimizer(learning_rate=l) 
grads_and_vars = opt.compute_gradients(loss, var_list) 

for l, gv in enumerate(grads_and_vars): 
    grads_and_vars[l] = (gv[0] - (1/l) * p, gv[1]) 

train_op = opt.apply_gradients(grads_and_vars) 

有沒有更好的方法來做到這一點?

回答

8

apply_gradients方法實際應用的更新規則取決於特定的優化器。看看apply_gradientstf.train.Optimizerhere的實現。它依賴於在方法_apply_dense_apply_spares中實施更新規則的派生類。您所指的更新規則由GradientDescentOptimizer執行。

關於你想要的正極添加更新:如果你在呼喚optGradientDescentOptimizer一個實例,那麼你確實可以達到你想要的

grads_and_vars = opt.compute_gradients(E, [v]) 
eta = opt._learning_rate 
my_grads_and_vars = [(g-(1/eta)*p, v) for g, v in grads_and_vars] 
opt.apply_gradients(my_grads_and_vars) 

更優雅的方式來做到這一點做的可能是編寫一個新的優化器(繼承自tf.train.Optimizer),直接實現您所需的更新規則。

+0

對不起,我在您提供的代碼片段中忽略了'opt = tf.train.GradientDescentOptimizer(learning_rate = l)'這一行,這使我的答案的第一段無關緊要。儘管如此,仍然將它留在上下文中。 – lballes

+0

謝謝。其他梯度優化器可以計算例如基於我更新的漸變的動畫,或者爲什麼它們與這種方法不兼容? –

+0

其他優化器實現更新規則,如動量梯度下降,AdaGrad等。當然,爲更新步驟添加一個常量值與任何更新規則都是兼容的(它是一個單獨的問題有多明智)。 – lballes

相關問題