原文 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/index)web
第五講——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, 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)))
由上文可知,
通過求導計算可得,對於上圖有
換句話說, 對於每一層來講,δ份量都等於後面一層全部的δ加權和,其中權值就是參數Θ。
===============================
(四)、Implementation note: Unrolling parameters
這一節講述matlab中如何實現unrolling parameter。
前幾章中已經講過在matlab中利用梯度降低方法進行更新的根本,兩個方程:
與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,供你們參考。