Machine Learning - Andrew Ng 筆記(3)

Neural Networks

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

Non-Linear Hypotheses

如上圖,我們需要對復雜的樣本進行分類,那么Linear的肯定不能滿足我們的要求,但是如果使用Non-Linear的會產生過多的特征,(上圖假設原特性有100個的話,如果是二次多項式展開,那么特性會膨脹到將近5000個)過多的特征將會導致overfitting,而Neural Networks恰好可以解決這個問題,這就是學習Neural Networks的動機.

Model Representation I

神經網絡算法是用來模擬人類大腦行為的算法,具體來說就是模擬人類神經元的工作流程,神經樹突作為輸入(對應特性),神經細胞作為計算,神經軸作為輸出(對應h_\theta(x)的值),如下圖:

Neural Network

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

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

Model Representation II

recap

a=g(z)

在這里我們用sigmoid函數作為layer2的激活函數,可以得到上面的表達式,繼續(xù)精簡,將vector x看作,則有,

vectorization

z^{(j)}=\Theta^{(j-1)}a^{(j-1)}
a^{(j)}=g(z^{(j)})
假設j+1層是output layer,那么有:
h_\Theta^{(x)}=a^{(j+1)}=g(z^{(j+1)})

Neural Network architecture

forward propagation

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

Examples and Intuitions

OR
NOR

Multiclass Classification

One vs all

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


y

以上4種情況分別對應行人,汽車,摩托車,卡車.

Cost Function

Neural Networking的代價函數如下:

Neural Networking Cost Function

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

  • "[","]"中的值都是某個樣本在某種預測下的代價,只不過對于Neural Networking來說,output layer的unit可能有多個,所以需要全部累加
  • regularization部分做的都是將所有\theta^2相加(除了\theta_0),只不過對于Neural Networking來說,\Theta^{(i)}是一個矩陣而已
    Cost part & Regularization part

Backpropagation Algorithm

Backpropagation算法就是用在Neural Networking中用來求梯度的算法,之后我們可以通過梯度下降或者其他advanced optimization methods來求出最優(yōu)的\theta使得J(\theta)最小.
該算法分兩個階段,第一步forward propagation求a^{(j)}

forward propagation

第二步back propagation
back propagation

Backpropagation Intuition

Error

Compute Error

從數學形式上來看,BP算法和FP類似,只不過是換了個方向:
FP


BP


可以看到FP和BP計算時形式幾乎一致,只不過FP時from left to right依次計算,BP是from right to left依次計算(注意:\delta_1^{(4)}=a_1^{(4)} - y^{(i)},上圖有誤)

Unrolling Parameters

上文中我們得到了costFunction的定義,也有了partial derivative,所以我么可以和之前一樣用fminunc()方法來costFunction的局部最優(yōu)解,fminunc()定義如下:

fminunc

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

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

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

Gradient Checking

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

derivative of cost function

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

最后如果backprop算法求得的gradVecgradApprox則證明backprop在正常工作.在校驗過bakprop算法正確性之后我們就可以將計算過程中的Gradient Checking功能關閉,因為他實在是太慢了.

Random Initialization

對于Neural Networking來說,在優(yōu)化J(\Theta)的時候,無論是用fminunc還是其他優(yōu)化算法,初始的\Theta不能設置為相同(比如zeros(m*n)直接丟到fminunc中去),因為這樣會導致hidden layer中每一個激活函數計算的值都是一樣,不僅如此,每一層的\delta值也會一樣,J(\Theta)對每一個\Theta_{i,j}^{(l)}求偏導值也一樣,這意味著即使更新過\Theta之后\Theta中的元素依然會保持一致.所以我們需要使用Random Initialization,如下:

Random Initialization

注意:

  • 這里的\epsilon和Gradient Checking中的沒有關系
  • rand(x,y)返回的矩陣元素在(0,1)之間,所以可以確保經過處理之后的-\epsilon<\Theta<\epsilon

Putting it Together

梳理下Neural Networking全過程:
1.構建一個網絡架構,input layer unit num?hidden layer num/unit num?output layer num.

Pick a network architecture

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

Neural networking intuition

注意:不同于之前的,Neural Network的代價函數是非凸的(non-convex),即很可能無法到達global minimum,不過local minimum也ok.

總結

做過ex4的練習之后,發(fā)現(xiàn)完成一個NN算法要經過以下幾個主要步驟:
1.可以使用vectorization形式計算forward propagation部分
2.之后對于每個樣本,我們去求每一個\delta^{(l)},并且在每一次循環(huán)中修改\Delta^{(l)}
3.循環(huán)結束之后對\Delta^{(l)}進行regularization,即是D^{(l)}
以上過程要謹記\Delta^{(l)}\Theta^{(l)}矩陣形式是一致的
4.再得到D^{(l)}之后我們需要使用Gradient Checking去校驗BP是否正常工作.
5.至此我們已經得到了正確的costFunction和grad,之后在使用fminunc獲得最優(yōu)\Theta,這樣一來NN算法就完整了
6.之后就是給訓練集之外的數據看看classification的準確性之類的

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容