1. 程式人生 > >訓練過程--正則化(regularization)技巧(包括L2正則化、dropout,資料增廣,早停)

訓練過程--正則化(regularization)技巧(包括L2正則化、dropout,資料增廣,早停)

正則化(regularization)

  正則化是解決高方差問題的重要方案之一,也是Reducing Overfiltering(克服過擬合)的方法。
  過擬合一直是DeepLearning的大敵,它會導致訓練集的error rate非常小,而測試集的error rate大部分時候很大。網路的擬合能力隨之降低,這會使網路不容易過擬合到訓練集。

1)L2正則化

  L2正則化傾向於使網路的權值接近0。這會使前一層神經元對後一層神經元的影響降低,使網路變得簡單,降低網路的有效大小,降低網路的擬合能力。L2正則化實質上是對權值做線性衰減,所以L2正則化也被稱為權值衰減(weight decay)。

2)隨機失活(dropout)

  在訓練時,隨機失活隨機選擇一部分神經元,使其置零,不參與本次優化迭代。隨機失活減少了每次參與優化迭代的神經元數目,使網路的有效大小變小。
  隨機失活的作用有兩點。
  1. 降低神經元之間耦合。因為神經元會被隨機置零,所以每個神經元不能依賴於其他神經元,這會迫使每個神經元自身要能提取到合適的特徵。
  2. 網路整合。隨機失活可以看作在訓練時每次迭代定義出一個新的網路,這些網路共享權值。在測試時的網路是這些網路的整合。

3)資料擴充(data augmentation)

  這實質是獲得更多資料的方法。當收集資料很昂貴,或者我們拿到的是第二手資料,資料就這麼多時,我們從現有資料中擴充生成更多資料,用生成的“偽造”資料當作更多的真實資料進行訓練。以影象資料做分類任務為例,把影象水平翻轉、移動一定位置、旋轉一定角度、或做一點色彩變化等,這些操作通常都不會影響這幅影象對應的標記。並且你可以嘗試這些操作的組合,理論上講,你可以通過這些組合得到無窮多的訓練樣本。

4)早停(early stopping)

  隨著訓練的進行,當你發現驗證集誤差不再變化或者開始上升時,提前停止訓練。


Dropout

  dropout層一般用在FC層之後,每次forward的時候FC之前層的每個神經元會以一定的概率不參與forward,而backward的時候這些單元也不參與。這種方式使得網路強制以部分神經元來表示當前的圖片,很大限度上降低過擬合。但是這樣一定程度上會延長訓練的時間,因為隨機性不只是會打亂過擬合的過程,也會打亂正常擬合的過程。
  在test的時候,不使用dropout,使所有神經元參與運算,給他們的結果乘以0.5來作為輸出值。
  其實,最後不乘0.5也是可以的。如果在分類的時候使用的不是原來的softmax,那麼只要特徵之間可以區分就行了,乘不同的係數只是放大或者縮小了這種差別。

  dropout 已經theoretically 證明等價於加 l2 regularizer 了。

  1)MAXOUT常與dropout一起用
  Maxout出現在ICML2013上,作者Goodfellow將maxout和dropout結合後,號稱在MNIST, CIFAR-10, CIFAR-100, SVHN這4個數據上都取得了start-of-art的識別率。

  2)Dropout函式能減弱過擬合效應,所以當發現訓練時的精度很高,但測試集上的精度上不去,就要使用它

  3)當特徵比較稀疏,75%是0,使用dropout解決。


資料擴增

  簡而言之就是對現有資料進行變換,使得總資料量得到提升。可以對圖片進行集合變換,如平移,水平翻轉等,論文中把原始影象縮放到256X256,然後分別取四個corner以及中間的224X224大小的patch,以及其flip後的patch來訓練。論文還提到了對圖片的RGB通道進行強度改變。即在訓練集的RGB通道上做PCA,但是不降維,只取特徵向量和特徵值,對訓練集上每張圖片的每個畫素加上值:
。。。
  其中和分別表示特徵向量和特徵值,表示高斯隨機變數(均值為0,方差為0.1)


早期停止Early Stopping

  是另一種正則化方法,就是在訓練集和驗證集上,一次迭代之後計算它們上面的錯誤率,當在驗證集上錯誤率最小,而沒開始增大的時候就停止,因為再接著訓練的話,訓練集上誤差應該是接著下降的,而驗證集上的誤差就會上升了,這時候就是要過擬合了,所以及時的停止,從而得到泛化最好的模型。
  所謂early stopping,即在每一個epoch結束時(一個epoch即對所有訓練資料的一輪遍歷)計算 validation data的accuracy,當accuracy不再提高時,就停止訓練。這是很自然的做法,因為accuracy不再提高了,訓練下去也沒用。另外,這樣做還能防止overfitting。

  早期停止和權重衰減之間的關係可以量化,所以關係a*q(其中a表示第幾次迭代,而q表示學習率)扮演著正則化引數的角色,所以網路中有效的引數就會隨著訓練的過程而不斷的增長。(其實就是網路中引數參與的會越來越多,這是一種形象的解釋)。

具體做法

  那麼,怎麼樣才算是validation accuracy不再提高呢?並不是說alidation accuracy一降下來,它就是“不再提高”,因為可能經過這個epoch後,accuracy降低了,但是隨後的epoch又讓accuracy升上去了,所以不能根據一兩次的連續降低就判斷“不再提高”。
  正確的做法是,在訓練的過程中,記錄最佳的validation accuracy,當連續10次epoch(或者更多次)沒達到最佳accuracy時,你可以認為“不再提高”,此時使用early stopping。
  這個策略就叫“ no-improvement-in-n”,n即epoch的次數,可以根據實際情況取10、20、30….