學習率衰減(learning rate decay)
爲了防止學習率過大,在收斂到全局最優點的時候會來回擺盪,所以要讓學習率隨着訓練輪數不斷按指數級下降,收斂梯度下降的學習步長。
學習率衰減可以用以下代碼實現
decayed_learning_rate = learning_rate * np.power(decay_rate,(global_step / decay_steps))
decay_rate
是衰減指數,可設爲略小於1的值,比如0.98。global_step
是當前的迭代輪數,decay_steps
是你想要每迭代多少輪就衰減的度量值,可叫作衰減速度。比如decay_steps = 1000
,意味着當global_step
達到1000時就給learning_rate
乘上0.98的一次方,達到2000就乘上0.98的二次方,以此類推,不斷縮小學習率。
TensorFlow提供了一個函數實現了指數衰減學習率,叫做tf.train.exponential_decay
用法如下
global_step = tf.Variable(0)
learning_rate = tf.train.exponential_decay(0.1, global_step, 1000, 0.98)
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost,\
global_step = global_step)
初始學習率爲1,衰減指數爲0.98,衰減速度爲1000,global_step會跟着minimize函數自動更新。
tf.train.exponential_decay還有一個參數是staircase,默認爲False,如果是False,學習率會平滑地衰減,而非每迭代1000輪才衰減一次,如果爲True,則會每迭代1000次才衰減一次,這種稱爲階梯函數。
學習率的本質可以說成是,在訓練初期,你希望學習的步長在可承受的範圍內儘量大一些,隨着訓練輪數的增加,爲了避免梯度下降無法收斂到全局最優點,甚至發散,你希望學習的步長越來越小,逐步逼近最優點,至少是在一個最優的範圍內來回震盪。
學習率衰減是非常有用的技巧,通常會和mini_batch的方法一併使用,你也可以手動衰減學習率,雖然這很耗費人力和精力。不過從我學到的知識來看,學習率衰減並不是你要考慮的首要問題,通常,你只需要不斷調整學習率,直至一個令人滿意的效果即可,並不一定需要用到學習率衰減。因爲還有很多更高級的超參數調整和搜索方式值得嘗試。