UFLDL:稀疏自編碼器

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

關於課程做業的 Python 代碼已經放到了 Github 上,點擊 課程代碼 就能去 Github 查看( 沒法訪問 Github 的話能夠點擊 Coding 查看 ),代碼中的錯誤和改進歡迎你們指出。git

稀疏自編碼器

你們知道如今深度學習在計算機視覺領域全面開花結果,獲得了許多以前沒法想象的好結果。而就在這以前你們還要花費很大的精力來人工設計特徵。下面要學習的 稀疏自編碼器 正是向自動學習特徵邁出的第一步。( 下圖爲做業中的神經網絡,左圖爲輸入圖像,右圖爲訓練後的輸出圖像 )github

稀疏自編碼器 的基本模型是一個三層的神經網絡,在學習時讓網絡輸出的目標值接近於輸入的圖像自己,從而學習圖像中的特徵。直接學習一個恆等函數的話沒有什麼意義,因此咱們要對隱含層作出一些限制,好比減少神經元的個數,網絡就會被迫壓縮數據並嘗試重建輸入圖像。當咱們加入懲罰讓神經元在大部分狀況下都不激活的時候,網絡可以學習到十分有趣的邊緣特徵。隱含層的神經元在觀察到輸入圖像中某個特定角度的邊緣特徵時纔會被激活( 這和神經科學發現的人類視覺皮層V1中的神經元的激活方式類似 )。

代價函數

根據機器學習的通常模式,首先給出 稀疏自編碼器 的代價函數:web

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)

比起熟悉的前兩項,代價函數新增了對於隱含層的懲罰,式中 s_2 表示隱含層的神經元個數。\hat\rho_j 表示 隱含層神經元 j 對於全部訓練數據的平均激活度,\hat\rho_j=\sum\limits_{i=1}^{m}\big[a_j^{(2)}(x^{(i)})\big]( 注意這裏的 a_j^{(2)}(x) 表示一個函數,值爲數據 x 對應的 a_j^{(2)} ),\rho\hat\rho_j 的目標值,目的就是以前說的讓神經元在大多數時間不激活。算法

按照 Ng 的說法,新的懲罰項有多種函數能夠選擇,而這裏用來衡量 \rho\hat\rho_j 差別的度量爲 KL \ divergence 又稱爲 相對熵,定義爲:網絡

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

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

梯度降低

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

因爲代價函數的增長項直接爲隱含層的函數,因此隱含層的偏差:學習

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

其中後一項可化爲:優化

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

所以 反向傳播算法 中的 \delta^{(2)}_j 計算變爲:

\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~,稀疏自編碼器的內容就是這些了,謝謝你們耐心閱讀。

P.S. 封面圖爲猴子視覺皮層 V1 區的方向柱

相關文章
相關標籤/搜索