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。
該衰減方法的優點是收斂速度較快,簡單直接。
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長一個維度。
這種方法有助於使用者針對不同任務進行精細地調參,在任意步長後下降任意數值的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
cycle參數是決定lr是否在下降後重新上升的過程。cycle參數的初衷是為了防止網路後期lr十分小導致一直在某個局部最小值中振蕩,突然調大lr可以跳出註定不會繼續增長的區域探索其他區域。
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形式差不多,只不過自然指數下降的底數是 型。
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)
由圖可知,自然數指數下降比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)
以上幾種衰減方式相差不大,主要都是基於指數型的衰減。個人理解其問題在於一開始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的影響如下:
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倍。
餘弦函數式的下降模擬了大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,主要應用領域是增強學習領域,本人未嘗試過。可以看出,該方法也是基於餘弦函數的衰減策略。
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尋找最優值的隨機性和可能性。
auto_learning_rate_decay
當然大家還可以自定義學習率衰減策略,如設置檢測器監控valid的loss或accuracy值,若一定時間內loss持續有效下降/acc持續有效上升則保持lr,否則下降;loss上升/acc下降地越厲害,lr下降的速度就越快等等自適性方案。
最後,祝大家煉丹愉快!
推薦閱讀:
※Ubuntu下CUDA+cuDNN+源代碼方式編譯安裝TensorFlow GPU版本過程中的一些坑
※TensorFlow初步(2)
※【解決搶卡爭端】為Tensorflow和PyTorch自動選擇空閑GPU
※【博客存檔】風格畫之最後一彈MRF-CNN
TAG:深度学习DeepLearning | TensorFlow | Python |