1. 程式人生 > > 神經網路資料預處理,正則化與損失函式

神經網路資料預處理,正則化與損失函式

1. 引言

上一節我們講完了各種激勵函式的優缺點和選擇,以及網路的大小以及正則化對神經網路的影響。這一節我們講一講輸入資料預處理、正則化以及損失函式設定的一些事情。

2. 資料與網路的設定

前一節提到前向計算涉及到的元件(主要是神經元)設定。神經網路結構和引數設定完畢之後,我們就得到得分函式/score function(忘記的同學們可以翻看一下之前的博文),總體說來,一個完整的神經網路就是在不斷地進行線性對映(權重和input的內積)和非線性對映(部分激勵函式作用)的過程。這一節我們會展開來講講資料預處理權重初始化損失函式的事情。

2.1 資料預處理

在卷積神經網處理影象問題的時候,影象資料有3種常見的預處理可能會用到,如下。我們假定資料表示成矩陣為X,其中我們假定X是[N*D]維矩陣(N是樣本資料量,D為單張圖片的資料向量長度)。

  • 去均值,這是最常見的圖片資料預處理,簡單說來,它做的事情就是,對待訓練的每一張圖片的特徵,都減去全部訓練集圖片的特徵均值,這麼做的直觀意義就是,我們把輸入資料各個維度的資料都中心化到0了。使用python的numpy工具包,這一步可以用X -= np.mean(X, axis = 0)輕鬆實現。當然,其實這裡也有不同的做法:簡單一點,我們可以直接求出所有畫素的均值,然後每個畫素點都減掉這個相同的值;稍微優化一下,我們在RGB三個顏色通道分別做這件事。
  • 歸一化,歸一化的直觀理解含義是,我們做一些工作去保證所有的維度上資料都在一個變化幅度上。通常我們有兩種方法來實現歸一化。一個是在資料都去均值之後,每個維度上的資料都除以這個維度上資料的標準差(X /= np.std(X, axis = 0))。另外一種方式是我們除以資料絕對值最大值,以保證所有的資料歸一化後都在-1到1之間。多說一句,其實在任何你覺得各維度幅度變化非常大的資料集上,你都可以考慮歸一化處理。不過對於影象而言,其實這一步反倒可做可不做,因為大家都知道,畫素的值變化區間都在[0,255]之間,所以其實影象輸入資料天生幅度就是一致的。

上述兩個操作對於資料的作用,畫成示意圖,如下: 
資料的去均值與歸一化

  • PCA和白化/whitening,這是另外一種形式的資料預處理。在經過去均值操作之後,我們可以計算資料的協方差矩陣,從而可以知道資料各個維度之間的相關性,簡單示例程式碼如下:
# 假定輸入資料矩陣X是[N*D]維的
X -= np.mean(X, axis = 0) # 去均值
cov = np.dot(X.T, X) / X.shape[0] # 計算協方差

得到的結果矩陣中元素(i,j)表示原始資料中,第i維和第j維之間的相關性。有意思的是,其實協方差矩陣的對角線包含了每個維度的變化幅度。另外,我們都知道協方差矩陣是對稱的,我們可以在其上做矩陣奇異值分解(SVD factorization):

U,S,V = np.linalg.svd(cov)

其中U為特徵向量,我們如果相對原始資料(去均值之後)做去相關操作,只需要進行如下運算:

Xrot = np.dot(X, U)

這麼理解一下可能更好,U是一組正交基向量。所以我們可以看做把原始資料X投射到這組維度保持不變的正交基底上,從而也就完成了對原始資料的去相關。如果去相關之後你再求一下Xrot的協方差矩陣,你會發現這時候的協方差矩陣是一個對角矩陣了。而numpy中的np.linalg.svd更好的一個特性是,它返回的U是對特徵值排序過的,這也就意味著,我們可以用它進行降維操作。我們可以只取top的一些特徵向量,然後做和原始資料做矩陣乘法,這個時候既降維減少了計算量,同時又儲存下了絕大多數的原始資料資訊,這就是所謂的主成分分析/PCA

Xrot_reduced = np.dot(X, U[:,:100])

這個操作之後,我們把原始資料集矩陣從[N*D]降維到[N*100],儲存了前100個能包含絕大多數資料資訊的維度。實際應用中,你在PCA降維之後的資料集上,做各種機器學習的訓練,在節省空間和時間的前提下,依舊能有很好的訓練準確度。

最後我們再提一下whitening操作。所謂whitening,就是把各個特徵軸上的資料除以對應特徵值,從而達到在每個特徵軸上都歸一化幅度的結果。whitening變換的幾何意義和理解是,如果輸入的資料是多變數高斯,那whitening之後的 資料是一個均值為0而不同方差的高斯矩陣。這一步簡單程式碼實現如下:

#白化資料
Xwhite = Xrot / np.sqrt(S + 1e-5)

提個醒:whitening操作會有嚴重化噪聲的可能。注意到我們在上述程式碼中,分母的部分加入了一個很小的數1e-5,以防止出現除以0的情況。但是資料中的噪聲部分可能會因whitening操作而變大,因為這個操作的本質是把輸入的每個維度都拉到差不多的幅度,那麼本不相關的有微弱幅度變化的噪聲維度,也被拉到了和其他維度同樣的幅度。當然,我們適當提高墳墓中的安全因子(1e-5)可以在一定程度上緩解這個問題。

