1. 程式人生 > >吳恩達《深度學習-改善深層神經網路》3--超引數除錯、正則化以及優化

吳恩達《深度學習-改善深層神經網路》3--超引數除錯、正則化以及優化

1. 系統組織超參除錯Tuning process

1)深度神經網路的超參有學習速率、層數、隱藏層單元數、mini-batch大小、學習速率衰減、β(優化演算法)等。其重要性各不相同,按重要性分類的話:   第一類:最重要的引數就是學習速率α    第二類:隱藏層單元數、mini-batch大小、β(優化演算法)    第三類:層數、學習速率衰減2)如何選擇除錯的引數組合呢?當超參較少時,傳統的做法是在引數組成的網格中規則取樣,比如有兩個超引數,如下圖左,然後嘗試所有引數組合,選出表現最好的一組,這種方式在引數較少時表現不錯,但是引數較多時就不太適用。推薦的做法是隨機選點,這樣的做法好處是,即使嘗試了相同數量的超引數組合,由於是隨機選取,對於任何一個超引數來說其嘗試的值會更多。比如對於只有兩個超引數的情況,兩種方式各嘗試了25各組合,對於第一種方式來說每個引數都只嘗試了5個不同的數,而隨機選點,每個引數嘗試的數會更多。

另一個常用的策略是,採用由粗糙到精細的策略,即先粗略取樣嘗試,發現幾個表現不錯的點,然後在那幾個點附近密集取樣,繼續嘗試。

2. Using a appropriate scale to pick hyperparameters選擇合適的超參標尺

1)對於隱藏層層數、隱藏層單元數這種取值範圍沒有數量級差的超參,直接隨機取樣就可以

2)對於學習速率α這種取值範圍有數量級差的超參,如0.0001~1,相差了10^3,如果隨機取樣,那麼90%的取樣點都將在0.1~1的範圍內,而我們更關注的表現可能更好的0.0001~0.1範圍內的取樣點僅有10%。所以對這種情況應該按數量級分段取樣,如0.0001~0.001~0.01~0.1~1,這樣分成四段分別隨機取樣。編碼時的做法是,用log找到數量級,如果線性區間為[a, b],令m=log(a),n=log(b),則對應的數量級log區間為[m,n]。對log區間的[m,n]進行隨機均勻取樣,然後得到的取樣值r,最後反推到線性區間,即
10r10r就是最終取樣的超引數。

m = np.log10(a)

n = np.log10(b)
r = np.random.rand()
r = m + (n-m)*r
r = np.power(
10,r)注意:除了α之外,動量梯度因子β也是一樣,在超引數除錯的時候也需要進行非均勻取樣。一般β的取值範圍在[0.9, 0.999]之間,那麼1β的取值範圍就在[0.001, 0.1]之間。那麼直接對1β在[0.001, 0.1]區間內進行log變換,然後隨機取樣。因為越靠近1,指數加權平均的個數變化越大,假設β從0.9000變化為0.9005,那麼1/(1-β)基本沒有變化。但假設β從0.9990變化為0.9995,那麼1/(1-β)前後差別1000。所以對
β接近1的區間,應該採集得更密集一些。

3. Hyperparameters tuning in practice: Pandas vs. Caviar

建議每隔一段時間對超引數進行一次重新測試或評估。

對於如何搜尋超引數,有兩個主要的思想流派:

1)babysit one model,簡單來說就是在一個模型不斷的除錯,先選擇一組超引數建立一個模型,然後觀察其效果,每天對其進行手動更改。適用於計算能力不足,不能在短時間內訓練大量模型時。這種方式被稱為Panda approach熊貓方式,因為熊貓的孩子非常少,通常只有一個,所以一般會花費大量心血,以確保其能成活。

2)實驗多種模型,選擇一組超引數建立模型,自動訓練直至完成,畫出學習曲線,然後換一組引數重複。這種方式被稱為caviar strategy魚子醬方式,產下很多卵,不會對任何一個多加照料,只期待其中一部分存活。這兩種方式的選擇,取決於所擁有的的計算資源及應用。如果擁有足夠強大的計算資源,那麼魚子醬模式是首選,但是如果計算資源不足夠,或一些資料量非常巨大的應用,如線上廣告設定及計算機視覺領域,熊貓方式通常更合適。在熊貓方式中如果一段時間後發現也許重新建立一個模型更好,也可以重新建立一個模型。

4. Normalizing activations in a network--Batch Normalization

1)為什麼?Batch Normalization(batch歸一化),可以是引數搜尋問題變得容易,使神經網路對於選定的超參更加穩定,即使超參取值範圍很大,也可以表現的很好,也使得神經網路乃至深度神經網路的訓練更為容易。我們已經歸一化了輸入值X,那麼Can we nomalize the value of a/z, so as to train w and b faster?關於是歸一化z還是歸一化a,也就是在啟用函式之前歸一化還是之後歸一化,有一些爭論,這裡介紹的是在啟用函式之前歸一化,也就是歸一化z,並推薦此種方法。2)如何實現?implementing batch norm這裡的z是某一層的z,為了簡化表達,省略的其所在的層號,這樣計算下來,使得其均值為0,方差為1,但若是不想讓隱藏單元的值均值為0方差為1,也許隱藏單元有了不同的分佈會更有意義,這時可以這樣做:

γ和β都是可學習的引數,使用梯度下降或其他優化方法,可以更新γ和β,就像更新w和b一樣。注意γ的作用就是為新得到的z設定方差,β的作用就是為新得到的z設定均值,如果這樣設定:

那麼新得到的z將會和原來的z一樣。batch norm真正的作用,是使隱藏層單元值的均值和方差標準化。

5. Fitting Batch Norm into a neural network

