Deep Learning 學習筆記(9):主成分分析( PCA )與 白化( whitening )


廢話:

這博客有三個月沒更新了。

三個月!!!尼瑪我真是夠懶了!!

這三個月我復習什么去了呢?

托福…………

也不是說我復習緊張到完全沒時間更新,

事實上我甚至有時間打LOL。

只是說,我一次就只能(只想?)做一件事情。

對我來說,在兩種不同思維之間轉換是十分耗費能量的。

說白了我!就!是!個!廢!柴!……哼……


前言:

PCA與白化,

就是對輸入數據進行預處理,

前者對數據進行降維,后者對數據進行方差處理。

雖說原理挺簡單,但是作用可不小。

之前的師兄做實驗的時候,就是忘了對數據預處理,

結果實驗失敗了。

可見好的PCA對實驗結果影響挺重要。


主成成分分析(PCA):

 

主要思想(我總結的):

通過拋棄攜帶信息量較少的維度對數據進行降維處理,從而加速機器學習進程。

 

方法:

一、數據的旋轉(其實我覺着,這個有點像向量正交化的過程)

1、使用的輸入數據集表示為 \textstyle \{x^{(1)}, x^{(2)}, \ldots, x^{(m)}\}

2、首先計算出協方差矩陣 \textstyle \Sigma ,如下所示:

\begin{align}
\Sigma = \frac{1}{m} \sum_{i=1}^m (x^{(i)})(x^{(i)})^T. 
\end{align}

可以證明,數據變化的主方向 \textstyle u_1 就是協方差矩陣 \textstyle \Sigma 的主特征向量,而 變化的次方向\textstyle u_2 是次特征向量,以此類推。

(證明略,事實上如果只是想實現算法這個定理不用理解。但我已決定重修線代(By Myself),因為越到后面越發現線性代數的重要性。)

3、我們可以通過matlab或其他線代軟件求解出協方差矩陣的特征向量,並按列排列如下:

\begin{align}
U = 
\begin{bmatrix} 
| & | & & |  \\
u_1 & u_2 & \cdots & u_n  \\
| & | & & | 
\end{bmatrix} 		
\end{align}

      \textstyle u_1 是主特征向量(對應最大的特征值), \textstyle u_2 是次特征向量。以此類推,另記 \textstyle \lambda_1, \lambda_2, \ldots, \lambda_n 為相應的特征值(數值遞減)。

4、旋轉數據。向量  構成了一個新基,可以用來表示數據。令 為訓練樣本,那么  就是樣本點 i 在維度 上的投影的長度(幅值)。

 

     至此,以二位空間為例,我們可以把 \textstyle x 用 \textstyle (u_1, u_2) 基表達為:

\begin{align}
x_{\rm rot} = U^Tx = \begin{bmatrix} u_1^Tx \\ u_2^Tx \end{bmatrix} 
\end{align}

   

     引用UFDL兩張圖

     可見變化最大的維度(攜帶信息最多,在我們EE人的眼中,交流能量(方差)可以用來表征信號的信息)被排到了最前。

旋轉前 旋轉后
PCA-u1.png PCA-rotated.png

 

 

 

二、數據的取舍

接上,我們用方差來表征一個信號的信息,在旋轉過后的數據中,我們把最后面方差較小的維度舍去。

\begin{align}
\hat{x}  = U \begin{bmatrix} \tilde{x}_1 \\ \vdots \\ \tilde{x}_k \\ 0 \\ \vdots \\ 0 \end{bmatrix}  
= \sum_{i=1}^k u_i \tilde{x}_i.
\end{align}

保留下來的數據與原數據所攜帶的信息比為

\begin{align}
\frac{\sum_{j=1}^k \lambda_j}{\sum_{j=1}^n \lambda_j}.
\end{align}

一般取

\begin{align}
\frac{\sum_{j=1}^k \lambda_j}{\sum_{j=1}^n \lambda_j} \geq 0.99. 
\end{align}

若向他人介紹PCA算法詳情,告訴他們你選擇的 \textstyle k 保留了99%的方差

總的來說,PCA后,數據的近似表示

\begin{align}
\tilde{x} = 
\begin{bmatrix} 
x_{{\rm rot},1} \\
\vdots \\ 
x_{{\rm rot},k} \\
0 \\ 
\vdots \\ 
0 \\ 
\end{bmatrix}
\approx 
\begin{bmatrix} 
x_{{\rm rot},1} \\
\vdots \\ 
x_{{\rm rot},k} \\
x_{{\rm rot},k+1} \\
\vdots \\ 
x_{{\rm rot},n} 
\end{bmatrix}
= x_{\rm rot} 
\end{align}

