吴恩达老师在深度学习视频中讲解 s o f t m a x \mathrm{softmax} softmax函数时,直接给出了损失函数对 z [ L ] z^{[L]} z[L]的导数,这里推导一下计算过程。
假设输出层有
n
n
n个神经元,使用
s
o
f
t
m
a
x
\mathrm{softmax}
softmax函数后神经网络的输出为
y
^
j
=
exp
(
z
j
[
L
]
)
∑
i
=
1
n
exp
(
z
i
[
L
]
)
j
=
1
,
2
,
.
.
.
,
n
\hat{y}_j=\frac{\exp(z^{[L]}_j)}{\sum_{i=1}^n\exp(z^{[L]}_i)}\quad j=1,2,...,n
y^j=∑i=1nexp(zi[L])exp(zj[L])j=1,2,...,n
使用交叉熵损失函数,定义为
L
(
y
^
,
y
)
=
−
∑
i
=
1
n
y
i
log
(
y
i
^
)
L(\hat{y}, y)=-\sum_{i=1}^{n}y_i\log(\hat{y_i})
L(y^,y)=−i=1∑nyilog(yi^)
从
s
o
f
t
m
a
x
\mathrm{softmax}
softmax函数的定义不难看出,对于每一个
z
j
[
L
]
z^{[L]}_j
zj[L],它对
y
^
\hat{y}
y^的每个元素都有贡献。那么在进行反向传播时,
y
^
\hat{y}
y^的每个元素都要计算对
z
j
[
L
]
z^{[L]}_j
zj[L]的导数,再分别乘以损失函数对
y
^
\hat y
y^每个元素的导数,然后求和。也即
∂
L
∂
z
j
[
L
]
=
∑
i
=
1
n
∂
L
∂
y
i
^
∂
y
i
^
∂
z
j
[
L
]
\frac{\partial L}{\partial z^{[L]}_j}=\sum_{i=1}^{n}\frac{\partial L}{\partial \hat{y_i}}\frac{\partial \hat{y_i}}{\partial z^{[L]}_j}
∂zj[L]∂L=i=1∑n∂yi^∂L∂zj[L]∂yi^
对于等式右侧的前一部分,显然
∂
L
∂
y
i
^
=
−
y
i
y
i
^
\frac{\partial L}{\partial \hat{y_i}}=-\frac{y_i}{\hat{y_i}}
∂yi^∂L=−yi^yi
对于后一部分,需要分为两种情况讨论
-
当 i = j i=j i=j时:
∂ y j ^ ∂ z j [ L ] = exp z j [ L ] ( ∑ i = 1 n exp ( z i [ L ] ) ) − ( exp z j [ L ] ) 2 ( ∑ i = 1 n exp ( z i [ L ] ) ) 2 = y j ^ ( 1 − y j ^ ) \begin{aligned} \frac{\partial\hat{y_j}}{\partial z^{[L]}_j} &=\frac{\exp{z^{[L]}_j}(\sum_{i=1}^n\exp(z^{[L]}_i))-(\exp{z^{[L]}_j})^2}{(\sum_{i=1}^n\exp(z^{[L]}_i))^2}\\ &=\hat{y_j}(1-\hat{y_j}) \end{aligned} ∂zj[L]∂yj^=(∑i=1nexp(zi[L]))2expzj[L](∑i=1nexp(zi[L]))−(expzj[L])2=yj^(1−yj^) -
当 i ≠ j i\neq j i=j时:
∂ y i ^ ∂ z j [ L ] = 0 − exp z i [ L ] exp z j [ L ] ( ∑ i = 1 n exp ( z i [ L ] ) ) 2 = − y i ^ y j ^ \begin{aligned} \frac{\partial\hat{y_i}}{\partial z^{[L]}_j} &=\frac{0-\exp{z^{[L]}_i\exp{z^{[L]}_j}}}{(\sum_{i=1}^n\exp(z^{[L]}_i))^2}\\ &=-\hat{y_i}\hat{y_j} \end{aligned} ∂zj[L]∂yi^=(∑i=1nexp(zi[L]))20−expzi[L]expzj[L]=−yi^yj^
那么
∂
L
∂
z
j
[
L
]
=
y
j
^
(
1
−
y
j
^
)
(
−
y
j
y
j
^
)
+
∑
i
≠
j
−
y
i
^
y
j
^
(
−
y
i
y
i
^
)
=
−
y
j
(
1
−
y
j
^
)
+
∑
i
≠
j
y
i
y
j
^
=
−
y
j
+
y
j
y
j
^
+
∑
i
≠
j
y
i
y
j
^
=
y
j
^
−
y
j
\begin{aligned} \frac{\partial L}{\partial z^{[L]}_j}&=\hat{y_j}(1-\hat{y_j})(-\frac{y_j}{\hat{y_j}})+\sum_{i\neq j}-\hat{y_i}\hat{y_j}(-\frac{y_i}{\hat{y_i}})\\ &=-y_j(1-\hat{y_j})+\sum_{i\neq j}y_i\hat{y_j}\\ &=-y_j+y_j\hat{y_j}+\sum_{i\neq j}y_i\hat{y_j}\\ &=\hat{y_j}-y_j \end{aligned}
∂zj[L]∂L=yj^(1−yj^)(−yj^yj)+i=j∑−yi^yj^(−yi^yi)=−yj(1−yj^)+i=j∑yiyj^=−yj+yjyj^+i=j∑yiyj^=yj^−yj
于是对于整个
z
[
L
]
z^{[L]}
z[L]显然有
d
z
[
L
]
=
y
^
−
y
dz^{[L]}=\hat{y}-y
dz[L]=y^−y
在多个样本时显然有
d
Z
[
L
]
=
1
m
(
Y
^
−
Y
)
dZ^{[L]}=\frac{1}{m}(\hat{Y}-Y)
dZ[L]=m1(Y^−Y)
这里的
1
m
\frac{1}{m}
m1来自来自损失函数。