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然後將特徵值乘上一個正態分佈
- 計算所有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
- 在進行Aumentation後還可以做zero-center 或 normalize
>>> X -= np.mean(X, axis = 0) # zero-center
>>> X /= np.std(X, axis = 0) # normalize
- 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)
在經過激活函數之前保證輸出是同分布,不受到輸入數據量的影響:
推薦的方法
上一種方法並沒有考慮激活層(relus)的影響,在文獻 中使用以下公式取得了良好的效果:
>>> w = np.random.randn(n) * sqrt(2.0/n) # current recommendation
上圖紅線是
訓練過程中的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。
激活函數
- sigmoid
- tanh
- ReLU(Rectified Linear Unit)
- Leaky ReLU
- Rarametric ReLU
- 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的上限控制:
Dropout
來自於
Dropout: A Simple Way to Prevent Neural Networks from Overfitting.
這個方法十分有效,即讓每層的節點不工作,不更新。一般dropoutratio爲
幾種方法的比較
觀察圖表
通過觀察目標函數(如交叉熵)或者精確度在每次的變化可以看出數據的學習率設置的是否合,是否有過擬合的情況。
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