訓練CNN你需要知道的tricks/tips

Introduction

本文假設閱讀者有基本的NN基礎,涉及的tips有一下幾點:
- data augmentation
- pre-process on images
- initializations of Networks
- some tips during training
- selections of activation functions
- diverse regularizations
- some insights found from figures and finally
- methods of ensemble multiple deep networks.

Data Augmentation

在數據量少的情況下,需要對圖片做Augmentation.當然,在訓練dnn時這一步是必不可少的。
data augmentation的基本方法有:

  • translation
  • rotation
  • stretching
  • shearing
  • lens distortions,…

(一般對圖片見減個均值或者scaling到【0-1】);
2. 對圖片做fancy PCA,即對圖片先做pca然後將特徵值乘上一個正態分佈N(0,0.1) 的隨機數;具體步驟如下:

  • 計算所有RGB通道的PCA
  • Sample some color offset along the principal components at each forward pass;
  • Add the offset to all pixels in a training image.
    這裏寫圖片描述
    這種方法在imagenet 2012中top 1 精確度獲得1%的提升。

github上的大神已經對Augmentation的操作有比較完整的實現:

Pre-Processing

  1. 在進行Aumentation後還可以做zero-centernormalize
    這裏寫圖片描述
>>> X -= np.mean(X, axis = 0) # zero-center
>>> X /= np.std(X, axis = 0) # normalize
  1. PCA Whitening 白化
    在centered後,可以再進行pca whitening
    這裏寫圖片描述
>>> U,S,V = np.linalg.svd(cov) # compute the SVD factorization of the data covariance matrix
>>> Xrot = np.dot(X, U) # decorrelate the data
>>> Xwhite = Xrot / np.sqrt(S + 1e-5) # divide by the eigenvalues (which are square roots of the singular values)

最後一個操作是,將矩陣處以特徵值進行白化,白化這種處理方法過分誇大了噪聲。

(p.s. zero-center是必須的,在vgg中圖片就是直接減去RGB固定的均值;但是嘗試[0,1]化發現反而效果變差)像這些方法要根據自己的實際情況斟酌使用,並不是必須的!

初始化

初始化爲0值

在理想狀態下,對於正太分佈的數據,把假設爲權重一半爲正一般爲負是合理的。所以,將權重全部初始化爲0看上去是合理的。但是,同樣的權重會導致每個神經元的輸出都是一樣的輸出,那麼他們計算出的梯度相同,結果就是反饋更新後的權重都相同,這顯然不合理。

用小的隨機數初始化


這裏寫圖片描述
這裏使用均勻分佈初始化也可以,但是會有一些影響。

方差校準(Calibrating the Variances)

上一個初始化方式隨機初始化的方差會隨着輸入數據的增加而增加。可以用以下方式初始化

>>> w = np.random.randn(n) / sqrt(n) 
# calibrating the variances with 1/sqrt(n)

n 是輸入數據的數量。這種方法在初始時可以近似地保證輸出的分佈是相同的,並且可以提高收斂速度;

在經過激活函數之前保證輸出是同分布,不受到輸入數據量的影響:

這裏寫圖片描述

推薦的方法

上一種方法並沒有考慮激活層(relus)的影響,在文獻 中使用以下公式取得了良好的效果:

>>> w = np.random.randn(n) * sqrt(2.0/n) # current recommendation

這裏寫圖片描述
上圖紅線是sqrt(2.0/n) 的結果,收斂速度比sqrt(1.0/n) 的要快。

訓練過程中的tricks

卷積和池化

  • 使用2的指數次冪的圖片作爲輸入,如32*32(cifar-10),224*224(imagenet)
  • 卷積層使用3*3並且做zero padding,small strides既可以減少參數數量並且能夠提高dnn的精度
  • 池化層一般用2*2 (越大的效果越差)

Gradient normalization

把梯度除以minibatch的大小,這樣就不用在採用不同batch大小時候大幅度改變learning rate的值。

learning rate

  • LR 常用 0.1
  • 使用交叉驗證集
  • 實際應用的建議:如果在validation set中不能精度不能提升了,可以嘗試將少lr爲原來的2倍(5倍)繼續訓練。

fine tuning

這裏寫圖片描述

還要注意的是:

  • 小數據集:對於finetuning的層建議隨機初始化
  • 大數據集:用更小的lr
  • 對於不同的數據集而且數據少,可以嘗試用靠前的某一層特徵的權重或特徵訓練SVM。

激活函數

  1. sigmoid
  2. tanh
  3. ReLU(Rectified Linear Unit)
  4. Leaky ReLU
  5. Rarametric ReLU
  6. Randomized ReLU

sigmoid

這裏寫圖片描述

優點:

  • 將數值“壓縮到”[0,1]
  • 飽和

缺點:

  • 梯度消失
  • 不是zero-centered

tanh

這裏寫圖片描述

優點:

  • 將數值“壓縮到”[-1,1]
  • zero-centered

缺點:

  • 梯度消失

ReLU(Rectified Linear Unit)

這裏寫圖片描述

優點:

  • 計算效率高
  • 收斂速度快

其他各種ReLU變種

不詳細介紹參見原文。

正則化

L2 regularization

L1 regularization

通常情況下,如果不做顯式的特徵選取,L2效果比L1好

L1 && L2

max norm constraints

對權重做L2的上限控制:||w||2<c

Dropout

來自於
Dropout: A Simple Way to Prevent Neural Networks from Overfitting.
這個方法十分有效,即讓每層的節點不工作,不更新。一般dropoutratio爲p=0.5

這裏寫圖片描述

幾種方法的比較

這裏寫圖片描述

觀察圖表

通過觀察目標函數(如交叉熵)或者精確度在每次的變化可以看出數據的學習率設置的是否合,是否有過擬合的情況。

這裏寫圖片描述

ensemble

最最最後,通過模型融合優化。有以下幾種方式:

同模型,不同初始化參數

利用cv找出最佳超參,然後初始化不同的參數進行訓練多個模型。這種方法的風險是各個模型的不同取決於初始化的情況。

不同模型

通過cv找出較好的幾個不同模型進行融合

Different checkpoints of a single model

一個模型多個checkpoint 做融合。

一些經驗

better ensemble method is to employ multiple deep models trained on different data sources to extract different and complementary deep representations

相當於將好多不同的nn stack在一起。
可以看這兩篇文獻:
1. Deep Spatial Pyramid Ensemble for Cultural Event Recognition
2. S-NN: Stacked Neural Networks

本文原文來自:Must Know Tips/Tricks in Deep Neural Networks

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章