深度學習之數據預處理


預處理與權重初始化之間的關系

如果做過DNN的實驗,大家可能會發現在對數據進行預處理,例如白化或者z-score,甚至是簡單的減均值操作都是可以加速收斂的,例如下圖所示的一個簡單的例子:

圖中紅點均代表二維的數據點,由於圖像數據的每一維一般都是$0~255$之間的數字,因此數據點只會落在第一象限,而且圖像數據具有很強的相關性,比如第一個灰度值為$30$,比較黑,那它旁邊的一個像素值一般不會超過$100$,否則給人的感覺就像噪聲一樣。由於強相關性,數據點僅會落在第一象限的很小的區域中,形成類似上圖a所示的狹長分布。

而神經網絡模型在初始化的時候,權重$W$是隨機采樣生成的,一個常見的神經元表示為:$ReLU(Wx + b) = \max(Wx + b,0)$,即在$Wx + b = 0$的兩側,對數據采用不同的操作方法。具體到ReLU就是一側收縮,一側保持不變。隨機的$Wx + b = 0$表現為圖b中的隨機虛線,由於初始化參數一般都是$0$均值的,因此開始的擬合$y =Wx + b$,基本過原點附近,如圖b中的紅色虛線。注意到,這兩條紅色虛線實際上並沒有什么意義(沒有分割到數據點)。在使用梯度下降時,可能需要很多次迭代才會使這些虛線對數據點進行有效的分割(如紫色虛線),即網絡需要經過多次學習才能逐步達到如紫色實線的擬合=》收斂比較慢。

更何況,我們這只是個二維的演示,數據占據四個象限中的一個,如果是幾百、幾千、上萬維呢?而且數據在第一象限中也只是占了很小的一部分區域而已,可想而知不對數據進行預處理帶來了多少運算資源的浪費,而且大量的數據外分割面在迭代時很可能會在剛進入數據中時就遇到了一個局部最優,導致overfit的問題。

這時,如果我們對輸入數據先作減均值操作,數據點就不再只分布在第一象限了,如圖c,這時一個隨機分界面落入數據分布的概率增加了多少呢?$2^n$倍!更進一步的,我們對數據再使用去除相關性的算法,例如PCA和ZCA白化,數據不再是一個狹長的分布而更加容易區分,這樣又會加快訓練,如圖d。隨機分界面有效的概率就又大大增加了。

不過計算協方差矩陣的特征值太耗時也太耗空間,我們一般最多只用到z-score處理,即每一維度減去自身均值,再除以自身標准差,這樣能使數據點在每維上具有相似的寬度,可以起到一定的增大數據分布范圍,進而使更多隨機分界面有意義的作用。

常見的預處理方法

預處理為什么要歸一化

前面講了數據預處理對於模型訓練的重要性,那么回歸到輸入數據的整體分布來看,在訓練開始前,都要對輸入數據做一個歸一化處理,本質原因還是在於神經網絡學習過程本質就是為了學習數據分布,一旦訓練數據與測試數據的分布不同,那么網絡的泛化能力也大大降低;另外一方面,一旦每批訓練數據的分布各不相同(batch 梯度下降),那么網絡就要在每次迭代都去學習適應不同的分布,這樣將會大大降低網絡的訓練速度,這也正是為什么我們對輸入數據都需要做一個歸一化預處理的原因。

歸一化、標准化與中心化

歸一化、標准化可以說是數據處理中最常被提及的詞匯之二了,關於二者的定義比較相似,也容易混淆。查閱了網上的各種資料,發現其實所謂“歸一化”和“標准化”在不同人的不同文章中,可能有着不一樣的定義。那么撇開指代模糊的名字,從最明確公式定義來看,“歸一化”和“標准化”通常指的是這四種特征縮放(Feature Scaling):

  1. Rescaling (min-max normalization) 有時簡稱normalization(有點坑):$$x' = \frac{x - min(x)}{max(x) - min(m)}$$
  2. Mean normalization:$$x' = \frac{x - mean(x)}{max(x) - min(x)}$$
  3. Standardization(Z-score normalization):$$x' = \frac{x - mean(x)}{\sigma}$$
  4. Scaling to unit length:$$x' = \frac{x}{||x||}$$

一般把第一種叫做歸一化第三種叫做標准化。而正則化的英文應該是Regularization,有時也被弄混,正則化是完全不同的事情了。而關於在機器學習中是用第一個好還是第三個好,可參考這篇文章:標准化和歸一化,請勿混為一談,透徹理解數據變換,里面有詳細的歸一化與標准化的區別與聯系的討論,以及使用決策,講得很好。

