1. 程式人生 > >3. DNN神經網路的正則化

3. DNN神經網路的正則化

1. DNN神經網路的前向傳播(FeedForward)

2. DNN神經網路的反向更新(BP)

3. DNN神經網路的正則化

1. 前言

和普通的機器學習演算法一樣,DNN也會遇到過擬合的問題,需要考慮泛化,這裡我們就對DNN的正則化方法做一個總結。

2. DNN的L1和L2正則化

想到正則化,我們首先想到的就是L1正則化和L2正則化。L1正則化和L2正則化原理類似,這裡重點講述DNN的L2正則化。

而DNN的L2正則化通常的做法是隻針對與線性係數矩陣\(W\),而不針對偏倚係數\(b\)。利用我們之前的機器學習的知識,我們很容易可以寫出DNN的L2正則化的損失函式。

假如我們的每個樣本的損失函式是均方差損失函式,則所有的m個樣本的損失函式為:

\[ J(W,b) = \frac{1}{2m}\sum\limits_{i=1}^{m}||a^L-y||_2^2 \]
則加上了L2正則化後的損失函式是

\[ J(W,b) = \frac{1}{2m}\sum\limits_{i=1}^{m}||a^L-y||_2^2 + \frac{\lambda}{2m}\sum\limits_{l=2}^L||w||_2^2 \]
其中,$\lambda\(1即我們的正則化超引數,實際使用時需要調參。而\)w\(為所有權重矩陣\)W$的所有列向量。

如果使用上式的損失函式,進行反向傳播演算法時,流程和沒有正則化的反向傳播演算法完全一樣,區別僅僅在於進行梯度下降法時,W的更新公式。

回想我們在DNN神經網路的反向更新(BP)中,\(W\)的梯度下降更新公式為:

\[ W^l = W^l -\alpha \sum\limits_{i=1}^m \delta^{i,l}(a^{x, l-1})^T \]
則加入L2正則化以後,迭代更新公式變成:

\[ W^l = W^l -\alpha \sum\limits_{i=1}^m \delta^{i,l}(a^{i, l-1})^T -\alpha \lambda W^l \]
注意到上式中的梯度計算中\(\frac{1}{m}\)我忽略了,因為\(\alpha\)是常數,而除以\(m\)也是常數,所以等同於用了新常數\(\alpha\)

來代替\(\frac{\alpha}{m}\)。進而簡化表示式,但是不影響損失演算法。

類似的L2正則化方法可以用於交叉熵損失函式或者其他的DNN損失函式,這裡就不累述了。

3. DNN通過整合學習的思路正則化

除了常見的L1和L2正則化,DNN還可以通過整合學習的思路正則化。在整合學習原理中,我們講到整合學習有Boosting和Bagging兩種思路。而DNN可以用Bagging的思路來正則化。常用的機器學習Bagging演算法中,隨機森林是最流行的。它 通過隨機取樣構建若干個相互獨立的弱決策樹學習器,最後採用加權平均法或者投票法決定整合的輸出。在DNN中,我們一樣使用Bagging的思路。不過和隨機森林不同的是,我們這裡不是若干個決策樹,而是若干個DNN的網路。

首先我們要對原始的\(m\)個訓練樣本進行有放回隨機取樣,構建\(N\)\(m\)個樣本的資料集,然後分別用這\(N\)組資料集去訓練我們的DNN。即採用我們的前向傳播演算法和反向傳播演算法得到N個DNN模型的\(W,b\)引數組合,最後對\(N\)個DNN模型的輸出用加權平均法或者投票法決定最終輸出。

不過用整合學習Bagging的方法有一個問題,就是我們的DNN模型本來就比較複雜,引數很多。現在又變成了\(N\)個DNN模型,這樣引數又增加了\(N\)倍,從而導致訓練這樣的網路要花更加多的時間和空間。因此一般N的個數不能太多,比如5-10個就可以了。

4. DNN通過Dropout正則化

這裡我們再講一種和Bagging類似但是又不同的正則化方法:Dropout。

所謂的Dropout指的是在用前向傳播演算法和反向傳播演算法訓練DNN模型時,一批資料迭代時,隨機的從全連線DNN網路中去掉一部分隱藏層的神經元。

比如我們本來的DNN模型對應的結構是這樣的:

image

在對訓練集中的一批資料進行訓練時,我們隨機去掉一部分隱藏層的神經元,並用去掉隱藏層的神經元的網路來擬合我們的一批訓練資料。如下圖,去掉了一半的隱藏層神經元:

image

然後用這個去掉隱藏層的神經元的網路來進行一輪迭代,更新所有的\(W,b\)。這就是所謂的dropout。

當然,dropout並不意味著這些神經元永遠的消失了。在下一批資料迭代前,我們會把DNN模型恢復成最初的全連線模型,然後再用隨機的方法去掉部分隱藏層的神經元,接著去迭代更新\(W,b\)。當然,這次用隨機的方法去掉部分隱藏層後的殘缺DNN網路和上次的殘缺DNN網路並不相同。

總結下dropout的方法: 每輪梯度下降迭代時,它需要將訓練資料分成若干批,然後分批進行迭代,每批資料迭代時,需要將原始的DNN模型隨機去掉部分隱藏層的神經元,用殘缺的DNN模型來迭代更新\(W,b\)。每批資料迭代更新完畢後,要將殘缺的DNN模型恢復成原始的DNN模型。

從上面的描述可以看出dropout和Bagging的正則化思路還是很不相同的。dropout模型中的W,b是一套,共享的。所有的殘缺DNN迭代時,更新的是同一組\(W,b\);而Bagging正則化時每個DNN模型有自己獨有的一套\(W,b\)引數,相互之間是獨立的。當然他們每次使用基於原始資料集得到的分批的資料集來訓練模型,這點是類似的。

使用基於dropout的正則化比基於bagging的正則化簡單,這顯而易見,當然天下沒有免費的午餐,由於dropout會將原始資料分批迭代,因此原始資料集最好較大,否則模型可能會欠擬合。

5. DNN通過增強資料集正則化

增強模型泛化能力最好的辦法是有更多更多的訓練資料,但是在實際應用中,更多的訓練資料往往很難得到。有時候我們不得不去自己想辦法能無中生有,來增加訓練資料集,進而得到讓模型泛化能力更強的目的。

對於我們傳統的機器學習分類迴歸方法,增強資料集還是很難的。你無中生有出一組特徵輸入,卻很難知道對應的特徵輸出是什麼。但是對於DNN擅長的領域,比如影象識別,語音識別等則是有辦法的。以影象識別領域為例,對於原始的資料集中的影象,我們可以將原始影象稍微的平移或者旋轉一點點,則得到了一個新的影象。雖然這是一個新的影象,即樣本的特徵是新的,但是我們知道對應的特徵輸出和之前未平移旋轉的影象是一樣的。

6. 總結

DNN的正則化的方法是很多的,還是持續的研究中。在Deep Learning這本書中,正則化是洋洋灑灑的一大章。裡面提到的其他正則化方法有:Noise Robustness, Adversarial Training,Early Stopping等。如果大家對這些正則化方法感興趣,可以去閱讀Deep Learning這本書中的第七章。

(歡迎轉載,轉載請註明出處。歡迎溝通交流: [email protected]