Neural Networks
為什么需要神經網絡算法?

如上圖,我們需要對復雜的樣本進行分類,那么Linear的肯定不能滿足我們的要求,但是如果使用Non-Linear的會產生過多的特征,(上圖假設原特性有100個的話,如果是二次多項式展開,那么特性會膨脹到將近5000個)過多的特征將會導致overfitting,而Neural Networks恰好可以解決這個問題,這就是學習Neural Networks的動機.
Model Representation I
神經網絡算法是用來模擬人類大腦行為的算法,具體來說就是模擬人類神經元的工作流程,神經樹突作為輸入(對應特性),神經細胞作為計算,神經軸作為輸出(對應的值),如下圖:

其中Layer1被稱為Input Layer,Layer2被稱為Hidden Layer, 等被稱為activation function(sigmoid是一種常見的激活函數),Layer3被稱為output layer, 被稱為bias unit.

為的原因:是layer j 映射到 layer (j+1)的函數的參數,想象,加上bias unit之后,X是一個的矩陣,是一個的矩陣,那么可以推導出必須要是一個的矩陣.
Model Representation II


在這里我們用sigmoid函數作為layer2的激活函數,可以得到上面的表達式,繼續(xù)精簡,將vector x看作,則有,
vectorization
假設j+1層是output layer,那么有:

forward propagation
Neural Network做的事情就是,把原始的特征經過
處理的輸出作為layer 2的輸入,layer 2的新特征
經過
的處理得到輸出作為layer 3的輸入,依次往前傳播.仔細觀察最后一層(如上圖layer4),layer3 -> layer4的處理如果使用的激活函數是sigmoid函數的化,實際上就是之前講過的logistic regression,只是不同的是他不再局限于使用原始的特征,而是通過中間的hidden layers加工后的新特征當作新特征,這樣做的好處就是可以得到更靈活的
(對比本筆記最開始那張圖中僵硬的x的多項展開式).
Examples and Intuitions


Multiclass Classification

之前討論的分類問題都是binary的,實際情況中可能如上圖所示,結果并不是binary的,解決的辦法還是和之前l(fā)ogistic regression一樣使用one vs all的思想,此時我們最后一層返回的不是一個標量,而是一個向量:

以上4種情況分別對應行人,汽車,摩托車,卡車.
Cost Function
Neural Networking的代價函數如下:

其中:
L = 網絡中l(wèi)ayer的數量
= 第層中unit的數量(不包含bias unit)
K = output layer中unit的數量?
對比logistic regression的代價函數(如下),可以發(fā)現(xiàn)兩者之間的形式相同:

- "[","]"中的值都是某個樣本在某種預測下的代價,只不過對于Neural Networking來說,output layer的unit可能有多個,所以需要全部累加
- regularization部分做的都是將所有
相加(除了
),只不過對于Neural Networking來說,
是一個矩陣而已
Cost part & Regularization part
Backpropagation Algorithm
Backpropagation算法就是用在Neural Networking中用來求梯度的算法,之后我們可以通過梯度下降或者其他advanced optimization methods來求出最優(yōu)的使得
最小.
該算法分兩個階段,第一步forward propagation求

第二步back propagation

Backpropagation Intuition


從數學形式上來看,BP算法和FP類似,只不過是換了個方向:
FP
BP
可以看到FP和BP計算時形式幾乎一致,只不過FP時from left to right依次計算,BP是from right to left依次計算(注意:
Unrolling Parameters
上文中我們得到了costFunction的定義,也有了partial derivative,所以我么可以和之前一樣用fminunc()方法來costFunction的局部最優(yōu)解,fminunc()定義如下:

可以看到fminunc函數需要傳入的參數都是vector,但是在Neural networking中,無論是(多個vector),還是(partial derivative)都是matrices,所以我們需要unrolling操作將上兩者轉換成vector給到fminunc函數.

如上圖,thetaVector將作為initalTheta給到fminunc函數,用于fminunc函數的costFunction基本如下:

上圖中,由thetaVec還原得到我們可以使用reshape函數,如下:

Gradient Checking
backprop算法會有些bug使得我們在運算的過程中出現(xiàn)確實在下降但是實際上Neural Networking沒有正常在工作.
所以一般來說我們需要實現(xiàn)Gradient Checking來校驗backprop算法是否正確工作,實現(xiàn)細節(jié)如下:
首先對于來說,求導公式如下:

因為是一個matrix,我們將其unrolling成vector之后可以方便的循環(huán)求出對于矩陣中每個的偏導數,如下:

最后如果backprop算法求得的gradVecgradApprox則證明backprop在正常工作.在校驗過bakprop算法正確性之后我們就可以將計算過程中的Gradient Checking功能關閉,因為他實在是太慢了.
Random Initialization
對于Neural Networking來說,在優(yōu)化的時候,無論是用fminunc還是其他優(yōu)化算法,初始的
不能設置為相同(比如zeros(m*n)直接丟到fminunc中去),因為這樣會導致hidden layer中每一個激活函數計算的值都是一樣,不僅如此,每一層的
值也會一樣,
對每一個
求偏導值也一樣,這意味著即使更新過
之后
中的元素依然會保持一致.所以我們需要使用Random Initialization,如下:

注意:
- 這里的
和Gradient Checking中的沒有關系
- rand(x,y)返回的矩陣元素在(0,1)之間,所以可以確保經過處理之后的
Putting it Together
梳理下Neural Networking全過程:
1.構建一個網絡架構,input layer unit num?hidden layer num/unit num?output layer num.

2.訓練Neural network,初始化,對于每一個樣本計算,實現(xiàn)代價函數,實現(xiàn)backprop,使用gradient checking校驗backprop是否正常工作,使用比如fminunc求出最優(yōu)


注意:不同于之前的,Neural Network的代價函數是非凸的(non-convex),即很可能無法到達global minimum,不過local minimum也ok.
總結
做過ex4的練習之后,發(fā)現(xiàn)完成一個NN算法要經過以下幾個主要步驟:
1.可以使用vectorization形式計算forward propagation部分
2.之后對于每個樣本,我們去求每一個,并且在每一次循環(huán)中修改
3.循環(huán)結束之后對進行regularization,即是
以上過程要謹記和
矩陣形式是一致的
4.再得到之后我們需要使用Gradient Checking去校驗BP是否正常工作.
5.至此我們已經得到了正確的costFunction和,之后在使用fminunc獲得最優(yōu)
,這樣一來NN算法就完整了
6.之后就是給訓練集之外的數據看看classification的準確性之類的