中心化比較簡單,就是將均值變為0($x' = x - mean(x)$),對方差沒要求。

z-score

z-score即上述第三種的“標准化”,將每一個維度的特征都處理為符合標准正態分布$N(0, 1)$,核心公式為$$\begin{align}\mu &= \frac{1}{N}\sum_{i = 1}^{N} x^{(i)} \\ \sigma^2 &= \frac{1}{N}\sum_{i = 1}{N}(x^{(i)} - \mu)^2 \\ \widetilde x^{(i)} &= \frac{x^{(i)} - \mu}{\sigma}\end{align}$$

每一維特征都服從標准正態分布。經過處理后的數據符合均值為0,標准差為1的分布,如果原始的分布是正態分布,那么z-score標准化就將原始的正態分布轉換為標准正態分布,機器學習中的很多問題都是基於正態分布的假設,這是更加常用的歸一化方法。

以上都是線性變換,對輸入向量$X$按比例壓縮再進行平移,操作之后原始有量綱的變量變成無量綱的變量。不過它們不會改變分布本身的形狀,下面以一個指數分布為例:

如果要改變分布本身的形狀,下面也介紹兩種。

正態分布Box-Cox變換

Box-Cox變換可以將一個非正態分布轉換為正態分布,使得分布具有對稱性,變換公式如下:$$Y^{(\lambda)} = \begin{cases} \frac{Y^{\lambda} - 1}{\lambda},\quad\text{$\lambda \neq 0$} \\ \ln \lambda,\quad \text{$\lambda = 0$} \end{cases}$$

在這里$\lambda$是一個基於數據求取的待定變換參數,Box-Cox的效果如下:

直方圖均衡化

直方圖均衡也可以將某一個分布歸一化到另一個分布,它通過圖像的灰度值分布,即圖像直方圖來對圖像進行對比度進調整,可以增強局部的對比度。

它的變換步驟如下:

(1)計算概率密度和累積概率密度。

(2)創建累積概率到灰度分布范圍的單調線性映射T。

(3)根據T進行原始灰度值到新灰度值的映射。

直方圖均衡化將任意的灰度范圍映射到全局灰度范圍之間,對於$8$位的圖像就是$(0, 255)$,它相對於直接線性拉伸,讓分布更加均勻,對於增強相近灰度的對比度很有效,如下圖。

綜上,歸一化數據的目標,是為了讓數據的分布變得更加符合期望,增強數據的表達能力。

在深度學習中,因為網絡的層數非常多,如果數據分布在某一層開始有明顯的偏移,隨着網絡的加深這一問題會加劇(這在BN的文章中被稱之為internal covariate shift),進而導致模型優化的難度增加,甚至不能優化。所以,歸一化就是要減緩這個問題。

白化(Whitening)

白化是一種重要的數據預處理方式,用來降低輸入數據特征之間的冗余性。輸入數據經過白化處理后,特征之間相關性低,並且所有特征具有相同的方差。

白化具有兩個目的:1. 使數據的不同維度去相關;2. 數據每個維度的方差為1。

假設訓練數據是圖像,由於圖像中相鄰像素之間具有很強的相關性,所以用於訓練時輸入是冗余的。白化的目的就是降低輸入的冗余性。

PCA白化

PCA即主成分分析(Principal Component Analysis),其思想是將$N$維特征映射到$K$維上(通常$K < N$),這$K$維是全新的正交特征。這$K$維特征稱為主成分,是重新構造出來的$K$維特征,而不是簡單地從$N$維特征中直接挑選出的$K$維特征。

這里先簡單講一下PCA的主要操作:

(1)求出訓練樣本$X$的協方差矩陣$\varSigma$,公式如下($m個$輸入數據$X$已經均值化過):$$\varSigma = \frac{1}{m}\sum_{i = 1}^{m}(x^{(i)})(x^{(i)})^T$$

(2)將$\varSigma$進行SVD分解,取前$K$大特征值對應的的特征向量作為列向量,組成特征向量矩陣$U$;

(3)將$X$投影到$U$上即得$Z$:$$z = U^Tx = \left[ \begin{array}{c} u_1^Tx \\ u_2^Tx \end{array} \right]$$

如此,樣本$x$經過PCA后被映射成了$z$。

那么,PCA白化的兩個主要步驟

1. 通過PCA將數據$X$映射得到$Z$,可以看出$Z$中每一維都是相互獨立的(去相關);

(如果$K < N$,就是PCA降維,如果$K = N$,則只是降低特征間得相關性。這里的$K$是指PCA處理過后的特征數。)

2. 再除以$Z$中每一維對應的方差,使得每一維的方差均為1。

ZCA白化

$$X_{ZCA_{white}} = UX_{PCA_{white}}$$

只是在PCA白化的基礎上做了一個旋轉操作,使得白化之后的數據更加接近原始數據。

ZCA白化首先通過PCA去除了各個特征相關性(沒降維,$K = N$),然后使輸入特征方差為1,此時得到PCA白化后的結果。之后再將數據旋轉回去,得到ZCA白化結果。

升級版的“預處理”——BN

對輸入數據進行預處理,減均值->z-score->白化可以逐級提升隨機初始化的權重對數據分割的有效性,還可以降低overfit的可能性。我們都知道,現在的神經網絡的層數都是很深的,如果我們對每一層的數據都進行處理,訓練時間和overfit程度是否可以降低呢?答案是可以,用Batch Normalization

參考資料:

https://blog.csdn.net/hjimce/article/details/50866313

https://www.zhihu.com/question/20467170

https://blog.csdn.net/weixin_36604953/article/details/102652160

https://www.zhihu.com/question/38102762/answer/607815171


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM