和普通的機器學習演算法一樣,DNN也會遇到過擬合的問題,需要考慮泛化,這裡我們就對DNN的正則化方法做一個總結。
1. 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$即我們的正則化超引數,實際使用時需要調參。而$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損失函式,這裡就不累述了。
2. 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個就可以了。
3. DNN通過dropout 正則化
這裡我們再講一種和Bagging類似但是又不同的正則化方法:Dropout。
所謂的Dropout指的是在用前向傳播演算法和反向傳播演算法訓練DNN模型時,一批資料迭代時,隨機的從全連線DNN網路中去掉一部分隱藏層的神經元。
比如我們本來的DNN模型對應的結構是這樣的:
在對訓練集中的一批資料進行訓練時,我們隨機去掉一部分隱藏層的神經元,並用去掉隱藏層的神經元的網路來擬合我們的一批訓練資料。如下圖,去掉了一半的隱藏層神經元:
然後用這個去掉隱藏層的神經元的網路來進行一輪迭代,更新所有的$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會將原始資料分批迭代,因此原始資料集最好較大,否則模型可能會欠擬合。
4. DNN通過增強資料集正則化
增強模型泛化能力最好的辦法是有更多更多的訓練資料,但是在實際應用中,更多的訓練資料往往很難得到。有時候我們不得不去自己想辦法能無中生有,來增加訓練資料集,進而得到讓模型泛化能力更強的目的。
對於我們傳統的機器學習分類迴歸方法,增強資料集還是很難的。你無中生有出一組特徵輸入,卻很難知道對應的特徵輸出是什麼。但是對於DNN擅長的領域,比如影象識別,語音識別等則是有辦法的。以影象識別領域為例,對於原始的資料集中的影象,我們可以將原始影象稍微的平移或者旋轉一點點,則得到了一個新的影象。雖然這是一個新的影象,即樣本的特徵是新的,但是我們知道對應的特徵輸出和之前未平移旋轉的影象是一樣的。
舉個例子,下面這個影象,我們的特徵輸出是5。
我們將原始的影象旋轉15度,得到了一副新的影象如下:
我們現在得到了一個新的訓練樣本,輸入特徵和之前的訓練樣本不同,但是特徵輸出是一樣的,我們可以確定這是5.
用類似的思路,我們可以對原始的資料集進行增強,進而得到增強DNN模型的泛化能力的目的。
5. 其他DNN正則化方法
DNN的正則化的方法是很多的,還是持續的研究中。在Deep Learning這本書中,正則化是洋洋灑灑的一大章。裡面提到的其他正則化方法有:Noise Robustness, Adversarial Training,Early Stopping等。如果大家對這些正則化方法感興趣,可以去閱讀Deep Learning這本書中的第七章。
(歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com)
參考資料:
1) Neural Networks and Deep Learning by By Michael Nielsen
2) Deep Learning, book by Ian Goodfellow, Yoshua Bengio, and Aaron Courville