1. 程式人生 > >如何選取一個神經網絡中的超參數hyper-parameters

如何選取一個神經網絡中的超參數hyper-parameters

ica paper ida 然而 machine lar 關閉 實際應用 全部

1.什麽是超參數

所謂超參數,就是機器學習模型裏面的框架參數。比如聚類方法裏面類的個數,或者話題模型裏面話題的個數等等,都稱為超參數。它們跟訓練過程中學習的參數(權重)是不一樣的,通常是手工設定的,經過不斷試錯來調整,或者對一系列窮舉出來的參數組合一通枚舉(叫做網格搜索)。深度學習和神經網絡模型,有很多這樣的參數需要學習。

2.一些啟發式規則

在實際應用中,當你使用神經網絡去解決問題時,很難找到好的超參數。假設我們現在正在處理MINIST數據庫的問題,並且對超參數是如何使用的一無所知。假設我們大部分超參數的選擇如下:30 hidden neurons, a mini-batch size of 10, training for 30 epochs using the cross-entropy。但是學習速率和正則項系數的選擇如下:learning rate η=10.0η=10.0 以及 regularization parameter λ=1000.0

我們的分類精度並不好。你可能會說“這很簡單啊,減少學習速率和正則項系數”。但是你並不能先知這是由這兩個超參數引起的問題。可能真實的原因是:“不管其它超參數如何選擇,隱藏層包含30個神經元的網絡就是性能不好”、“可能我們至少需要100個神經元或者300個”、或者“使用另一種方法來對輸出進行編碼”、“可能我們需要訓練更多epochs”、“可能mini-batches太小了”、“可能我們需要另一種方法來初始化權值”等等。當你的網絡很大、訓練集很大時,這些超參數的問題可能會更讓你抓狂。

接下來會介紹一些啟發式規則,可以用來參考該如何設置超參數。當然這裏所介紹的並不是全部的規則,總會有新的技巧可以用來提高你的網絡性能。

2.1 廣泛戰略(Broad strategy)

我們使用神經網絡來解決問題所面臨的第一個挑戰就是:我們希望網絡有好的學習能力。也就是說,我們的網絡所得到的結果肯定要比偶然結果好(要是連隨隨便便的一個網絡的性能都比我們網絡的好,那我們這個網絡可見是有多差了)。但往往我們在面臨一個新問題時,想要做到這點更是極其困難。下面有一些策略可以用於解決這個問題。

2.1.1 將問題拆分

假設你現在是第一次接觸MINIST數據庫,你就遭遇了上述問題:網絡性能並不好。你要做的就是將問題拆開。將0s或1s的圖像留下,丟掉其它所有的訓練和驗證圖像,然後嘗試著建立一個能將0和1分開的網絡。這樣做不僅比原先需要區分十種圖像(數字0-9)要簡單的多,而且減少了80%的訓練數據量,將訓練過程加速了5倍。

2.1.2 將網絡拆分

為了進一步加速實驗過程,你也可以將你的網絡拆分為最簡單的形式,只要這個形式可以進行有意義的學習。比如說,如果你覺得一個 [784, 10] 的網絡對MINIST數字的分類結果better-than-chance,那你就可以從這樣的一個網絡開始訓練,看看結果如何。這將會比直接訓練一個 [784, 30, 10] 的網絡要快的多。

2.1.3 提高監測頻率

當超參數很多時,我們對性能的監測就會耗時很久。此時,我們可以通過更頻繁地監測驗證的準確度來更快地得到反饋,比如每訓練1,000張圖像之後就監測一次。此外,我們可以使用100張驗證圖像來更快地得到估計量,而不是全部的10,000張。關鍵就是提供大量的訓練圖像使得網絡得到很好地訓練,但只需粗略地估計性能即可。

這意味著你可以更快速地對超參數的其它choices進行測試,甚至可以幾乎同時測試不同的choices。

接下來我們看一下具體的建議,我們將會討論學習速率η、L2正則項系數λ,及小型批處理的大小(mini-batch size)。當然,這些建議也適用於其它超參數,包括那些與網絡結構相關的參數、其它形式的正則項參數,以及往後將會見到的超參數——如動量系數(momentum co-efficient)等。

2.2 學習速率η

假設我們使用3個不同的學習速率來運行MINIST網絡:η=0.025、η=0.25、η=2.5,其它參數像前面設置的一樣,其中 λ=5.0,我們仍使用全部的50,000張訓練圖像。下圖左是 training cost 的圖表,可以看出:η=0.025時,cost下降的很平滑;η=0.25時,cost最開始處於下降狀態,到epoch≈20時差不多就飽和了,再往後的改變很小且隨機波動;η=2.5時,cost從一開始就波動很大。

技術分享技術分享

