1. 概述
在訓練數(shù)據(jù)不夠多時,或者overtraining時,常常會導致overfitting(過擬合)。其直觀的表現(xiàn)如下圖所示,隨著訓練過程的進行,模型復雜度增加,在training data上的error漸漸減小,但是在驗證集上的error卻反而漸漸增大——因為訓練出來的網(wǎng)絡過擬合了訓練集,對訓練集外的數(shù)據(jù)卻不工作。

為了防止overfitting,可以用的方法有很多,下文就將以此展開。有一個概念需要先說明,在機器學習算法中,我們常常將原始數(shù)據(jù)集分為三部分:
- training data
- validation data
- testing data
這個validation data是什么?它其實就是用來避免過擬合的,在訓練過程中,我們通常用它來確定一些超參數(shù)(比如根據(jù)validation data上的accuracy來確定early stopping的epoch大小、根據(jù)validation data確定learning rate等等)。那為啥不直接在testing data上做這些呢?因為如果在testing data做這些,那么隨著訓練的進行,我們的網(wǎng)絡實際上就是在一點一點地overfitting我們的testing data,導致最后得到的testing accuracy沒有任何參考意義。因此,training data的作用是計算梯度更新權重,validation data如上所述,testing data則給出一個accuracy以判斷網(wǎng)絡的好壞。
避免過擬合的方法有很多:
- early stopping
- 數(shù)據(jù)集擴增(Data augmentation)
- 正則化(Regularization)包括L1、L2(L2 regularization也叫weight decay)
- dropout。
2. L2范數(shù)(L2-normal)
L2正則化就是在代價函數(shù)后面再加上一個正則化項:

C0代表原始的代價函數(shù),后面那一項就是L2正則化項,它是這樣來的:所有參數(shù)w的平方的和,除以訓練集的樣本大小n。λ就是正則項系數(shù),權衡正則項與C0項的比重。另外還有一個系數(shù)1/2,1/2經(jīng)常會看到,主要是為了后面求導的結果方便,后面那一項求導會產(chǎn)生一個2,與1/2相乘剛好湊整。
L2正則化項是怎么避免overfitting的呢?我們推導一下看看,先求導:

可以發(fā)現(xiàn)L2正則化項對b的更新沒有影響,但是對于w的更新有影響:

在不使用L2正則化時,求導結果中w前系數(shù)為1,現(xiàn)在w前面系數(shù)為 1?ηλ/n ,因為η、λ、n都是正的,所以 1?ηλ/n小于1,它的效果是減小w,這也就是權重衰減(weight decay)的由來。當然考慮到后面的導數(shù)項,w最終的值可能增大也可能減小。
另外,需要提一下,對于基于mini-batch的隨機梯度下降,w和b更新的公式跟上面給出的有點不同:

對比上面w的更新公式,可以發(fā)現(xiàn)后面那一項變了,變成所有導數(shù)加和,乘以η再除以m,m是一個mini-batch中樣本的個數(shù)。
到目前為止,我們只是解釋了L2正則化項有讓w“變小”的效果,但是還沒解釋為什么w“變小”可以防止overfitting?一個所謂“顯而易見”的解釋就是:更小的權值w,從某種意義上說,表示網(wǎng)絡的復雜度更低,對數(shù)據(jù)的擬合剛剛好(這個法則也叫做奧卡姆剃刀),而在實際應用中,也驗證了這一點,L2正則化的效果往往好于未經(jīng)正則化的效果。
過擬合的時候,擬合函數(shù)的系數(shù)往往非常大,為什么?如下圖所示,過擬合,就是擬合函數(shù)需要顧忌每一個點,最終形成的擬合函數(shù)波動很大。在某些很小的區(qū)間里,函數(shù)值的變化很劇烈。這就意味著函數(shù)在某些小區(qū)間里的導數(shù)值(絕對值)非常大,由于自變量值可大可小,所以只有系數(shù)足夠大,才能保證導數(shù)值很大。

而正則化是通過約束參數(shù)的范數(shù)使其不要太大,所以可以在一定程度上減少過擬合情況。