0. 前言
經朋友推薦,近日閱讀齋藤康毅先生編寫的《深度學習入門 · 基於Python的理論與實現》,書本十分通俗易懂,在Chapter 5 —— 反向傳播部分,作者以計算圖方式給出了Sigmoid函數,全連接層的反向傳播過程,但是在給出Softxmax層的反向傳播推導過程的時候,將Softmax函數與交叉熵計算函數直接相連,視爲同一個層次,並且給出這個層次的反向傳播計算圖推導,這篇文章主要關注於兩點:
- 將Softmax函數單獨視爲一層,該層的反向傳播導數的輸出是什麼?
- 驗證作者在文中所提出的觀點 :
對於Sotfmax-with-loss層,當損失函數爲交叉熵時,反向傳播輸出爲 : ∂A∂L=Yi−Ti ( 其中 : A爲Softmax函數輸入 , Y爲Softmax函數輸出 , T爲樣本的真實標籤 )
PS :
- 本文爲本人閱讀筆記,可作爲對該書的補充理解,具體知識點請參閱書本
- 本文所列出的公式可爲代碼編寫時,softmax函數的反向傳播輸出提供參考借鑑
1. Softmax層計算圖結構
如《深度學習入門 · 基於Python的理論與實現》一書所示,Softmax-with-Loss層計算圖和反向傳播過程如下圖所示 :
此處,我使用相同的樣例——假設softmax函數輸出爲一個1X3的向量,分析softmax函數本身的反向傳播過程(層次畫的略亂,各位見諒) :
此處,進行參數補全與名詞解釋 :
- L1, L2, L3 : 上層函數對softmax各維的輸出的求導的結果,若使用書中的交叉熵,則 : Li=−yiti……①
- 圖中沒有給出的參數
- L1∗ea1
- L2∗ea2
- L3∗ea3
- −(∑eai)2L1ea1+L2ea2+L3ea3
- 根據計算圖加法原則,同4
- 同上
- 同上
- (∑eai)2(L1−L2)ea2+(L1−L3)ea3∗ea1
- (∑eai)2(L2−L1)ea1+(L2−L3)ea3∗ea2
- (∑eai)2(L3−L1)ea1+(L3−L2)ea2∗ea3
2. 作者的推導合理性的驗證
此處,我們以(8)式爲例進行推導——使用交叉熵函數作爲損失函數,softmax輸入端每個維度的導數是否與作者原文一樣,等於yi-ti:
Step 1 . 在(8)式中代入①式,由Softmax的輸出,可知 :yi=∑eajeai
Step 2 . 所以可得 :(L1−L2)∗ea1∗ea2=t2∗S∗ea1−t1∗S∗ea2 (L1−L3)∗ea1∗ea3=t3∗S∗ea1−t1∗S∗ea3
其中 : S=∑eaj
Step 3 . 原式等價於 : ∑eait2ea1+t3ea3−t1ea2−t1ea3
Step 4 . 等價變換,原式等於 : ∑eai(t1ea1+t2ea1+t3ea1)−(t1ea1+t1ea2+t1ea3)
等於 : ∑eai(t1ea1+t2ea1+t3ea1)−t1
Step 5 . 由於t1,t2,t3爲樣本的真實標籤,且採用one-hot形式表示,即t1,t2,t3中只有一個爲1,其餘爲0,所以,原式等於 :
∑eaiea1−t1=y1−t1
Step 6. 比較上述結果,發現與作者所求結果一致,所以可知——softmax作爲最後一層,且損失函數爲交叉熵時,將二者視爲同層,該層次反向傳播的導數輸出爲y-t
3. 某些補充
-
Problem : 爲何"在正向傳播時有分支流出,則反向傳播時它們的反向傳播值會相加"?
Answer : 在鏈式求導中,對函數 f(u,y,φ) 求f關於x的偏導數(假設x是u,y,φ中的自變量),則 : ∂x∂f=∂u∂f∂x∂u+∂y∂f∂x∂y+∂φ∂f∂x∂φ
以softmax圖中(1),(2),(3)合併到(4)爲例,(1),(2),(3)其實分別就是f對u,y,φ的偏導數,之所以三者可以合併,是因爲 u(x) = φ(x) = y(x) = 1/S 所以三個偏導數值可以相加乘以下一層的偏導
-
Problem : 爲什麼我把(1,1,1)作爲輸入,得到的Softmax函數導數值爲0
Answer : 這隻能說明對(1,1,1)向量,softmax函數無任何誤差,達到最低點。但是這在交叉熵中不可能出現,因爲 (ti/yi) 只有唯一一個不爲0的值
4. Reference
《深度學習入門 · 基於Python的理論與實現》 —— 齋藤康毅