優化深度神經網絡(一) dropout 初始化


Coursera吳恩達《優化深度神經網絡》課程筆記(1)-- 深度學習的實用層面

1. Train/Dev/Test sets  訓練集(Training sets)、驗證集(Development sets)、測試集(Test sets)

之前人們通常設置Train sets和Test sets的數量比例為70%和30%。如果有Dev sets,則設置比例為60%、20%、20%,分別對應Train/Dev/Test sets。這種比例分配在樣本數量不是很大的情況下,例如100,1000,10000,是比較科學的。

但是如果數據量很大的時候,例如100萬,這種比例分配就不太合適了。科學的做法是要將Dev sets和Test sets的比例設置得很低。因為Dev sets的目標是用來比較驗證不同算法的優劣,從而選擇更好的算法模型就行了。因此,通常不需要所有樣本的20%這么多的數據來進行驗證。對於100萬的樣本,往往只需要10000個樣本來做驗證就夠了。Test sets也是一樣,目標是測試已選算法的實際表現,無偏估計。對於100萬的樣本,往往也只需要10000個樣本就夠了。因此,對於大數據樣本,Train/Dev/Test sets的比例通常可以設置為98%/1%/1%,或者99%/0.5%/0.5%。

樣本數據量越大,相應的Dev/Test sets的比例可以設置的越低一些。

 

現代深度學習還有個重要的問題就是訓練樣本和測試樣本分布上不匹配,意思是訓練樣本和測試樣本來自於不同的分布。

舉個例子,假設你開發一個手機app,可以讓用戶上傳圖片,然后app識別出貓的圖片。在app識別算法中,你的訓練樣本可能來自網絡下載,而你的驗證和測試樣本可能來自不同用戶的上傳。從網絡下載的圖片一般像素較高而且比較正規,而用戶上傳的圖片往往像素不穩定,且圖片質量不一。因此,訓練樣本和驗證/測試樣本可能來自不同的分布。

解決這一問題的比較科學的辦法是盡量保證Dev sets和Test sets來自於同一分布。

值得一提的是,訓練樣本非常重要,通常我們可以將現有的訓練樣本做一些處理,例如圖片的翻轉、假如隨機噪聲等,來擴大訓練樣本的數量,從而讓該模型更加強大。即使Train sets和Dev/Test sets不來自同一分布,使用這些技巧也能提高模型性能。

2. Bias/Variance

在傳統的機器學習算法中,Bias和Variance是對立的,分別對應着欠擬合和過擬合,我們常常需要在Bias和Variance之間進行權衡。

深度學習中,我們可以同時減小Bias和Variance,構建最佳神經網絡模型。

深度學習:

減少high bias的方法通常是增加神經網絡的隱藏層個數、神經元個數,訓練時間延長,選擇其它更復雜的NN模型等。在base error不高的情況下,一般都能通過這些方式有效降低和避免high bias,至少在訓練集上表現良好。

減少high variance的方法通常是增加訓練樣本數據,進行正則化Regularization,選擇其他更復雜的NN模型等。

4. Regularization

L1 regularization。其表達式為:

J(w,b)=\frac1m\sum_{i=1}^mL(\hat y^{(i)},y^{(i)})+\frac{\lambda}{2m}||w||_1

||w||_1=\sum_{j=1}^{n_x}|w_j|

L1的在微分求導方面比較復雜。

 

在深度學習模型中,L2 regularization的表達式為:

J(w^{[1]},b^{[1]},\cdots,w^{[L]},b^{[L]})=\frac1m\sum_{i=1}^mL(\hat y^{(i)},y^{(i)})+\frac{\lambda}{2m}\sum_{l=1}^L||w^{[l]}||^2

||w^{[l]}||^2=\sum_{i=1}^{n^{[l]}}\sum_{j=1}^{n^{[l-1]}}(w_{ij}^{[l]})^2

由於加入了正則化項,梯度下降算法中的 dw^{[l]} 計算表達式需要做如下修改:

dw^{[l]}=dw^{[l]}_{before}+\frac{\lambda}{m}w^{[l]}

w^{[l]}:=w^{[l]}-\alpha\cdot dw^{[l]} w^{[l]}:=w^{[l]}-\alpha\cdot dw^{[l]}

