UFLDL 是斯坦福大學 CS294A課程 的教學 wiki。課程設置很科學,按部就班,每次課程都是在上次的基礎上增添一些東西,還有做業可讓你直觀地感覺所學內容。雖然沒有涉及 RNN (循環神經網絡),但做爲 CNN(卷積神經網絡)的基礎課程仍是很不錯的。 若是你對 監督學習、邏輯迴歸、梯度降低 等基礎概念並不熟悉,能夠先學習 以前的課程。 關於課程做業的 Python 代碼已經放到了 Github 上,點擊 課程代碼 就能去 Github 查看,代碼中的錯誤和改進歡迎你們指出。python
你們知道如今深度學習在計算機視覺領域全面開花結果,獲得了許多以前沒法想象的好結果。而就在這以前你們還要花費很大的精力來人工設計特徵。這部分學習的 稀疏自編碼器 正是向自動學習特徵邁出的第一步,也是這門課程的基礎。( 下圖爲做業中的神經網絡,左圖爲輸入圖像,右圖爲訓練後的輸出圖像 )git
向量化 是在代碼中竟可能地使用向量運算來代替原有 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,它的想法是去除輸入特徵的相關性。首先將特徵變換到無相關性的座標下,經過相關性係數拉伸,再變換到原先的座標系,使得特徵在原先座標系下再也不相關。( 對於二維特徵,整個過程以下圖 )網絡
在 Softmax 這部分,咱們使用它來爲 稀疏自編碼器 自學習到的特徵來分類,它的特色是輸出向量是歸一化的( 和爲一 )。不過在以前 MNIST分類問題 中,咱們對每一個輸出層的神經元使用了邏輯迴歸( 每一個輸出都是二元分類 )。這就產生了一個問題,何時該使用 Softmax,何時使用邏輯迴歸呢?架構
Ng 告訴咱們問題的關鍵在於類別之間是否互斥。好比咱們的手寫字符識別問題,每一個數字類別是互斥的,你寫的數字不可能既是 1 又是 2。若是你的數據可能既屬於分類 A 又 屬於分類 B,這時候你就須要使用邏輯迴歸了。機器學習
這時課程開始漸入正題,Ng 告訴咱們 稀疏自編碼器 可以本身學習到局部圖像的邊緣特徵,若是使用中間層的輸出做爲特徵再訓練一個稀疏自編碼器,這時的隱含層會學習如何去組合邊,從而構成輪廓、角等更高階的特徵。再加上稀疏自編碼器是無監督學習,因此咱們能夠反覆使用這種方式來構建更深的網絡,並在最後對整個網絡進行 微調 來高效地完成深層網絡的訓練。函數
- 使用輸入圖像訓練稀疏自編碼器,得到隱含層的權值
- 將隱含層的輸出做爲特徵訓練第二層稀疏自編碼器
- 將第二層稀疏自編碼器隱含層的輸出做爲特徵,原數據的結果目標值,訓練 Softmax 分類器
- 微調 整個網絡的權值,完成網絡的訓練
在先前的網絡中,隱含層的每一個神經元鏈接了全部輸入層的神經元。當訓練圖片增大時,所要學習的權值也不斷增多,以致於訓練速度慢到不可接受。受 視覺皮層的神經元只感覺局部接受信息 的啓發( 同時也是天然圖像有其固有特性,也就是說,圖像的一部分的統計特性與其餘部分是同樣的 ),咱們可讓隱含層只鏈接一部分的輸入單元來提取特徵。
好比輸入數據是 96x96 的圖片,咱們先隨機取這些圖片中 8x8 的局部圖像,用 稀疏自編碼器 學習 100 個特徵( 隱含層單元及輸入的權值,做業中學習到的特徵以下圖 )。
不難發現,當我在原圖上經過卷積提取特徵的時候,只有某些位置的激活是最強烈的,因此咱們使用 池化 來減少冗餘。池化 就是在卷積輸出的每一個區域,使用均值或者最大值來代替原來的輸出,它帶來的一個好處是提取的特徵對圖像的平移不敏感。
經過 Coursera 課程,咱們學習了一些基本的 機器學習 算法,對整個領域有了一個大致的認識。UFLDL 課程在它的基礎上更近一步,介紹了深度學習中 CNN 的網絡架構和學習方法。有了這些基礎就不難理解由 CNN 架構演化而來的各類網絡( CNN 架構的演進 )。
對於以後要學習的深度學習知識點,一方面考慮學習一下 RNN( 循環神經網絡 ),以及基於這個架構演化的用來處理序列的網絡;另外一方面考慮學習不一樣的學習方法,好比 強化學習。