MLP 之手写数字识别
0. 前言
前面我們利用 LR 模型實現了手寫數字識別,但是效果并不好(不到 93% 的正確率)。 LR 模型從本質上來說還只是一個線性的分類器,只不過在線性變化之后加入了非線性單調遞增 sigmoid 函數進行一一映射。實際上,這里的非線性變換對于我們分類來說是幾乎沒有什么作用的(在分類上,它等價于線性變換之后挑選出輸出值最大的節點作為我們的預測結果),于是我們考慮用更復雜一點的帶有一個隱層的 MLP (Multi-Layer Perceptron) 模型。
1. 模型
MLP 模型可以看作是在輸入空間經過非線性變換(第一層與第二層)之后的 LR(第二層與第三層), MLP 的優勢在于,一個經過訓練的 MLP 的可以由第一層的輸入經過非線性變換映射到另外一個線性可分的由隱層節點組成的空間里去。由于activation function 可以取很多種類型 (excluding polynomials), a two-layer net work with linear outputs can uniformly approximate any continuous function on a compact input domain to?arbitrary accuracy?provided the network has a sufficiently large number of hidden units, ?隱層這種優良的表現能力,也是 deeplearning 的基礎。
下面我們來看看具有 3 個隱層, 1000 個隱層節點的神經網絡對 cos 函數的回歸效果:
理解了前面兩篇博客,對 bp 算法有了直觀理解,明白了反向求導過程,再來看這個程序就變得非常簡單了。在這個程序里面,我們的 MLP 模型可以表示如下:
用公式可以表示成:
這個模型包含的參數包括:
如果利用 SGD 來學習這個模型,我們需要知道 Loss Function (程序中加入了 L1 和 L2 范式)對于每個參數的偏導值。?這里,我們可以采用前面已經介紹過的 BP 算法?(BP 算法其實就是計算 ANN 中各個參數導數的一種快速算法,就像 FDCT 對于 DCT 的快速計算。在 Theano 庫里面,由于函數是自動求導的,所以在下面的代碼中我們幾乎看不到 BP 的具體實現過程,我猜想 BP 過程應該是 Theano 自動完成的)。
2. 構建
只帶有一個隱層的 MLP 的 hidden layer 到 output layer 在結構上與 LR 沒有多大的差別。我們可以在之前的 LR 基礎上添加從 input layer 到 hidden layer 的結構, 就構成了這一小節中的 MLP。于是乎,我們構建了一個隱層節點,隱層的非線性函數設定為 tanh 函數(由 sigmoid 函數往下平移 0.5 再將值域擴大 2 倍)。對于隱層節點為 tanh 函數的神經網絡來說, MLP 的權重空間具有很強的對稱性,假設某一個解是 MLP 的最優解,那么:
這樣,只有一個隱層的 MLP ,如果隱層節點采用 tanh 函數,那么權重空間就有 M!2^M 個等價的解。
全零向量正好處在解的對稱中心,梯度為 0, 不能作為權重的初始值,所以需要對權重進行隨機初始化,隨機范圍與 activation function 相關,有論文推導這一范圍,暫時來不及細看。
接著我們把剛剛建立的隱層結構的輸出作為 LR 的輸入 (在 theano 里面實現十分簡潔, graph structures 的方式真是太方便啦),這樣,一個 MLP 的神經網絡就搭好了。
3. 值得深入的地方
這是源代碼下載地址,具體細節就不介紹了。用這種方法進行手寫數字識別,在 5w 張圖片上進行 828 次迭代訓練,正確率可以達到 98.35%, 相比 LR 模型,的確是一個很大的提升!
?
?
?
參考資料:
[1]:?deeplearning tutorial?
[2]: PRML, Bishop, chapter 05
?
from:http://www.cnblogs.com/daniel-D/總結
以上是生活随笔為你收集整理的MLP 之手写数字识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 支持向量机SVM 简要推导过程
- 下一篇: 卷积神经网络CNN 手写数字识别