1. 程式人生 > >改善深層神經網路:超引數除錯、正則化以及優化_課程筆記_第一、二、三週

改善深層神經網路:超引數除錯、正則化以及優化_課程筆記_第一、二、三週

所插入圖片仍然來源於吳恩達老師相關視訊課件。仍然記錄一下一些讓自己思考和關注的地方。

第一週 訓練集與正則化

這周的主要內容為如何配置訓練集、驗證集和測試集;如何處理偏差與方差;降低方差的方法(增加資料量、正則化:L2、dropout等);提升訓練速度的方法:歸一化訓練集;如何合理的初始化權重矩陣來緩解梯度消失和梯度爆炸的問題;在debug過程中應用梯度檢驗可以很好解決一些bug。

1.應用深度學習是一個多次迭代的過程,實際應用中每一次迭代的效率很關鍵。

2.Train\dev\test sets的劃分:

小資料量(萬級別):60/20/20 。

大資料量(百萬級別):98/1/1或者 99.5/0.4/0.1。

深度學習需要大量的資料進行學習,導致train\dev\test可能來自於不同的分佈,此時應該確保驗證集和測試集來自於同一分佈。如果不需要無偏估計的話,沒有測試集也是可以接受的。如果驗證集與測試集來自於同一分佈,在驗證集上表現良好往往在測試集上也表現良好。

3.通過訓練集誤差和驗證集誤差來判斷模型的偏差與方差情況。

注意下圖存在著兩個前提條件:(1)訓練集與驗證集來自於同一分佈。(2)數值相對於最優誤差(也成為貝葉斯誤差)來看,下圖最優誤差為0。訓練誤差較高,那麼偏差肯定也高,這是毋庸置疑的。驗證誤差相對於訓練誤差高,那麼該模型的方差就高。因為方差其實影響著該模型的泛化能力,一個模型的泛化能力弱表現在對於新的樣本的擬合程度低,方差高的模型泛化能力必然較弱。

 4.一種降低模型方差的方法是準備更多的資料,當沒有更多的資料時,還可以採用正則化。這也不難理解,當一個模型存在高方差,也就是過擬合的問題時,往往就是該模型太過於複雜,學習了一些我們並不想要其學習的特徵,在不變更模型的基礎上,正則化所要做的便是通過調整引數來做到降低模型複雜度的目的。在成本函式後新增正則化項,例如L2正則項,例如超引數進行調節,使引數的權重降低,便可以起到降低某些引數作用的目的。使用L2正則化的一個缺點在於,得不斷的嘗試超引數,這會負擔較大的計算代價。

5.Dropout(隨機失活)正則化 ,顧名思義,隨機刪除一些網路中節點,達到精簡網路、改善過擬合的目的。常用的Dropout方法之一便是反向Dropout(Inverted Dropout),這一方法在刪除節點後,注意使該層的啟用值除以keep-prob,目的是為了保持下一層輸出的期望與刪除節點之前保持一致。這樣做同時也保證在測試階段中的網路不使用dropout,輸出的結果也能保持合理性。

6.資料增強,解決資料量較小的問題。方法較多。

7.EarlyStopping,觀察訓練誤差和驗證誤差的曲線,選擇適當的位置,停止迭代過程。簡單方便,但是試圖一次性解決使代價函式最小和使模型方差變小這兩個問題,結果可想而知,並不會很好。

8.吐槽一下,1.8節明明講的是其他降低過擬合的方法,但是標題卻是其他正則化方法。

9.歸一化訓練集(Normalize train sets):減去均值,併除以方差。當輸入特徵的尺度差距很大時,如x1~(0,1),x2~(1,10000),此時歸一化訓練集可以起到加速學習過程的目的。具體參見下圖便很清晰了。例如左邊的圖,需要多次迭代尋找最小值,因為需要設定較低的學習率避免跳過區域性最小值。

