【深度学习基础】系列博客为学习Coursera上吴恩达深度学习课程所做的课程笔记。
softmax函数详解。
假设神经网络输出层的激活函数为softmax函数,用以解决多分类问题。在反向传播时,就需要计算softmax函数的导数,这也就是本文着重介绍的内容。
我们只需关注输出层即可,其余层和之前介绍的二分类模型一样,不再赘述。
我们先考虑只有一个样本的情况,输出层的 z [ L ] , a [ L ] z^{[L]},a^{[L]} z[L],a[L]以及标签y为(假设预测类别共有K类):
z [ L ] = [ z 1 z 2 ⋮ z K ] ; a [ L ] = [ a 1 a 2 ⋮ a K ] ; y = [ y 1 y 2 ⋮ y K ] z^{[L]}= \begin{bmatrix} z_1 \\ z_2 \\ \vdots \\ z_K \\ \end{bmatrix} ; a^{[L]} = \begin{bmatrix} a_1 \\ a_2 \\ \vdots \\ a_K \\ \end{bmatrix};y=\begin{bmatrix} y_1 \\ y_2 \\ \vdots \\ y_K \\ \end{bmatrix} z[L]= z1z2⋮zK ;a[L]= a1a2⋮aK ;y= y1y2⋮yK
其中:
a j = e z j ∑ k = 1 K e z k , j ∈ [ 1 , 2 , . . . , K ] (1) a_j=\frac{e^{z_j}}{\sum^K_{k=1}e^{z_k}},j\in [1,2,...,K] \tag{1} aj=∑k=1Kezkezj,j∈[1,2,...,K](1)
使用交叉熵损失函数构建cost function:
C = − ∑ k = 1 K y k ln a k (2) C=-\sum^K_{k=1} y_k \ln a_k \tag{2} C=−k=1∑Kyklnak(2)
其中, y k y_k yk等于0或1。
很容易算出:
∂ C ∂ a j = − y j a j (3) \frac{\partial C}{\partial a_j}=-\frac{y_j}{a_j} \tag{3} ∂aj∂C=−ajyj(3)
接下来我们只要算出 ∂ a j ∂ z i \frac{\partial a_j}{ \partial z_i} ∂zi∂aj即可。这里之所以是 z i z_i zi而不是 z j z_j zj是因为使用softmax计算得到的 a j a_j aj包含了 z [ L ] z^{[L]} z[L]中的所有元素,也就是说 a j a_j aj可对 z [ L ] z^{[L]} z[L]中的任意元素求导,而不仅仅只是 z j z_j zj。因此,我们分两种情况讨论。
情况一: i = j i=j i=j
∂ a j ∂ z i = ∂ a i ∂ z i = e z i ∑ k = 1 K e z k − e 2 z i ( ∑ k = 1 K e z k ) 2 = e z i ∑ k = 1 K e z k − ( e z i ∑ k = 1 K e z k ) 2 = a i − a i 2 = a i ( 1 − a i ) \begin{align*} \frac{\partial a_j}{\partial z_i} &= \frac{\partial a_i}{\partial z_i} \\&= \frac{e^{z_i} \sum^K_{k=1}e^{z_k} - e^{2z _i} }{ (\sum^K_{k=1}e^{z_k})^2 } \\&= \frac{e^{z_i}}{\sum^K_{k=1}e^{z_k}} - (\frac{e^{z_i}}{\sum^K_{k=1}e^{z_k}})^2 \\&= a_i-a_i^2 \\&= a_i(1-a_i) \tag{4} \end{align*} ∂zi∂aj=∂zi∂ai=(∑k=1Kezk)2ezi∑k=1Kezk−e2zi=∑k=1Kezkezi−(∑k=1Kezkezi)2=ai−ai2=ai(1−ai)(4)
情况二: i ≠ j i\neq j i=j
∂ a j ∂ z i = − e z j e z i ( ∑ k = 1 K e z k ) 2 = − a j a i (5) \frac{\partial a_j}{\partial z_i} = -\frac{e^{z_j} e^{z_i}}{(\sum^K_{k=1}e^{z_k})^2} = -a_j a_i \tag{5} ∂zi∂aj=−(∑k=1Kezk)2ezjezi=−ajai(5)
结合式(3)、式(4)、式(5)可得:
∂ C ∂ z i = ∑ k = 1 K ∂ C ∂ a k ⋅ ∂ a k ∂ z i = − y i a i ⋅ a i ( 1 − a i ) + ∑ k = 1 , k ≠ i K ( − y k a k ) ⋅ ( − a k a i ) = − y i + y i a i + ∑ k = 1 , k ≠ i K y k a i = − y i + a i ( y i + ∑ k = 1 , k ≠ i K y k ) = a i − y i \begin{align*} \frac{\partial C}{\partial z_i} &= \sum^K_{k=1} \frac{\partial C}{\partial a_k} \cdot \frac{\partial a_k}{\partial z_i} \tag{6} \\&= -\frac{y_i}{a_i} \cdot a_i(1-a_i) + \sum^K_{k=1,k\neq i} (-\frac{y_k}{a_k}) \cdot (-a_k a_i) \tag{7} \\&= -y_i + y_i a_i + \sum^K_{k=1,k\neq i} y_k a_i \tag{8} \\&= -y_i + a_i (y_i + \sum^K_{k=1,k\neq i} y_k) \tag{9} \\&= a_i - y_i \end{align*} ∂zi∂C=k=1∑K∂ak∂C⋅∂zi∂ak=−aiyi⋅ai(1−ai)+k=1,k=i∑K(−akyk)⋅(−akai)=−yi+yiai+k=1,k=i∑Kykai=−yi+ai(yi+k=1,k=i∑Kyk)=ai−yi(6)(7)(8)(9)
使用向量化方法:
∂ C ∂ z [ L ] = a [ L ] − y \frac{\partial C}{\partial z^{[L]} }=a^{[L]}-y ∂z[L]∂C=a[L]−y
可直接扩展到多个样本的情况:
∂ L ∂ Z [ L ] = A [ L ] − Y \frac{\partial L}{\partial Z^{[L]} }=A^{[L]}-Y ∂Z[L]∂L=A[L]−Y
想要获取最新文章推送或者私聊谈人生,请关注我的个人微信公众号:⬇️x-jeff的AI工坊⬇️
个人博客网站:https://shichaoxin.com
GitHub:https://github.com/x-jeff