这里是对吴恩达深度学习视频中后向传播求导公式的推导,需要对视频有一定了解。
吐槽:吴恩达的符号记法真的是比西瓜书上的记法好太多了,后者还没开始推导就看晕了。
符号说明:
n [ l ] n^{[l]} n[l]:第 l l l层神经元的数目;
W [ l ] W^{[l]} W[l]:第 l l l层的权值;
b [ l ] b^{[l]} b[l]:第 l l l层的阈值;
z [ l ] z^{[l]} z[l]:第 l l l层的输入;
a [ l ] a^{[l]} a[l]:第 l l l层的输出;
g [ l ] g^{[l]} g[l]:第 l l l层的激活函数;
L ( y ^ , y ) \mathcal{L}(\hat y,y) L(y^,y):损失函数。
神经网络的前向传播公式是:
z
[
l
]
=
W
[
l
]
a
[
l
−
1
]
+
b
[
l
]
a
[
l
]
=
g
[
l
]
(
z
[
l
]
)
\begin{aligned} z^{[l]}&=W^{[l]}a^{[l-1]}+b^{[l]}\\ a^{[l]}&=g^{[l]}(z^{[l]}) \end{aligned}
z[l]a[l]=W[l]a[l−1]+b[l]=g[l](z[l])
一个样本的情形:
假设我们已经知道了损失函数
L
(
y
^
,
y
)
\mathcal{L}(\hat y,y)
L(y^,y)对第
l
l
l层输出值
a
[
l
]
a^{[l]}
a[l]的梯度
d
a
[
l
]
d a^{[l]}
da[l],也即
d
a
[
l
]
=
(
∂
L
∂
a
1
[
l
]
,
∂
L
∂
a
2
[
l
]
,
.
.
.
,
∂
L
∂
a
n
[
l
]
[
l
]
)
T
d a^{[l]}=\begin{pmatrix}\frac{\partial\mathcal{L}}{\partial a^{[l]}_1},\frac{\partial\mathcal{L}}{\partial a^{[l]}_2},...,\frac{\partial\mathcal{L}}{\partial a^{[l]}_{n^{[l]}}}\end{pmatrix}^T
da[l]=(∂a1[l]∂L,∂a2[l]∂L,...,∂an[l][l]∂L)T
根据链式法则,首先对
z
[
l
]
z^{[l]}
z[l]求导,再对
W
[
l
]
W^{[l]}
W[l]和
b
[
l
]
b^{[l]}
b[l]求导。
由于
a
[
l
]
a^{[l]}
a[l]中的值和
z
[
l
]
z^{[l]}
z[l]中的值是一一对应的,因此求导时也应该是对应元素求导,也即
d
z
[
l
]
dz^{[l]}
dz[l]可以写成这种形式
d
z
[
l
]
=
(
∂
L
∂
a
1
[
l
]
∂
a
1
[
l
]
∂
z
1
[
l
]
,
∂
L
∂
a
2
[
l
]
∂
a
2
[
l
]
∂
z
2
[
l
]
,
.
.
.
,
∂
L
∂
a
n
[
l
]
[
l
]
∂
a
n
[
l
]
[
l
]
∂
z
n
[
l
]
[
l
]
)
T
dz^{[l]}=\begin{pmatrix}\frac{\partial\mathcal{L}}{\partial a^{[l]}_1}\frac{\partial a^{[l]}_1}{\partial z^{[l]}_1},\frac{\partial\mathcal{L}}{\partial a^{[l]}_2}\frac{\partial a^{[l]}_2}{\partial z^{[l]}_2},...,\frac{\partial\mathcal{L}}{\partial a^{[l]}_{n^{[l]}}}\frac{\partial a^{[l]}_{n^{[l]}}}{\partial z^{[l]}_{n^{[l]}}}\end{pmatrix}^T
dz[l]=(∂a1[l]∂L∂z1[l]∂a1[l],∂a2[l]∂L∂z2[l]∂a2[l],...,∂an[l][l]∂L∂zn[l][l]∂an[l][l])T
用
g
[
l
]
′
(
z
[
l
]
)
g^{[l]}{'}(z^{[l]})
g[l]′(z[l])表示对
z
[
l
]
z^{[l]}
z[l]逐元素求导,也即
g
[
l
]
′
(
z
[
l
]
)
=
(
∂
a
1
[
l
]
∂
z
1
[
l
]
,
∂
a
2
[
l
]
∂
z
2
[
l
]
,
.
.
.
,
∂
a
n
[
l
]
[
l
]
∂
z
n
[
l
]
[
l
]
)
T
g^{[l]}{'}(z^{[l]})=\begin{pmatrix}\frac{\partial a^{[l]}_1}{\partial z^{[l]}_1},\frac{\partial a^{[l]}_2}{\partial z^{[l]}_2},...,\frac{\partial a^{[l]}_{n^{[l]}}}{\partial z^{[l]}_{n^{[l]}}}\end{pmatrix}^T
g[l]′(z[l])=(∂z1[l]∂a1[l],∂z2[l]∂a2[l],...,∂zn[l][l]∂an[l][l])T
那么
d
z
[
l
]
dz^{[l]}
dz[l]可以写成
d
z
[
l
]
=
d
a
[
l
]
∗
g
[
l
]
′
(
z
[
l
]
)
d z^{[l]}=d a^{[l]}*g^{[l]}{'}(z^{[l]})
dz[l]=da[l]∗g[l]′(z[l])
有了
d
z
[
l
]
dz^{[l]}
dz[l]可以对
W
[
l
]
W^{[l]}
W[l]和
b
[
l
]
b^{[l]}
b[l]求导。先考虑最简单的,对
b
[
l
]
b^{[l]}
b[l]求导,由于
z
[
l
]
z^{[l]}
z[l]中的值和
b
[
l
]
b^{[l]}
b[l]中的值也是一一对应的,因此
d
b
[
l
]
=
(
∂
L
∂
z
1
[
l
]
∂
z
1
[
l
]
∂
b
1
[
l
]
,
∂
L
∂
z
2
[
l
]
∂
z
2
[
l
]
∂
b
2
[
l
]
,
.
.
.
,
∂
L
∂
z
n
[
l
]
[
l
]
∂
z
n
[
l
]
[
l
]
∂
b
n
[
l
]
[
l
]
)
T
db^{[l]}=\begin{pmatrix}\frac{\partial\mathcal{L}}{\partial z^{[l]}_1}\frac{\partial z^{[l]}_1}{\partial b^{[l]}_1},\frac{\partial\mathcal{L}}{\partial z^{[l]}_2}\frac{\partial z^{[l]}_2}{\partial b^{[l]}_2},...,\frac{\partial\mathcal{L}}{\partial z^{[l]}_{n^{[l]}}}\frac{\partial z^{[l]}_{n^{[l]}}}{\partial b^{[l]}_{n^{[l]}}}\end{pmatrix}^T
db[l]=(∂z1[l]∂L∂b1[l]∂z1[l],∂z2[l]∂L∂b2[l]∂z2[l],...,∂zn[l][l]∂L∂bn[l][l]∂zn[l][l])T
由于
b
[
l
]
b^{[l]}
b[l]的系数为
1
1
1,因此
d
b
[
l
]
=
d
z
[
l
]
db^{[l]}=dz^{[l]}
db[l]=dz[l]
接下来对
W
[
l
]
W^{[l]}
W[l]求导,根据矩阵乘法规则,
z
[
l
]
z^{[l]}
z[l]的一个元素对应于矩阵
W
[
l
]
W^{[l]}
W[l]的一行,因此求导时应该是
d
W
[
l
]
=
(
∂
L
∂
z
1
[
l
]
∂
z
1
[
l
]
W
1
:
[
l
]
∂
L
∂
z
2
[
l
]
∂
z
2
[
l
]
W
2
:
[
l
]
⋮
∂
L
∂
z
n
[
l
]
[
l
]
∂
z
n
[
l
]
[
l
]
W
n
[
l
]
:
[
l
]
)
dW^{[l]}= \begin{pmatrix} \frac{\partial\mathcal{L}}{\partial z^{[l]}_1}\frac{\partial z^{[l]}_1}{W^{[l]}_{1:}}\\ \frac{\partial\mathcal{L}}{\partial z^{[l]}_2}\frac{\partial z^{[l]}_2}{W^{[l]}_{2:}}\\ \vdots\\ \frac{\partial\mathcal{L}}{\partial z^{[l]}_{n^{[l]}}}\frac{\partial z^{[l]}_{n^{[l]}}}{W^{[l]}_{n^{[l]}:}} \end{pmatrix}
dW[l]=⎝⎜⎜⎜⎜⎜⎜⎜⎜⎛∂z1[l]∂LW1:[l]∂z1[l]∂z2[l]∂LW2:[l]∂z2[l]⋮∂zn[l][l]∂LWn[l]:[l]∂zn[l][l]⎠⎟⎟⎟⎟⎟⎟⎟⎟⎞
这里
W
i
:
[
l
]
W^{[l]}_{i:}
Wi:[l]代表
W
[
l
]
W^{[l]}
W[l]的第
i
i
i行,是一个行向量,由于
z
i
[
l
]
=
W
i
:
[
l
]
a
[
l
]
z^{[l]}_i=W^{[l]}_{i:}a^{[l]}
zi[l]=Wi:[l]a[l]
因此
∂
z
i
[
l
]
∂
W
i
:
[
l
]
=
a
[
l
]
T
\frac{\partial z^{[l]}_i}{\partial W^{[l]}_{i:}}=a^{[l]T}
∂Wi:[l]∂zi[l]=a[l]T
最终的结果是
d
W
[
l
]
=
d
z
[
l
]
a
[
l
]
T
dW^{[l]}=dz^{[l]}a^{[l]^T}
dW[l]=dz[l]a[l]T
最后为了实现反向传播,还需要计算损失函数对
a
[
l
−
1
]
a^{[l-1]}
a[l−1]的导数
d
a
[
l
−
1
]
da^{[l-1]}
da[l−1]。跟之前不同的是,
z
[
l
]
z^{[l]}
z[l]的一个元素对应于
a
[
l
−
1
]
a^{[l-1]}
a[l−1]的每个元素,所以应该是
z
[
l
]
z^{[l]}
z[l]的每个元素分别对
a
[
l
−
1
]
a^{[l-1]}
a[l−1]求导,然后求和,也即
d
a
[
l
]
=
∑
i
=
1
n
[
l
]
∂
L
∂
z
i
[
l
]
∂
z
i
[
l
]
∂
a
[
l
−
1
]
da^{[l]}=\sum_{i=1}^{n^{[l]}}\frac{\partial\mathcal{L}}{\partial z^{[l]}_i}\frac{\partial z^{[l]}_i}{\partial a^{[l-1]}}
da[l]=i=1∑n[l]∂zi[l]∂L∂a[l−1]∂zi[l]
由于有
∂
z
i
[
l
]
∂
a
[
l
−
1
]
=
W
i
:
[
l
]
T
\frac{\partial z^{[l]}_i}{\partial a^{[l-1]}}=W^{[l]^T}_{i:}
∂a[l−1]∂zi[l]=Wi:[l]T
因此
d
a
[
l
]
=
∑
i
=
1
n
[
l
]
∂
L
∂
z
i
[
l
]
∂
z
i
[
l
]
∂
a
[
l
−
1
]
=
∑
i
=
1
n
[
l
]
W
i
:
[
l
]
T
d
z
i
[
l
]
=
W
[
l
]
T
d
z
[
l
]
\begin{aligned} da^{[l]}&=\sum_{i=1}^{n^{[l]}}\frac{\partial\mathcal{L}}{\partial z^{[l]}_i}\frac{\partial z^{[l]}_i}{\partial a^{[l-1]}}\\ &=\sum_{i=1}^{n^{[l]}}W^{[l]^T}_{i:}dz^{[l]}_i\\ &=W^{[l]^T}dz^{[l]} \end{aligned}
da[l]=i=1∑n[l]∂zi[l]∂L∂a[l−1]∂zi[l]=i=1∑n[l]Wi:[l]Tdzi[l]=W[l]Tdz[l]
至此推导出了单个样本情形的所有求导公式:
d
z
[
l
]
=
d
a
[
l
]
∗
g
[
l
]
′
(
z
[
l
]
)
d
b
[
l
]
=
d
z
[
l
]
d
W
[
l
]
=
d
z
[
l
]
a
[
l
]
T
d
a
[
l
]
=
W
[
l
]
T
d
z
[
l
]
\begin{aligned} dz^{[l]}&=d a^{[l]}*g^{[l]}{'}(z^{[l]})\\ db^{[l]}&=dz^{[l]}\\ dW^{[l]}&=dz^{[l]}a^{[l]^T}\\ da^{[l]}&=W^{[l]^T}dz^{[l]} \end{aligned}
dz[l]db[l]dW[l]da[l]=da[l]∗g[l]′(z[l])=dz[l]=dz[l]a[l]T=W[l]Tdz[l]
批量的情形:
只需要对单个样本情形进行简单的推广即可。这里先给出结果,再进行解释。
假设已经有了
d
A
[
l
]
dA^{[l]}
dA[l],那么
d
Z
[
l
]
=
d
A
[
l
]
∗
g
[
l
]
′
(
Z
[
l
]
)
dZ^{[l]}=dA^{[l]}*g^{[l]}{'}(Z^{[l]})
dZ[l]=dA[l]∗g[l]′(Z[l])
这很容易理解,因为从
Z
[
l
]
Z^{[l]}
Z[l]到
A
[
l
]
A^{[l]}
A[l]仍然是经过一个逐元素函数。
d
W
[
l
]
=
d
Z
[
l
]
A
[
l
−
1
]
T
dW^{[l]}=dZ^{[l]}A^{[l-1]^T}
dW[l]=dZ[l]A[l−1]T
在一个样本时
d
W
[
l
]
=
d
z
[
l
]
a
[
l
]
T
dW^{[l]}=dz^{[l]}a^{[l]^T}
dW[l]=dz[l]a[l]T
现在有多个样本,那么就需要求和,也就可以写成上面那种形式。
这里跟视频中的不一样,因为损失函数中的
1
m
\frac{1}{m}
m1已经包含在了上一层的求导中。
d
b
[
l
]
=
∑
i
=
1
M
d
Z
:
i
[
l
]
db^{[l]}=\sum_{i=1}^{M}dZ^{[l]}_{:i}
db[l]=i=1∑MdZ:i[l]
其中
d
Z
:
i
[
l
]
dZ^{[l]}_{:i}
dZ:i[l]代表矩阵
d
Z
[
l
]
dZ^{[l]}
dZ[l]的第
i
i
i列,这里跟
d
W
[
l
]
dW^{[l]}
dW[l]是一样的情形。
d
A
[
l
−
1
]
=
W
[
l
]
T
d
Z
[
l
]
dA^{[l-1]}=W^{[l]^T}dZ^{[l]}
dA[l−1]=W[l]TdZ[l]
在一个样本时
d
a
[
l
]
=
W
[
l
]
T
d
z
[
l
]
da^{[l]}=W^{[l]^T}dz^{[l]}
da[l]=W[l]Tdz[l]
现在有多个样本,那么
d
A
[
l
]
=
(
d
a
[
l
]
(
1
)
,
d
a
[
l
]
(
2
)
,
.
.
.
,
d
a
[
l
]
(
m
)
)
=
(
W
[
l
]
T
d
z
[
l
]
(
1
)
,
W
[
l
]
T
d
z
[
l
]
(
2
)
,
.
.
.
,
W
[
l
]
T
d
z
[
l
]
(
m
)
)
=
W
[
l
]
T
d
Z
[
l
]
\begin{aligned} dA^{[l]}&=\begin{pmatrix}da^{[l](1)},da^{[l](2)},...,da^{[l](m)}\end{pmatrix}\\ &=\begin{pmatrix}W^{[l]^T}dz^{[l](1)},W^{[l]^T}dz^{[l](2)},...,W^{[l]^T}dz^{[l](m)}\end{pmatrix}\\ &=W^{[l]^T}dZ^{[l]} \end{aligned}
dA[l]=(da[l](1),da[l](2),...,da[l](m))=(W[l]Tdz[l](1),W[l]Tdz[l](2),...,W[l]Tdz[l](m))=W[l]TdZ[l]
其中
a
[
l
]
(
i
)
a^{[l](i)}
a[l](i)代表第
i
i
i个样本在第
l
l
l层的输出,
z
[
l
]
(
i
)
z^{[l](i)}
z[l](i)同理。
至此所有的公式是
d
Z
[
l
]
=
d
A
[
l
]
∗
g
[
l
]
′
(
Z
[
l
]
)
d
b
[
l
]
=
∑
i
=
1
M
d
Z
:
i
[
l
]
d
W
[
l
]
=
d
Z
[
l
]
A
[
l
−
1
]
T
d
A
[
l
−
1
]
=
W
[
l
]
T
d
Z
[
l
]
\begin{aligned} dZ^{[l]}&=dA^{[l]}*g^{[l]}{'}(Z^{[l]})\\ db^{[l]}&=\sum_{i=1}^{M}dZ^{[l]}_{:i}\\ dW^{[l]}&=dZ^{[l]}A^{[l-1]^T}\\ dA^{[l-1]}&=W^{[l]^T}dZ^{[l]} \end{aligned}
dZ[l]db[l]dW[l]dA[l−1]=dA[l]∗g[l]′(Z[l])=i=1∑MdZ:i[l]=dZ[l]A[l−1]T=W[l]TdZ[l]