人工智能-深度學習筆記3 神經網絡的前向傳播和反向傳播計算

在上兩篇的學習筆記中,學習了數據集的表示和處理、激活函數的選取、代價函數的設計技巧和梯度下降的過程,那麼神經網絡在下降的計算過程是怎樣的呢?下面將以目前流行的計算圖的方式,展示一個神經網絡的計算,是如何按照前向或反向傳播過程組織起來的。

1、計算圖(Computation Graph)的計算

嘗試計算函數J,J是由三個變量a,b,c組成的函數,這個函數是3(a+bc) 。計算這個函數走三個步驟,首先計算 b 乘以 c,把它儲存在變量u中,u=bc; 然後計算v=a+u;最後輸出J=3v,這就是要計算的函數J。可以把這三步畫成如上的計算圖,先畫三個變量a,b,c,第一步就是計算u=bc,在這周圍放個矩形框,它的輸入是b,c,接着第二步v=a+u,最後一步J=3v。

舉個例子: a=5,b=3,c=2 ,u=bc就是6,就是5+6=11。J是3倍的v ,因此即3×(5+3×2)。如果把它算出來,實際上得到33就是J的值。 當有不同的或者一些特殊的輸出變量時,例如本例中的J和邏輯迴歸中想優化的代價函數J,因此計算圖用來處理這些計算會很方便。從這個小例子中可以看出,通過一個從左向右的過程,你可以計算出J的值。

爲了計算導數,從右到左(紅色箭頭,和藍色箭頭的過程相反)的過程是用於計算導數最自然的方式。計算圖組織計算的形式是用藍色箭頭從左到右的計算,下面看看如何進行反向紅色箭頭(也就是從右到左)的導數計算

 

2、計算圖的導數計算

先來張計算圖的計算:

假設要計算dJ/dv,那要怎麼算呢?

其實dJ/dv和上一篇的學習筆記中的導數描述如出一轍,看 如上圖的增量三角的描述。它的斜率是3。在反向傳播算法中,如果想計算最後輸出變量的導數,使用最關心的變量對v的導數,那麼就做完了一步反向傳播,在這個流程圖中是一個反向步。

dJ/da是多少呢?換句話說,如果我們提高a的數值,對J的數值有什麼影響?

在變量a=5時,讓它增加到5.001,那麼對v的影響就是a+u,之前v=11,現在變成11.001,從上圖看到現在J就變成33.003了,所以如果讓a增加0.001,J增加0.003。如果把這個5換成某個新值,那麼a的改變量就會傳播到流程圖的最右端,所以J的增量是3乘以a的增量,意味着這個導數是3。要解釋這個計算過程,其中一種方式是:如果改變了a,那麼也會改變v,通過改變v,也會改變J。所以J值的淨變化量就是:當提升這個值(0.001),當把a值提高一點點,這就是J的變化量(0.003)。

首先a增加了,v也會增加,v增加多少呢?這取決於dv/da,然後v的變化導致J也在增加,所以這在微積分裏實際上叫鏈式法則,如果a影響到v,v影響到J,那麼當讓a變大時,J的變化量就是當改變a時,v的變化量乘以改變v時J的變化量,在微積分裏這就叫鏈式法則

數學描述這個計算:dJ/da=(dJ/dv)*(dv/da),所以這個乘積就是3×1,實際上dJ/da=3。(至於dv/da這個偏導大家自行解算哈)。

上圖完成部分的反向傳播算法dJ/da,這裏約定dJ/da簡述da,dJ/dv簡述dv。這個新的符號約定,就是當編程實現反向傳播時,通常會有一個最終輸出值是要關心的,最終的輸出變量,真正想要關心或者說優化的。那接下來按照以上的這個套路算算其餘的導數/反向傳播過程。

du=dJ/du=(dJ/dv)*(dv/du)=3×1:

db=dJ/db=(dJ/dv)*(dv/du)*(du/db)=3×1×2:(例子中c=2)

dc=dJ/dc=(dJ/dv)*(dv/du)*(du/dc)=3×1×3:(例子中b=3)

 

可以說,一個神經網絡的計算,都是按照前向或反向傳播過程組織的。首先計算出一個新的網絡的輸出(前向過程),緊接着進行一個反向傳輸操作。所以這是一個計算流程圖,就是正向或者說從左到右的計算來計算成本函數J或是可能需要優化的函數,然後反向從右到左計算導數。如果熟悉了微積分或鏈式法則,就知道需要做什麼才能編寫代碼,實現邏輯迴歸模型中的導數計算。

下一篇的學習筆記便是編寫代碼,通過邏輯迴歸的實現來表達下此篇以及前兩篇中有關數據集如何表示和處理、選用的激活函數成本函數和此篇的前向傳播和反向傳播的過程,梯度下降又是如何起作用的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章