1. 程式人生 > >UFLDL:稀疏自編碼器

UFLDL:稀疏自編碼器

吳恩達的 CS294A 是一門很好的深度學習入門課程,打算接下來的學習以這個課程的內容為主。UFLDL Tutorial 是 CS294A 課程的 wiki 頁,包含了課程講義和作業。如果你對 監督學習邏輯迴歸梯度下降 等基礎概念並不熟悉,可以先學習 之前的課程

關於課程作業的 Python 程式碼已經放到了 Github 上,點選 課程程式碼 就能去 Github 檢視( 無法訪問 Github 的話可以點選 Coding 檢視 ),程式碼中的錯誤和改進歡迎大家指出。

稀疏自編碼器

大家知道現在深度學習在計算機視覺領域全面開花結果,得到了許多之前無法想象的好結果。而就在這之前大家還要花費很大的精力來人工設計特徵。下面要學習的 稀疏自編碼器

正是向自動學習特徵邁出的第一步。( 下圖為作業中的神經網路,左圖為輸入影象,右圖為訓練後的輸出影象 )
在這裡插入圖片描述
稀疏自編碼器 的基本模型是一個三層的神經網路,在學習時讓網路輸出的目標值接近於輸入的影象本身,從而學習影象中的特徵。直接學習一個恆等函式的話沒有什麼意義,所以我們要對隱含層做出一些限制,比如減小神經元的個數,網路就會被迫壓縮資料並嘗試重建輸入影象。當我們加入懲罰讓神經元在大部分情況下都不啟用的時候,網路能夠學習到十分有趣的邊緣特徵。隱含層的神經元在觀察到輸入影象中某個特定角度的邊緣特徵時才會被啟用( 這和神經科學發現的人類視覺皮層V1中的神經元的啟用方式相似 )。

代價函式

根據機器學習的一般模式,首先給出 稀疏自編碼器

的代價函式:
Jsparse(W,b)=1mi=1m(12hW,b(x(i))y(i)2)+λ2l=1L1i=1slj=1sl+1(Θji(l))2+βj=1s2KL(ρρ^j) J_{sparse}(W,b)= \frac{1}{m}\sum\limits_{i=1}^{m}\big(\frac{1}{2}||h_{W,b}(x^{(i)})-y^{(i)}||^2\big) + \frac{\lambda}{2}\sum\limits_{l=1}^{L-1}\sum\limits_{i=1}^{s_l}\sum\limits_{j=1}^{s_{l+1}}\big(\Theta_{ji}^{(l)}\big)^2 \\+ \beta\sum\limits_{j=1}^{s_2}KL(\rho||\hat\rho_j)

比起熟悉的前兩項,代價函式新增了對於隱含層的懲罰,式中 s2s_2 表示隱含層的神經元個數。ρ^j\hat\rho_j 表示 隱含層神經元 jj 對於所有訓練資料的平均啟用度,ρ^j=i=1m[aj(2)(x(i))]\hat\rho_j=\sum\limits_{i=1}^{m}\big[a_j^{(2)}(x^{(i)})\big]( 注意這裡的 aj(2)(x)a_j^{(2)}(x) 表示一個函式,值為資料 xx 對應的 aj(2)a_j^{(2)} ),ρ\rhoρ^j\hat\rho_j 的目標值,目的就是之前說的讓神經元在大多數時間不啟用。

按照 Ng 的說法,新的懲罰項有多種函式可以選擇,而這裡用來衡量 ρ\rhoρ^j\hat\rho_j 差異的度量為 KLdivergenceKL \ divergence 又稱為 相對熵,定義為:

KL(PQ)=iP(i)log(Q(i)P(i)) KL(P||Q) = \sum\limits_{i}P(i)log\Big(\frac{Q(i)}{P(i)}\Big)

它所度量的是兩個概率分佈間的距離( 我也不是太懂,有機會再做深入的研究 )。
有了代價函式,接下來看下原先的反向傳播演算法有什麼變化~

梯度下降

在之前 反向傳播演算法 課程中已經說過它該演算法的兩個重點,一個是它的目的:更快速地計算代價函式的梯度,另一個是它的計算依賴於多元函式求導的鏈式法則。

由於代價函式的增加項直接為隱含層的函式,所以隱含層的誤差:
δj(2)=Jsparsezj(2)=Jzj(2)+KLzj(2) \delta^{(2)}_j = \frac{\partial J_{sparse}}{\partial z^{(2)}_j} = \frac{\partial J}{\partial z^{(2)}_j} + \frac{\partial KL}{\partial z^{(2)}_j}
其中後一項可化為:
KLzj(2)=k=1s2KLak(2)ak(2)zj(2)=β(ρρ^j+1ρ1ρ^j)g(zj(2)) \frac{\partial KL}{\partial z^{(2)}_j}= \sum\limits_{k=1}^{s_{2}} \frac{\partial KL}{\partial a_k^{(2)}} \frac{\partial a_k^{(2)}}{\partial z^{(2)}_j} = \beta\Big(-\frac{\rho}{\hat\rho_j}+\frac{1-\rho}{1-\hat\rho_j}\Big)g'(z^{(2)}_j)
因此 反向傳播演算法 中的 δj(2)\delta^{(2)}_j 計算變為:
δj(2)=(k=1s3Θkj(2)δk(3)+(ρρ^j+1ρ1ρ^j))aj(2)(1aj(2)) \delta^{(2)}_j = \Big(\sum\limits_{k=1}^{s_3} \Theta_{kj}^{(2)} \delta^{(3)}_k +\Big(-\frac{\rho}{\hat\rho_j}+\frac{1-\rho}{1-\hat\rho_j}\Big)\Big)a_j^{(2)} (1-a_j^{(2)})
其餘的計算都和原先的演算法相同。
搞定代價函式和梯度計算,剩下的就是呼叫帶優化的梯度下降演算法了~

視覺化

最後稍微提下課程作業,它讓我們在 10 張風景圖片中隨機取 10000 個 8x8 的區域性圖,然後讓稀疏自編碼器學習其中的特徵。神經網路的隱含層神經元個數為 25,輸入輸出維度都為 64。下圖為每個隱含層神經元對應的輸入層權重,大致可看成該神經元檢測到這種特徵時會被啟用。( tip: 作業中的學習演算法和梯度檢查函式在之前的課程中都寫過,因此可以直接拿來用。 )
在這裡插入圖片描述
So~,稀疏自編碼器的內容就是這些了,謝謝大家耐心閱讀。