1. 程式人生 > >反向傳播演算法的理解(Nielsen版)

反向傳播演算法的理解(Nielsen版)

在學習standford大學機器學習在coursera上的公開課中,對於其中講授的神經網路的反向傳播演算法不是很清楚,經過網上查詢資料,覺得Michael Nielsen的「Neural Networks and Deep Learning」中的解釋特別清楚,於是這份材料為主經過學習,現在說一下我的理解。

記憶BP演算法的竅門

我總結記住反向傳播演算法的關鍵要素可以用三個數字來代表:214

  • 兩個假設
  • 一箇中間變數
  • 四個公式

代價函式

在闡述反向傳播演算法之前,我們還是先明確代價函式的定義,我們定義代價函式的形式如下:

C=12nx||y(x)aL(x)||2(
)

其中n是樣本的總數,L是神經網路的總層數,y(x)=y是樣本的值,aL(x)=x是自變數帶入hypothesis計算的結果,aL(x)=x也可以看成hw,b(x),這個式子也可以寫成C=12nx||yaL||2,吳恩達的版本是:J(W,b;x,y)=12||hw,b(x)y||2

兩個假設

  1. 總體的代價函式可以寫成全部單個樣本的代價總和的平均值。
    也就是C=1nxCx,其中Cx=12||yaL||2

  2. 代價函式可以認為是神經網路輸出的函式。
    比如對於單獨的一個樣本來說,代價函式可以寫成C=12||yaL||=12j(yjaLj)2

一箇中間變數

我們定義神經網路中第l

層的第j個神經元上的誤差δlj為:

δlj=Czlj()
其中zlj是這個神經元上的輸入,這裡我們用zlj表示神經元上的輸入,用alj表示這個神經元的輸出。
憑什麼這麼定義?憑什麼這麼定義?憑什麼這麼定義?(重要的事情說三遍)
我認為理解這點是整個演算法的核心,演算法的全部內容都是基於這個假設展開的,如果這點不成立後面推匯出花也沒用!不幸的是,網上大多數文章都在這個問題都是一筆帶過,在Nielsen的書裡有對這點進行描述,我結合他的闡述以及我的理解表達一下我對這個假設的看法::如果我們在第l層的第j個神經元的輸入zlj上增加一個微小的變化Δzlj,根據誤差傳遞法則,這個微小的變化最終會導致代價C產生
C
zlj
Δzlj
的改變,其實按理來說CzljΔzlj這個東西才是所謂的誤差。但是在這個演算法裡我們並沒有把整個式子定義為誤差,而是取其中的偏導數部分為誤差。偏導部分其實是C這個函式對於zlj這個變數的梯度,它反映了這個函式對於這個變數變化的敏感程度(CS231n),如果敏感程度高那麼即使是自變數非常微小的變化也會引起整個函式值很大的變化,反之如果非常不敏感,即使是自變數很大的變化也不會另