原文http://blog.csdn.net/abcjennifer/article/details/7758797
本欄目(Machine learning)包括單參數(shù)的線性回歸猾编、多參數(shù)的線性回歸、Octave Tutorial彭雾、Logistic Regression蝙叛、Regularization儡陨、神經(jīng)網(wǎng)絡(luò)迷扇、機器學(xué)習(xí)系統(tǒng)設(shè)計鸥昏、SVM(Support Vector Machines 支持向量機)瑟蜈、聚類、降維踪栋、異常檢測焙格、大規(guī)模機器學(xué)習(xí)等章節(jié)夷都。所有內(nèi)容均來自Standford公開課machine learning中Andrew老師的講解。(https://class.coursera.org/ml/class/index)
第五講——Neural Networks 神經(jīng)網(wǎng)絡(luò)的表示
===============================
(一)囤官、Cost function
(二)、Backpropagation algorithm
(三)党饮、Backpropagation intuition
(四)、Implementation note: Unrolling parameters
(五)刑顺、Gradient checking
(六)、Random initialization
(七)蹲堂、Putting it together
===============================
(一)、Cost function
假設(shè)神經(jīng)網(wǎng)絡(luò)的訓(xùn)練樣本有m個柒竞,每個包含一組輸入x和一組輸出信號y政供,L表示神經(jīng)網(wǎng)絡(luò)層數(shù),Sl表示每層的neuron個數(shù)(SL表示輸出層神經(jīng)元個數(shù))朽基。
將神經(jīng)網(wǎng)絡(luò)的分類定義為兩種情況:二類分類和多類分類布隔,
卐二類分類:SL=1, y=0 or 1表示哪一類;
卐K類分類:SL=K, yi= 1表示分到第i類稼虎;(K>2)
我們在前幾章中已經(jīng)知道衅檀,Logistic hypothesis的Cost Function如下定義:
其中,前半部分表示hypothesis與真實值之間的距離霎俩,后半部分為對參數(shù)進行regularization的bias項术吝,神經(jīng)網(wǎng)絡(luò)的cost function同理:
hypothesis與真實值之間的距離為 每個樣本-每個類輸出 的加和,對參數(shù)進行regularization的bias項處理所有參數(shù)的平方和
===============================
(二)茸苇、Backpropagation algorithm
前面我們已經(jīng)講了cost function的形式排苍,下面我們需要的就是最小化J(Θ)
想要根據(jù)gradient descent的方法進行參數(shù)optimization,首先需要得到cost function和一些參數(shù)的表示学密。根據(jù)forward propagation,我們首先進行training dataset 在神經(jīng)網(wǎng)絡(luò)上的各層輸出值:
我們定義神經(jīng)網(wǎng)絡(luò)的總誤差為:
希望通過調(diào)整權(quán)重參數(shù)W(也就是theta)來最小化E淘衙。由于所以每一層按如下方式進行更新:
根據(jù)backpropagation算法進行梯度的計算,這里引入了error變量δ腻暮,該殘差表明了該節(jié)點對最終輸出值的殘差產(chǎn)生了多少影響彤守。對于最后一層,我們可以直接算出網(wǎng)絡(luò)產(chǎn)生的輸出與實際值之間的差距哭靖,我們將這個差距定義為具垫。對于隱藏單元我們?nèi)绾翁幚砟兀课覀儗⑼ㄟ^計算各層節(jié)點殘差的加權(quán)平均值計算hidden layer的殘差试幽。讀者可以自己驗證下筝蚕,其實就是E對b求導(dǎo)的結(jié)果。
對于前面的每一層起宽,都有
由于我們的真實目的是計算,且
所以我們可以得到神經(jīng)網(wǎng)絡(luò)中權(quán)重的update方程:
不斷迭代直到落入local optima,就是backpropagation的算法過程洲胖。
============================================================
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Example of logistical cost:
下面我們針對logistical cost給出計算的例子:而對于每一層,其誤差可以定義為:
分別代入即得
由此得來\theta_{k}的update方程:
如果將誤差對激勵函數(shù)(activation function)的導(dǎo)數(shù)記做δ坯沪,則有:
對于前面一層 ,更新同理绿映,只是上一層\Theta梯度的第一個分量E對a_k求導(dǎo)有所變化,
但是始終是不變的腐晾。
下圖就是上面推導(dǎo)得出的結(jié)果:
由上圖我們得到了error變量δ的計算叉弦,下面我們來看backpropagation算法的偽代碼:
ps:最后一步之所以寫+=而非直接賦值是把Δ看做了一個矩陣藻糖,每次在相應(yīng)位置上做修改。
從后向前此計算每層依的δ榄棵,用Δ表示全局誤差,每一層都對應(yīng)一個Δ(l)疹鳄。再引入D作為cost function對參數(shù)的求導(dǎo)結(jié)果芦岂。下圖左邊j是否等于0影響的是是否有最后的bias regularization項。左邊是定義腺怯,右邊可證明(比較繁瑣)川无。
===============================
(三)、Backpropagation intuition
上面講了backpropagation算法的步驟以及一些公式晾虑,在這一小節(jié)中我們講一下最簡單的back-propagation模型是怎樣learning的仅叫。
首先根據(jù)forward propagation方法從前往后計算z(j),a(j);
然后將原cost function 進行簡化帜篇,去掉下圖中后面那項regularization項笙隙,
那么對于輸入的第i個樣本(xi,yi)坎缭,有
Cost(i)=y(i)log(hθ(x(i)))+(1-y(i))log(1-?hθ(x(i)))
由上文可知签钩,
其中J就是cost。那么將其進行簡化哄尔,暫時不考慮g'(zk) = ak(1-ak)的部分,就有:
經(jīng)過求導(dǎo)計算可得富拗,對于上圖有
換句話說, 對于每一層來說啃沪,δ分量都等于后面一層所有的δ加權(quán)和窄锅,其中權(quán)值就是參數(shù)Θ。
===============================
(四)入偷、Implementation note: Unrolling parameters
這一節(jié)講述matlab中如何實現(xiàn)unrolling parameter。
前幾章中已經(jīng)講過在matlab中利用梯度下降方法進行更新的根本殿雪,兩個方程:
function [jVal, gradient] = costFunction(theta)
optTheta = fminunc(@costFunction, initialTheta, options)
與linear regression和logistic regression不同锋爪,在神經(jīng)網(wǎng)絡(luò)中,參數(shù)非常多亏镰,每一層j有一個參數(shù)向量Θj和Derivative向量Dj。那么我們首先將各層向量連起來拆挥,組成大vectorΘ和D某抓,傳入function,再在計算中進行下圖中的reshape汉矿,分別取出進行計算。
計算時洲拇,方法如下:
===============================
(五)奈揍、Gradient checking
神經(jīng)網(wǎng)絡(luò)中計算起來數(shù)字千變?nèi)f化難以掌握赋续,那我們怎么知道它里頭工作的對不對呢?不怕蛾绎,我們有法寶鸦列,就是gradient checking,通過check梯度判斷我們的code有沒有問題薯嗤,ok骆姐?怎么做呢,看下邊:
對于下面這個【Θ-J(Θ)】圖玻褪,取Θ點左右各一點(Θ+ε),(Θ-ε)黄虱,則有點Θ的導(dǎo)數(shù)(梯度)近似等于(J(Θ+ε)-J(Θ-ε))/(2ε)庸诱。
對于每個參數(shù)的求導(dǎo)公式如下圖所示:
由于在back-propagation算法中我們一直能得到J(Θ)的導(dǎo)數(shù)D(derivative)桥爽,那么就可以將這個近似值與D進行比較,如果這兩個結(jié)果相近就說明code正確盗扒,否則錯誤,如下圖所示:
Summary: 有以下幾點需要注意
-在back propagation中計算出J(θ)對θ的導(dǎo)數(shù)D侣灶,并組成vector(Dvec)
-用numerical gradient check方法計算大概的梯度gradApprox=(J(Θ+ε)-J(Θ-ε))/(2ε)
-看是否得到相同(or相近)的結(jié)果
-(這一點非常重要)停止check缕碎,只用back propagation 來進行神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)(否則會非常慢,相當(dāng)慢)
===============================
(六)凡怎、Random Initialization
對于參數(shù)θ的initialization問題,我們之前采用全部賦0的方法统倒,比如:
this means all of your hidden units are computing all of the exact same function of the input. So this is a highly redundant representation. 因為一層內(nèi)的所有計算都可以歸結(jié)為1個房匆,而這使得一些interesting的東西被ignore了。
所以我們應(yīng)該打破這種symmetry墓猎,randomly選取每一個parameter赚楚,在[-ε,ε]范圍內(nèi):
===============================
(七)骗卜、Putting it together
1. 選擇神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
我們有很多choices of network :
那么怎么選擇呢?
No. of input units: Dimension of features
No. output units: Number of classes
Reasonable default: 1 hidden layer, or if >1 hidden layer, have same no. of hidden units in every layer (usually the more the better)
2. 神經(jīng)網(wǎng)絡(luò)的訓(xùn)練
① Randomly initialize weights
② Implement forward propagation to gethθ(x(i))?for anyx(i)
③ Implement code to compute cost function J(θ)
④ Implement backprop to compute partial derivatives
⑤
⑥
本章講述了神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)的過程,重點在于back-propagation算法俭嘁,gradient-checking方法,希望能夠有人用我之前這篇文章中的類似方法予以實現(xiàn)神經(jīng)網(wǎng)絡(luò)供填。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?另外提供一篇作為Reference罢猪,供大家參考。