深度學習煉丹手冊——學習率設置

2021-03-02 AIZOO

在訓練深度學習模型時,一個非常重要的超參數就是學習率,學習率設置的合理與否,非常影響模型的收斂速度和最終性能。本篇文章為大家總結了科學設置學習率的方法,建議大家閱讀收藏~

本文來自:https://zhuanlan.zhihu.com/p/332766013  已獲得授權轉載 。深度神經網絡的參數學習主要是通過梯度下降方法來尋找一組可以最小化結構風險的參數。而學習率在深度學習的訓練過程中是一個很重要的超參數,指導我們該如何通過損失函數的梯度調整網絡權重的超參數。學習率越低損失函數的變化速度就越慢。雖然使用低學習率可以確保我們不會錯過任何局部極小值,但也意味著我們將花費更長的時間來進行收斂,特別是在被困在高原區域的情況下。下面就是梯度下降法的公式:

 ,其中  表示學習率。目前的各種優化算法本質上還是對梯度下降法的各種變形,所以我們還是以典型的梯度下降法來說明。借用下圖:

當學習率設置的較小,訓練收斂較慢,需要更多的epoch才能到達一個較好的局部最小值;

當學習率設置的較大,訓練可能會在接近局部最優的附件震蕩,無法更新到局部最優處;

當學習率設置的非常大,正如上一篇文章提到可能直接飛掉,權重變為NaN;

那麼如何去設置學習率這個超參數呢?總體上可以分為兩種:人工調整或策略調整。人工調整學習率一般是根據我們的經驗值進行嘗試,首先在整個訓練過程中學習率肯定不會設為一個固定的值,原因如上圖描述的設置大了得不到局部最優值,設置小了收斂太慢也容易過擬合。通常我們會嘗試性的將初始學習率設為:0.1,0.01,0.001,0.0001等來觀察網絡初始階段epoch的loss情況:

如果訓練初期loss出現梯度爆炸或NaN這樣的情況(暫時排除其他原因引起的loss異常),說明初始學習率偏大,可以將初始學習率降低10倍再次嘗試;

如果訓練初期loss下降緩慢,說明初始學習率偏小,可以將初始學習率增加5倍或10倍再次嘗試;

如果訓練一段時間後loss下降緩慢或者出現震蕩現象,可能訓練進入到一個局部最小值或者鞍點附近。如果在局部最小值附近,需要降低學習率使訓練朝更精細的位置移動;如果處於鞍點附件,需要適當增加學習率使步長更大跳出鞍點。

如果網絡權重採用隨機初始化方式從頭學習,有時會因為任務複雜,初始學習率需要設置的比較小,否則很容易梯度飛掉帶來模型的不穩定(振蕩)。這種思想也叫做Warmup,在預熱的小學習率下,模型可以慢慢趨於穩定,等模型相對穩定後再選擇預先設置的學習率進行訓練,使得模型收斂速度變得更快,模型效果更佳。形狀如下:

這裡只說了如果設置學習率,至於學習率降低到什麼程序可以停止訓練,理論上訓練loss和驗證loss都達到最小的時候就可以了。這裡再說下去就是過擬合等內容,會再寫一篇詳細描述。策略調整學習率包括固定策略的學習率衰減和自適應學習率衰減,由於學習率如果連續衰減,不同的訓練數據就會有不同的學習率。當學習率衰減時,在相似的訓練數據下參數更新的速度也會放慢,就相當於減小了訓練數據對模型訓練結果的影響。為了使訓練數據集中的所有數據對模型訓練有相等的作用,通常是以epoch為單位衰減學習率。

固定學習率衰減包括:

分段減緩:每N輪學習率減半或者在訓練過程中不同階段設置不同的學習率,便於更精細的調參。TF的接口函數為:

global_step_op = tf.train.get_or_create_global_step()
base_learning_rate = 0.01
decay_boundaries = [2000, 4000] # 學習率衰減邊界;
learning_rate_value = [base_learning_rate, base_learning_rate/10., base_learning_rate/100.] # 不同階段對應學習率。
learning_rate = tf.train.piecewise_constant_decay(global_step_op, boundaries=decay_boundaries,values=learning_rate_value)


          分數減緩:將學習率隨著epoch的次數進行衰減, ,其中  表示學習率, 表示衰減率(可嘗試設為0.1,根據數據集/迭代次數調整),  表示迭代次數,  表示初始學習率。

        指數減緩:與分數減緩類似,只是採用指數形式做了表達,  ,其中gamma表示指數的底(通常會設置為接近於1的數值,如0.95),隨著訓練批次epoch的增加,學習率呈指數下降。TF的接口函數為:

