天天看點

Softmax求導

softmax

的方程為:

p = softmax ( z )   where   p i = e z i ∑ j = 1 k e z j for   i = 1 , ⋯   , k . \boldsymbol{p}=\text{softmax}(\boldsymbol{z})\, \text{where}\, p_i=\frac{e^{z_i}}{\sum^k_{j=1}e^{z_j}} \text{for}\, i=1,\cdots,k . p=softmax(z)wherepi​=∑j=1k​ezj​ezi​​fori=1,⋯,k.

上式中 p \boldsymbol{p} p和 z \boldsymbol{z} z都是 k k k維列向量,形狀為 k × 1 k\times1 k×1。對

softmax

直接求導并不難,用求導法則中的除法法則1即可實作: ( f g ) ′ = f ′ g − f g ′ g 2 \left(\frac{f}{g}\right)'=\frac{f'g-fg'}{g^2} (gf​)′=g2f′g−fg′​。注意:因為 p \boldsymbol{p} p和 z \boldsymbol{z} z都是 k k k維列向量,最後求導結果 ∂ p ∂ z \frac{\partial\boldsymbol{p}}{\partial\boldsymbol{z}} ∂z∂p​應該是個 k × k k\times k k×k的矩陣。我在這裡簡單算下導數矩陣中的一個小元素,假設 m = ∑ j = 1 k e z j m=\sum^k_{j=1}e^{z_j} m=∑j=1k​ezj​,那麼:

∂ p i ∂ z j = 0 ⋅ m − e z i ⋅ e z j m 2 = − p i p j    ( i ≠ j ) , ∂ p i ∂ z i = e z i ⋅ m − e z i ⋅ e z i m 2 = p i − p i 2   . \frac{\partial p_i}{\partial z_j}=\frac{0\cdot m - e^{z_i}\cdot e^{z_j}}{m^2}=-p_ip_j\, \, (i\neq j), \\ \frac{\partial p_i}{\partial z_i}=\frac{e^{z_i}\cdot m - e^{z_i}\cdot e^{z_i}}{m^2}=p_i-p_i^2\,. ∂zj​∂pi​​=m20⋅m−ezi​⋅ezj​​=−pi​pj​(i​=j),∂zi​∂pi​​=m2ezi​⋅m−ezi​⋅ezi​​=pi​−pi2​.

這個求導結果看起來非常複雜且無聊。

我們一般做分類任務的時候才會用到

softmax

,損失函數自然用交叉熵

Cross Entropy

。當我們對

softmax

Cross Entropy

的聯合輸出求導時,得到的結果才更有趣!

先給出交叉熵的方程:

p = softmax ( z ) ℓ ( p , y ) = ∑ i = 1 k − y i log ⁡ p i \boldsymbol{p}=\text{softmax}(\boldsymbol{z})\\ \ell(\boldsymbol{p}, \boldsymbol{y})=\sum^k_{i=1}-y_i\log p_i p=softmax(z)ℓ(p,y)=i=1∑k​−yi​logpi​

再給出求導結果如下:

∂ ℓ ∂ z = ∂ ℓ ∂ p ⋅ ∂ p ∂ z = p − y   . \frac{\partial\ell}{\partial\boldsymbol{z}}=\frac{\partial\ell}{\partial\boldsymbol{p}}\cdot \frac{\partial\boldsymbol{p}}{\partial\boldsymbol{z}}=\boldsymbol{p}-\boldsymbol{y} \,. ∂z∂ℓ​=∂p∂ℓ​⋅∂z∂p​=p−y.

求導過程:

∂ ℓ ∂ z j = ∑ i ∂ ℓ ∂ p i ⋅ ∂ p i ∂ z j = ∂ ℓ ∂ p j ⋅ ∂ p j ∂ z j + ∑ i ≠ j ∂ ℓ ∂ p i ⋅ ∂ p i ∂ z j \frac{\partial\ell}{\partial z_j} = \sum_i\frac{\partial\ell}{\partial{p_i}}\cdot \frac{\partial{p_i}}{\partial{z_j}} \\ =\frac{\partial\ell}{\partial{p_j}}\cdot \frac{\partial{p_j}}{\partial{z_j}} + \sum_{i\neq j}\frac{\partial\ell}{\partial{p_i}}\cdot \frac{\partial{p_i}}{\partial{z_j}} ∂zj​∂ℓ​=i∑​∂pi​∂ℓ​⋅∂zj​∂pi​​=∂pj​∂ℓ​⋅∂zj​∂pj​​+i​=j∑​∂pi​∂ℓ​⋅∂zj​∂pi​​

注意,交叉熵的導數:

∂ ℓ ∂ p i = − y i p i   \frac{\partial\ell}{\partial p_i}=-\frac{y_i}{p_i}\, ∂pi​∂ℓ​=−pi​yi​​

帶入上面的求導過程可得:

− y j p j ( p j − p j 2 ) + ∑ i ≠ j − y i p i ( − p i p j ) = − y j ( 1 − p j ) + ∑ i ≠ j y i p j = − y j + y j p j + p j ∑ i ≠ j y i = − y j + y j p j + p j ( 1 − y j ) = p j − y j   . -\frac{y_j}{p_j}(p_j-p^2_j)+ \sum_{i\neq j}- \frac{y_i}{p_i}(-p_ip_j) \\ =-y_j(1-p_j)+ \sum_{i\neq j} y_ip_j \\ =-y_j + y_jp_j+p_j \sum_{i\neq j} y_i \\ =-y_j+y_jp_j+p_j(1-y_j) \\ = p_j - y_j \,. −pj​yj​​(pj​−pj2​)+i​=j∑​−pi​yi​​(−pi​pj​)=−yj​(1−pj​)+i​=j∑​yi​pj​=−yj​+yj​pj​+pj​i​=j∑​yi​=−yj​+yj​pj​+pj​(1−yj​)=pj​−yj​.

注意倒數第二步用到了 ∑ i y i = 1 \sum_i y_i=1 ∑i​yi​=1,因為分類問題裡

label

都是

one-hot encoding

,即一個元素為1,其他元素皆為0。

softmax

cross entropy

的輸出直接求導,得到的結果,簡約的不可思議!!!

  1. https://blog.csdn.net/u014261408/article/details/106150098 ↩︎

繼續閱讀