深度學(xué)習(xí)中的的超參數(shù)調(diào)節(jié)
我們平時一直都在說“調(diào)參、調(diào)參”,但實際上,不是調(diào)“參數(shù)”,而是調(diào)“超參數(shù)”。
一、參數(shù)(Parameter)和超參數(shù)(HyperParameter)是指什么呢?
參數(shù)是我們訓(xùn)練神經(jīng)網(wǎng)絡(luò) 最終要學(xué)習(xí)的目標(biāo),最基本的就是神經(jīng)網(wǎng)絡(luò)的權(quán)重 W和bias b,我們訓(xùn)練的目的,就是要找到一套好的模型參數(shù),用于預(yù)測未知的結(jié)果。這些參數(shù)我們是不用調(diào)的,是模型來訓(xùn)練的過程中自動更新生成的。
超參數(shù)是我們控制我們模型結(jié)構(gòu)、功能、效率等的 調(diào)節(jié)旋鈕,具體有哪些呢:
- learning rate
- epochs(迭代次數(shù),也可稱為 num of iterations)
- num of hidden layers(隱層數(shù)目)
- num of hidden layer units(隱層的單元數(shù)/神經(jīng)元數(shù))
- activation function(激活函數(shù))
- batch-size(用mini-batch SGD的時候每個批量的大小)
- optimizer(選擇什么優(yōu)化器,如SGD、RMSProp、Adam)
- 用諸如RMSProp、Adam優(yōu)化器的時候涉及到的β1,β2等等
- ......
太多了,上面是一些最常見的超參數(shù),一般的深度學(xué)習(xí)框架就是調(diào)節(jié)這些玩意兒。
具體怎么調(diào)節(jié),在不同的場景中基本都不同,沒有統(tǒng)一的標(biāo)準(zhǔn)說learning rate取多少比較好、epochs多少比較好,都是在在實際情況中反復(fù)試驗的。當(dāng)然,如果我們可以借鑒一些知名的項目的超參數(shù)的選擇,來應(yīng)用到我們類似的項目中去。
二、用什么方法來選擇“(超)參數(shù)組合”呢?
hyperparameters眾多,每一個hyperparameter有多種取法,這就是一個 組合問題了。
比如我們需要對兩個超參數(shù)進(jìn)行調(diào)節(jié),可能會想到用 “網(wǎng)格法”:

這種方法有個很大的缺陷,主要是由 “不同的超參數(shù)的重要性/作用效果有區(qū)別”導(dǎo)致的。
比如,假設(shè)在某個問題中,上面的Hyper1的作用其實微乎其微,而Hyper2的改變對模型的效果很明顯。那么,由網(wǎng)格法可知,H1和H2的組合有25種,我們需要試驗25次。但是實際上呢,由于H1基本不起作用,我們相當(dāng)于只進(jìn)行了5次試驗。
換句話說, 我們花了25次試驗的時間,只做了5次試驗。顯然效率低下。
事實上,不同超參數(shù)的效果有區(qū)別是很常見的,所以用網(wǎng)格法會浪費我們大量的時間和資源。
因此,我們最好在兩個參數(shù)構(gòu)成的矩形內(nèi),隨機(jī)取樣,理想狀態(tài)下,任何兩點都不同行不同列:

具體方法為:
- 在大范圍內(nèi)隨機(jī)取樣
- 在效果較好的幾個點的附近,再劃分較小區(qū)域,在其中再進(jìn)行隨機(jī)取樣
- 重復(fù)上述過程
這樣做的好處是,可以保證沒有浪費的試驗,同時可以迅速鎖定最優(yōu)區(qū)域,更快地找到最佳的超參數(shù)組合。
三、用合適的尺度(scale)來選擇超參數(shù)
上面我們解決了如何選擇組合的方法問題,但是具體 對于每一個超參數(shù),應(yīng)該在怎樣的一個尺度上進(jìn)行劃分呢?
一般從經(jīng)驗上講,我們可能會直接 “均勻采樣(uniformly)”,就是用均勻分布去選擇各個候選的超參數(shù)。然而,這里直接給出結(jié)論,這樣 意義不大! 比如下面這種對學(xué)習(xí)率的在0~1上以0.1為尺度來采樣:

實際上效果是極差的。也許你會發(fā)現(xiàn),對所有的點,試驗的效果都是類似的。
為什么呢?(實際上,learning rate基本不會取大于0.1的值,因為太大了,梯度下降根本沒法有效進(jìn)行)
因為像這種超參數(shù),我們在調(diào)節(jié)的時候,更關(guān)注的不是實際的數(shù)值,而是變化的程度。
例如,learning rate 從0.001到0.1,擴(kuò)大了100倍,實際梯度下降中每一步都比之前增大了100倍。但是,從0.1到1,雖然實際的數(shù)值差比0.001到0.1的距離要大的多,但是實際的變化量最多就10倍。
因此,我們做實驗就可以發(fā)現(xiàn),0.001到0.1這個范圍內(nèi),learning rate極為敏感,也許一個小小的改變就可以讓我們的梯度下降cost曲線大有不同,但是從0.1到1,cost曲線也許基本沒有變化。
更好的辦法,是 在對數(shù)尺度上隨機(jī)取樣:

