Neural Networks: Learning - Week_5

Cost Function and Backpropagation

Cost Function

在Cost function的部分,我們先定義一些用到的參數:

L:整個神經網路的層數 (包含輸入、輸出和隱藏層)
Sl:第 " l " 層單位數/節點數 (不包含隱藏偏差單位(bias unit))
K:輸出的類別數 (number of output/unit class)
h𝚯(X)k:代表第k個hypothesis function,相當於第k個輸出的結果

還記得上一章,我們用邏輯迴歸的算法去計算神經網路的價值函數型式如下:


根據上面定義的參數去改寫此數學式:


發現cost function公式裡面,一般項下,有2個summation的符號,代表說m個訓練樣本,K個輸出分類;在正規化項(regularization)中,有三個summation的符號,分別是代表總共有L-1層的映射函數,因為theta都在theta matrix中,theta matrix總用有Sl+1列(row)和Sl欄(column)。

還有一些要注意的地方如下:

  1. 在一般項兩個的summation中,它只計算輸出層的部分的cost function
  2. 而在正規化項三個的summation中,他則是計算整個神經網路的theta matrix
  3. 在正規化項summation中,i並不是對應到第i個樣本,而是對應到theta的第幾欄或第幾列

--------------------------------------------------------------------------------------------------------------------------

Backpropagation Algorithm

在Back propagation的部分,back propagation主要是神經網路裡面一個最小化價值函數的專有名詞,就如同我們在邏輯和線性回歸裡面做的梯度下降法是一樣的,都是要找尋最小的價值函數。

Back propagation的演算法大致如下:


1.在一開始給定訓練的資料集{(x(1),y(1))...(x(n),y(m))}

2.設定Δi,j(l) := 0

3.接著在進入迴圈,設定迴圈範圍從1到m

4.在迴圈內,設定令a(1) := x(t)

5.在迴圈內用forward propagation去計算每層的 a(l) for l = 1, 2, 3,...., L

<<forward propagation計算方法如下圖>>


<<forward propagation計算方法如上圖>>

6.在迴圈內,利用訓練集的資料y(t),計算每層的誤差 δ(L) = a(L) - y(t)
這裡所提到的L為神經網路總層數,a(L)則是一個代表最後一層(輸出層)的activation unit向量

7.在迴圈內,計算δ(L-1), δ(L-2), ... ,δ(2),利用 δ(l) = ((ϴ(l))Tδ(l+1)).*a(l).*(1-a(l))
這裡我們令 g'(z(l)) = a (l) .* (1-a(l)),也稱之為g-prime derivative。

8.在迴圈內,計算Δi,j(l) := Δi,j(l) + aj(l)δi(l+1),或者向量化Δ(l) := Δ(l) + δ(l+1)(a(l))T,持續更新我們的Δ。

9.在迴圈外,因為梯度下降法要得到價值函數的偏微分,所以需要計算Di,j(l)
Di,j(l) := (1/m)(Δi,j(l) + λϴi,j(l)), if j ≠ 0
Di,j(l) := (1/m)(Δi,j(l) ), if j = 0

--------------------------------------------------------------------------------------------------------------------------

Backpropagation Intuition

若我們只考慮單一分類的神經網路且忽略掉正規化,其價值函數可以被表示成下面的數學式:


直覺上來說,δj(l)是aj(l)的誤差,更正式來說,delta是價值函數的微分項,如下面的數學式表示:


還記得微分項是價值函數的切線斜率,在這邊誤差等於由價值函數的微分項,也就是說,若微分項越大或切線斜率越陡峭,就代表說我們的誤差越大,越不正確(對比於訓練的資料集而言),下面我們再介紹怎麼計算一些δj(l)。


上面這張圖所示,如果要計算δ2(2),上圖介紹的方法使用權重加總相似的概念去計算,計算公式如下:

δ2(2) = ϴ12(2) * δ1(3) + ϴ22(2) * δ2(3)
δ2(3) = ϴ12(3) * δ1(4)

--------------------------------------------------------------------------------------------------------------------------

Backpropagation in Practice

