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=1kezjezifori=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=1kezj,那麼:
∂ 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=−pipj(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−yilogpi
再給出求導結果如下:
∂ ℓ ∂ 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∂ℓ=−piyi
帶入上面的求導過程可得:
− 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 \,. −pjyj(pj−pj2)+i=j∑−piyi(−pipj)=−yj(1−pj)+i=j∑yipj=−yj+yjpj+pji=j∑yi=−yj+yjpj+pj(1−yj)=pj−yj.
注意倒數第二步用到了 ∑ i y i = 1 \sum_i y_i=1 ∑iyi=1,因為分類問題裡
label
都是
one-hot encoding
,即一個元素為1,其他元素皆為0。
對
softmax
和
cross entropy
的輸出直接求導,得到的結果,簡約的不可思議!!!
- https://blog.csdn.net/u014261408/article/details/106150098 ↩︎