以下內容有任何不理解可以翻看我之前的博客哦:吳恩達deeplearning.ai專欄
文章目錄
- 一個小型神經網絡的例子
- 利用計算圖逐步計算價值函數J
- 利用計算圖求出價值函數的導數
計算圖是深度學習中的一個關鍵概念,它也是Tensorflow等編程框架自動計算神經網絡導數的方式。讓我們舉個例子。
一個小型神經網絡的例子
這是一個很小型的神經網絡,其中,激活值a滿足:
a = w x + b a=wx+b a=wx+b
之后采用線性激活函數:
a = g ( z ) = z a=g(z)=z a=g(z)=z
其價值函數為:
J ( w , b ) = 1 2 ( a ? y ) 2 J(w,b)=\frac{1}{2}(a-y)^2 J(w,b)=21?(a?y)2
對于這種小網絡,我們只有一個訓練樣例:
x = ? 2 , y = 2 x=-2,y=2 x=?2,y=2
該網絡的參數為:
w = 2 , b = 8 w=2,b=8 w=2,b=8
我們想要展示的是如何使用計算圖來逐步計算價值函數J。
利用計算圖逐步計算價值函數J
以下是這個例子的計算圖,其實很簡單:
這張圖從左到右逐步展示了價值函數的計算過程,其中矩形之中描述的是計算步驟,而線段上面所寫的是前一步計算出來的值。所以從左到右,依次計算量w*x的值,然后計算出了a的值,再計算出a-y的值,最后求得價值函數,為2。
計算圖向我們展現了神經網絡向前傳播的步驟(圖中還更進一步求了價值函數)。現在的問題是,如何利用計算圖找到J關于w和b的導數 ? J ? w \frac{\partial J}{\partial w} ?w?J? ? J ? b \frac{\partial J}{\partial b} ?b?J?。
利用計算圖求出價值函數的導數
事實證明,神經網絡的前向傳播是從左到右計算,而計算導數是從右向左的計算。
反向傳播的第一步是詢問d的值,它是價值函數的輸入,d改變,J就跟著改變。例如,如果d改變了一內內,比如0.001,那么j將如何變化嘞。結果是在這種情況下,如果d從2變為了2.01,j則從2變味了2.02,那么可以得出結論就是J這里的導數為2,數學公式就是: ? J ? d = 2 \frac{\partial J}{\partial d}=2 ?d?J?=2,這樣就求出最右邊的導數了。
下一步當然是繼續向左進行,求一下 ? J ? a \frac{\partial J}{\partial a} ?a?J?等于多少。利用與上面同樣的方法,可以求出 ? d ? a = 1 \frac{\partial d}{\partial a}=1 ?a?d?=1,再結合上 ? J ? d = 2 \frac{\partial J}{\partial d}=2 ?d?J?=2,那么聯立就可以得出 ? J ? a = 2 \frac{\partial J}{\partial a}=2 ?a?J?=2。用數學化的方式來說,以上步驟其實是依靠鏈式法則進行微積分,高等數學應該學過。其實就是 ? J ? a = ? d ? a × ? J ? d \frac{\partial J}{\partial a}=\frac{\partial d}{\partial a}\times \frac{\partial J}{\partial d} ?a?J?=?a?d?×?d?J?。
接下來就是一步步從右到左,最終可以得出:
? J ? w = ? 4 \frac{\partial J}{\partial w}=-4 ?w?J?=?4
事實證明,反向傳播是計算導數的一個不錯的方法,避免了你直接計算導數時過于復雜的復合求導。如果一個圖具有n個節點(就是圖中的矩形)和p個參數(我們這個例子中有兩個參數),我們可以在n+p步中求出J對于所有參數的導數,而非n*p,這就表明即使在大型神經網絡中你仍然可以進行求導運算。
為了給讀者你造成不必要的麻煩,博主的所有視頻都沒開僅粉絲可見,如果想要閱讀我的其他博客,可以點個小小的關注哦。