想要了解波動的原因,我們可以回想隨機梯度下降法,它幫助我們逐漸滾落到損失函數的谷底,如上圖右。所以,如果η過大,跨的一步也就越大,當快要到達谷底時,可能跨的一步就越過了谷底,也就是滾過了頭。這也就是為什麽當η=2.5時,cost曲線產生波動的原因。當η=0.25時,cost曲線的後面一部分也出現了同樣的原因(overshooting problem)。而當η=0.025時,就沒有出現這樣的問題了。

雖然當η取的相對較小時,不會出現overshooting的問題,但是會出現另一個問題:減慢了隨機梯度下降法。所以這個時候,一個更好的辦法是:開始時,我們選取η=0.25,當epochs=20時,我們將 η 改為0.025。我們一會再討論這個可變的學習率的問題,現在先弄明白如何找到一個固定的好的 η 值。

2.2.1 固定的學習率

首先,我們估計 η 的閾值。當 η 取這個閾值時,訓練數據的cost立即開始減少,而不是產生波動或增加。這個估計不需要太過精確,你可以從 η=0.01 開始,然後依照量級開始增大。如果在前幾個epochs中cost是減少的,你就可以依次嘗試 η=0.1,1.0,……,直到某個 η 使得cost在前幾個epochs中是波動的或增加的。如果從 η=0.01 開始,前幾個epochs中cost是波動的或增加的,你就可以依次嘗試η=0.001,0.0001,……,直到某個 η 使得cost在前幾個epochs中是減少的。找到最大的 η 使得cost在前幾個epochs中減少,比如 η=0.5 或 η=0.2(這個值不需要超級準確)。這樣我們就得到了 η 的閾值。

顯然,實際的 η 不應該大於這個閾值。事實上,如果 η 取這個閾值時,在許多epochs中仍然起作用,我們一般會將真正的 η 取的比這個閾值小,一般是閾值的1/2。這樣的選擇可以使你訓練更多的epochs,而不會引起學習速率降低。

在MINIST數據這個例子中,在經過一些優化之後,我們得到的閾值為 η=0.5,按照上一段提到的規則,我們實際中選取的學習率 η=0.25。

這一切看似很簡單,但是使用cost函數去選擇 η 與我們前面所說的相矛盾了——我們會使用驗證數據來評估性能,從而選取超參數。在實際中,我們會使用驗證的精度去選擇正則化系數、mini-batch的大小、網絡參數(如層的數目和隱藏層神經元的個數等)等。

那為什麽對學習率 η 的處理不同呢?坦白講,這是我個人的審美偏好選擇,也許是有些特殊。原因是:其它超參數是旨在提高測試集最終的分類精度,所以通過驗證精度來選擇它們毋庸置疑。但是,學習率只是偶然影響分類精度,它的主要目的是控制梯度下降中的步長(step)。所以說,監測訓練的cost是檢測step size是否太大的最好方法。

不過總的來說呢,這是個人偏好問題。如果驗證精度提高,在學習的早期,訓練cost一般只會減少。所以說,其實在實際應用中,不管你選哪種準則,影響都不大。

2.2.2 Early Stopping

Early Stopping的意思就是:在每一次epoch結束後,我們都計算一下在驗證數據上的分類精度,當分類精度不再提高時,我們就終止訓練。這使得epoch的值非常容易設置,這樣我們就不用了解其它超參數是如何影響epoch的了。而且,Early Stopping也能自動防止網絡過擬合。

不過呢,在實驗的早期,關閉Early Stopping是需要的,這樣你可以看到過擬合的任何signs,然後用它們去調整你的方法。

那麽,分類精度不再提高是什麽意思呢?因為分類精度在一次epoch中降低了,不是說就會一直下降了,可能在下一個epoch中又上升了,所以不能根據一兩次的下降就說明分類精度“不再提高”了。正確的判斷方法是:在訓練的過程中,記錄最佳的validation accuracy,當連續10次(或更多次)epoch都沒達到最佳validation accuracy時,我們就可以認為是“不再提高”了。

此時,使用Early Stopping。這個策略就叫“no-improvement-in-n”,n即epoch的次數,可以根據實際情況取10、20、30……。因為有些網絡可能在一段時間內(即n)進入了平穩期,在那之後accuracy可能又開始提高了。

(這個規則也可以不用於實驗中)

2.2.3 可變的學習率

在前面我們講了怎麽尋找比較好的learning rate,方法就是不斷嘗試。在一開始的時候,我們可以將其設大一點,這樣就可以使weights改變地比較快,從而讓你看出cost曲線的走向(上升or下降)。進一步,你就可以決定增大還是減小learning rate。

但是問題是,找出這個合適的learning rate之後,我們前面的做法是在訓練這個網絡的整個過程中都使用這個learning rate,這顯然不是好的方法。

在優化的過程中,learning rate應該是逐漸減小的,越接近“山谷”的時候,邁的“步伐”應該越小。

