Tensorflow 中 learning rate decay 的奇技淫巧
深度學習中引數更新的方法想必大家都十分清楚了——sgd,adam 等等,孰優孰劣相關的討論也十分廣泛。可是,learning rate 的衰減策略大家有特別關注過嗎? 說實話,以前我也只使用過指數型和階梯型的下降法,並不認為它對深度學習調參有多大幫助。但是,最近的學習和工作中逐漸接觸到了各種奇形怪狀的 lr 策略,可以說大大重新整理了三觀,在此也和大家分享一下學習經驗。
learning rate 衰減策略檔案在 tensorflow/tensorflow/python/training/learning_rate_decay.py(http://t.cn/RQJ78Lg ) 中,函式中呼叫方法類似 tf.train.exponential_decay 就可以了。
以下,我將在 ipython 中逐個介紹各種 lr 衰減策略。
exponential_decay
exponential_decay(learning_rate, global_step, decay_steps, decay_rate,
staircase=False, name=None)
指數型 lr 衰減法是最常用的衰減方法,在大量模型中都廣泛使用。
learning_rate 傳入初始 lr 值,global_step 用於逐步計算衰減指數,decay_steps 用於決定衰減週期,decay_rate 是每次衰減的倍率,staircase 若為 False 則是標準的指數型衰減,True 時則是階梯式的衰減方法,目的是為了在一段時間內(往往是相同的 epoch 內)保持相同的 learning rate。
圖 1. exponential_decay 示例,其中紅色線條是 staircase=False,即指數型下降曲線,藍色線條是 staircase=True,即階梯式下降曲線
該衰減方法的優點是收斂速度較快,簡單直接。
piecewise_constant
piecewise_constant(x, boundaries, values, name=None)
分段常數下降法類似於 exponential_decay 中的階梯式下降法,不過各階段的值是自己設定的。
其中,x 即為 global step,boundaries=[step_1, step_2, ..., step_n] 定義了在第幾步進行 lr 衰減,values=[val_0, val_1, val_2, ..., val_n] 定義了 lr 的初始值和後續衰減時的具體取值。需要注意的是,values 應該比 boundaries 長一個維度。
圖 2. piecewise_constant 示例
這種方法有助於使用者針對不同任務進行精細地調參,在任意步長後下降任意數值的 learning rate。
polynomial_decay
polynomial_decay(learning_rate, global_step, decay_steps,
end_learning_rate=0.0001, power=1.0,
cycle=False, name=None)
polynomial_decay 是以多項式的方式衰減學習率的。
It is commonly observed that a monotonically decreasing learning rate, whose degree of change is carefully chosen, results in a better performing model. This function applies a polynomial decay function to a provided initial `learning_rate` to reach an `end_learning_rate` in the given `decay_steps`.
其下降公式也在函式註釋中闡釋了:
global_step = min(global_step, decay_steps) decayed_learning_rate = (learning_rate - end_learning_rate) * (1 - global_step / decay_steps) ^ (power) + end_learning_rate
圖 3. polynomial_decay 示例,cycle=False,其中紅色線為 power=1,即線性下降;藍色線為 power=0.5,即開方下降;綠色線為 power=2,即二次下降
cycle 引數是決定 lr 是否在下降後重新上升的過程。cycle 引數的初衷是為了防止網路後期 lr 十分小導致一直在某個區域性最小值中振盪,突然調大 lr 可以跳出註定不會繼續增長的區域探索其他區域。
圖 4. polynomial_decay 示例,cycle=True,顏色同上
natural_exp_decay
natural_exp_decay(learning_rate, global_step, decay_steps, decay_rate,
staircase=False, name=None)
natural_exp_decay 和 exponential_decay 形式差不多,只不過自然指數下降的底數是
型。
exponential_decay: decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps) natural_exp_decay: decayed_learning_rate = learning_rate * exp(-decay_rate * global_step / decay_steps)
圖 5. natural_exp_decay 與 exponential_decay 對比圖,其中紅色線為 natural_exp_decay,藍色線為 natural_exp_decay 的階梯形曲線,綠線為 exponential_decay
由圖可知,自然數指數下降比 exponential_decay 要快許多,適用於較快收斂,容易訓練的網路。
inverse_time_decay
inverse_time_decay(learning_rate, global_step, decay_steps, decay_rate,
staircase=False, name=None)
inverse_time_decay 為倒數衰減,衰減公式如下所示:
decayed_learning_rate = learning_rate / (1 + decay_rate * global_step / decay_step)
圖 6. inverse_time_decay 示例
以上幾種衰減方式相差不大,主要都是基於指數型的衰減。個人理解其問題在於一開始 lr 就快速下降,在複雜問題中可能會導致快速收斂於區域性最小值而沒有較好地探索一定範圍內的引數空間。
cosine_decay
cosine_decay(learning_rate, global_step, decay_steps, alpha=0.0,
name=None)
cosine_decay 是近一年才提出的一種 lr 衰減策略,基本形狀是餘弦函式。其方法是基於論文實現的:SGDR: Stochastic Gradient Descent with Warm Restarts(https://arxiv.org/abs/1608.03983 )
計算步驟如下:
global_step = min(global_step, decay_steps) cosine_decay = 0.5 * (1 + cos(pi * global_step / decay_steps)) decayed = (1 - alpha) * cosine_decay + alpha decayed_learning_rate = learning_rate * decayed
alpha 的作用可以看作是 baseline,保證 lr 不會低於某個值。不同 alpha 的影響如下:
圖 7. cosine_decay 示例,其中紅色線的 alpha=0.3,藍色線的 alpha=0.0
cosine_decay_restarts
cosine_decay_restarts(learning_rate, global_step, first_decay_steps,
t_mul=2.0, m_mul=1.0, alpha=0.0, name=None)
cosine_decay_restarts 是 cosine_decay 的 cycle 版本。first_decay_steps 是指第一次完全下降的 step 數,t_mul 是指每一次迴圈的步數都將乘以 t_mul 倍,m_mul 指每一次迴圈重新開始時的初始 lr 是上一次迴圈初始值的 m_mul 倍。
圖 8. cosine_decay_restarts 示例,紅色線條 t_mul=2.0,m_mul=0.5,藍色線條 t_mul=2.0,m_mul=1.0
餘弦函式式的下降模擬了大 lr 找潛力區域然後小 lr 快速收斂的過程,加之 restart 帶來的 cycle 效果,有漲 1-2 個點的可能。
linear_cosine_decay
linear_cosine_decay(learning_rate, global_step, decay_steps,
num_periods=0.5, alpha=0.0, beta=0.001,
name=None)
linear_cosine_decay 的參考文獻是 Neural Optimizer Search with RL(https://arxiv.org/abs/1709.07417 ),主要應用領域是增強學習領域,本人未嘗試過。可以看出,該方法也是基於餘弦函式的衰減策略。
圖 9. linear_cosine_decay 示例
noisy_linear_cosine_decay
noisy_linear_cosine_decay(learning_rate, global_step, decay_steps,
initial_variance=1.0, variance_decay=0.55,
num_periods=0.5, alpha=0.0, beta=0.001,
name=None)
參考文獻同上。該方法在衰減過程中加入了噪聲,某種程度上增加了 lr 尋找最優值的隨機性和可能性。
圖 10.noisy_linear_cosine_decay 示例
auto_learning_rate_decay
當然大家還可以自定義學習率衰減策略,如設定檢測器監控 valid 的 loss 或 accuracy 值,若一定時間內 loss 持續有效下降/acc 持續有效上升則保持 lr,否則下降;loss 上升/acc 下降地越厲害,lr 下降的速度就越快等等自適性方案。
圖 11. auto_learning_rate_decay 效果示例
最後,祝大家煉丹愉快!