【調參15】如何配置神經網絡的學習率



神經網絡的權重無法使用分析方法來計算,必須通過隨機梯度下降的經驗優化過程來尋找權重。神經網絡的隨機梯度下降法所解決的優化問題極具挑戰性,解空間(權重集)可能包含許多好的解(全局最優解),而且容易找到,但是更容易找到局部最優解。在此搜索過程的每個步驟中,模型的變化量或步長稱爲學習率(learning rate),它可能是神經網絡最重要求最需要調整的超參數,以實現模型對特定問題的良好性能。


1. 什麼是學習率

深度學習神經網絡是使用隨機梯度下降算法訓練的。隨機梯度下降法是一種優化算法,它使用訓練數據集中的示例爲模型的當前狀態估算誤差梯度,然後使用誤差的反向傳播算法(簡稱反向傳播)更新模型的權重。

訓練過程中權重的更新量稱爲步長或“ 學習率”。具體而言,學習率是用於神經網絡訓練的可配置超參數,爲一個確定步長的正標量,值域爲 [0.0,1.0][0.0,1.0],經驗值爲 0.0010.0010.010.01。通常用小寫的希臘字母 η\eta 表示。

在訓練期間,誤差的反向傳播估計網絡中節點權重所負責的錯誤量。不是更新全部權重,而是根據學習率來縮放。0.1的學習率意味着每次更新權重時,網絡中的權重將更新0.1 *(估計的權重誤差)或估計的權重誤差的10%。


2. 學習率的影響

神經網絡學習或近似一個函數,以最佳地將輸入映射到訓練數據集中示例的輸出。

學習速率超參數控制模型學習的速率或速度。具體來說,它控制模型權重隨其每次更新而更新的分配誤差量,例如在每批訓練示例的末尾。

給定一個完美配置的學習速率,該模型將學習在給定數量的訓練時期(通過訓練數據)中,在給定可用資源(層數和每層節點數)的情況下,對函數進行最佳近似。

通常,較高的學習率可使模型學習更快,但代價是要獲得次優的最終權重集。較小的學習率可以使模型學習更優化的甚至是全局最優的權重集,但是訓練時間可能會更長。

在極端情況下,學習速率過大將導致權重更新過大,模型的性能(例如訓練損失)在訓練期間會發生振盪。振盪是由發散的權重引起的。太小的學習速率可能永遠不會收斂或陷入局部最優解。

在最壞的情況下,權重更新太大會導致權重爆炸(即導致數值溢出)。當使用較高的學習率時,可能會遇到一個正反饋循環,其中較大的權重會導致較大的梯度,然後導致較大的權重更新。如果這些更新持續增加權重的大小,則[權重]會迅速遠離原點,直到發生數值溢出爲止。


3. 如何設置學習率

在訓練數據集上爲模型找到合適的學習率非常重要。實際上,學習率可能是爲模型配置的最重要的超參數。學習率可能是最重要的超參數。如果有時間僅調整一個超參數,請調整學習率。

一般來說,不可能先驗地計算出最佳學習率。相反,必須通過反覆試驗找到一個好的(或足夠好的)學習率。學習率的範圍通常爲 106η1.010^{-6} \le \eta \le 1.0

學習率將與優化過程的許多其它方面相互作用,並且相互作用可能是非線性的。一般而言,較低的學習率將需要更多的訓練時間;較高的學習率將需要較少的訓練時間。此外,考慮到誤差梯度的噪聲估計,較小的批次大小更適合較小的學習率

學習率的選擇非常關鍵,如果值太小,則誤差的減小將非常緩慢,而如果值太大,則可能導致發散振盪。

另一種方法是對所選模型的學習率進行敏感性分析,也稱爲網格搜索。這可以找到一個好的學習率可能存在的數量級範圍,以及描述學習率和性能之間的關係。網格搜索學習率通常是 0.10.110510^{-5}10610^{-6} 之間。例如,測試集合 {0.10.01103104105}\{ 0.1,0.01、10^{-3}、10^{-4}、10^{-5} \} 中的學習率在模型上的表現。


4. 爲學習過程添加動量(Momentum)

通過將歷史記錄添加到權重更新過程中,可以使訓練神經網絡變得更加容易。

具體地,當權重被更新時,可以包括權重的先前更新的指數加權平均值(exponentially weighted average)。隨機梯度下降的這種變化稱爲動量(momentum),並在更新過程中增加了慣性(inertia),從而導致一個方向上的許多過去更新在將來繼續朝該方向發展。

