Stanford機器學習---第五講. 神經網絡的學習 Neural Networks learning

原文 http://blog.csdn.net/abcjennifer/article/details/7758797php

本欄目(Machine learning)包括單參數的線性迴歸、多參數的線性迴歸、Octave Tutorial、Logistic Regression、Regularization、神經網絡、機器學習系統設計、SVM(Support Vector Machines 支持向量機)、聚類、降維、異常檢測、大規模機器學習等章節。全部內容均來自Standford公開課machine learning中Andrew老師的講解。(https://class.coursera.org/ml/class/indexweb

 

第五講——Neural Networks 神經網絡的表示算法

===============================網絡

(一)、Cost functiondom

(二)、Backpropagation algorithm機器學習

(三)、Backpropagation intuition
函數

(四)、Implementation note: Unrolling parameters
學習

(五)、Gradient checking
ui

(六)、Random initialization
this

(七)、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。

前幾章中已經講過在matlab中利用梯度降低方法進行更新根本,兩個方程:

 

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,供你們參考。

相關文章
相關標籤/搜索