可以看到,這把“尺子”的每個刻度都是相差十倍的關(guān)系,我們的learning rate在這個尺度上進(jìn)行隨機(jī)采樣,就可以得到很好的效果,盡快地找到最佳的超參數(shù)。
為啥這個是對數(shù)尺度呢?
不妨將取樣的區(qū)間定義為[10a,10b],
但是,learning rate不是在上述區(qū)間均勻取樣,而是令 learning rate=10r,讓r在[a,b]內(nèi)均勻取樣。而r=log(learning rate).
因此稱這種取樣為log尺度取樣。
通常,像learning rate這種連續(xù)性的超參數(shù),都會在某一端特別敏感,learning rate本身在 靠近0的區(qū)間會非常敏感,因此我們一般在靠近0的區(qū)間會多采樣。
類似的,動量法梯度下降中(SGD with Momentum)有一個重要的超參數(shù) β,β越大,動量越大,因此 β在靠近1的時候非常敏感,因此一般取值在0.9~0.999.
四、訓(xùn)練模型的兩種方式
吳恩達(dá)很形象地用兩種動物來形容在實踐中我們訓(xùn)練一個模型的兩種方法:
熊貓法(Panda) VS. 魚子醬法(Caviar)
熊貓法:
當(dāng)我們訓(xùn)練一個很大的模型,但是計算資源又沒有那么多的時候,我們會很珍惜我們的訓(xùn)練機(jī)會,通常會像照顧一個熊貓一樣去照顧我們的模型的訓(xùn)練過程。
具體來說,我們先初始化一組超參數(shù),然后每訓(xùn)練一段時間,比如一天,就趕緊去看看進(jìn)展如何,是否按照我們預(yù)想的方向發(fā)展,然后做一定的微調(diào),接著訓(xùn)練,保持觀察;如果發(fā)現(xiàn)偏離了方向,趕緊對超參數(shù)進(jìn)行調(diào)整。就這樣,一天天地照看,直到最后達(dá)到我們的訓(xùn)練目標(biāo)。
可以用下面的圖來表示:

如圖所示,每一天我們觀察一次效果,并做微調(diào)??梢钥吹剑叭於疾诲e,第四天突然走偏了,于是我們趕緊退回到D3的節(jié)點,調(diào)整參數(shù)重新訓(xùn)練,讓它回到正軌。
這就跟熊貓的養(yǎng)成一樣,熊貓每次只能生一個,而且存活率也很低,所以我們必須特別小心地看護(hù)。
魚子醬法
魚產(chǎn)卵一次就是一大坨,成千上萬個小孩生出來,生死由命。
如果我們的計算資源足夠豐富,可以同時訓(xùn)練多個模型,那么我們就可以用魚子醬法:

我們直接丟一堆超參數(shù)組合的模型去訓(xùn)練,然后不管了,最后看看誰的效果最好就選擇誰。
對于這兩種方式怎么選擇,當(dāng)然是看具體的情況了,一般情況話,訓(xùn)練一個大模型的時候,我們沒有那么壕,所以小心翼翼地去像照顧熊貓一樣去調(diào)節(jié)我們的模型可能更常見一些。
好了,關(guān)于超參數(shù)調(diào)節(jié)(Hyperparameters tuning)的內(nèi)容就差不多這些。具體的細(xì)節(jié)還是需要我們在實踐中不斷去嘗試,以及可以多看看一些成功的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的參數(shù)都是怎么設(shè)置的,作為借鑒。
歡迎關(guān)注我的專欄:
DeepLearning.ai學(xué)習(xí)筆記
和我一起一步步學(xué)習(xí)深度學(xué)習(xí)。
專欄其他文章:
【DL筆記1】Logistic回歸:最基礎(chǔ)的神經(jīng)網(wǎng)絡(luò)
【DL筆記2】神經(jīng)網(wǎng)絡(luò)編程原則&Logistic Regression的算法解析
【DL筆記3】一步步親手用python實現(xiàn)Logistic Regression
【DL筆記4】神經(jīng)網(wǎng)絡(luò)詳解,正向傳播和反向傳播
【DL碎片1】神經(jīng)網(wǎng)絡(luò)參數(shù)初始化的學(xué)問
【DL碎片2】神經(jīng)網(wǎng)絡(luò)中的優(yōu)化算法
【DL碎片3】神經(jīng)網(wǎng)絡(luò)中的激活(Activation)函數(shù)及其對比