UFLDL:斯坦福大學深度學習課程總結

UFLDL 是斯坦福大學 CS294A課程 的教學 wiki。課程設置很科學,按部就班,每次課程都是在上次的基礎上增添一些東西,還有做業可讓你直觀地感覺所學內容。雖然沒有涉及 RNN (循環神經網絡),但做爲 CNN(卷積神經網絡)的基礎課程仍是很不錯的。 若是你對 監督學習邏輯迴歸梯度降低 等基礎概念並不熟悉,能夠先學習 以前的課程。 關於課程做業的 Python 代碼已經放到了 Github 上,點擊 課程代碼 就能去 Github 查看,代碼中的錯誤和改進歡迎你們指出。python

稀疏自編碼器

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

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

對於 稀疏自編碼器 詳細的學習方法,能夠參考 上一篇文章

向量化

向量化 是在代碼中竟可能地使用向量運算來代替原有 For 循環。因爲可以使用向量運算的庫一般對向量運算進行過優化,因此能夠大大加速代碼的執行速度。github

舉一段 反向傳播 算法中的例子,它的做用是對於每一組數據運行反向傳播並累計偏差。web

for i in range(m):
        d3 = (a3[i] - data[i]) * a3[i] * (1.0 - a3[i])
        d2 = (np.dot(d3,Theta2)[1:] + beta * sparsity_delta) * a2[i][1:] * (1.0 - a2[i][1:])
        delta1 = delta1 + np.dot(d2.reshape(-1,1),a1[[i]])
        delta2 = delta2 + np.dot(d3.reshape(-1,1),a2[[i]])
複製代碼

wiki 中有建議將這段代碼向量化,不過沒有給出具體的僞代碼。筆者原覺得最後只剩這部分沒改的話對效率也不會有十分大的影響,但事實是向量化以後,學習速度獲得了明顯的提高 Orz。( 這個章節對於後面的課程能夠說是必須的,由於最痛苦的事莫過於學習速度很慢,你的代碼又有問題須要從新學習 )算法

d3 = (a3 - data) * a3 * (1.0 - a3)
    d2 = (np.dot(d3, Theta2)[:,1:] + beta * sparsity_delta) * a2[:,1:] * (1.0 - a2[:,1:])
    delta1 = np.dot(d2.T, a1)
    delta2 = np.dot(d3.T, a2)
複製代碼

做業將 稀疏自編碼器 使用在 MNIST 數據集上,學習到了頗有意思的邊緣特徵。spring

預處理

課程中使用的預處理爲 ZCA Whitening,它的想法是去除輸入特徵的相關性。首先將特徵變換到無相關性的座標下,經過相關性係數拉伸,再變換到原先的座標系,使得特徵在原先座標系下再也不相關。( 對於二維特徵,整個過程以下圖 )網絡

事實證實這也是一種視網膜處理圖像的粗糙模型。具體而言,當你的眼睛感知圖像時,因爲一幅圖像中相鄰的部分在亮度上十分相關,大多數臨近的「像素」在眼中被感知爲相近的值。所以,若是人眼須要分別傳輸每一個像素值(經過視覺神經)到大腦中,會很是不划算。取而代之的是,視網膜進行一個與 ZCA 中類似的去相關操做 ( 這是由視網膜上的 ON-型 和 OFF-型 光感覺器細胞將光信號轉變爲神經信號完成的 )。由此獲得對輸入圖像的更低冗餘的表示,並將它傳輸到大腦。

Softmax

Softmax 這部分,咱們使用它來爲 稀疏自編碼器 自學習到的特徵來分類,它的特色是輸出向量是歸一化的( 和爲一 )。不過在以前 MNIST分類問題 中,咱們對每一個輸出層的神經元使用了邏輯迴歸( 每一個輸出都是二元分類 )。這就產生了一個問題,何時該使用 Softmax,何時使用邏輯迴歸呢?架構

Ng 告訴咱們問題的關鍵在於類別之間是否互斥。好比咱們的手寫字符識別問題,每一個數字類別是互斥的,你寫的數字不可能既是 1 又是 2。若是你的數據可能既屬於分類 A 又 屬於分類 B,這時候你就須要使用邏輯迴歸了。機器學習

增長深度

這時課程開始漸入正題,Ng 告訴咱們 稀疏自編碼器 可以本身學習到局部圖像的邊緣特徵,若是使用中間層的輸出做爲特徵再訓練一個稀疏自編碼器,這時的隱含層會學習如何去組合邊,從而構成輪廓、角等更高階的特徵。再加上稀疏自編碼器是無監督學習,因此咱們能夠反覆使用這種方式來構建更深的網絡,並在最後對整個網絡進行 微調 來高效地完成深層網絡的訓練。函數

上圖是做業中訓練的網絡,它的整個訓練步驟以下:

  1. 使用輸入圖像訓練稀疏自編碼器,得到隱含層的權值
  2. 將隱含層的輸出做爲特徵訓練第二層稀疏自編碼器
  3. 將第二層稀疏自編碼器隱含層的輸出做爲特徵,原數據的結果目標值,訓練 Softmax 分類器
  4. 微調 整個網絡的權值,完成網絡的訓練

大圖像處理

在先前的網絡中,隱含層的每一個神經元鏈接了全部輸入層的神經元。當訓練圖片增大時,所要學習的權值也不斷增多,以致於訓練速度慢到不可接受。受 視覺皮層的神經元只感覺局部接受信息 的啓發( 同時也是天然圖像有其固有特性,也就是說,圖像的一部分的統計特性與其餘部分是同樣的 ),咱們可讓隱含層只鏈接一部分的輸入單元來提取特徵。

好比輸入數據是 96x96 的圖片,咱們先隨機取這些圖片中 8x8 的局部圖像,用 稀疏自編碼器 學習 100 個特徵( 隱含層單元及輸入的權值,做業中學習到的特徵以下圖 )。

而後使用每一個隱含層神經元,對原圖的每一個部分作特徵提取( 這個過程至關於對原圖像作 卷積 的操做,以下圖 )。對於每張 96x96 的圖像,咱們將獲得 100 個 89x89 的卷積特徵圖像,用於後續處理。

不難發現,當我在原圖上經過卷積提取特徵的時候,只有某些位置的激活是最強烈的,因此咱們使用 池化 來減少冗餘。池化 就是在卷積輸出的每一個區域,使用均值或者最大值來代替原來的輸出,它帶來的一個好處是提取的特徵對圖像的平移不敏感。

通過上述 卷積池化 的處理,特徵數量已經大幅減小。最後咱們使用這些特徵來訓練 Softmax 分類器。

後續

經過 Coursera 課程,咱們學習了一些基本的 機器學習 算法,對整個領域有了一個大致的認識。UFLDL 課程在它的基礎上更近一步,介紹了深度學習中 CNN 的網絡架構和學習方法。有了這些基礎就不難理解由 CNN 架構演化而來的各類網絡( CNN 架構的演進 )。

對於以後要學習的深度學習知識點,一方面考慮學習一下 RNN( 循環神經網絡 ),以及基於這個架構演化的用來處理序列的網絡;另外一方面考慮學習不一樣的學習方法,好比 強化學習

相關文章
相關標籤/搜索