本節講的是如何在mini-batch中應用batch norm(BN),值得一提的是正向傳播中Z[l]=W[l]A[l1]+b[l],但由於batch norm有去均值的操作,相當於把常數項b減掉了,所以這裡的常數項可以去掉或設定為0,變為Z[l]=W[l]*A[l-1],常數項b的作用由β來代替,這樣所有的引數就變為w、γ和β,在反向傳播過程中利用優化演算法對這幾個引數進行迭代更新。

--正向傳播:X-->Z[1]=W[1]*X -->~Z[1](歸一化,增加引數γ1和β1)-->A[1]=g9~Z[1])-->Z[2]=W[2]*A[1]-->~Z[2](歸一化,增加引數γ2和β2)-->A[2]=g(~Z[2])……(~Z表示batch歸一化之後的Z)--反向傳播:W[l]=W[l]-αdwγ[l]=γ[l]-αdγβ[l]=β[l]-αdβ

這裡用的傳統的梯度下降演算法,也可以使用其他優化演算法,如動量梯度下降、RMSprop或者Adam等。

6. Why does Batch Norm work?

原因之一:之前歸一化是把輸入特徵做均值為0,方差為1的規範化處理,來加快學習速度。而Batch Norm也是對隱藏層各神經元的做類似的規範化處理。

原因之二:batch歸一化使得權重比網路更深(deeper or later),使得後面的權重對前面權重的變化更具有魯棒性。下面舉例說明:

假如用一個淺層神經網路(比如邏輯迴歸)來訓練貓的識別器。但是所有的訓練樣本都是黑貓。然後,用這個訓練器來對各種顏色的貓進行測試,測試的結果可能並不好。這種訓練樣本(黑貓)和測試樣本(各種顏色的貓)分佈的變化稱之為covariate shift。

這裡寫圖片描述

對於這種情況,已經學習到了x到y的對映,如果x的分佈發生了變化,一般是要對模型重新進行學習的,哪怕x到y的對映函式並沒有變化,也需要重新學習才能有較好的效果。在神經網路,尤其是深度神經網路中,在迭代過程中引數是不斷更新的,對於某一個隱藏層來說,它的輸入值就是不斷在變化的,這就導致了covariate shift問題,而Batch Norm的作用恰恰是減小隱藏層數值(分佈)變化的量,通過對隱藏層數值均值和方差的限定,使得其變化被控制在了很小的範圍內,從而限制了由於前層權重更新在當前層引起的數值分佈變化的程度,使得隱藏層數值更加穩定,減弱了前層引數作用和後層引數作用的聯絡,使得各層相對獨立,可以自己學習,從而有助於加速整個網路的學習。

另外,Batch Norm也起到輕微的正則化(regularization)效果:

--batch歸一化對Z的縮放是由某一mini-batch計算的均值和方差來決定的,而不是整個資料集的均值和方差,所以這樣的均值和方差是含有一些噪聲的--由於均值和方差含有噪聲,所以計算得來的Z也是有噪聲的,相當於往每個隱藏層的啟用值上隨機添加了噪聲,(這個dropout類似,dropout新增噪聲的方式是使得一些隱藏層單元有一定概率乘以0,一些隱藏層單元有一定概率乘以1,所以dropout含多重噪聲),batch歸一化也含有多重噪聲,去均值一重噪聲,標準偏差又一重噪聲。--所以類似dropout,batch歸一化也有正則化效果,由於新增噪聲,使得後部單元不能過分依賴任何一個輸入單元,但由於噪聲很小,所以正則化效果也很微弱,實際中可以同時使用dropout和batch歸一化。--mini-batch size越大,如用512代替64,那麼噪聲就會減少,正則化效果就會更弱。

但是,正則化是Batch Norm的意外收穫,不推薦把Batch Norm作為正則化的一種手段,batch norm真正的意義還在於歸一化隱藏層單元啟用值,加速學習。

7. Batch Norm at test time

訓練過程中,Batch Norm是對某個mini-batch進行操作的,如計算均值方差,但在測試過程中,對單個樣本,應該怎麼做呢?

μσ2是對某個mini-batch中所有m個樣本求得的。在測試過程中,如果只有一個樣本,求其均值和方差是沒有意義的,就需要對μσ2進行估計。估計的方法有很多,理論上我們可以將所有訓練集放入最終的神經網路模型中,然後將每個隱藏層計算得到的μ[l]σ2[l]直接作為測試過程的μσ2來使用。但是,實際應用中一般不使用這種方法,而是使用之前介紹過的指數加權平均(exponentially weighted average)的方法來估計測試過程單個樣本的μσ2

具體做法:對於第l層隱藏層,考慮所有mini-batch在該隱藏層下的μ[l]σ2[l],然後用指數加權平均的方式來預測得到當前單個樣本的μ[l]σ2[l]。這樣就實現了對測試過程單個樣本的均值和方差估計。最後,再利用訓練過程得到的γβ值計算出各層的z~(i)值。

8. Softmax Regressionlogistics regression解決的是二分類問題,softmax regression解決的是多分類問題。softmax可以理解為啟用函式的一種,但是它是專門用於多分類神經網路的最後一層,對Z進行歸一化,使得最終各項之和為1。
其計算方法很簡單,就是在獲得最後一層的Z[L]=W[L]*A[L-1]+b[L]之後進行如下計算:輸出層每個神經元的輸出a[L]i對應屬於該類的概率。9. Training a softmax classifier

1)為什麼叫softmax

softmax是為了和hard max對應,對於多分類最後結果,hard max選擇可能性最大的一項設定為1,其餘為0,而softmax則是列出屬於各類的概率,方式相對溫和一些。C--類數

2)成本函式

對於單個樣本,loss function:

對於整個資料集,成本函式cost function:3)softmax的梯度