在講前面那張cost曲線圖時,我們說可以先將learning rate設置為0.25,到了第20個epoch時候設置為0.025。這是人工的調節,而且是在畫出那張cost曲線圖之後做出的決策。能不能讓程序在訓練過程中自動地決定在哪個時候減小learning rate?

答案是肯定的,而且做法很多。一個簡單有效的做法就是:當validation accuracy滿足 no-improvement-in-n規則時,本來我們是要early stopping的,但是我們可以不stop,而是讓learning rate減半,之後讓程序繼續跑。下一次validation accuracy又滿足no-improvement-in-n規則時,我們同樣再將learning rate減半(此時就變為原始learning rate的四分之一了)…繼續這個過程,直到learning rate變為原來的1/1024再終止程序。(1/1024還是1/512還是其他可以根據實際情況來確定)(也可以選擇每次將learning rate除以10,而不是除以2)

2.3 正則項系數λ

正則項系數初始值應該設置為多少,好像也沒有一個比較好的準則。

建議一開始將正則項系數λ設置為0.0,先用上述方法確定一個比較好的learning rate。然後固定該learning rate,給λ一個值(比如1.0),然後根據是否提高了validation accuracy,將λ增大或者減小10倍(增減10倍是粗調節,當你確定了λ的合適的數量級後,比如λ = 0.01,再進一步地細調節,比如調節為0.02,0.03,0.009之類。)

當正則項系數 λ 確定好之後,我們需要反過來再對learning rate進行優化。

2.4 Mini-batch size

首先說一下采用mini-batch時的權重更新規則。比如mini-batch size設為100,則權重更新的規則為:

技術分享

也就是將100個樣本的梯度求均值,替代online learning方法中求單個樣本的梯度值:

技術分享

當采用mini-batch時,我們可以將一個batch裏的所有樣本放在一個矩陣裏,利用線性代數庫來加速梯度的計算,這是工程實現中的一個優化方法。

那麽,size要多大呢?一個大的batch,可以充分利用矩陣、線性代數庫來進行計算的加速,batch越小,則加速效果可能越不明顯。當然batch也不是越大越好,太大了,權重的更新就會不那麽頻繁,導致優化過程太漫長。所以mini-batch size選多少,不是一成不變的,根據你的數據集規模、你的設備計算能力去選。

幸運的是,使得學習速度最大的mini-batch size與其它超參數相對獨立(除了整體結構),所以你不需要通過優化其它超參數,以便找到最佳的mini-batch size。所以,合適的做法是:首先為其它超參數選擇一個合適的值(不一定是最優的),然後為mini-batch size嘗試不同的值,像前面講的那樣縮放learning rate,最後畫出實際運行時間(不是epoch)下的validation accuracy圖像,然後觀察哪個mini-batch size使得性能提高得最快。

得到了最優的mini-batch size,我們就可以對其它超參數進行優化了。

3.自動化技術

手動地優化是一個很好地理解神經網絡如何工作的方法。然而,不出意外的是,有許多關於將這一過程自動化的研究。一個常見的技術是網格搜索(grid search),通過網格有系統地搜索超參數空間。

還有許多更復雜的方法,但要提到一篇用貝葉斯方法自動優化超參數的文章。

參考文獻:

  1. 什麽是超參數
  2. Michael A.Nielsen, “Neural Networks and Deep Learning“ Chapter3-how_to_choose_a_neural_network’s_hyper-parameters, Determination Press, 2015.
  3. 這裏也有他人關於第三章的中文理解——機器學習算法中如何選取超參數:學習速率、正則項系數、minibatch size
  4. 選擇可變學習速率的好處:Ciresan, Ueli Meier, Luca Maria Gambardella,”Deep Big Simple Neural Nets Excel on Handwritten Digit Recognition “
  5. 關於神經網絡中的一些技巧:Grégoire Montavon, Geneviève B. Orr, Klaus-Robert Müller, “Neural Networks:Tricks of the Trade” book
  6. 關於網格搜索的成就和局限:James Bergstra, Yoshua Bengio, “Random search for hyper-parameter optimization”,2012 paper
  7. 用貝葉斯自動優化超參數:Jasper Snoek, Hugo Larochelle, Ryan Adams, “Practical Bayesian optimization of machine learning algorithms”,2012 paper
  8. 使用BP和梯度下降訓練神經網絡(包括深度神經網絡)的一些實際建議:Yoshua Bengio, “Practical recommendations for gradient-based training of deep architectures”, 2012 paper
  9. :Yann LeCun, Léon Bottou, Genevieve Orr and Klaus-Robert Müller, “Efficient BackProp”, 1998 paper
  10. 安逸軒博客: http://andyjin.applinzi.com/

如何選取一個神經網絡中的超參數hyper-parameters