1. 程式人生 > >大白話5分鐘帶你走進人工智慧-第37節神經網路之反向傳播詳細案例及解釋(5)

大白話5分鐘帶你走進人工智慧-第37節神經網路之反向傳播詳細案例及解釋(5)

目錄

1、反向傳播前述:

2、第一個案例解說反向傳播:

3、通用案例形式:

4、邏輯迴歸案例:

5、總結:


1、反向傳播前述:

我們知道正向傳播就是把x拿下來一層層的和w乘,然後經過function非線性變化,最後得到一個y輸出結果。反向傳播(reverse-mode autodiff)就是反過來,從最後的y到x,反向的自動求導。前向傳播是make predictions,去預測ŷ,然後計算出誤差,再計算出每個神經節點對誤差的貢獻。這裡的求貢獻就是反向傳播過程,首先根據前向傳播的誤差來求梯度,梯度越大貢獻越大。然後根據梯度調整原來的權重。總結下來反向傳播就是求導、求梯度,然後根據梯度在迭代裡面調整w的一個過程。

反向自動求導是tensorflow實現的方案,首先,它執行圖的前向階段,從輸入到輸出,去計算節點值;然後反向階段,從輸出到輸入去計算所有變數的偏導。

什麼是偏導數:在數學中,一個多變數的函式的偏導數,就是它關於其中一個變數的導數而保持其他變數恆定(相對於全導數,在其中所有變數都允許變化)。偏導數在向量分析和微分幾何中是很有用的。

說白了就是假如f對x求偏導:∂f*∂x。就是把除x以外的自變數當成常數,然後再進行正常的求導即可。

2、第一個案例解說反向傳播:

比如

                                                                                 

這個計算邏輯,即這個演算法。可以用如圖來表達正向傳播和反向傳播邏輯。圖中紅色虛線表示正向傳播,黑色實線是反向傳播。

如果x=3,y=4,正向傳播之後,結果為42,體現在n7節點上。

那反向傳播是做什麼事情呢?怎樣傳播? 如何計算每根線上面的梯度呢?

這裡依賴反向自動求導(reverse-mode autodiff),求解的想法是逐漸的從上往下,來計算f(x,y)的偏導,使用每一箇中間連續的節點,直到我們達到變數節點,這裡嚴重依賴鏈式求導法則。

鏈式求導法則,就是x不能直接連線f,我們通過一箇中間的節點,比如ni,如果ni可以連線f,就可以讓f對ni求偏導;然後x可以連線ni,ni對xi求偏導,然後根據鏈式求導法則相乘,得到的就是f對x求偏導的一個值。

                                                                                       

比如上圖中的演算法邏輯我們最終的f對x來求偏的, f是最後節點出現的結果,x是第一個節點,中間有好長的路要走。所以如果對x求偏導的話,得把每一步節點輸出對x求偏導。n1節點沒有直接連上n7節點, n1節點也沒有直接連上n5節點,但是n1節點可以連上n4節點;n4節點連不上n7節點,但是能連線n5節點。那麼我們可以讓xn1通過n4去連線n5,然後再通過n5連線到n7,它就成為一條鏈,求這條鏈上面的導數,最後就可以把n7對n1也就是f對x偏導求出來。

因為最後的function,對x求偏導,不能直接對x求導,我們倒過來一點點來推,所以它叫反向傳播,反過來一點點的去傳播梯度。

接下來我們一層一層的解釋。

對於f來說,f就是n7的結果,所以f對n7求導。因為是對本身求導,相當於f(x)=x這種情況下,對x求導,結果就變成前面的一個係數,等於1。

下一層,我們要求圖中紅色這根線上所對應的梯度

這根線的輸出是n5節點,所以就要求一下n7對n5節點function的一個偏導,根據鏈式法則,如圖,把它倆的結果相乘。f對n7這一部分已經得到了結果,n7節點的function是加和,n7=n5+n6,如果n7對n5求偏導,結果就是1。可以這樣理解這一步,比如f(x)=ax+by,對x求導,那跟b、y沒有關係,只用看x前面所對應的斜率,就等於a,這裡同樣只看n5前面的係數即為1。記住:

對誰求偏導,就把誰看做未知數。其他的都是常數!

∂f/∂n5=∂f*∂n7*∂n7/∂n5,就是1*1=1,所以圖中這根紅線上的梯度就是1。此時我們有一箇中間結果,

接下來再往下來傳播。求如下紅色線的梯度:

即求∂f/∂n4,等於∂f/∂n5*∂n5/∂n4,上一步求出來的∂f/∂n5=1,接著計算∂n5/∂n4,n5的計算節點的function是,乘法。n5=n4*n2,對n4求偏導,把n4當做未知數,n2為係數,所以結果是n2。同理,反過來,對n2求偏導結果n4。然後把n2節點的數值4代進來,即∂f/∂n4=1*4=4。

再往下傳播:求圖中紅色線梯度

即∂f/∂x,這裡有兩根線,根據上面傳播下來的梯度,那∂f/∂x=∂f/∂n4*∂n4/∂n1,∂f/∂n4已經根據前面算出來的邏輯,∂f/∂n4=4,下面求∂n4/∂n1,∂n4/∂n1看n4節點的function邏輯。此時n4=n1*n1=n1^2。因為(x^2)'=2x,所以∂n4/∂n1=2n1=6。所以∂f/∂x=∂f/∂n4*∂n4/∂n1=4*6=24。

下面求f對y的梯度,y就是n2,如圖,因為y是有兩條線連線,先求下圖左邊的梯度:

n2上面連線n5,那麼梯度∂f/∂n2=∂f/∂n5*∂n5/∂n2,∂f/∂n5=1(上面已經求出),∂n5/∂n2這部分看n5的邏輯是n5=n4*n2,對n2求偏導結果為n4。n4不用算,因為在正向傳播的時候,每個節點的值已經算出來了,所以n4是3^2=9。即∂n5/∂n2=9。所以∂f/∂n2=∂f/∂n2=∂f/∂n5*∂n5/∂n2=1*9=9。

然後再求y連線的右半部分如圖:

n7經過n6再連線n2,那麼∂n7/∂n2=∂n7/∂n6*∂n6/∂n2,∂n7/∂n6看n7的邏輯n7=n5+n6,對n6求偏導結果為1;∂n6/∂n2看n6的邏輯n6=n2+n3,對n2求偏導也是1。所以∂n7/∂n2=1*1=1。

所以最後∂f/∂y=∂f/∂n2+∂nf/∂n2=1+9=10。

我們再看下f對n3的梯度:

其實我們也不用算這根線,換成機器學習的角度去看,n1是第一個維度x1,n2是第而個維度x2,n3是截距,對截距求偏導,把n3看做未知數,前面係數恆為1 。所以對截距求偏導結果恆為1。

反向傳播,如果想求每根線上所對應的梯度,得從後面往前,反著一層層的推出來,才能推出來。這樣沿著圖一路向下,我們可以計算出所有連線梯度,最後就能計算出