global_step_op = tf.train.get_or_create_global_step()
base_learning_rate = 0.01
decay_rate = 0.98
decay_steps = 2000
learning_rate_no_stair = tf.train.exponential_decay(learning_rate=base_learning_rate,
decay_rate=decay_rate,
decay_steps=decay_steps,
staircase=True,
global_step=global_step_op,
name="exponential_decay_use_stair")

餘弦周期減緩:餘弦周期減緩也叫餘弦退火學習率,不同於傳統的學習率,隨著epoch的增加,學習率先急速下降,再陡然提升,然後不斷重複這個過程。其目的在於跳出局部最優點。

之前介紹的幾種學習率調節方式在神經網絡訓練過程中學習率會逐漸減小,所以模型逐漸找到局部最優點。這個過程中,因為一開始的學習率較大,模型不會踏入陡峭的局部最優點,而是快速往平坦的局部最優點移動。隨著學習率逐漸減小,模型最終收斂到一個比較好的最優點。如下圖所示:

而餘弦退火學習率由於急速下降,所以模型會迅速踏入局部最優點(不管是否陡峭),並保存局部最優點的模型。⌈快照集成⌋中⌈快照⌋的指的就是這個意思。保存模型後,學習率重新恢復到一個較大值,逃離當前的局部最優點,並尋找新的最優點。因為不同局部最優點的模型則存到較大的多樣性,所以集合之後效果會更好。如下圖所示:

兩種方式比較起來,可以理解為模型訓練的「起點」和「終點」是差不多的。不同的是,餘弦退火學習率使得模型的訓練過程比較「曲折」。TF的接口函數為:

# total_decay_step = 15000 總的學習率衰減步數
# base_learning_rate = 0.01 基學習率
# warmup_learning_rate = 0.0001 warm-up 學習率
# warmup_steps = 2000 warm-up 迭代次數
# hold_base_rate_steps_2000 = 2000 保持基學習率的步數
# hold_base_rate_steps_0 = 0
# alpha = 0.00001 最小學習率
global_step_op = tf.train.get_or_create_global_step()
learning_rate = cosine_decay_with_warmup(learning_rate_base=base_learning_rate,
total_decay_steps=total_decay_step,
alpha = alpha,
warmup_learning_rate=warmup_learning_rate,
warmup_steps=warmup_steps,
hold_base_rate_steps=hold_base_rate_steps_2000,
global_step=global_step_op)
def cosine_decay_with_warmup(global_step,
learning_rate_base,
total_decay_steps,
alpha = 0.0,
warmup_learning_rate=0.0,
warmup_steps=0,
hold_base_rate_steps=0):
"""Cosine decay schedule with warm up period.
In this schedule, the learning rate grows linearly from warmup_learning_rate
to learning_rate_base for warmup_steps, then transitions to a cosine decay
schedule."""
def eager_decay_rate():
"""Callable to compute the learning rate."""
learning_rate = tf.train.cosine_decay(learning_rate=learning_rate_base,
decay_steps=total_decay_steps - warmup_steps - hold_base_rate_steps,
global_step= global_step - warmup_steps - hold_base_rate_steps,
alpha=alpha)
if hold_base_rate_steps > 0:
learning_rate = tf.where(
global_step > warmup_steps + hold_base_rate_steps,
learning_rate, learning_rate_base)
if warmup_steps > 0:
if learning_rate_base < warmup_learning_rate:
raise ValueError('learning_rate_base must be larger or equal to '
'warmup_learning_rate.')
slope = (learning_rate_base - warmup_learning_rate) / warmup_steps
warmup_rate = slope * tf.cast(global_step,
tf.float32) + warmup_learning_rate
learning_rate = tf.where(global_step < warmup_steps, warmup_rate,
learning_rate)
return tf.where(global_step > total_decay_steps, alpha, learning_rate,
name='learning_rate')

if tf.executing_eagerly():
return eager_decay_rate
else:
return eager_decay_rate()

自適應學習率衰減包括:

AdaGrad、 RMSprop、 AdaDelta等。此處更偏向於優化算法,暫時不在該篇介紹。

備註:推薦這篇文章「Cyclical Learning Rates for Training Neural Networks」介紹如何找到適合當前網絡的初始學習率。

歡迎掃描下方的二維碼添加小助手微信,邀請您加入我們的微信交流群。群裡有多位清北復交、BAT、AI獨角獸大牛和眾多深度學習er在一起愉快的交流技術,有任何問題,都可以諮詢大家,歡迎你的加入哦。