Implementation Note: Unrolling Parameters

在神經網路中,很多參數都是矩陣,我們想要有系統化的把矩陣全部放到長向量中,方便提取所需要的參數。下面會教大家如何在octave中,合併矩陣到一個長向量中。

thetaVector = [ Theta1(:); Theta2(:); Theta3(:); ]
deltaVector = [ D1(:); D2(:); D3(:) ]

若是合併完之後要進行提取的話,就依照下面方式進行提取,假設Theta1的矩陣維度是10x11,Theta2的矩陣維度是10x11,Theta3的矩陣維度是1x11:

Theta1 = reshape(thetaVector(1:110),10,11)
Theta2 = reshape(thetaVector(111:220),10,11)
Theta3 = reshape(thetaVector(221:231),1,11)

下面是神經網路中大概會遇到上述狀況的流程,給大家做參考:


--------------------------------------------------------------------------------------------------------------------------

Gradient Checking

我們可以運用gradient checking來確保我們的反向傳播如預期地進行,我們可以使用下面的方式去逼近代價函數的導數:


如果是像theta這種多重的矩陣,我們可以也可以使用下列的公式去逼近:


切記上述的ϵ要夠小,例如ϵ = 10-4,確保該數學是能正確的運作。下面是在ocatve程式裡面gradient checking的程式碼:

epsilon = 1e-4;
for i = 1:n,
  thetaPlus = theta;
  thetaPlus(i) += epsilon;
  thetaMinus = theta;
  thetaMinus(i) -= epsilon;
  gradApprox(i) = (J(thetaPlus) - J(thetaMinus))/,(2*epsilon)
end;

前面我們有提到如何運用反向傳播來計算deltavector,這邊我們再運用gradient checking計算gradapprox,要確認是否正確計算反向傳播,只要讓 deltavector  ≈  gradapprox,記住一旦確認反向傳播演算法是正確後,即可以把gradient checking註解掉,不然每次都計算gradient checking 會造成計算速度太慢。

--------------------------------------------------------------------------------------------------------------------------

Random Initialization

如果是用零這個值去在初始化theta這個權重值,並無法正常地在神經網路中運作,當我們使用用反向傳播方式,所以有的節點(nodes)會同步更新成相同的值。相反地,若我們使用隨機的方式來初始化theta的權重值。


這邊我們用亂數初始化theta,並把範圍控制在[-ϵ , ϵ],使用上述的式子可在octave中確認他在該範圍內並用亂數初始化。這邊的epsilon並不是代表極小值,是代表一個實數。

------------------------------------------------------------------------------------------------------------------

Putting it Together

首先,要建立神經網路,必須要先思考,每層隱藏層需要幾個單元,還有整個神經網路需要有幾層。這邊有些基礎概念如下:

  • 輸入層的單位數量 = 訓練樣本的特徵維度
  • 輸出層的單位數量 = 分類的數量
  • 每層隱藏層的單位數量 = 通常會比特徵維度多一點
  • 預設都是一層隱藏層,如果你的隱藏層多於一層以上,建議每層的隱藏層的單位都一樣

以下是訓練神經網路的大致流程:

  1. 初始化隨機的權重值
  2. 執行正向傳播去得到h𝚯(x(i))
  3. 計算cost function
  4. 執行反向傳播去得到cost function的偏微分
  5. 使用gradient checking去確認反向傳播是否正常運作,然後關掉gradient checking。
  6. 使用梯度下降或內建的最優化函數去找出cost function的最小值還有theta的權重。
當我們執行forward和back傳播時,建議一開始使用訓練樣本數作為迴圈計數,基本coding架構如下:

for i = 1:m,
   
  Perform forward propagation and backpropagation using example (x(i),y(i))
   
  (Get activations a(l) and delta terms d(l) for l = 2,...,L)


我們所看到神經網路的所執行的就如同下圖:



The question that I asked in Coursera platform

D和Δ的差異

留言

這個網誌中的熱門文章

在jupyter notebook中同時使用pyhton2和python3

Recommender Systems - Week_9_part2

Machine Learning System Design - Week_6_ part2