無監督學習一些算法的簡要概括(一)-稀疏自編碼


無監督學習(unsurpervised learning)是深度學習的基礎,也是大數據時代科學家們用來處理數據挖掘的主要工具。個人理解的話就是數據太多,而人們不可能給每個數據樣本加標簽吧,所以才有了無監督學習。當然用的最多的是用無監督學習算法訓練參數,然后用一部分加了標簽的數據測試。這種方法叫半監督學習(semi-unsurpervised)。最近看的幾個深度學習算法是:稀疏自編碼(sparse auto-encoder)、稀疏限制玻爾茲曼機器(sparse RBM)、K-means 聚類和高斯混合模型。根據論文An Analysis of Single-Layer Networks in Unsupervised Feature Learning的實驗結果,K-means聚類算法是准確率最高,而且不需要超參數(hyper-parameter)。

稀疏自編碼(sparse auto-encoder)

提到自編碼,就必須了解BP神經網絡。而稀疏自編碼是在自編碼基礎上加入了對隱藏單元活性(activition)的限制:即稀疏性參數ρ,通常是一個接近於0的較小值(比如ρ=0.05)。如果機器學習的基礎比較薄弱的話,建議先看Andrew Ng 老師講授的《機器學習》

BP神經網絡,是使用前向傳播(forward propagation)、后向傳播(backward propagation)來訓練參數。這里給出前向傳播和后向傳播的公式,具體細節見參考資料:

Network3322.png

前向傳播(向量表示法):

\begin{align}
z^{(2)} &= W^{(1)} x + b^{(1)} \\
a^{(2)} &= f(z^{(2)}) \\
z^{(3)} &= W^{(2)} a^{(2)} + b^{(2)} \\
h_{W,b}(x) &= a^{(3)} = f(z^{(3)})
\end{align}

其中,f(x)稱為激活函數(activation function).可以或者激活函數

sigmoid函數:


f(z) = \frac{1}{1+\exp(-z)}.
取值范圍[0,1].它的導數就是\textstyle f'(z) = f(z) (1-f(z)) 

 雙曲正切函數:


f(z) = \tanh(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}},  
取值范圍[-1,1]。它的導數是 \textstyle f'(z) = 1- (f(z))^2

(激活函數的導數在后向傳播中會經常用到)

后向傳播:

前向傳播中,需要用到的參數W和b,是我們要訓練的參數。我們可以利用批量梯度下降的方法求得(這部分需要熟悉機器學習中梯度下降部分)。給定一個包含m個樣例的數據集,我們可以定義整體代價函數為:

 
\begin{align}
J(W,b)
&= \left[ \frac{1}{m} \sum_{i=1}^m J(W,b;x^{(i)},y^{(i)}) \right]
                       + \frac{\lambda}{2} \sum_{l=1}^{n_l-1} \; \sum_{i=1}^{s_l} \; \sum_{j=1}^{s_{l+1}} \left( W^{(l)}_{ji} \right)^2
 \\
&= \left[ \frac{1}{m} \sum_{i=1}^m \left( \frac{1}{2} \left\| h_{W,b}(x^{(i)}) - y^{(i)} \right\|^2 \right) \right]
                       + \frac{\lambda}{2} \sum_{l=1}^{n_l-1} \; \sum_{i=1}^{s_l} \; \sum_{j=1}^{s_{l+1}} \left( W^{(l)}_{ji} \right)^2
\end{align}

其中,
\begin{align}
J(W,b; x,y) = \frac{1}{2} \left\| h_{W,b}(x) - y \right\|^2.
\end{align}
第一項中的 \textstyle J(W,b)是一個均方差項;第二項則是一個正規化項,其目的是減少權值的幅度,防止過度擬合。

於是就有了梯度下降法中每一次迭代對W和b的更新:


\begin{align}
W_{ij}^{(l)} &= W_{ij}^{(l)} - \alpha \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b) \\
b_{i}^{(l)} &= b_{i}^{(l)} - \alpha \frac{\partial}{\partial b_{i}^{(l)}} J(W,b)
\end{align}

其中α是學習速率。而關鍵步驟則是計算偏導數~這個,就是我們要講的后向傳播算法了。

整體代價函數的\textstyle J(W,b)的偏導數:


\begin{align}
\frac{\partial}{\partial W_{ij}^{(l)}} J(W,b) &=
\left[ \frac{1}{m} \sum_{i=1}^m \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b; x^{(i)}, y^{(i)}) \right] + \lambda W_{ij}^{(l)} \\
\frac{\partial}{\partial b_{i}^{(l)}} J(W,b) &=
\frac{1}{m}\sum_{i=1}^m \frac{\partial}{\partial b_{i}^{(l)}} J(W,b; x^{(i)}, y^{(i)})
\end{align}

現在對其分析可以知道::

於是,后向傳播算法就是在說明針對第 \textstyle l 層的每一個節點 \textstyle i,我們計算出其“殘差”\textstyle \delta^{(l)}_i

天才的科學家們提出了如下的計算過程:

  1. 進行前饋傳導計算,利用前向傳導公式,得到 \textstyle L_2, L_3, \ldots  直到輸出層 \textstyle L_{n_l} 的激活值。

  2.對於第 \textstyle n_l 層(輸出層)的每個輸出單元 \textstyle i,我們根據以下公式計算殘差:


\begin{align}
\delta^{(n_l)}_i
= \frac{\partial}{\partial z^{(n_l)}_i} \;\;
        \frac{1}{2} \left\|y - h_{W,b}(x)\right\|^2 = - (y_i - a^{(n_l)}_i) \cdot f'(z^{(n_l)}_i)
