【DL碎片4】深度學習中的的超參數調節

從【DL筆記1】到【DL筆記N】,是我學習深度學習一路上的點點滴滴的記錄,是從Coursera網課、各大博客、論文的學習以及自己的實踐中總結而來。從基本的概念、原理、公式,到用生動形象的例子去理解,到動手做實驗去感知,到著名案例的學習,到用所學來實現自己的小而有趣的想法......我相信,一路看下來,我們可以感受到深度學習的無窮的樂趣,並有興趣和激情繼續鑽研學習。 正所謂 Learning by teaching,寫下一篇篇筆記的同時,我也收穫了更多深刻的體會,希望大家可以和我一同進步,共同享受AI無窮的樂趣。


我們平時一直都在說“調參、調參”,但實際上,不是調“參數”,而是調“超參數”。

一、參數(Parameter)和超參數(HyperParameter)是指什麼呢?

參數是我們訓練神經網絡 最終要學習的目標,最基本的就是神經網絡的權重 W和bias b,我們訓練的目的,就是要找到一套好的模型參數,用於預測未知的結果。這些參數我們是不用調的,是模型來訓練的過程中自動更新生成的。

超參數是我們控制我們模型結構、功能、效率等的 調節旋鈕,具體有哪些呢:

  • learning rate
  • epochs(迭代次數,也可稱爲 num of iterations)
  • num of hidden layers(隱層數目)
  • num of hidden layer units(隱層的單元數/神經元數)
  • activation function(激活函數)
  • batch-size(用mini-batch SGD的時候每個批量的大小)
  • optimizer(選擇什麼優化器,如SGD、RMSProp、Adam)
  • 用諸如RMSProp、Adam優化器的時候涉及到的β1,β2等等
  • ……

太多了,上面是一些最常見的超參數,一般的深度學習框架就是調節這些玩意兒。

具體怎麼調節,在不同的場景中基本都不同,沒有統一的標準說learning rate取多少比較好、epochs多少比較好,都是在在實際情況中反覆試驗的。當然,如果我們可以借鑑一些知名的項目的超參數的選擇,來應用到我們類似的項目中去。


二、用什麼方法來選擇“(超)參數組合”呢?

hyperparameters衆多,每一個hyperparameter有多種取法,這就是一個 組合問題了。 比如我們需要對兩個超參數進行調節,可能會想到用 “網格法”

這種方法有個很大的缺陷,主要是由 “不同的超參數的重要性/作用效果有區別”導致的。

比如,假設在某個問題中,上面的Hyper1的作用其實微乎其微,而Hyper2的改變對模型的效果很明顯。那麼,由網格法可知,H1和H2的組合有25種,我們需要試驗25次。但是實際上呢,由於H1基本不起作用,我們相當於只進行了5次試驗。 換句話說, 我們花了25次試驗的時間,只做了5次試驗。顯然效率低下。

事實上,不同超參數的效果有區別是很常見的,所以用網格法會浪費我們大量的時間和資源。

因此,我們最好在兩個參數構成的矩形內,隨機取樣理想狀態下,任何兩點都不同行不同列

具體方法爲:

  1. 在大範圍內隨機取樣
  2. 在效果較好的幾個點的附近,再劃分較小區域,在其中再進行隨機取樣
  3. 重複上述過程

這樣做的好處是,可以保證沒有浪費的試驗,同時可以迅速鎖定最優區域,更快地找到最佳的超參數組合。


三、用合適的尺度(scale)來選擇超參數

上面我們解決了如何選擇組合的方法問題,但是具體 對於每一個超參數,應該在怎樣的一個尺度上進行劃分呢?

一般從經驗上講,我們可能會直接 “均勻採樣(uniformly)”,就是用均勻分佈去選擇各個候選的超參數。然而,這裏直接給出結論,這樣 意義不大! 比如下面這種對學習率的在0~1上以0.1爲尺度來採樣:

實際上效果是極差的。也許你會發現,對所有的點,試驗的效果都是類似的。 爲什麼呢?(實際上,learning rate基本不會取大於0.1的值,因爲太大了,梯度下降根本沒法有效進行)

因爲像這種超參數,我們在調節的時候,更關注的不是實際的數值,而是變化的程度。

例如,learning rate 從0.001到0.1,擴大了100倍,實際梯度下降中每一步都比之前增大了100倍。但是,從0.1到1雖然實際的數值差比0.001到0.1的距離要大的多,但是實際的變化量最多就10倍

因此,我們做實驗就可以發現,0.001到0.1這個範圍內,learning rate極爲敏感,也許一個小小的改變就可以讓我們的梯度下降cost曲線大有不同,但是從0.1到1,cost曲線也許基本沒有變化。

更好的辦法,是 在對數尺度上隨機取樣

可以看到,這把“尺子”的每個刻度都是相差十倍的關係,我們的learning rate在這個尺度上進行隨機採樣,就可以得到很好的效果,儘快地找到最佳的超參數。

爲啥這個是對數尺度呢? 不妨將取樣的區間定義爲[10a,10b], 但是,learning rate不是在上述區間均勻取樣,而是令 learning rate=10r,讓r在[a,b]內均勻取樣。而r=log(learning rate). 因此稱這種取樣爲log尺度取樣。

通常,像learning rate這種連續性的超參數,都會在某一端特別敏感,learning rate本身在 靠近0的區間會非常敏感,因此我們一般在靠近0的區間會多采樣。

類似的,動量法梯度下降中(SGD with Momentum)有一個重要的超參數 β,β越大,動量越大,因此 β在靠近1的時候非常敏感,因此一般取值在0.9~0.999.


四、訓練模型的兩種方式

吳恩達很形象地用兩種動物來形容在實踐中我們訓練一個模型的兩種方法: 熊貓法(Panda) VS. 魚子醬法(Caviar)

熊貓法:

當我們訓練一個很大的模型,但是計算資源又沒有那麼多的時候,我們會很珍惜我們的訓練機會,通常會像照顧一個熊貓一樣去照顧我們的模型的訓練過程。

具體來說,我們先初始化一組超參數,然後每訓練一段時間,比如一天,就趕緊去看看進展如何,是否按照我們預想的方向發展,然後做一定的微調,接着訓練,保持觀察;如果發現偏離了方向,趕緊對超參數進行調整。就這樣,一天天地照看,直到最後達到我們的訓練目標。

可以用下面的圖來表示:

如圖所示,每一天我們觀察一次效果,並做微調。可以看到,前三天都不錯,第四天突然走偏了,於是我們趕緊退回到D3的節點,調整參數重新訓練,讓它回到正軌。 這就跟熊貓的養成一樣,熊貓每次只能生一個,而且存活率也很低,所以我們必須特別小心地看護。

魚子醬法

魚產卵一次就是一大坨,成千上萬個小孩生出來,生死由命。 如果我們的計算資源足夠豐富,可以同時訓練多個模型,那麼我們就可以用魚子醬法:

我們直接丟一堆超參數組合的模型去訓練,然後不管了,最後看看誰的效果最好就選擇誰。

對於這兩種方式怎麼選擇,當然是看具體的情況了,一般情況話,訓練一個大模型的時候,我們沒有那麼壕,所以小心翼翼地去像照顧熊貓一樣去調節我們的模型可能更常見一些。


好了,關於超參數調節(Hyperparameters tuning)的內容就差不多這些。具體的細節還是需要我們在實踐中不斷去嘗試,以及可以多看看一些成功的神經網絡結構的參數都是怎麼設置的,作爲借鑑。


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