隨着深度學習的興起,愈來愈多的人從事算法工程師這一崗位。有時候他們自嘲本身爲「天橋調參師」。固然,算法工程師的工做內容並無那麼簡單,由於設置超參數的過程須要專業知識和普遍的試驗和試錯過程。尤爲是針對學習率(learning rate)、批量大小(batch size)、動量( momentum)和權重衰減(weight decay)這些超參數而言,沒有簡單易行的方法來設置。算法
深度學習模型充滿了超參數,在如此高維空間中找到這些參數的最佳值並非一項容易的挑戰。在討論找到最佳超參數的方法以前,首先了解這些超參數:學習率、批量大小、動量和權重衰減。這些超參數相似於開關旋鈕,能夠在模型訓練期間進行調整。爲了使得模型可以得到最佳結果,須要找到這些超參數的最佳值。服務器
梯度降低是訓練機器學習算法中經常使用的優化技術。訓練機器學習算法的主要目的是調整權重w以最小化損失函數或成本函數。經過最小化成本函數,就能夠找到產生最佳模型性能的參數[1]。
迴歸問題的典型損失函數圖相似於碗的形狀,以下所示。網絡
在梯度降低算法中,首先隨機模型參數,並計算每次學習迭代的偏差,不斷更新模型參數以更接近致使最小成本的值。梯度降低算法將梯度乘以一個標量(學習率),以肯定下一個點。
若是用dW和db做爲更新參數W和b的梯度,梯度降低算法以下:架構
若是學習率很小,那麼訓練會更加可靠,但花費的時間也更多,由於每次移動的步長很小。
若是學習率很大,那麼訓練可能不收斂。權重變化可能很大,以致於優化器錯失最優化並使得損失變大。所以,最終目標是找到能夠快速得到最小損失的最佳學習率。機器學習
通常而言,能夠將梯度降低視爲在山谷中滾動的球。但願它可以在停留山脈的最深處,但有時可能會出錯。函數
根據球開始滾動的位置,它可能會停留在山谷的底部。但不是最低的一個,這稱爲局部最小值。初始化模型權重的方式可能會致使局部最小值。爲了不這種狀況,能夠隨機始化權重向量。
用2-D表示損失面,以下所示:佈局
紅點是全局最小值,但願可以達到這一點。使用梯度降低方法,更新將以下所示:性能
隨着梯度降低的每次迭代,向上和向下振盪移動到局部最優。若是使用更大的學習率,那麼垂直振盪將具備更高的幅度。這種垂直振盪會減慢梯度降低過程,並阻止設置更大的學習率,而學習速率過小會使梯度降低變慢。學習
目標是但願在垂直方向上學習更慢,在水平方向上學習更快,這將有助於更快地達到全局最小值。測試
爲了實現這一點,可使用具備動量的梯度降低 [2]。
梯度降低:
在動量方面,採用dW和db的指數加權平均值,而不是每一個時期單獨使用dW和db。
其中β
是另外一個稱爲動量的超參數,取值範圍從0到1。它設置先前值的平均值與當前值之間的權重,以計算新的加權平均值。
計算指數加權平均值後更新參數。
經過使用dW和db的指數加權平均值,將垂直方向上的振盪平均化爲接近零。然而,在水平方向上,全部導數都指向水平方向的右側,所以水平方向上的平均值仍然至關大。它容許算法採用更直接的路徑朝向局部最優並阻尼垂直振盪。基於此,算法最終會在局部最優處進行幾回迭代。
有三種梯度降低的方法:
b
個示例:訓練時不是使用全部的示例,而是將訓練集劃分爲稱爲批處理的較小尺寸,每次取b
個示例用來更新模型參數;在網格搜索[3]中,嘗試每一個可能的參數配置。
步驟:
n =(learning_rate, batch_size)
;batch_size = [4,8,16,32]
,learning_rate = [0.1,0.01,0.0001]
;C1 =(0.1,4) - > acc = 92%
,C2 =(0.01,4) - > acc = 92.3%
等;隨着維度的增多,搜索將在時間複雜度上發生爆炸。當維度小於或等於4時,一般使用這種方法。雖然它最終能保證找到最佳配置,但它仍然不是優選的,最好是使用隨機搜索。
隨機搜索[4]首先從配置空間中隨機選取一個點,使用隨機搜索更普遍地探索超參數空間。這能夠在更少的迭代次數中找到最佳配置。例如:
在網格佈局中,很容易注意到,即便已經訓練了9個模型,而每一個變量只使用了3個值。然而,使用隨機搜索,咱們不太可能不止一次地選擇相同的變量,將使用9個不一樣的值爲每一個變量訓練9個模型。更多詳細分析,請參閱該文。
儘管隨機搜索比網格搜索表現更好,但這兩種方法在計算上仍然是昂貴且耗時的。在2018年,Leslie在其經典論文中提出了關於識別最佳超參數的各類方法的詳細報告[5]。其中最好的方法是基於經過檢查測試/驗證損失以尋找欠擬合和過擬合的曲線來找到兩者之間的平衡,以便爭取最佳的超參數集合。
超參數調整過程無異於在鋼絲上走路,以實現欠擬合和過擬合之間的平衡。
若是學習率過小,則可能發生過擬合。較高的學習率有助於正則訓練,但若是學習率過大,訓練就會出現偏差。所以,能夠進行短距離網格搜索以找到收斂或發散的學習率,但還有另外一種方法稱爲「週期性學習率(CLR)」。
實驗代表,訓練期間使用不一樣的學習率整體上是有益的,所以建議在一個取值範圍內週期性地改變學習率,而不是將其設定爲固定值。讓學習率在必定範圍內變化,而不是採用逐步、固定或指數級減小學習率值。即設置好最小和最大邊界,學習率在這些邊界之間循環變化。
LR範圍測試:運行模型幾個epoch,同時讓學習率在高低學習率值之間線性增長。對於淺層的3層架構,最大設置爲0.01
,而對於resnet這樣的網絡,學習率最大能夠設置爲3.0
。
從一輪循環肯定最大學習速率,並將最大值的十分之一做爲最小學習率的表現也不錯[6]。
與學習率不一樣,其值不影響計算訓練時間。批量大小受硬件內存的限制,而學習率則否則。建議使用適合硬件內存的較大批量大小,並使用更大的學習速率。
若是服務器有多個GPU,則總批量大小是單個GPU上的批量大小乘以GPU的數量。
動量和學習率密切相關。最佳學習率取決於動量,而動量又取決於學習率。與學習率同樣,在不引發訓練不穩定的狀況下儘量設置大的動量值是頗有價值的。
0.9-0.99
)將起到僞增長學習率的做用並加速訓練。可是,使用過大的動量值會致使訓練結果不好。不管是循環學習速率仍是恆定學習速率,能夠嘗試在0.9到0.99範圍內設定動量值,並從中選擇一個表現最佳值。
體重衰減是正則化的一種形式,它在訓練中起着重要做用,所以須要適當設定[7]。權重衰減被定義爲將每一個時期的梯度降低中的每一個權重乘以因子λ(0 <λ<1
)。
通常而言,能夠測試權重衰減值爲1 /10³
、1 /10⁴
、1 /10⁵
和0
。較小的數據集和模型結構設置較大的權重衰減值,而較大的數據集和更深的模型結構設置較小的值。
若是使用恆定的學習率而不是使用學習率範圍進行搜索,則最佳權重衰減會有所不一樣。因爲較大的學習率提供正則化,所以較小的權重衰減值是最佳的。
0.99
、0.97
、0.95
和0.9
進行測試,以得到動量的最佳值;0.8
或0.85
;10^-4
、10^-5
、10^-6
、0
;10^-2
、10^-3
、10^-4
;
原文連接 本文爲雲棲社區原創內容,未經容許不得轉載。