相關焦點

  • 深度學習100問-11:什麼是學習率衰減?
    Lab          在深度學習煉丹過程中,一項關鍵的工作就是調參。其中優化器的學習率的設置是一個重要調參步驟。     關於優化算法的相關理論,這裡不過多展開,筆者在深度學習60講系列中第6講中有詳細講解,需要複習的朋友回看深度學習筆記6:神經網絡優化算法之從SGD到Adam即可。這裡咱們單獨把優化器中的學習率拎出來,因為學習率是一個神經網絡優化的關鍵參數。學習率即步長,它控制著算法優化的速度。
  • 深度學習的學習率調節實踐
    當一個ANN包含一個很深的隱藏層時,它被稱為深度神經網絡(DNN)。在本文中,我們將在MNIST數據集上訓練一個深度MLP,並通過指數增長來尋找最佳學習率,繪製損失圖,並找到損失增長的點,以達到85%以上的準確率。對於最佳的實踐過程,我們將實現早期停止,保存檢查點,並使用TensorBoard繪製學習曲線。
  • 深度學習·煉丹入門
    深度學習的模型訓練就是煉丹。把精選原始數據,按照神經網絡的規定法則通過計算框架提煉,從而得到一個遠小於數據數倍的模型。一個好的模型不僅能抓取數據中的模式,更是能提取更加一般化規則從而可以用來預測新的數據。雖然有人會指出機器學習的模型訓練也是一個類似的過程,但深度學習丹師對此是不屑的,他們認為訓練「淺」模型的人最多算是老中醫。
  • 乾貨:關於深度學習中學習率的常見問題總結(建議收藏)
    除了選擇學習率,損失函數的形狀以及選擇優化器之外,還要確定要達到目標最小值的速度和收斂速度。錯誤的權重學習率有什麼問題?當我們的輸入為圖像時,學習率設置不當會導致噪聲特徵,如下圖所示。恰恰相反,良好的學習速度是平滑,乾淨和多樣化的功能。正確和不正確設置的學習率將決定模型的預測質量:進行良好的培訓還是未融合的網絡。
  • 深度學習調參tricks總結!
    多模型融合Ensemble是論文刷結果的終極核武器,深度學習中一般有以下幾種方式不同的參數,通過cross-validation,選取最好的幾組同樣的參數,模型訓練的不同階段,即不同迭代次數的模型。不同的模型,進行線性融合. 例如RNN和傳統模型.
  • PyCharm+Docker:打造最舒適的深度學習煉丹爐
    一般煉丹都在伺服器上,很少有人在本機跑代碼的。之前自己搗鼓怎麼用本地的編輯器配上遠程伺服器的環境來營造一個最舒乎的姿勢。開始之前你可以對比以下條件來確定自己是否真的需要這樣做: 使用 PyCharm 作為主力 IDE 寫 Python而不是其他(我非常推薦大家用) 深度學習煉丹師(當然你可以不是,但如果是,你會更舒服) 伺服器在遠程或者區域網
  • 幫助開發者擊破「黑盒煉丹」
    深度學習模型訓練過程盯log頭暈眼花?複雜模型結構全靠腦補?網絡各層效果無法評估?模型評估指標難以綜合權衡?近日,VisualDL 2.0 ——飛槳可視化分析工具全面改版升級,幫眾位開發者們從」煉丹萌新」變身「太上老君」。
  • 如何優化深度學習模型
    事情不是那麼簡單。如果學習率太小,模型將花費太長時間來收斂,如上所述。如果你聽說過AutoML,那麼Google基本上就是這樣做的:將所有內容都設置為超參數,然後扔大量TPU在這個問題上讓它自行解決。但是對於我們絕大多數隻想在黑色星期五銷售之後用經濟型機器分類貓狗的人來說,現在是時候該弄清楚如何使這些深度學習模型真正起作用了。網格搜索這是獲得良好超參數的最簡單方法。
  • 學習率和batchsize如何影響模型的性能?
    batchsize目前深度學習模型多採用批量隨機梯度下降算法進行優化,隨機梯度下降算法的原理如下,n是批量大小(batchsize),η是學習率(learning rate)。學習率直接影響模型的收斂狀態,batchsize則影響模型的泛化性能,兩者又是分子分母的直接關係,相互也可影響,因此這一次來詳述它們對模型性能的影響。2 學習率如何影響模型性能?通常我們都需要合適的學習率才能進行學習,要達到一個強的凸函數的最小值,學習率的調整應該滿足下面的條件,i代表第i次更新。
  • 天橋調參師秘籍:一份深度學習超參微調技術指南
    隨著深度學習的興起,越來越多的人從事算法工程師這一崗位。有時候他們自嘲自己為「天橋調參師」。當然,算法工程師的工作內容並沒有那麼簡單,因為設置超參數的過程需要專業知識和廣泛的試驗和試錯過程。尤其是針對學習率(learning rate)、批量大小(batch size)、動量( momentum)和權重衰減(weight decay)這些超參數而言,沒有簡單易行的方法來設置。深度學習模型充滿了超參數,在如此高維空間中找到這些參數的最佳值並不是一項容易的挑戰。在討論找到最佳超參數的方法之前,首先了解這些超參數:學習率、批量大小、動量和權重衰減。
  • 深度學習中的超參數優化技術
    設置超參數的過程需要專業知識和廣泛的試驗和錯誤。沒有簡單易行的方法來設置超參數 - 特別是學習率、批量大小、動量和權重衰減。深度學習模型充滿了超參數,在如此高維空間中找到這些參數的最佳配置並不是一項微不足道的挑戰。
  • 自Adam 出現以來,深度學習優化器發生了什麼變化?
    這個方法很簡單,你只需將模型和數據迭代幾次,把學習率初始值設置得比較小,然後在每次迭代後增加。你需要記錄學習率的每次損失並將它畫出。LR Range Test 圖示。LR 的初始值僅為 1e-7,然後增加到 10。
  • 改善深度學習訓練的trick總結|CSDN博文精選
    作者 | ZesenChen來源 | CSDN博客精選在深度學習中,同樣一個模型用不同的初始化,數據處理,batch size,學習率,優化器都能得到不同性能的參數。我根據自己參與過的比賽中經常用到的一些trick進行大致的總結,有代碼的會順便附上,方便自己以後使用。
  • 深度 | 從修正Adam到理解泛化:概覽2017年深度學習優化算法的最新研究進展
    因此從機器學習從業者的角度看來,深度學習最好的優化算法開發近年來基本沒有太大的突破。然而,今年我們開發了好幾種新的方法被,它們有望優於當前最佳的方法,並用於未來複雜模型的優化中。在這篇博客中,我將介紹深度學習優化算法中幾個最有意義的進展以及最有潛力的方向。這篇博客假定讀者熟悉 SGD 和適應性學習率方法,如 Adam。
  • 2020年深度學習調參技巧合集
    尋找合適的學習率學習率是一個非常非常重要的超參數,這個參數呢,面對不同規模、不同batch-size、不同優化方式、不同數據集,其最合適的值都是不確定的,我們無法光憑經驗來準確地確定lr的值,我們唯一可以做的,就是在訓練中不斷尋找最合適當前狀態的學習率。
  • [機器學習基礎二] 深度學習優化器一覽
    本文為機器學習基礎 第二篇Hello大家好,本期將和大家一起分享和討論一下深度學習中的一個基礎組件:Optimizer,也就是優化器。
  • 教你如何從零開始構建深度學習項目?
    ,分為以下六個部分:第一部分:啟動一個深度學習項目第二部分:創建一個深度學習數據集第三部分:設計深度模型第四部分:可視化深度網絡模型及度量指標第五部分:深度學習網絡中的調試第六部分:改善深度學習模型性能及網絡調參第一部分:啟動一個深度學習項目
  • ...必備技能:一文實現深度學習數學原理入門,還有吳恩達老師親授課程
    賈浩楠 發自 凹非寺量子位 報導 | 公眾號 QbitAI哪個程式設計師不想高效「煉丹」?尤其是深度學習算法開發人員,追求模型結構優化和提高編程效率是永遠的目標。就以深度學習中常用的神經網絡來說,典型模型包括多層感知機(DLP)、卷積神經網絡(CNN)、循環神經網絡(RNN)等等,不同的項目,對神經網絡的調參需求也不相同。
  • 手把手教你從零搭建深度學習項目(附連結)
    本文由六大部分組成,涵蓋深度學習 ( DL ) 項目的整個過程。我們將使用一個自動漫畫著色項目來說明深度學習的設計、程序調試和參數調整過程。本文主題為"如何啟動一個深度學習項目?"通常對於早期階段,默認設置已經能工作得很好。否則,最可能需要改變的參數應該是學習率。7.
  • 卷積神經網絡學習路線(五)| 卷積神經網絡參數設置,提高泛化能力?
    test_iter:網絡的迭代測試次數。網絡一次測試batch_size張圖片,因為為了可以將驗證集中所有圖片都測試一次,這個參數乘以batch_size應該等於驗證集中的圖片數。test_interval:網絡迭代多少次進行一次測試。一次迭代即是將一個batch_size的圖片進行訓練。