Softmax 損失-梯度計算


本文介紹Softmax運算、Softmax損失函數及其反向傳播梯度計算, 內容上承接前兩篇博文 損失函數 & 手推反向傳播公式

Softmax 梯度

設有K類, 那么期望標簽y形如\([0,0,...0,1,0...0]^T\)的one-hot的形式. softmax層的輸出為\([a_1,a_2,...,a_j,...a_K]^T\), 其中第j類的softmax輸出為:

\[\begin{align} a_{j} &= \frac{\exp(z_{j})}{\sum_{k=1}^K \exp(z_{k})} \forall j\in 1...K \\ {\partial a_{j}\over \partial z_{j} } &= {\exp(z_{j})\cdot(\Sigma - \exp(z_{j}) )\over \Sigma^2} = a_j(1 - a_j) \\ {\partial a_{k}\over \partial z_{j} } &= { - \exp(z_{k}) \cdot \exp(z_{j}) \over \Sigma^2} = -a_j a_k \tag{$k\ne j$} \end{align} \]

如果是全連接的DNN,那么有: \(z_{j}^{l+1}=\sum_i w_{ij} a_{i}^{l}+b_j^{l+1}\)
\(a_j^{l+1}\)可以解釋成觀察到的數據 \(a^l\) 屬於類別 j 的概率,或者稱作似然 (Likelihood)。

求輸出對輸入的梯度\(\partial a\over \partial z\):

\[\begin{align} {\partial a\over \partial z_k}= \begin{bmatrix} {\partial a_1\over \partial z_k} \\ \vdots \\ {\partial a_k\over \partial z_k} \\ \vdots \\ {\partial a_K\over \partial z_k} \end{bmatrix} = \begin{bmatrix} -a_1 \\ \vdots \\ (1-a_k) \\ \vdots \\ -a_K \end{bmatrix}a_k = (\begin{bmatrix} 0 \\ \vdots \\ 1 \\ \vdots \\ 0 \end{bmatrix} -a)a_k \end{align} \]

因此損失對輸入的梯度為\({\partial E\over \partial z}\):

\[{\partial E\over \partial z_k}={\partial E\over \partial a}{\partial a\over \partial z_k}=({\partial E\over \partial a_k} - [{\partial E\over \partial a}]^T a)a_k \\ {\partial E\over \partial z}={\partial E\over \partial a}{\partial a\over \partial z}=({\partial E\over \partial a} - [{\partial E\over \partial a}]^T a)⊙ a \]

對應的 Caffe 中的SoftmaxLayer的梯度反向傳播計算實現代碼為:

# dot 表示矩陣乘法, * 表示按對應元素相乘
bottom_diff = (top_diff - dot(top_diff, top_data)) * top_data

Softmax loss 梯度

單樣本的損失函數為:

\[E = -\sum^K_{k}y_k\log(a_{k}) \\ {\partial E\over \partial a_j} = -\sum^K_{k}{y_k\over a_k}\cdot {\partial a_k\over \partial a_j}=-{y_j\over a_j} \]

接下來求E對w,b的梯度, 過程與反向傳播的通用梯度計算公式相同, 這里指定了具體的激活函數(softmax)與損失函數:

\[\begin{align} {\partial E\over \partial b_j^{l+1}} &= {\partial E\over \partial z_j^{l+1}} = \sum_k{\partial E\over \partial a_k^{l+1}} \cdot {\partial a_k^{l+1}\over \partial z_j^{l+1}} \\ &=-{y_j^{l+1}\over a_j^{l+1}} \cdot a_j^{l+1}(1 - a_j^{l+1})+\sum_{k\ne j}[-{y_k^{l+1}\over a_k^{l+1}} \cdot -a_j^{l+1} a_k^{l+1}] \\ &= -y_j^{l+1}+y_j^{l+1} a_j^{l+1} +\sum_{k\ne j}y_k^{l+1}a_j^{l+1} \\ &= a_j^{l+1}-y_j^{l+1} \\ {\partial E\over \partial w_{ij}^{l+1}} &= {\partial E\over \partial z_j^{l+1}} \cdot {\partial z_j^{l+1}\over w_{ij}^{l+1}}=(a_j^{l+1}-y_j^{l+1})a_i^l \end{align} \]

對應的 Caffe 中的SoftmaxWithLossLayer的梯度反向傳播計算實現為(\({\partial E\over \partial z}\)):

# prob_data 為前向傳播時softmax的結果, label_data 是標簽的one-hot表示
bottom_diff = prob_data - label_data

參考[1][2][3]


  1. softmax的log似然代價函數(公式求導) https://blog.csdn.net/u014313009/article/details/51045303 ↩︎

  2. Softmax與SoftmaxWithLoss原理及代碼詳解 https://blog.csdn.net/u013010889/article/details/76343758 ↩︎

  3. 數值計算穩定性 http://freemind.pluskid.org/machine-learning/softmax-vs-softmax-loss-numerical-stability/ ↩︎


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM