1. 程式人生 > >深度學習之常見tricks

深度學習之常見tricks

本文主要給出了在實現網路或者調節程式碼過程使用的以及平時看一些文章記錄下來的一些小技巧,主要針對卷積網路和影象處理。就個人感受,有些技巧還是非常有效的,而且通常可以通過看開源庫的一些文件或者原始碼來發掘這些內容,最後能夠稱為自己所用。

構造validation set

一般資料集可能不會給出驗證集,所以自己會從給的訓練集中按照一定比例(9:1)分離出驗證集。

增加訓練資料

為了更好的訓練網路,有時候需要增加原始資料集,一般有以下方法[1]:

  • 沿著x軸將圖片左右翻轉
  • 隨機的剪下、縮放、旋轉
  • 用pca來改變RGB的強度值,產生分別對應的特徵值和特徵向量,然後用均值為0方差為0.1的隨機數與特徵值和特徵向量相乘得到新的資料[2]

預處理

常見的是減均值、除方差,還有變化到-1~1,主要針對不同尺度的特徵,例如房價預測的例子中,每個房子的房屋大小和臥室數量就不在一個數量級上,這種情況就需要對每一維特徵進行尺度變換normalize,還有的方法是使用pca白化。但是就影象處理領域,通常就減去一個均值就可以直接拿來計算。

權重初始化

不要全部初始化為0,這樣會導致大部分的deltaw都一樣,一般用高斯分佈或者uniform分佈。但是這樣的分佈會導致輸出的方差隨著輸入單元個數而變大,因此需要除以fan in(輸入個數的平方根)。

卷積tricks

  • 圖片輸入是2的冪次方,例如32、64、96、224等。
  • 卷積核大小是3*3或者5*5。
  • 輸入圖片上下左右需要用0補充,即padding,且假如卷積核大小是5那麼padding就是2(圖片左右上下都補充2),卷積核大小是3padding大小就是1。

pooling層tricks

poolin層也能防止過擬合,使用overlapped pooling,即用來池化的資料有重疊,但是pooling的大小不要超過3。

max pooling比avg pooling效果會好一些。

避免overfitting

  • drop out能夠避免過擬[1],一般在加在全連線層後面[3],但是會導致收斂速度變慢。
  • 正則化也能避免過擬合,L2正則l2正則懲罰了峰值權重,l1正則會導致稀疏權重,趨近於0,l1會趨向選擇有用的輸入。又或者可以給給權重向量的模加上上邊界(3 or 4),更新時對delta w進行歸一化。

調參

使用pretrain好的網路引數作為初始值。然後fine-tuning,此處可以保持前面層數的引數不變,只調節後面的引數。但是finetuning要考慮的是圖片大小和跟原資料集的相關程度,如果相關性很高,那麼只用取最後一層的輸出,不相關資料多就要finetuning比較多的層。

初始值設定為0.1,然後訓練到一定的階段除以2,除以5,依次減小。

加入momentum項[2],可以讓網路更快的收斂。

  • 節點數增加,learning rate要降低
  • 層數增加,後面的層數learning rate要降低

激勵函式

Sigmoid作為激勵函式有飽和和梯度消失的現象,在接近輸出值0和1的地方梯度接近於0(可通過sigmoid的分佈曲線觀察出)。因而可採用Rectified Linear Units(ReLUs)作為激勵函式,這樣會訓練的快一些,但是relu比較脆弱,如果某次某個點梯度下降的非常多,權重被改變的特別多,那麼這個點的激勵可能永遠都是0了,還有帶參的prelu、產生隨機值的rrelu等改進版本。但是leaky版本(0換成0.01)的效果並不是很穩定。

通過做圖來觀察網路訓練的情況

可以畫出隨著不同引數訓練集測試集的改變情況,觀察它們的走勢圖來分析到底什麼時候的引數比較合適。

  • 不同學習率與loss的曲線圖,橫座標是epoch,縱座標是loss或者正確率
  • 不同的batchsize與loss的曲線圖,座標同上

資料集不均衡

這種情況如果資料集跟imagenet的比較相近,可以直接用finetuning的方法,假如不相近,首先考慮重新構造資料集的每一類個數,再次可以減少資料量比較大的類(減取樣),並且複製資料量比較小的類(增取樣)。

以上是在實現卷積神經網路中使用過的和平時看文章中提及到的一些技巧,大多數現在的開源軟體都是已經實現好了,直接呼叫使用即可。