基於計算圖的Softmax層反向傳播推導

0. 前言

經朋友推薦,近日閱讀齋藤康毅先生編寫的《深度學習入門 · 基於Python的理論與實現》,書本十分通俗易懂,在Chapter 5 —— 反向傳播部分,作者以計算圖方式給出了Sigmoid函數,全連接層的反向傳播過程,但是在給出Softxmax層的反向傳播推導過程的時候,將Softmax函數與交叉熵計算函數直接相連,視爲同一個層次,並且給出這個層次的反向傳播計算圖推導,這篇文章主要關注於兩點:

  • 將Softmax函數單獨視爲一層,該層的反向傳播導數的輸出是什麼?
  • 驗證作者在文中所提出的觀點 :

    對於Sotfmax-with-loss層,當損失函數爲交叉熵時,反向傳播輸出爲 : LA=YiTi\frac {\partial L}{\partial A} = Y_{i} - T_{i} ( 其中 : A爲Softmax函數輸入 , Y爲Softmax函數輸出 , T爲樣本的真實標籤 )

PS :

  1. 本文爲本人閱讀筆記,可作爲對該書的補充理解,具體知識點請參閱書本
  2. 本文所列出的公式可爲代碼編寫時,softmax函數的反向傳播輸出提供參考借鑑

1. Softmax層計算圖結構

如《深度學習入門 · 基於Python的理論與實現》一書所示,Softmax-with-Loss層計算圖和反向傳播過程如下圖所示 :
Softmax-with-Loss
此處,我使用相同的樣例——假設softmax函數輸出爲一個1X3的向量,分析softmax函數本身的反向傳播過程(層次畫的略亂,各位見諒) :
Softmax此處,進行參數補全與名詞解釋 :

  • L1, L2, L3 : 上層函數對softmax各維的輸出的求導的結果,若使用書中的交叉熵,則 : Li=tiyiLi = -{\frac {t_{i}}{y_{i}}} ……①
  • 圖中沒有給出的參數
    1. L1ea1L1 * e^{a1}
    2. L2ea2L2 * e^{a2}
    3. L3ea3L3 * e^{a3}
    4. L1ea1+L2ea2+L3ea3(eai)2 - \frac{L_{1}e^{a1} + L_{2}e^{a2} + L3e^{a3}}{(\sum e^{ai})^{2}}
    5. 根據計算圖加法原則,同4
    6. 同上
    7. 同上
    8. (L1L2)ea2+(L1L3)ea3(eai)2ea1\frac{(L_{1}-L_{2})e^{a2}+(L_{1}-L_{3})e^{a3}}{(\sum e^{ai})^{2}} * e^{a1}
    9. (L2L1)ea1+(L2L3)ea3(eai)2ea2\frac{(L_{2}-L_{1})e^{a1}+(L_{2}-L_{3})e^{a3}}{(\sum e^{ai})^{2}} * e^{a2}
    10. (L3L1)ea1+(L3L2)ea2(eai)2ea3\frac{(L_{3}-L_{1})e^{a1}+(L_{3}-L_{2})e^{a2}}{(\sum e^{ai})^{2}} * e^{a3}

2. 作者的推導合理性的驗證

此處,我們以(8)式爲例進行推導——使用交叉熵函數作爲損失函數,softmax輸入端每個維度的導數是否與作者原文一樣,等於yi-ti:
Step 1 . 在(8)式中代入①式,由Softmax的輸出,可知 :yi=eaieajy_{i} = \frac {e^{ai}}{\sum{e^{aj}}}
Step 2 . 所以可得 :(L1L2)ea1ea2=t2Sea1t1Sea2(L_{1} - L_{2}) * e^{a1} * e^{a2} = t_{2} * S * e^{a1} - t_{1} * S * e^{a2} (L1L3)ea1ea3=t3Sea1t1Sea3(L_{1} - L_{3}) * e^{a1} * e^{a3} = t_{3} * S * e^{a1} - t_{1} * S * e^{a3}
其中 : S=eajS = {\sum{e^{aj}}}
Step 3 . 原式等價於 : t2ea1+t3ea3t1ea2t1ea3eai\frac{t_{2}e^{a1} +t_{3}e^{a3} - t_{1}e^{a2} - t_{1}e^{a3}}{\sum e^{ai}}
Step 4 . 等價變換,原式等於 : (t1ea1+t2ea1+t3ea1)(t1ea1+t1ea2+t1ea3)eai\frac{(t_{1}e^{a1}+t_{2}e^{a1}+t_{3}e^{a1}) - (t_{1}e^{a1}+t_{1}e^{a2} + t_{1}e^{a3})}{\sum e^{ai}}
等於 : (t1ea1+t2ea1+t3ea1)eait1\frac{(t_{1}e^{a1}+t_{2}e^{a1}+t_{3}e^{a1})}{\sum e^{ai}} - t_{1}
Step 5 . 由於t1,t2,t3爲樣本的真實標籤,且採用one-hot形式表示,即t1,t2,t3中只有一個爲1,其餘爲0,所以,原式等於 :
ea1eait1=y1t1\frac{e^{a1}}{\sum e^{ai}} - t_{1} = y_{1} - t_{1}
Step 6. 比較上述結果,發現與作者所求結果一致,所以可知——softmax作爲最後一層,且損失函數爲交叉熵時,將二者視爲同層,該層次反向傳播的導數輸出爲y-t

3. 某些補充

  1. Problem : 爲何"在正向傳播時有分支流出,則反向傳播時它們的反向傳播值會相加"?
    Answer : 在鏈式求導中,對函數 f(u,y,φ) 求f關於x的偏導數(假設x是u,y,φ中的自變量),則 : fx=fuux+fyyx+fφφx\frac{\partial f}{\partial x} = \frac{\partial f}{\partial u} \frac{\partial u}{\partial x} + \frac{\partial f}{\partial y} \frac{\partial y}{\partial x} + \frac{\partial f}{\partial φ} \frac{\partial φ}{\partial x}
    以softmax圖中(1),(2),(3)合併到(4)爲例,(1),(2),(3)其實分別就是f對u,y,φ的偏導數,之所以三者可以合併,是因爲 u(x) = φ(x) = y(x) = 1/S 所以三個偏導數值可以相加乘以下一層的偏導

  2. Problem : 爲什麼我把(1,1,1)作爲輸入,得到的Softmax函數導數值爲0
    Answer : 這隻能說明對(1,1,1)向量,softmax函數無任何誤差,達到最低點。但是這在交叉熵中不可能出現,因爲 (ti/yi) 只有唯一一個不爲0的值

4. Reference

《深度學習入門 · 基於Python的理論與實現》 —— 齋藤康毅

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