由於加上了正則項, dw^{[l]} 有個增量,在更新 w^{[l]} 的時候,會多減去這個增量,使得 w^{[l]} 比沒有正則項的值要小一些。不斷迭代更新,不斷地減小。

\begin{eqnarray}w^{[l]} &:=&w^{[l]}-\alpha\cdot dw^{[l]}\\ &=&w^{[l]}-\alpha\cdot(dw^{[l]}_{before}+\frac{\lambda}{m}w^{[l]})\\ &=&(1-\alpha\frac{\lambda}{m})w^{[l]}-\alpha\cdot dw^{[l]}_{before} \end{eqnarray}

其中, (1-\alpha\frac{\lambda}{m})<1

 

選擇合適大小的 \lambda 值,就能夠同時避免high bias和high variance,得到最佳模型。

還有另外一個直觀的例子來解釋為什么正則化能夠避免發生過擬合。假設激活函數是tanh函數。tanh函數的特點是在z接近零的區域,函數近似是線性的,而當|z|很大的時候,函數非線性且變化緩慢。當使用正則化, \lambda 較大,即對權重 w^{[l]} 的懲罰較大, w^{[l]} 減小。因為 z^{[l]}=w^{[l]}a^{[l]}+b^{[l]} 。當 w^{[l]} 減小的時候, z^{[l]} 也會減小。則此時的 z^{[l]} 分布在tanh函數的近似線性區域。那么這個神經元起的作用就相當於是linear regression。如果每個神經元對應的權重 w^{[l]} 都比較小,那么整個神經網絡模型相當於是多個linear regression的組合,即可看成一個linear network。得到的分類超平面就會比較簡單,不會出現過擬合現象。

 

6. Dropout Regularization

除了L2 regularization之外,還有另外一種防止過擬合的有效方法:Dropout。

Dropout是指在深度學習網絡的訓練過程中,對於每層的神經元,按照一定的概率將其暫時從網絡中丟棄。也就是說,每次訓練時,每一層都有部分神經元不工作,起到簡化復雜網絡模型的效果,從而避免發生過擬合。

Dropout有不同的實現方法,接下來介紹一種常用的方法:Inverted dropout。假設對於第l層神經元,設定保留神經元比例概率keep_prob=0.8,即該層有20%的神經元停止工作。 dl 為dropout向量,設置 dl 為隨機vector,其中80%的元素為1,20%的元素為0。在python中可以使用如下語句生成dropout vector:

dl = np.random.rand(al.shape[0],al.shape[1])<keep_prob #隨機生成大小為al.shape[0],al.shape[1]的矩陣,將其填充在一個均勻分布的隨機樣本[0, 1)中,小於keep_prob的為false

然后,第 l 層經過dropout,隨機刪減20%的神經元,只保留80%的神經元,其輸出為:

al = np.multiply(al,dl)

最后,還要對 al 進行scale up處理,即:

al /= keep_prob

之所以要對 al 進行scale up是為了保證在經過dropout后, al 作為下一層神經元的輸入值盡量保持不變。假設第 l 層有50個神經元,經過dropout后,有10個神經元停止工作,這樣只有40神經元有作用。那么得到的 al 只相當於原來的80%。scale up后,能夠盡可能保持 al 的期望值相比之前沒有大的變化。

 

Inverted dropout的另外一個好處就是在對該dropout后的神經網絡進行測試時能夠減少scaling問題。因為在訓練時,使用scale up保證 al期望值沒有大的變化,測試時就不需要再對樣本數據進行類似的尺度伸縮操作了。

對於m個樣本,單次迭代訓練時,隨機刪除掉隱藏層一定數量的神經元;然后,在刪除后的剩下的神經元上正向和反向更新權重w和常數項b;接着,下一次迭代中,再恢復之前刪除的神經元,重新隨機刪除一定數量的神經元,進行正向和反向更新w和b。不斷重復上述過程,直至迭代訓練完成。

值得注意的是,使用dropout訓練結束后,在測試和實際應用模型時,不需要進行dropout和隨機刪減神經元,所有的神經元都在工作。

7. Understanding Dropout

為什么dropout可以防止過擬合

理解1.Dropout通過每次迭代訓練時,隨機選擇不同的神經元,相當於每次都在不同的神經網絡上進行訓練,類似機器學習中Bagging的方法,能夠防止過擬合。

