Deep Learning 學習筆記(8):自編碼器( Autoencoders )


之前的筆記,算不上是 Deep Learning, 

只是為理解Deep Learning 而需要學習的基礎知識,

從下面開始,我會把我學習UFDL的筆記寫出來

#主要是給自己用的,所以其他人不一定看得懂#

UFDL鏈接 : http://deeplearning.stanford.edu/wiki/index.php/UFLDL_Tutorial


自編碼器( Autoencoders ):(概述)

自編碼器是只有一層隱藏節點,輸入和輸出具有相同節點數的神經網絡。

自編碼器的目的是求的函數 \textstyle h_{W,b}(x) \approx x. 也就是希望是的神經網絡的輸出與輸入誤差盡量少。

 

 

由於隱藏節點數目小於輸入節點,

這就表示神經網絡需要學習到輸入樣本的特征,以便進行壓縮表示。

如果輸入樣本是完全混亂的,這將會十分困難。

但是當輸入樣本具有一定相似性(比如都是汽車),神經網絡將會學習到其中的共同特征(比如車窗,車輪)

這種學習是半監督的(樣本無標簽,但是經過了篩選)。


 

自編碼器(autoencoder):

File:Autoencoder636.png

 

如圖是一個自編碼器(autoencoder),不算偏置節點的話,輸入輸出節點相同。

節點函數是sigmoid,用之前講到的反向傳播算法對其進行訓練

訓練的結果,出來后,我們對W1進行可視化表示,便是數據的壓縮特征。

(注意,由於輸出節點是sigmoid,輸入數據的范圍必須在 [ 0, 1] 內)

(常用激活函數有:sigmoid、tanh、max(x,0))

 


 

稀疏性:(直接粘貼自UFDL)

      如果隱藏節點比可視節點(輸入、輸出)少的話,由於被迫的降維,自編碼器會自動習得訓練樣本的特征(變化最大,信息量最多的維度)。但是如果隱藏節點數目過多,甚至比可視節點數目還多的時候,自編碼器不僅會喪失這種能力,更可能會習得一種“恆等函數”——直接把輸入復制過去作為輸出。這時候,我們需要對隱藏節點進行稀疏性限制。

 

  所謂稀疏性,就是對一對輸入圖像,隱藏節點中被激活的節點數(輸出接近1)遠遠小於被抑制的節點數目(輸出接近0)。那么使得神經元大部分的時間都是被抑制的限制則被稱作稀疏性限制。

 

注意到 \textstyle a^{(2)}_j 表示隱藏神經元 \textstyle j 的激活度,但是這一表示方法中並未明確指出哪一個輸入 \textstyle x 帶來了這一激活度。所以我們將使用 \textstyle a^{(2)}_j(x) 來表示在給定輸入為 \textstyle x 情況下,自編碼神經網絡隱藏神經元 \textstyle j 的激活度。 進一步,讓

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

表示隱藏神經元 \textstyle j 的平均活躍度(在訓練集上取平均)。我們可以近似的加入一條限制

\begin{align}
\hat\rho_j = \rho,
\end{align}

其中, \textstyle \rho 是稀疏性參數,通常是一個接近於0的較小的值(比如 \textstyle \rho = 0.05 )。換句話說,我們想要讓隱藏神經元 \textstyle j 的平均活躍度接近0.05。為了滿足這一條件,隱藏神經元的活躍度必須接近於0。

為了實現這一限制,我們將會在我們的優化目標函數中加入一個額外的懲罰因子,而這一懲罰因子將懲罰那些 \textstyle \hat\rho_j 和 \textstyle \rho 有顯著不同的情況從而使得隱藏神經元的平均活躍度保持在較小范圍內。懲罰因子的具體形式有很多種合理的選擇,我們將會選擇以下這一種:

\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 s_2 是隱藏層中隱藏神經元的數量,而索引 \textstyle j 依次代表隱藏層中的每一個神經元。如果你對相對熵(KL divergence)比較熟悉,這一懲罰因子實際上是基於它的。於是懲罰因子也可以被表示為

\begin{align}
\sum_{j=1}^{s_2} {\rm KL}(\rho || \hat\rho_j),
\end{align}

其中 \textstyle {\rm KL}(\rho || \hat\rho_j)
 = \rho \log \frac{\rho}{\hat\rho_j} + (1-\rho) \log \frac{1-\rho}{1-\hat\rho_j} 是一個以 \textstyle \rho 為均值和一個以 \textstyle \hat\rho_j 為均值的兩個伯努利隨機變量之間的相對熵。相對熵是一種標准的用來測量兩個分布之間差異的方法。(如果你沒有見過相對熵,不用擔心,所有你需要知道的內容都會被包含在這份筆記之中。)


這一懲罰因子有如下性質,當 \textstyle \hat\rho_j = \rho 時 \textstyle {\rm KL}(\rho || \hat\rho_j) = 0 ,並且隨着 \textstyle \hat\rho_j 與 \textstyle \rho 之間的差異增大而單調遞增。舉例來說,在下圖中,我們設定 \textstyle \rho = 0.2 並且畫出了相對熵值 \textstyle {\rm KL}(\rho || \hat\rho_j) 隨着 \textstyle \hat\rho_j 變化的變化。

KLPenaltyExample.png


我們可以看出,相對熵在 \textstyle \hat\rho_j = \rho 時達到它的最小值0,而當 \textstyle \hat\rho_j 靠近0或者1的時候,相對熵則變得非常大(其實是趨向於\textstyle \infty)。所以,最小化這一懲罰因子具有使得 \textstyle \hat\rho_j 靠近 \textstyle \rho 的效果。 現在,我們的總體代價函數可以表示為

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

其中 \textstyle J(W,b) 如之前所定義,而 \textstyle \beta 控制稀疏性懲罰因子的權重。 \textstyle \hat\rho_j 項則也(間接地)取決於 \textstyle W,b ,因為它是隱藏神經元 \textstyle j 的平均激活度,而隱藏層神經元的激活度取決於 \textstyle W,b 。


為了對相對熵進行導數計算,我們可以使用一個易於實現的技巧,這只需要在你的程序中稍作改動即可。具體來說,前面在后向傳播算法中計算第二層( \textstyle l=2 )更新的時候我們已經計算了

\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}

就可以了。

 

 

 


免責聲明!

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



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