即,我們舍去n維向量中的(n-k)維,用k維向量來表示數據,可見數據的維度被縮小了。

 

如,舍去第二維之后的數據

PCA-xtilde.png

 

三、復原

其實一般都不復原,那么辛苦排除了無用信息還復原干蛋。只是說有這么個東西……

矩陣 \textstyle U 有正交性,即滿足 \textstyle U^TU = UU^T = I ,所以若想將旋轉后的向量 \textstyle x_{\rm rot} 還原為原始數據 \textstyle x ,將其左乘矩陣\textstyle U即可: \textstyle x=U x_{\rm rot} , 驗算一下: \textstyle U x_{\rm rot} =  UU^T x = x,即:

\begin{align}
\tilde{x} = 
\begin{bmatrix} 
x_{{\rm rot},1} \\
\vdots \\ 
x_{{\rm rot},k} \\
0 \\ 
\vdots \\ 
0 \\ 
\end{bmatrix}
\approx 
\begin{bmatrix} 
x_{{\rm rot},1} \\
\vdots \\ 
x_{{\rm rot},k} \\
x_{{\rm rot},k+1} \\
\vdots \\ 
x_{{\rm rot},n} 
\end{bmatrix}
= x_{\rm rot} 
\end{align}

 

 


白化(Whitening):

  主要思想(教程上的):

  由於圖像中相鄰像素之間具有很強的相關性,所以用於訓練時輸入是冗余的。白化的目的就是降低輸入的冗余性;更正式的說,我們希望通過白化過程使得學習算法的輸入具有如下性質:(i)特征之間相關性較低;(ii)所有特征具有相同的方差。

 

  方法:   

  在上一步PCA中,旋轉過后的維度間已經不具有相關性(果真正交化?)。因此這里只用將數據的方差化為一即可。

  可知協方差矩陣對角元素的值為 \textstyle \lambda_1 ,\textstyle \lambda_2 ……為數據方差,方差歸一:

                                     \begin{align}
x_{{\rm PCAwhite},i} = \frac{x_{{\rm rot},i} }{\sqrt{\lambda_i}}.   
\end{align}

 

  (對,就這么就完了,當然這只是最最最簡單的東西)

 

TIPS:

  未防止 \textstyle \lambda_i 過於接近零,這樣在縮放步驟時我們除以 \sqrt{\lambda_i} 將導致除以一個接近0的值;這可能使數據上溢 。因而在實踐中,我們使用少量的正則化實現這個縮放過程,即在取平方根和倒數之前給特征值加上一個很小的常數 \textstyle \epsilon

\begin{align}
x_{{\rm PCAwhite},i} = \frac{x_{{\rm rot},i} }{\sqrt{\lambda_i + \epsilon}}.
\end{align}

  當 \textstyle x 在區間 \textstyle [-1,1] 上時, 一般取值為 \textstyle \epsilon \approx 10^{-5}

(教程上是這么說的,但是事實上我認為如果某一維度的\textstyle \lambda_i過於接近零,這個維度在PCA過程中將會被舍棄。可能教程中針對的是未經過PCA的數據即:ZCAWhite?)

 

 


完結:?

基本上把幾個月的深度學習自己過了一遍(雖然有相當一部分是復制粘貼的0)。

后面的池化和卷積就不寫了,能用到的不多。

至於稀疏編碼寫不寫,還要看學不學。

因為在UFLDL里面這方面的內容還未完善,

而且稀疏編碼的激活函數都是可學習的,

不僅理解難度大,實現起來難度也大。

師兄學習的時候跑了兩天………………何況我的I3-M一代。

暫且就這樣吧。

 

接下來想學習python和theano,

提高應用能力,

然后向自己找點資料搞實驗。(事實上已經找到)

不過需要指導老師,和老師打交道什么的最不懂了。

 

自學DL后深深感到線性代數知識的匱乏,需要惡補。

同時發現這個是DL因為可並行計算很多,很有硬件加速的前途(FPGA?不過矩陣運算好像還不成熟?)。

要是做成芯片肯定很有前途啊~

 

管他呢!

 


免責聲明!

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



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