Deep Learning.ai學習筆記_第二門課_改善深層神經網絡:超參數調試、正則化以及優化

目錄

第一週(深度學習的實踐層面)

第二週(優化算法)

第三週(超參數調試、Batch正則化和程序框架)

 

目標: 如何有效運作神經網絡,內容涉及超參數調優,如何構建數據,以及如何確保優化算法快速運行,從而使學習算法在合理時間內完成自我學習。

第一週(深度學習的實踐層面)

如何選取一個神經網絡的訓練集、驗證集和測試集呢?

如果數據量比較少,例如只有100條,1000條或者1萬條數據,按照60%、20%、20%劃分是比較合理的,但是在目前大部分數據都是遠遠大於這個數理級,也可以說是大數據規模的級別。那麼,此時選擇的比例比較合適的爲訓練集佔98%,驗證集和測試集各佔1%。

 

在對於驗證集和測試集的數據選擇上,儘量確保這兩部分數據來自同一分佈,這樣處理的是會使得算法的性能驗證結果更加精確。

 

優化神經網絡性能的基本思路

合理地分析訓練集在訓練算法產生的誤差和驗證集上驗證算法產生的誤差來診斷算法是否存在高偏差和高方差,對系統地優化算法有很大的幫助。

 

在訓練神經網絡時,如果算法的偏差很高,甚至無法擬合訓練集,那麼此時需要選擇一個新的網絡,比如含有更多隱藏層或者隱藏單元的網絡,或者花費更多時間來訓練網絡,或者嘗試更先進的優化算法。

 

訓練網絡完成後,驗證其性能時,如果方差很高,最好的解決辦法就是採用更多數據,如果能夠做到,會有一定的幫助,但有時候,我們無法獲得更多數據,我們也可以嘗試通過正則化來減少過擬合。

 

L2正則化方法

 

L2正則化更新W值過程

 

爲什麼正則化有利於預防過擬合呢?

如果正則化參數很大,激活函數的參會會相對較小,因爲代價函數的參數變大了。如果W很小,相對來說,z也會很小。此時,激活函數g(z)大致呈線性,和線性迴歸函數一樣,此時就可以很好地解決過擬合問題。具體如下圖:

 

dropout正則化

 

使用數據擴增可以有效減少神經網絡中的過擬合,例如把已有數據進行相關處理,可以把圖片翻轉或者變形壓縮等處理,這樣就大大增加了已有樣本數據集的數量。

 

此外,還可以選擇採用early stopping方式來減少神經網絡中的過擬合。例如下圖:

 

 

梯度檢驗應用的注意事項

首先,不要在訓練中使用梯度檢驗,它只用於調試。

第二點,如果算法的梯度檢驗失敗,要檢查所有項,檢查每一項,並試着找出bug

第三點,在實施梯度檢驗時,如果使用正則化,請注意正則項。

第四點,梯度檢驗不能與dropout同時使用,因爲每次迭代過程中,dropout會隨機消除隱藏層單元的不同子集,難以計算dropout在梯度下降上的代價函數J。

最後一點,也是比較微妙的一點,現實中幾乎不會出現這種情況。當w和b接近0時,梯度下降的實施是正確的,在隨機初始化過程中……,但是在運行梯度下降時,w和b變得更大。可能只有在w和b接近0時,backprop的實施纔是正確的。但是當W和b變大時,它會變得越來越不準確。你需要做一件事,我(吳恩達老師)不經常這麼做,就是在隨機初始化過程中,運行梯度檢驗,然後再訓練網絡,w和b會有一段時間遠離0,如果隨機初始化值比較小,反覆訓練網絡之後,再重新運行梯度檢驗。

 

第二週(優化算法)

Mini-batch梯度下降簡單介紹

mini-bach梯度下降法,核心是把輸入數據以及輸出數據,以一定數量組分組變成向量化的結果進行相關計算,這樣做的好處就是循環次數大大減少,也能夠提高運行效率。下圖可參考:

 

使用batch(批量)梯度下降法,一次遍歷訓練集只能讓你做一個梯度下降,使用mini-batch梯度下降法,一次遍歷訓練集,能讓你做5000個梯度下降。當然正常來說你想要多次遍歷訓練集,還需要爲另一個while循環設置另一個for循環。所以你可以一直處理遍歷訓練集,直到最後你能收斂到一個合適的精度。

