【DL-CV】資料預處理&權重初始化

八九寺真宵發表於2019-02-16

【DL-CV】卷積神經網路<前篇—後篇>【DL-CV】批量歸一化(BN演算法)

資料預處理

在網路訓練時,我們通常會對原始資料進行預處理再餵給網路進行訓練,而不是直接把原始資料餵給網路。這樣能減少訓練時問題的發生,提高網路模型的效能。現在我們有原始資料 X,其尺寸是 NxD(N是資料樣本數量,D是資料的維度)

均值減法

均值減法(Mean subtraction)是預處理最常用的形式,將資料的每一維特徵都減去平均值即可,在numpy的實現是X -= np.mean(X, axis=0),它能使資料零中心化


另外還有一些類似的方法對影像資料預處理來說也很可能用到:

  • 直接減去整個資料的均值,X -= np.mean(X),對於影像,可以移除影像的平均亮度值,因為很多情況下我們對影像亮度並不感興趣,而是關注其內容,所以將影像整體減去畫素均值是有意義的
  • 減去每個顏色通道上的均值

歸一化

歸一化(Normalization)也是一種預處理的方法,他將資料的所有維度都歸一化,使其數值範圍都近似相等。先對資料做零中心化處理,然後每個維度都除以其標準差

x = x - np.mean(x, axis=0)
x = x / np.std(x, axis=0)

除此之外,預處理方法還有PCA和白化,但在影像處理這一塊他們用得並不是很多,這裡就不講了,有興趣自查。在影像識別領域,更常用的是零中心化和歸一化,特別是零中心化
零中心化在使用時,先將樣本資料分成訓練/驗證/測試集,從訓練集中求得平均值,然後將各個集(訓練/驗證/測試集)中的資料再減去這個均值。

權重初始化

首先,全零初始化想想都知道肯定是錯的。

然後,小隨機數初始化如W = 0.01 * np.random.randn(D,H)是可以的(randn函式是基於零均值和標準差的一個高斯分佈),不過不是越小越好,權重初始化的太小的話計算出來的啟用值會很小,在反向傳播中就會得到很小的梯度,後果你知道的。

但是,還不是最好的,小隨機數初始化有一個問題就是隨著輸入資料量的增長,隨機初始神經元輸出資料的方差也增大,這樣網路一深問題就大了。解決方法是:除以輸入資料量的平方根來調整數值範圍,使神經元輸出的方差歸一化為1,也就是W = np.random.randn(in, out) / sqrt(in) ,其中in是輸入資料的數量(若W尺寸 DxH ,則in=D,out=H)。這種更厲害的方法叫做 Xavier初始化,他保證了網路中所有神經元起始時有近似同樣的輸出分佈。實踐經驗證明,這樣做可以提高收斂的速度。

《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》論文指出,使用relu啟用函式的網路,由於一半的啟用值變成了0,相當於一半的輸入資料量是對方差無貢獻的,為保持輸入輸出的方差維持不變,初始化方法也作了相應改變(根號中的資料量除以二): W = np.random.randn(in, out) / sqrt(in/2) ,這是針對使用relu的初始化方法。

至於偏置值,通常初始化為0

總結

針對影像識別領域,通常來說

  • 資料預處理使用零中心化
  • 權重初始化使用Xavier;如網路使用relu,使用W = np.random.randn(in, out) / sqrt(in/2)
  • 偏置值初始化為0

相關文章