\end{align}
3.對  \textstyle l = n_l-1, n_l-2, n_l-3, \ldots, 2 的各個層,第  \textstyle l 層的第  \textstyle i 個節點的殘差計算方法如下:
 
\delta^{(l)}_i = \left( \sum_{j=1}^{s_{l+1}} W^{(l)}_{ji} \delta^{(l+1)}_j \right) f'(z^{(l)}_i)

  4.計算我們需要的偏導數,計算方法如下:

 
\begin{align}
\frac{\partial}{\partial W_{ij}^{(l)}} J(W,b; x, y) &= a^{(l)}_j \delta_i^{(l+1)} \\
\frac{\partial}{\partial b_{i}^{(l)}} J(W,b; x, y) &= \delta_i^{(l+1)}.
\end{align}

最后,我們將對梯度下降算法做個全面總結。在下面的偽代碼中,\textstyle \Delta W^{(l)} 是一個與矩陣 \textstyle W^{(l)} 維度相同的矩陣,\textstyle \Delta b^{(l)} 是一個與 \textstyle b^{(l)} 維度相同的向量。注意這里“\textstyle \Delta W^{(l)}”是一個矩陣,而不是“\textstyle \Delta與 \textstyle W^{(l)} 相乘”。下面,我們實現批量梯度下降法中的一次迭代:

 

  1. 對於所有 \textstyle l,令 \textstyle \Delta W^{(l)} := 0 , \textstyle \Delta b^{(l)} := 0 (設置為全零矩陣或全零向量)
  2. 對於 \textstyle i = 1 到 \textstyle m
    1. 使用反向傳播算法計算 \textstyle \nabla_{W^{(l)}} J(W,b;x,y) 和 \textstyle \nabla_{b^{(l)}} J(W,b;x,y)
    2. 計算 \textstyle \Delta W^{(l)} := \Delta W^{(l)} + \nabla_{W^{(l)}} J(W,b;x,y)
    3. 計算 \textstyle \Delta b^{(l)} := \Delta b^{(l)} + \nabla_{b^{(l)}} J(W,b;x,y)
  3. 更新權重參數:
     \begin{align}
W^{(l)} &= W^{(l)} - \alpha \left[ \left(\frac{1}{m} \Delta W^{(l)} \right) + \lambda W^{(l)}\right] \\
b^{(l)} &= b^{(l)} - \alpha \left[\frac{1}{m} \Delta b^{(l)}\right]
\end{align}

於乎~就這樣了。。。

下面就好辦了,對於自編碼,無非就是嘗試學習一個 \textstyle h_{W,b}(x) \approx x 的函數。而稀疏自編碼則是給隱藏神經元加入稀疏性限制。

吶:

\begin{align}
\hat\rho_j = \frac{1}{m} \sum_{i=1}^m \left[ a^{(2)}_j(x^{(i)}) \right]
\end{align}

表示隱藏神經元j的平均活躍度,而限制則是\begin{align}
\hat\rho_j = \rho,
\end{align}\textstyle \rho 是稀疏性參數,通常是一個接近於0的較小的值(比如 \textstyle \rho = 0.05 )。

於是有了懲罰因子:

\begin{align}
\sum_{j=1}^{s_2} {\rm KL}(\rho || \hat\rho_j),
\end{align}等於\begin{align}
\sum_{j=1}^{s_2} \rho \log \frac{\rho}{\hat\rho_j} + (1-\rho) \log \frac{1-\rho}{1-\hat\rho_j}.
\end{align}

這是相對熵的公式表示形式,意義在於當 \textstyle \hat\rho_j = \rho 時 \textstyle {\rm KL}(\rho || \hat\rho_j) = 0 。相對熵的三條結論:

1.對於兩個完全相同的函數,它們的相對熵等於0.

2.相對熵越大,兩個函數差異越大;反之,相對熵越小,差異越小。

3.對於概率分布或者概率密度分布,如果取值均大於零,相對熵可以度量兩個隨機分布的差異性。

(引用吳軍老師《數學之美》中的結論)。

所以,稀疏自編碼的總體代價函數就是:

\begin{align}
J_{\rm sparse}(W,b) = J(W,b) + \beta \sum_{j=1}^{s_2} {\rm KL}(\rho || \hat\rho_j),
\end{align}

 

而實際與后向傳播不同的地方就是:

\begin{align}
\delta^{(2)}_i = \left( \sum_{j=1}^{s_{2}} W^{(2)}_{ji} \delta^{(3)}_j \right) f'(z^{(2)}_i),
\end{align}

現在我們將其換成

\begin{align}
\delta^{(2)}_i =
  \left( \left( \sum_{j=1}^{s_{2}} W^{(2)}_{ji} \delta^{(3)}_j \right)
+ \beta \left( - \frac{\rho}{\hat\rho_i} + \frac{1-\rho}{1-\hat\rho_i} \right) \right) f'(z^{(2)}_i) .
\end{align}
嗯,就此算是結束了對稀疏自編碼的介紹。如果對一些概念不懂的話,請先了解Andrew Ng老師講解的《機器學習課程》。

 

參考資料:

1,斯坦福大學關於深度學習的網站(其實你只要看這個,稀疏自編碼你就明白了,我的基本算是copy這的)

http://deeplearning.stanford.edu/wiki/index.php/UFLDL%E6%95%99%E7%A8%8B

2,Andrew Ng老師講解的《機器學習課程》

http://openclassroom.stanford.edu/MainFolder/CoursePage.php?course=MachineLearning


免責聲明!

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



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