2015年12月16日 星期三

Neural network 的 forward/backward propagation (二)

修改係數 W 的流程前一篇中講了 forward propagation 的目的有二

  1. testing 階段用來猜出 label
  2. training 階段看猜出的 label 離答案多遠,藉此可以在 backward propagation 計算係數矩陣 W 要作什麼修改
這邊說明修改係數矩陣 W 的流程
修改係數矩陣 W 是透過微積分的 gradient descent 達成
目標是希望得到的 error,也就是 cost function E 越小

簡單的說如果某個值 w 變大,E 會變小的話
那我就應該把 w 變大
數學上來說就是把 w 向微分 E 對 w 的偏微分的反方向更新
w = w-cΔE/Δw
(c 是一個要額外決定的正常數)

那麼要怎麼算出微分值呢?
假設我們已經透過 forward propagation 得到誤差值了
例如這樣,我們算出的 label 是 0.8,真正的 label 是 1
我們要計算
「前面的路徑如果動了一點點,對誤差會有多少改變」
背後的數學就是微積分裡面的 chain rule

從最後一級來看,他有兩個輸入
兩個輸入微小變動會對輸出 E 有什麼影響(其實就是微分)
(之後的圖因為很麻煩,所以盡量省略上下標)
接著繼續向左看
因為 training 用的 label 不能變動,所以下面不管他了
來看上面 z 的變化會導致輸出 a 有什麼變化
進而讓 E 有變化
根據 chain rule 寫出下列公式
接著終於到了第一個有係數的地方了
因為 z = a1*w1+...
所以 w1 的微小變化會在 z 那端放大 a1 倍
同理 a1 的微小變化會在 z 那端放大 w1 倍
(其實還是 chain rule)
這裡我們就可以更新 w1 的值了(w2, w3 同理)

接著又是 non-linear layer,這邊跟前面一樣
前面又有一層係數,w 的更新也跟前面一樣
比較不一樣的地方是 x 的部份
因為牽涉到三個輸出
所以微分是後面的輸出的加總
不過因為前面是 data 不必更新係數
所以我們其實用不到這個值

最後我們把整個架構圖切成這樣
可以比對前面 a, z 的位置都在虛線方框框的外側
就知道為什麼會 NN 一般會說他有一層一層 layer 的架構了
---
短結
這邊說明了 backward propagation 由左到右的偏微分計算過程
偏微分計算的值可以拿來更新 w,或是傳給前一級用來算前面的偏微分



沒有留言:

張貼留言