10.梯度消失(vanishing gradient)和梯度爆炸(exploding gradient),如果此時利用梯度下降法進行訓練,那會非常的慢。這成為了訓練神經網路的一個阻力。合理的初始化權重矩陣(不能太大,也不能太小)是作為緩解這個問題的方法。例如Xavier初始化等等。關於Xavier初始化參見 2010_[Xavier Glorot]_Understanding the difficulty of training deep feedforward neural networks。

梯度檢驗(gradient checking),梯度檢驗是作為檢測神經網路在後向傳播中是否存在bug的一種實用的手段。由幾個注意事項:

(1)不要在神經網路訓練中應用,僅僅在debug中應用。

(2)注意正則項。

(3)不能與dropout一起使用。

第二週 優化演算法

1.mini batch梯度下降。

演算法每遍歷一次訓練集稱為一個epoch。

Mini-batch 是batch 和 stochastic(永遠不會收斂,只會在最小值附近波動,所以一般都不會使用)的折中,如何確定mini-batch的大小呢,有一些參考。

(1)當小樣本情況下,(m<2000),使用批梯度下降。

(2)一般選擇大小符合計算機的記憶體習慣,常見大小的選取:64,128,256,512。

2.指數加權平均,統計中稱為指數加權移動平均,並不是很清楚其原理,但是可以記下結論。

注意引數\beta的取值。

以及根據\beta​​​​​​​的值,可以大約推測平均了(1/1-\beta​​​​​​​)的資料。

由於初始值V0=0,這樣操作的話便會生成一個問題,使最初的幾個計算不準確,因此需要加一個偏差修正來解決:

                                                                                   V_{t}' = \frac{V_{t}}{1-\beta _{t}}

這裡,討論較深的數學意義不太有意義,形式上看,便是以指數的形式進行加權,權值依次為\beta\beta​​​​​​​^2,\beta​​​​​​​^3 其實將公式展開便可以大概看出是什麼情況。使用指數加權平均的一大優勢便是在電腦計算中佔據很小的記憶體,而且只需要很少的程式碼,因此計算的效率高。

3.動量梯度下降法(momentum),簡而言之,基本的想法就是計算梯度的指數加權平均數代替原有的梯度,並利用新計算的梯度來更新你的權重。

採用了一個新的引數vdw和vdb來代替之前的dw和db來進行引數的更新,因此,vdw與dw同維度,vdb與db同維度。\beta​​​​​​​常取值0.9,具備較好的魯棒性。當\beta​​​​​​​=0.9時,根據上面的內容,此時大致採用的是利用前10次進行更新,因此可以不考慮偏差修正。 

4.RMSprop(root mean square prop)

仍然是在更新引數這一塊做文章。這裡應注意幾個細節:

(1)dw的平方,db的平方。至於為什麼是平方,也就是說利用指數平均計算的是原有梯度的平方,沒有明白。這裡有一個疑問是,指數平均的每次原有梯度的平方值,原有梯度有正有負,這樣弄得話,那麼豈不是把負的和正的都一視同仁了?

(2)在進行更新權重時,加了一個根號分之一的權重,這樣的目的是為了減緩引數更新時的震盪,使震盪大的變小一些,震盪小的變大一些。

(3)注意根號內加一個較小值 \varepsilon,常選10的負8次方,目的是為了防止根號內的值太小。

(4)經過RMSprop,更新中引數的震盪幅度變小,因此學習率\alpha就可以適當增加。

 5.Adam(adaptive moment estimation 適應性矩估計),Momentum + RMSprop

注意幾個細節:

(1)引數都進行了偏差調整。

(2)超引數的選擇,常選用\beta_{1}=0.9,\beta_{2}=0.999。

(3)既然跟矩有關係,可以發現,momentum利用指數平均計算的是一階矩,RMSprop利用指數平均計算的二階矩。具體數學原理不清楚。

6.學習率衰減 隨著迭代過程的進行,逐步的減少學習率。之所以能夠加快學習的速度,是因為在學習的後期,當引數向著區域性最小值收斂時能夠減少在區域性最小值周圍擺動的過程。

