深度學習模型的優化演算法及tensorflow實現
模型的優化對於傳統機器學習和深度學習都是很重要的,尤其是深度學習,在訓練過中很可能需要解決一些更加困難的挑戰。目前來說,流行且使用較廣泛的優化演算法有隨機梯度下降,具動量的隨機梯度下降,RMSProp演算法,具動量的RMSProp,AdaDelta和Adam等,以下會選擇幾種進行具體說明,大部分抄自《深度學習》和tensorflow官方文件。如有錯漏歡迎指正。
隨機梯度下降
隨機梯度下降(SGD)可能是應用最多的優化演算法了,隨機梯度下降演算法如下所示:
輸入:學習率 , 初始引數 |
---|
while 停止準則未滿足 do |
從訓練集中採包含m個樣本的小批量{ |
計算梯度估計: |
應用更新: |
end while |
tensorflow中並沒有專門的SGD的實現,要實現SGD可以藉助tensorflow提供的簡單梯度下降tf.train.GradientDescentOptimizer
,在執行Session時將隨機選取的小批量資料餵給模型即可。
tf.train.GradientDescentOptimizer類的init()函式引數如下所示:
__init__(
learning_rate,
use_locking=False,
name='GradientDescent'
)
learning_rate指定學習率,use_locking指定是否為更新operation加鎖,這裡主要針對併發讀寫問題。
從演算法和init函式都可以看出,SGD中學習率是固定的,然而固定的學習率並不能很好服務於模型,到訓練後期可能導致學習曲線的劇烈震盪。因此往往需要隨著時間的推移逐漸降低學習率。tensorflow提供了多種decay函式來實現學習率的衰減,以tf.train.exponential_decay()為例:
exponential_decay(
learning_rate,
global_step,
decay_steps,
decay_rate,
staircase=False,
name=None
)
這個函式返回的decayed_learning_rate就是在輸入的learning_rate基礎上進行衰減。
decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps)
其中global_step表示當前次數,decay_steps表示衰減步長,staircase為True時,global_step / decay_steps取整數,返回的學習率呈階梯形衰減,而若staircase為False,學習率呈線性衰減。返回的decayed_learning_rate可以直接用來。
Adagrad演算法
AdaGrad演算法是一種自適應學習率演算法,它獨立地適應所有模型引數的學習率。演算法維護一個累積平方梯度向量,即對模型的每個引數,累積其歷史平方值的總和,以其反比作為權重更新引數,具體規則如下:
tensorflow中Adagrad類的init()如下:
tf.train.AdagradOptimizer.__init__(
learning_rate,
initial_accumulator_value=0.1,
use_locking=False,
name='Adagrad'
)
其中initial_accumulator_value對應演算法中的。
AdaGrad演算法雖然具有一些令人滿意的理論性質,然而從經驗上說,從訓練開始時積累梯度平方會導致有效學習率過早和過量的減小。在某些模型上AdaGrad效果不錯,但不是全部。
使用動量的隨機梯度下降
從形式上看,動量演算法引入了變數v充當速度角色。使用動量的隨機梯度下降演算法更新規則在原隨機梯度下降基礎上改進如下:
使用動量的隨機梯度下降的tensorflow中的init()函式為:
tf.train.MomentumOptimizer.__init__(
learning_rate,
momentum,
use_locking=False,
name='Momentum'
)
其中引數momentum對應於演算法中的動量引數