Stanford機器學習---第五講. 神經網路的學習 Neural Networks learning
轉載自:http://blog.csdn.net/dan1900/article/details/17787917
本欄目(Machine learning)包括單引數的線性迴歸、多引數的線性迴歸、Octave Tutorial、Logistic Regression、Regularization、神經網路、機器學習系統設計、SVM(Support Vector Machines 支援向量機)、聚類、降維、異常檢測、大規模機器學習等章節。所有內容均來自Standford公開課machine
learning中Andrew老師的講解。(https://class.coursera.org/ml/class/index
第五講——Neural Networks 神經網路的表示
===============================
(一)、Cost function
(二)、Backpropagation algorithm
(三)、Backpropagation intuition
(四)、Implementation note: Unrolling parameters
(五)、Gradient checking
(六)、Random initialization
(七)、Putting it together
===============================
(一)、Cost function
假設神經網路的訓練樣本有m個,每個包含一組輸入x和一組輸出訊號y,L表示神經網路層數,Sl表示每層的neuron個數(SL表示輸出層神經元個數)。
將神經網路的分類定義為兩種情況:二類分類和多類分類,
卐二類分類:SL=1, y=0 or 1表示哪一類;
卐K類分類:SL=K, yi = 1表示分到第i類;(K>2)
我們在前幾章中已經知道,Logistic hypothesis的Cost Function如下定義:
其中,前半部分表示hypothesis與真實值之間的距離,後半部分為對引數進行regularization的bias項,神經網路的cost function同理:
hypothesis與真實值之間的距離為 每個樣本-每個類輸出 的加和,對引數進行regularization的bias項處理所有引數的平方和
===============================
(二)、Backpropagation algorithm
前面我們已經講了cost function的形式,下面我們需要的就是最小化J(Θ)
想要根據gradient descent的方法進行引數optimization,首先需要得到cost function和一些引數的表示。根據forward propagation,我們首先進行training dataset 在神經網路上的各層輸出值:
由上圖我們得到了error變數δ的計算,下面我們來看backpropagation演算法的虛擬碼:
ps:最後一步之所以寫+=而非直接賦值是把Δ看做了一個矩陣,每次在相應位置上做修改。
從後向前此計算每層依的δ,用Δ表示全域性誤差,每一層都對應一個Δ(l)。再引入D作為cost function對引數的求導結果。下圖左邊j是否等於0影響的是是否有最後的bias regularization項。左邊是定義,右邊可證明(比較繁瑣)。
===============================
(三)、Backpropagation intuition
上面講了backpropagation演算法的步驟以及一些公式,在這一小節中我們講一下最簡單的back-propagation模型是怎樣learning的。首先根據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)的部分,就有:
經過求導計算可得,對於上圖有
換句話說, 對於每一層來說,δ分量都等於後面一層所有的δ加權和,其中權值就是引數Θ。
===============================
(四)、Implementation note: Unrolling parameters
這一節講述matlab中如何實現unrolling parameter。
function [jVal, gradient] = costFunction(theta) optTheta = fminunc(@costFunction, initialTheta, options)與linear regression和logistic regression不同,在神經網路中,引數非常多,每一層j有一個引數向量Θj和Derivative向量Dj。那麼我們首先將各層向量連起來,組成大vectorΘ和D,傳入function,再在計算中進行下圖中的reshape,分別取出進行計算。
計算時,方法如下:
===============================
(五)、Gradient checking
神經網路中計算起來數字千變萬化難以掌握,那我們怎麼知道它裡頭工作的對不對呢?不怕,我們有法寶,就是gradient checking,通過check梯度判斷我們的code有沒有問題,ok?怎麼做呢,看下邊:
對於下面這個【Θ-J(Θ)】圖,取Θ點左右各一點(Θ+ε),(Θ-ε),則有點Θ的導數(梯度)近似等於(J(Θ+ε)-J(Θ-ε))/(2ε)。
對於每個引數的求導公式如下圖所示:
由於在back-propagation演算法中我們一直能得到J(Θ)的導數D(derivative),那麼就可以將這個近似值與D進行比較,如果這兩個結果相近就說明code正確,否則錯誤,如下圖所示:
Summary: 有以下幾點需要注意
-在back propagation中計算出J(θ)對θ的導數D,並組成vector(Dvec)
-用numerical gradient check方法計算大概的梯度gradApprox=(J(Θ+ε)-J(Θ-ε))/(2ε)
-看是否得到相同(or相近)的結果
-(這一點非常重要)停止check,只用back propagation 來進行神經網路學習(否則會非常慢,相當慢)
===============================
(六)、Random Initialization
對於引數θ的initialization問題,我們之前採用全部賦0的方法,比如:
所以我們應該打破這種symmetry,randomly選取每一個parameter,在[-ε,ε]範圍內:
===============================
(七)、Putting it together
1. 選擇神經網路結構
我們有很多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. 神經網路的訓練
① Randomly initialize weights
② Implement forward propagation to get hθ(x(i)) for anyx(i)
③ Implement code to compute cost function J(θ)
④ Implement backprop to compute partial derivatives
⑤
⑥
test:
本章講述了神經網路學習的過程,重點在於back-propagation演算法,gradient-checking方法,希望能夠有人用我之前這篇文章中的類似方法予以實現神經網路。
另外提供一篇作為Reference,供大家參考。