如果你有一個丟失的訓練集,mini-batch梯度下降法比batch梯度下降法運行地更快,所以幾乎每個研習深度學習的人在訓練巨大的數據集時都會用到。

 

mini-bathc梯度下降法和batch梯度下降法隨着訓練次數的關係圖:

 

如果mini-batch中設置的分組數目大小爲1,此時算法就變成了隨機梯度下降法。

樣本集較小時,推薦直接使用batch梯度下降法,此時沒有必要使用mini-batch梯度下降法。

 

使用mini-batch梯度下降法注意點

在使用mini-batch梯度下降法時要注意選定的分組數目要合理,一般選擇2的指數次,例如64或者512。如果選擇的數目不合理,會因爲你訓練所在的CPU/GPU內存不相符,導致算法的表現得不到預期效果。

 

理解指數加權平均數

指數加權平均數,類似一個等比數列和等差數列的組合體,計算第n項需要不斷迭代,如下圖:

 

動量梯度下降法

 

加快學習算法的一個辦法就是隨時間慢慢減少學習率,我們將之稱爲學習率衰減。

 

梯度下降

在機器學習中,最簡單就是沒有任何優化的梯度下降(GD,Gradient Descent),我們每一次循環都是對整個訓練集進行學習,這叫做批量梯度下降(Batch Gradient Descent),我們之前說過了最核心的參數更新的公式,這裏我們再來看一下: 

 

由梯度下降算法演變來的還有隨機梯度下降(SGD)算法和小批量梯度下降算法,隨機梯度下降(SGD),相當於小批量梯度下降,但是和mini-batch不同的是其中每個小批量(mini-batch)僅有1個樣本,和梯度下降不同的是你一次只能在一個訓練樣本上計算梯度,而不是在整個訓練集上計算梯度。

 

包含動量的梯度下降

 

Adam算法

 

 

Adam的一些優點包括相對較低的內存要求(雖然比梯度下降和動量下降更高)和通常運作良好,即使對參數進行微調(除了學習率α)。

 

第三週(超參數調試、Batch正則化和程序框架)

調試處理

在訓練神經網絡時,有很多參數需要調整來使得訓練結果變得更加合理,其中經常需要調試的參數爲學習速率a。

當有多個超參數需要調節時,可以採用由粗糙到精細的策略,即估算出最佳參數的調節範圍,然後再在縮小的調節範圍中精細調節。

 

超參數調試的實踐

(1) 你照看一個模型,通常是有龐大的數據組,但沒有許多計算資源或足夠的CPUGPU的前提下,基本而言,你只可以一次負擔起試驗一個模型或一小批模型,在這種情況下,即使當它在試驗時,你也可以逐漸改良。類比哺乳動物照看孩子,例如熊貓,一般只能照看一個孩子

(2) 同時試驗多種模型,你設置了一些超參數,儘管讓它自己運行,或者是一天甚至多天,然後你會獲得不同的學習曲線,這可以是損失函數J或實驗誤差或損失或數據誤差的損失,但都是你曲線軌跡的度量。類比魚產卵,可以由很多很多,但其中只要有成功存活就可以。

 

Batch歸一化一次只能處理一個mini-batch數據,它在mini-batch上計算均值和方差。 使用Batch歸一化,能夠訓練更深的網絡,讓學習算法運行速度更快。

 

Softmax迴歸

有一種logistic迴歸的一般形式,叫做Softmax迴歸,能讓你在試圖識別某一分類時做出預測,或者說是多種分類中的一個,不只是識別兩個分類。 Softmax迴歸或Softmax激活函數將logistic激活函數推廣到C類,而不僅僅是兩類。可以參考下圖的輸出層:

 

Tesorflow框架使用

初始化Tensorflow變量後,進行相關運算時,例如乘法運算,運算前需要創建一個session,然後調用session.run()方法才能成功完成相關運算。

 

參考資料:

1.https://blog.csdn.net/u013733326/article/details/79907419

2.http://www.ai-start.com/

 

 

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