動量可以加速對這些問題的學習,在這些問題上,通過優化過程導航的高維權空間(weight space)具有誤導梯度下降算法的結構,例如平坦區域(flat regions)或陡峭曲率(steep curvature)。動量法旨在加速學習,尤其是在面對高曲率(high curvature),較小但一致的梯度或噪聲梯度(noisy gradients)時

過去更新的慣性量(amount of inertia)通過添加新的超參數(通常稱爲動量(momentum)或速度(velocity))進行控制,並使用希臘小寫字母 α\alpha 表示。動量算法引入了一個變量 vv,表示參數在參數空間中移動的方向和速度。速度設置爲負梯度的指數衰減平均值( exponentially decaying average of the negative gradient)。

它具有平滑優化過程,減慢更新速度以繼續前一個方向而不會卡住或振盪(oscillating)的作用。解決**特徵值差異很大(widely differing eigenvalues)**的一種非常簡單的技術是在梯度下降公式中添加動量項。這有效地增加了權重空間的運動的慣性,並消除了振動。

動量設置爲大於0.0且小於1的值,在實踐中通常使用0.5,0.9和0.99等常用值。Keras默認配置爲0.99。

動量不能使配置學習率變得容易,因爲步長與動量無關。相反,動量可以與步長一致地提高優化過程的速度,從而提高在更少的訓練時期中發現更好的權重集合(解空間)的可能性


5. 使用學習率時間表(LR Schedule)

與使用固定學習率相比,更好的另一種方法是在訓練過程中改變學習率。學習率隨時間變化的方式(訓練時期)稱爲學習率時間表(learning rate schedule)或學習率衰減(learning rate decay)。最簡單的學習率衰減方式是將學習率從較大的初始值線性減小到較小的值。這允許在學習過程開始時進行較大的權重更改,並在學習過程結束時進行較小的更改或微調。

在實踐中,有必要逐漸降低學習率,這是因爲SGD梯度估算器(estimator)引入了噪聲源(m個訓練樣本的隨機採樣),即使達到最小化也不會消失。

實際上,在訓練神經網絡時,使用學習速率表可能是最佳實踐。代替選擇固定的學習速率超參數,配置挑戰包括選擇初始學習速率和學習速率時間表。考慮到學習率時間表可能允許的更好性能,初始學習率的選擇可能不如選擇固定學習率敏感。

學習率可以衰減到接近零的較小值。或者,可以在固定數量的訓練時期內衰減學習速率,然後將剩餘的訓練時期保持在較小的恆定值,以利於進行更多的時間微調。

在Keras中可以設置學習率回調,通過監視驗證損失或者其他指標,來決定學習率衰減的程度。舉一個簡單的例子:

# snippet of using the ReduceLROnPlateau callback
from tensorflow.keras.callbacks import ReduceLROnPlateau
...
rlrop = ReduceLROnPlateau(monitor='val_loss', factor=0.1, mode='auto', patience=100)
model.fit(..., callbacks=[rlrop])

以上代碼的意思是說如果驗證損失連續在100個epoch內減小值小於0.1,則降低學習率。


6. 自適應學習率(Adaptive LR)

訓練數據集上模型的性能可以通過學習算法進行監控,並且可以相應地調整學習率。這稱爲自適應學習率。

合理的優化算法選擇是SGD,其動量具有學習速率下降的趨勢(在不同問題上表現較好或較差的流行衰減方法包括線性衰減,直到達到固定的最小學習速率,然後呈指數衰減,或將學習速率每次2-10個epoch降低一定比例)。如果在固定數量的訓練時期內性能沒有提高,則可以再次提高學習率。

自適應學習率方法通常會優於配置錯誤學習率的模型。自適應學習率方法如此有用和流行的原因之一是先驗地選擇好的學習率很困難。一個好的自適應算法通常會比簡單的反向傳播收斂速度快得多,而固定學習率選擇得不好。

儘管沒有任何一種方法可以最好地解決所有問題,但是已經證明了三種自適應學習率方法在許多類型的神經網絡和問題上均具有較強的魯棒性。它們是AdaGrad,RMSProp和Adam,並且都針對模型中的每個權重維持和調整學習率。 最常用的是Adam,因爲它在RMSProp之上增加了動量。

實際上,選擇何種優化器沒有固定的標準,需要針對不同的問題進行試驗,最流行的優化算法包括SGD,帶動量的SGD,RMSProp,帶動量的RMSProp,AdaDelta和Adam。


參考:
https://machinelearningmastery.com/learning-rate-for-deep-learning-neural-networks/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章