理解2.從權重w的角度。對於某個神經元來說,某次訓練時,它的某些輸入在dropout的作用被過濾了。而在下一次訓練時,又有不同的某些輸入被過濾。經過多次訓練后,某些輸入被過濾,某些輸入被保留。這樣,該神經元就不會受某個輸入非常大的影響,影響被均勻化了。也就是說,對應的權重w不會很大。這從從效果上來說,與L2 regularization是類似的,都是對權重w進行“懲罰”,減小了w的值

 

總結一下,對於同一組訓練數據,利用不同的神經網絡訓練之后,求其輸出的平均值可以減少overfitting。Dropout就是利用這個原理,每次丟掉一定數量的隱藏層神經元,相當於在不同的神經網絡上進行訓練,這樣就減少了神經元之間的依賴性,即每個神經元不能依賴於某幾個其他的神經元(指層與層之間相連接的神經元),使神經網絡更加能學習到與其他神經元之間的更加健壯robust的特征。

dropdout注意點

首先,不同隱藏層的dropout系數keep_prob可以不同。一般來說,神經元越多的隱藏層,keep_prob可以設置得小一些.,例如0.5;神經元越少的隱藏層,keep_out可以設置的大一些,例如0.8,設置是1。

實際應用中,不建議對輸入層進行dropout,如果輸入層維度很大,例如圖片,那么可以設置dropout,但keep_prob應設置的大一些,例如0.8,0.9。總體來說,就是越容易出現overfitting的隱藏層,其keep_prob就設置的相對小一些。沒有准確固定的做法,通常可以根據validation進行選擇。

8. Other regularization methods

1.增加訓練樣本數量。但是通常成本較高,難以獲得額外的訓練樣本。但是,我們可以對已有的訓練樣本進行一些處理來“制造”出更多的樣本,稱為data augmentation。

2.early stopping。一個神經網絡模型隨着迭代訓練次數增加,train set error一般是單調減小的,而dev set error 先減小,之后又增大。也就是說訓練次數過多時,模型會對訓練樣本擬合的越來越好,但是對驗證集擬合效果逐漸變差,即發生了過擬合。因此,迭代訓練次數不是越多越好,可以通過train set error和dev set error隨着迭代次數的變化趨勢,選擇合適的迭代次數,即early stopping。

early stopping缺點:

通常來說,機器學習訓練模型有兩個目標:一是優化cost function,盡量減小J;二是防止過擬合。這兩個目標彼此對立的,即減小J的同時可能會造成過擬合,反之亦然。我們把這二者之間的關系稱為正交化orthogonalization。

而在深度學習中,我們可以同時減小Bias和Variance,構建最佳神經網絡模型。但是,Early stopping的做法通過減少得帶訓練次數來防止過擬合,這樣J就不會足夠小。也就是說,early stopping將上述兩個目標融合在一起,同時優化,但可能沒有“分而治之”的效果好。

與early stopping相比,L2 regularization可以實現“分而治之”的效果:迭代訓練足夠多,減小J,而且也能有效防止過擬合。而L2 regularization的缺點之一是最優的正則化參數 \lambda 的選擇比較復雜。對這一點來說,early stopping比較簡單。總的來說,L2 regularization更加常用一些。

9. Normalizing inputs

在訓練神經網絡時,標准化輸入可以提高訓練的速度。標准化輸入就是對訓練數據集進行歸一化的操作,即將原始數據減去其均值 \mu 后,再除以其方差 \sigma^2

\mu=\frac1m\sum_{i=1}^mX^{(i)}

\sigma^2=\frac1m\sum_{i=1}^m(X^{(i)})^2

X:=\frac{X-\mu}{\sigma^2}

10. 梯度消失 梯度爆炸

詳解機器學習中的梯度消失、爆炸原因及其解決方法

- 預訓練加微調

- 梯度剪切、權重正則(針對梯度爆炸)

- 使用不同的激活函數 RELU

- 使用batchnorm

- 使用殘差結構*

- 使用LSTM網絡

11. 權重w初始化

深度神經網絡模型中,以單個神經元為例,該層( l )的輸入個數為n,其輸出為:

z=w_1x_1+w_2x_2+\cdots+w_nx_n z=w_1x_1+w_2x_2+\cdots+w_nx_n

a=g(z)

