1. 程式人生 > >Stanford機器學習---第五講. 神經網路的學習 Neural Networks learning

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, y= 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 在神經網路上的各層輸出值:


我們定義神經網路的總誤差為:
希望通過調整權重引數W(也就是theta)來最小化E。
由於
所以每一層按如下方式進行更新:
根據backpropagation演算法進行梯度的計算,這裡引入了error變數δ,該殘差表明了該節點對最終輸出值的殘差產生了多少影響。
對於最後一層,我們可以直接算出網路產生的輸出與實際值之間的差距,我們將這個差距定義為。對於隱藏單元我們如何處理呢?我們將通過計算各層節點殘差的加權平均值計算hidden layer的殘差。讀者可以自己驗證下,其實就是E對b求導的結果。
在最後一層中,
對於前面的每一層,都有
由此得到第l層第i個節點的殘差計算方法:
由於我們的真實目的是計算,且
所以我們可以得到神經網路中權重的update方程:
不斷迭代直到落入local optima,就是backpropagation的演算法過程。
============================================================
Example of logistical cost:
下面我們針對logistical cost給出計算的例子:
而對於每一層,其誤差可以定義為:
分別代入即得
由此得來\theta_{k}的update方程:
如果將誤差對激勵函式(activation function)的導數記做δ,則有:
對於前面一層 ,更新同理,,只是上一層\Theta梯度的第一個分量E對a_k求導有所變化,

但是始終是不變的。

下圖就是上面推導得出的結果:


由上圖我們得到了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的方法,比如:


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. 因為一層內的所有計算都可以歸結為1個,而這使得一些interesting的東西被ignore了。

所以我們應該打破這種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,供大家參考。