我們知道其實 “深度學習” 是深層神經(jīng)網(wǎng)絡的重新包裝,得益于GPU和大規(guī)模數(shù)據(jù)集的出現(xiàn)以及近幾年算法的創(chuàng)新,神經(jīng)網(wǎng)絡重新煥發(fā)了生機又碌。logistic regression 分類器可以看成一個單隱層的神經(jīng)網(wǎng)絡迹卢,若干個logistic regression單元有規(guī)律的組合就能形成可以處理復雜任務的深層神經(jīng)網(wǎng)絡,因此探討logistic regression 的運行機制對于我們理解深層神經(jīng)網(wǎng)絡有很大的好處重罪。
目前神經(jīng)網(wǎng)絡的計算主要分為2個方向:遍歷樣本進行前向傳播產(chǎn)生預測值;計算成本進行反向傳播更新參數(shù)值哀九。
(一)前向傳播(forward propagation)
為了方便我們以后討論問題剿配,我們定義了如上符號。前向傳播主要分為線性運算(z=w.T*x+b)和激活運算(a=g(z)),g指的是激活函數(shù)阅束。我們常用的激活函數(shù)有: sigmoid,? tanh, softmax,relu呼胚。在深層神經(jīng)網(wǎng)絡中我們一般采用 relu+softmax或relu+tanh,關(guān)于它們的優(yōu)缺點和應用場景可以參考:常用激活函數(shù)比較? 。在logistic regression 中我們采用 sigmoid作為激活函數(shù)息裸。
(二)成本函數(shù)(cost function)
在對網(wǎng)絡進行反向傳播之前蝇更,我們首先需要對前向傳播計算的輸出值和樣本的真實值之間的誤差計算損失。loss function是在單個訓練樣本上定義的呼盆,它衡量了神經(jīng)網(wǎng)絡在單個訓練樣本上的表現(xiàn)年扩;cost function是在全體樣本上定義的, 它衡量的是神經(jīng)網(wǎng)絡在全體訓練樣本上的表現(xiàn)访圃。
(三)反向傳播(back propagation)
反向傳播是神經(jīng)網(wǎng)絡進行訓練和優(yōu)化的重要環(huán)節(jié)厨幻,在訓練集上利用優(yōu)化算法最小化成本函數(shù)J(w,b)來得出最優(yōu)的參數(shù)w.b。常見的優(yōu)化算法有: GD, SGD, RMSprop, ADAM, Adadelta等等。優(yōu)化算法的比較及代碼實現(xiàn)??
接著我們就可以進行n次梯度循環(huán)况脆,一步步的達到最優(yōu)值平绩。下面我們將以吳恩達教授的貓臉識別為例詳解logistic regression 的代碼實現(xiàn)。
(四)代碼實現(xiàn)
1-1? sigmoid??
? ? ?sigmoid 用于神經(jīng)網(wǎng)絡的輸出層漠另,它可以將一個實數(shù)映射到(0,1)的區(qū)間捏雌,可以用來做二分類
?1-2? 代碼實現(xiàn):
2-1? 參數(shù)初始化
當你訓練神經(jīng)網(wǎng)絡的時候,隨機初始化權(quán)重(W)非常重要笆搓。對于有多個隱藏單元的神經(jīng)網(wǎng)絡性湿,如果將權(quán)重參數(shù)全部初始化為0,再進行梯度下降是完全無效的满败,因為所有的隱藏單元都是對稱的肤频,不管你運行多長時間的梯度下降,它們都是在計算完全一樣的函數(shù)算墨,因此在多層神經(jīng)網(wǎng)絡中宵荒,不能將權(quán)重初始化為0,由于logistic regression只有一個隱藏單元净嘀,可以將權(quán)重初始化為0报咳。對于偏置b 我們可以統(tǒng)一初始化為0。
2-2? 代碼實現(xiàn)
3-1? 梯度循環(huán)
梯度循環(huán)分為2部分:首先進行前向傳播計算成本值挖藏;進行反向傳播計算梯度值更新參數(shù)暑刃。
3-2? 代碼實現(xiàn)
4-1? 訓練優(yōu)化
我們可以自己嘗試設置學習率,梯度循環(huán)次數(shù)膜眠。進行多次訓練求得最優(yōu)的w岩臣,b 并且緩存w,b 作為預測模型的最終參數(shù),預測其它的照片宵膨。
4-2? 代碼實現(xiàn)
5-1? 產(chǎn)生預測模型
經(jīng)過多次的訓練優(yōu)化架谎,我們就能得到使 cost function 最小的w,b(最優(yōu)解),下面我們就可以用從訓練集上學到的最優(yōu)的w,b 對測試集的照片進行預測辟躏。
5-2? 代碼實現(xiàn)
6-1? logistic regression 函數(shù)
我們已經(jīng)實現(xiàn)了logistic regression 所需的所有子函數(shù)谷扣,現(xiàn)在我們就可以把它們組合起來形成完整的logistic regression 網(wǎng)絡。
6-2? 代碼實現(xiàn)
7-1? All to all
我們可以隨意設置學習率和梯度下降循環(huán)次數(shù)鸿脓,觀察神經(jīng)網(wǎng)絡的運行結(jié)果抑钟,為了方便查看可以使用matplotlib 庫繪制cost 曲線。我設置了3個不同的學習率分別為0.018,0.012,0.006野哭,循環(huán)次數(shù)為2000次,最后用三張照片測試算法的性能幻件。
7-2? 代碼及性能展示
8 總結(jié)
通過以上例程拨黔,我們明白了logistic regression 運行機制。我們觀察到算法在測試集上的識別正確率約為68%绰沥,在訓練集上識別正確率約為100%篱蝇,即存在較大的偏差和方差贺待。為了提高測試集識別正確率我們可以增加訓練集的圖片數(shù)目或者采用更深層的神經(jīng)網(wǎng)絡。我們以后會用4層的神經(jīng)網(wǎng)絡來識別貓臉零截,你會發(fā)現(xiàn)測試集的識別正確率能達到82%麸塞。完整的程序及訓練數(shù)據(jù)集可以訪問我的?github
9? 引用
吳恩達教授在網(wǎng)易上的公開課(deep learning):http://study.163.com/my#/smarts
李飛飛教授(cs231n):http://study.163.com/course/courseMain.htm?courseId=1003223001
進擊的加菲貓:https://www.aiboy.pub/2017/09/10/A_Brief_Of_Optimization_Algorithms/#more
不會停的蝸牛:http://www.reibang.com/p/22d9720dbf1a