下圖為原始資料到去相關白化之後的資料分佈示意圖: 
去相關與白化

我們來看看真實資料集上的操作與得到的結果,也許能對這些過程有更清晰一些的認識。大家都還記得CIFAR-10影象資料集吧。訓練集大小為50000*3072,也就是說,每張圖片都被展成一個3072維度的列向量了。然後我們對原始50000*3072資料矩陣做SVD分解,進行上述一些操作,再視覺化一下,得到的結果示意圖如下:

CIFAR-10降維與視覺化

我們稍加解釋一下,最左邊是49張原始圖片;左起第2幅圖是最3072個特徵向量中最top的144個,這144個特徵向量包含了絕大多數資料變數資訊,而其實它們代表的是圖片中低頻的資訊;左起第3幅圖表示PCA降維操作之後的49張圖片,使用上面求得的144個特徵向量。我們可以觀察到圖片好像被蒙上了一層東西一樣,模糊化了,這也就表明了我們的top144個特徵向量捕捉到的都是影象的低頻資訊,不過我們發現影象的絕大多數資訊確實被保留下來了;最右圖是whitening的144個數通過乘以U.transpose()[:144,:]還原回圖片的樣子,有趣的是,我們發現,現在低頻資訊基本都被濾掉了,剩下一些高頻資訊被放大呈現。

實際工程中,因為這個部分講到資料預處理,我們就把基本的幾種資料預處理都講了一遍,但實際卷積神經網中,我們並沒有用到去相關和whitening操作。當然,去均值是非常非常重要的,而每個畫素維度的歸一化也是常用的操作。

特別說明,需要特別說明的一點是,上述的預處理操作,一定都是在訓練集上先預算的,然後應用在交叉驗證/測試集上的。舉個例子,有些同學會先把所有的圖片放一起,求均值,然後減掉均值,再把這份資料分作訓練集和測試集,這是不對的親!!!

2.2 權重初始化

我們之前已經看過一個完整的神經網路,是怎麼樣通過神經元和連線搭建起來的,以及如何對資料做預處理。在訓練神經網路之前,我們還有一個任務要做,那就是初始化引數。

錯誤的想法:全部初始化為0,有些同學說,那既然要訓練和收斂嘛,初始值就隨便設定,簡單一點就全設為0好了。親,這樣是絕對不行的!!!為啥呢?我們在神經網路訓練完成之前,是不可能預知神經網路最後的權重具體結果的,但是根據我們歸一化後的資料,我們可以假定,大概有半數左右的權重是正數,而另外的半數是負數。但設定全部初始權重都為0的結果是,網路中每個神經元都計算出一樣的結果,然後在反向傳播中有一樣的梯度結果,因此迭代之後的變化情況也都一樣,這意味著這個神經網路的權重沒有辦法差異化,也就沒有辦法學習到東西。

很小的隨機數,其實我們依舊希望初始的權重是較小的數,趨於0,但是就像我們剛剛討論過的一樣,不要真的是0。綜合上述想法,在實際場景中,我們通常會把初始權重設定為非常小的數字,然後正負儘量一半一半。這樣,初始的時候權重都是不一樣的很小隨機數,然後迭代過程中不會再出現迭代一致的情況。舉個例子,我們可能可以這樣初始化一個權重矩陣W=0.0001*np.random.randn(D,H)。這個初始化的過程,使得每個神經元的權重向量初始化為多維高斯中的隨機取樣向量,所以神經元的初始權重值指向空間中的隨機方向。

特別說明:其實不一定更小的初始值會比大值有更好的效果。我們這麼想,一個有著非常小的權重的神經網路在後向傳播過程中,回傳的梯度也是非常小的。這樣回傳的”訊號”流會相對也較弱,對於層數非常多的深度神經網路,這也是一個問題,回傳到最前的迭代梯度已經很小了。

方差歸一化,上面提到的建議有一個小問題,對於隨機初始化的神經元引數下的輸出,其分佈的方差隨著輸入的數量,會增長。我們實際上可以通過除以總輸入數目的平方根,歸一化每個神經元的輸出方差到1。也就是說,我們傾向於初始化神經元的權重向量為w = np.random.randn(n) / sqrt(n),其中n為輸入數。

我們從數學的角度,簡單解釋一下,為什麼上述操作可以歸一化方差。考慮在激勵函式之前的權重w與輸入x的內積s=niwixi部分,我們計算一下s的方差:

Var(s)=Var(inwixi)=inVar(wixi)=in[E(wi)]2Var(xi)+E[(xi)]2Var(wi)+Var(xi)Var(wi)=inVar(xi)Var(wi)=(nVar(w))Var(x).

注意,這個推導的前2步用到了方差的性質。第3步我們假定輸入均值為0,因此E[xi]=E[wi]=0。不過這是我們的一個假設,實際情況下並不一定是這樣的,比如ReLU單元的均值就是正的。最後一步我們假定wi,xi是獨立分佈。我們想讓s的方差和輸入x的方差一致,因此我們想讓w的方差取值為1/n,又因為我們有公式Var(