最常見的學習率衰減函式,其中衰減率和\alpha _{0}都為超引數:

 還有一些學習率衰減的策略:指數式、開方式、離散式(一段時間設定一個值)以及純人工設定。

7.最後一講的視訊,吳恩達老師加深了我們對於區域性最小值的理解。在學習演算法中,我們常常會擔心自己的梯度下降演算法會陷入到區域性最小值內而無法達到全域性最小值,這在例如2維的低維空間是會存在這個問題,但是在高維的空間內,因為我們常常處理的是高維空間的問題,很少會遇到區域性最小值的點,而常常為遇到鞍點。這是因為區域性最小值的點即梯度為0的點,要求這個點各個方向上的導數都為0,在高維空間中這很難滿足;而鞍點則滿足在一些方向,導數為0,但是在另一些則不為0,梯度下降則會從不為0的方向繼續演算法。因此在高維空間時,不必過於擔心會陷入區域性最小值的境地(這非常少,但也可能出現)。 

第三週 超引數選擇策略、Batch Normalization、Softmax

1.超引數選擇策略:

(1)隨機取值而不是網格取值,隨機取值代表著有更多的可能性探究不同的超引數的潛在值。

(2)還有一種思路是從粗略到精細的選擇超引數,

(3)調整超引數的尺度更好的進行超引數的選擇。(例如實數軸轉換為對數軸、指數軸等)。例如學習率的取值。

2.Batch歸一化(batch normalization),我也不清楚翻譯成Batch歸一化對不對,總感覺怪怪的,但是先姑且按照這樣翻譯。如下圖所示:

在進行訓練時,常常會對訓練的資料進行一個引數歸一化的過程,而同樣,直觀上看batch歸一化要做的是對隱藏層的歸一化操作,注意這裡是對隱藏層節點啟用前的z值進行的歸一化。但是與常規的歸一化操作不同的是,在進行歸一化操作後,還存在一個類似於線性對映的步驟,即Z(i)' = \gamma Z(i) + \beta(注意與Adam等演算法中超引數區分)。形式上看,這個操作是歸一化操作的逆過程。為什麼要有這個過程,因為要注意到,在歸一化操作的過程中,我們將這些z值全部對映到均值為0,方差為1的空間中,有時候這樣做,可能縮小了引數z變化的可能性,所以增加這個逆過程。注意\gamma\beta是可學習的引數。通過batch歸一化和逆歸一化(逆歸一化這個詞可能用的不對,只是形式上面是這個意思)這個流程,我的理解是增強了對於隱藏層的控制程度。

不難看出,利用batch normalization不僅會增加計算量,而且在訓練網路時還增加了新的引數\gamma\beta,但是其還是會加速神經網路的學習程序,並且能使訓練更深的網路。因為從其做的操作來看,其本身通過歸一化和歸一化後尺度改變操作,增強了自身本層的獨立性,限制了前面層的更新值對該層的影響程度,從而減少了前面層網路對後面層網路的影響,增加了層本身的獨立性,從而使層更健壯。Andrew提到,batch normalization也可看做是一個輕微的正則化過程,因為在mini-batch上進行操作時,其batch normalization無疑是給處理中的資料增加了一些噪聲,這不難理解。

關於提到的batch normalization是解決Covariate shift的一個方案,參考https://blog.csdn.net/guoyuhaoaaa/article/details/80236500

3.Softmax(名字來源於hardmax的對比,例如hardmax輸出[1,0,0,0],softmax輸出[0.8,0.1,0.05,0.05])。注意softmax啟用函式輸入一個向量,輸出一個向量。注意在處理過程中進行了一個非線性的對映,即取指數e。我想一是為了解決輸入softmax中存在著負值的問題,二是為了使輸出的分類打破線性關係的制約。同時,softmax也可以看做是將邏輯迴歸推廣到多種分類。

觀察其損失函式,只與待分的正確的類有關係。即找到需要分的正確的類,並使該類的分類概率最大化。