的各部分的計算梯度範數假設我有以下損失函數:複合損失函數
loss_a = tf.reduce_mean(my_loss_fn(model_output, targets))
loss_b = tf.reduce_mean(my_other_loss_fn(model_output, targets))
loss_final = loss_a + tf.multiply(alpha, loss_b)
爲了顯現梯度WRT的範數來loss_final
一個可以這樣做:
optimizer = tf.train.AdamOptimizer(learning_rate=0.001)
grads_and_vars = optimizer.compute_gradients(loss_final)
grads, _ = list(zip(*grads_and_vars))
norms = tf.global_norm(grads)
gradnorm_s = tf.summary.scalar('gradient norm', norms)
train_op = optimizer.apply_gradients(grads_and_vars, name='train_op')
但是,我想分別繪製loss_a
和loss_b
的梯度範圍。我怎樣才能在效率最高的方式做到這一點?是否需要分別撥打loss_a
和loss_b
上的compute_gradients(..)
,然後將這兩個梯度相加,然後將它們傳遞給optimizer.apply_gradients(..)
?我知道,由於求和規則,這在數學上是正確的,但它看起來有點麻煩,我也不知道如何正確實現梯度求和。另外,loss_final
相當簡單,因爲它只是一個總和。如果loss_final
更復雜,例如一個部門?
我使用的是Tensorflow 0.12。
感謝您的回答。你怎麼知道這是通過張量流優化的,真的沒有重複的工作?我們可以驗證什麼優化適用於DAG嗎?我知道我可以進行一些測試,但是有沒有某種保證,這種可能的優化確實每次都應用,或者我們是否依靠「盡力而爲」的行爲? – kaufmanu
@ kaufmanu更新了答案以顯示如何捕獲圖。 – Alex