1. 程式人生 > >深度學習--解決梯度爆炸方法(含TensorFlow程式碼)

深度學習--解決梯度爆炸方法(含TensorFlow程式碼)

在深層的神經網路中,經常碰到梯度消失或者梯度爆炸問題。我先講一下原理,在求導的時候因為是鏈式法則,哪怕所有層的導數都很接近1,比如0.9,那麼在20層之後0.9的20次方也只剩0.1左右。這就意味著越深層的誤差難以影響到淺層的權重。若是導數再小一點這個梯度就直接消失了接近0。

梯度爆炸也是同理,若每層導數都是2,傳遞了多層之後會非常大。

當然防止梯度消失有許多辦法,比如使用relu啟用函式、使用batchnorm、殘差網路等等。

不過本文的重點在於在tensorflow中解決梯度爆炸問題,原理很簡單就是梯度修剪。把大於1的導數修剪為1等等。

直接上程式碼吧:

# 使用Adam梯度下降
     optimizer = tf.train.AdamOptimizer(learningrate)

#     # 裁剪一下Gradient輸出,最後的gradient都在[-1, 1]的範圍內
#     # 計算導數   cost為損失函式
     gradients = optimizer.compute_gradients(cost)
#     # 限定導數值域-1到1
     capped_gradients = [(tf.clip_by_value(grad, -1., 1.), var) for grad, var in gradients if grad is not None]
#     # 將處理後的導數繼續應用到BP演算法中
     train_op = optimizer.apply_gradients(capped_gradients)
使用compute_gradients()方法來計算導數並將其clip。