這里忽略了常數項b。為了讓z不會過大或者過小,思路是讓w與n有關,且n越大,w應該越小才好。這樣能夠保證z不會過大。

激活函數是tanh,在初始化w時,令其方差為 \frac1n

如果激活函數是ReLU,權重w的初始化一般令其方差為 \frac2n

Yoshua Bengio提出了另外一種初始化w的方法,令其方差為 \frac{2}{n^{[l-1]}n^{[l]}}

可以根據不同的激活函數選擇不同方法。另外,我們可以對這些初始化方法中設置某些參數,作為超參數,通過驗證集進行驗證,得到最優參數,來優化神經網絡。

13. 梯度檢查

我們將介紹如何進行梯度檢查,來驗證訓練過程中是否出現bugs。

1.梯度檢查首先要做的是分別將 W^{[1]},b^{[1]},\cdots,W^{[L]},b^{[L]} 這些矩陣構造成一維向量,然后將這些一維向量組合起來構成一個更大的一維向量 \theta 。這樣cost function J(W^{[1]},b^{[1]},\cdots,W^{[L]},b^{[L]}) 就可以表示成 J(\theta)

 

2.將反向傳播過程通過梯度下降算法得到的 dW^{[1]},db^{[1]},\cdots,dW^{[L]},db^{[L]} 按照一樣的順序構造成一個一維向量 d\thetad\theta 的維度與 \theta 一致。

 

3.利用 J(\theta) 對每個 \theta_i 計算近似梯度,其值與反向傳播算法得到的 d\theta_i 相比較,檢查是否一致。例如,對於第i個元素,近似梯度為:

 

d\theta_{approx}[i]=\frac{J(\theta_1,\theta_2,\cdots,\theta_i+\varepsilon,\cdots)-J(\theta_1,\theta_2,\cdots,\theta_i-\varepsilon,\cdots)}{2\varepsilon}

 

4.計算完所有 \theta_i 的近似梯度后,可以計算 d\theta_{approx}d\theta 的歐氏(Euclidean)距離來比較二者的相似度。公式如下:

 

\frac{||d\theta_{approx}-d\theta||_2}{||d\theta_{approx}||_2+||d\theta||_2}

 

5.如果歐氏距離越小,例如 10^{-7} ,甚至更小,則表明 d\theta_{approx}d\theta 越接近,即反向梯度計算是正確的,沒有bugs。

如果歐氏距離較大,例如 10^{-5} ,則表明梯度計算可能出現問題,需要再次檢查是否有bugs存在。

如果歐氏距離很大,例如 10^{-3} ,甚至更大,則表明 d\theta_{approx}d\theta 差別很大,梯度下降計算過程有bugs,需要仔細檢查。

 

在進行梯度檢查的過程中有幾點需要注意的地方:

  • 不要在整個訓練過程中都進行梯度檢查,僅僅作為debug使用。
  • 如果梯度檢查出現錯誤,找到對應出錯的梯度,檢查其推導是否出現錯誤。
  • 注意不要忽略正則化項,計算近似梯度的時候要包括進去。
  • 梯度檢查時關閉dropout,檢查完畢后再打開dropout。
  • 隨機初始化時運行梯度檢查,經過一些訓練后再進行梯度檢查(不常用)。

 

下圖是一個利用sigmoid函數作為激活函數的含四個隱藏層的神經網絡訓練的梯度下降圖。這個神經網絡遇到了梯度消失的問題。下面哪個敘述是正確的?(A)深度學習 DL基礎 中
 第一隱藏層對應D,第二隱藏層對應C,第三隱藏層對應B,第四隱藏層對應A
 第一隱藏層對應A,第二隱藏層對應C,第三隱藏層對應B,第四隱藏層對應D
 第一隱藏層對應A,第二隱藏層對應B,第三隱藏層對應C,第四隱藏層對應D
 第一隱藏層對應B,第二隱藏層對應D,第三隱藏層對應C,第四隱藏層對應A 

由於反向傳播算法進入起始層,學習能力降低,這就是梯度消失。換言之,梯度消失是梯度在前向傳播中逐漸減為0, 按照圖標題所說, 四條曲線是4個隱藏層的學習曲線, 那么第一層梯度最高(損失函數曲線下降明顯), 最后一層梯度幾乎為零(損失函數曲線變成平直線). 所以D是第一層, A是最后一層。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM