Tensorflow中learning rate decay的奇技淫巧

深度學習中參數更新的方法想必大家都十分清楚了——sgd,adam等等,孰優孰劣相關的討論也十分廣泛。可是,learning rate的衰減策略大家有特別關注過嗎?

說實話,以前我也只使用過指數型和階梯型的下降法,並不認為它對深度學習調參有多大幫助。但是,最近的學習和工作中逐漸接觸到了各種奇形怪狀的lr策略,可以說大大刷新了三觀,在此也和大家分享一下學習經驗。

learning rate衰減策略文件在tensorflow/tensorflow/python/training/learning_rate_decay.py中,函數中調用方法類似tf.train.exponential_decay就可以了。

以下,我將在ipython中逐個介紹各種lr衰減策略。


exponential_decay

exponential_decay(learning_rate, global_step, decay_steps, decay_rate,n staircase=False, name=None)n

指數型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)n

分段常數下降法類似於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,n end_learning_rate=0.0001, power=1.0,n cycle=False, name=None)n

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,n staircase=False, name=None)n

natural_exp_decay和exponential_decay形式差不多,只不過自然指數下降的底數是 1/e 型。

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,n staircase=False, name=None)n

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,n name=None)n

cosine_decay是近一年才提出的一種lr衰減策略,基本形狀是餘弦函數。其方法是基於論文實現的:SGDR: Stochastic Gradient Descent with Warm Restarts

計算步驟如下:

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,n t_mul=2.0, m_mul=1.0, alpha=0.0, name=None)n

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,n num_periods=0.5, alpha=0.0, beta=0.001,n name=None)n

linear_cosine_decay的參考文獻是Neural Optimizer Search with RL,主要應用領域是增強學習領域,本人未嘗試過。可以看出,該方法也是基於餘弦函數的衰減策略。

圖9. linear_cosine_decay示例

noisy_linear_cosine_decay

noisy_linear_cosine_decay(learning_rate, global_step, decay_steps,n initial_variance=1.0, variance_decay=0.55,n num_periods=0.5, alpha=0.0, beta=0.001,n name=None)n

參考文獻同上。該方法在衰減過程中加入了雜訊,某種程度上增加了lr尋找最優值的隨機性和可能性。

圖10.noisy_linear_cosine_decay示例

auto_learning_rate_decay

當然大家還可以自定義學習率衰減策略,如設置檢測器監控valid的loss或accuracy值,若一定時間內loss持續有效下降/acc持續有效上升則保持lr,否則下降;loss上升/acc下降地越厲害,lr下降的速度就越快等等自適性方案。

圖11. auto_learning_rate_decay效果示例


最後,祝大家煉丹愉快!


推薦閱讀:

Ubuntu下CUDA+cuDNN+源代碼方式編譯安裝TensorFlow GPU版本過程中的一些坑
TensorFlow初步(2)
【解決搶卡爭端】為Tensorflow和PyTorch自動選擇空閑GPU
【博客存檔】風格畫之最後一彈MRF-CNN

TAG:深度学习DeepLearning | TensorFlow | Python |