本文章包含DNN和CNN反向传播算法的详细推导,特别是CNN的反向传播算法中对权重求偏导数的公式中补零和卷积核旋转的详细推导。
反向传播算法是用来计算神经网络(NN)的可训练参数的偏导数的算法。在神经网络的训练中,对于一个参数(例如权重)的更新,往往采用下面的式子。
w
i
,
j
=
w
i
,
j
−
α
∑
k
∈
B
∂
J
k
∂
w
i
,
j
.
w_{i,j}=w_{i,j}-\alpha \sum_{k\in B}\frac{\partial J_k}{\partial w_{i,j}}.
wi,j=wi,j−αk∈B∑∂wi,j∂Jk.
其中
w
i
,
j
w_{i,j}
wi,j是某个我们想要更新的权重,
α
\alpha
α是学习率(一般比较小,例如
1
×
1
0
−
3
1\times 10^{-3}
1×10−3),
B
B
B是一个mini-batch的集合,
J
k
J_k
Jk是这个mini-batch中第
k
k
k个样本经过现有神经网络后的损失函数。如果不使用mini-batch的训练方法,即每次更新参数只输入一个样本,则上式变为
w
i
,
j
=
w
i
,
j
−
α
∂
J
∂
w
i
,
j
.
(1)
w_{i,j}=w_{i,j}-\alpha \frac{\partial J}{\partial w_{i,j}}.\tag{1}
wi,j=wi,j−α∂wi,j∂J.(1)
其中
∂
J
∂
w
i
,
j
\frac{\partial J}{\partial w_{i,j}}
∂wi,j∂J是损失函数对于该权重的偏导数。偏导数可以用数值微分的方法求得。
1. 数值微分
下面用一个简单的函数为例简要说明数值微分求偏导数的方法。考虑一个函数
z
=
f
(
x
,
y
)
z=f(x,y)
z=f(x,y),则该函数相对于
x
x
x和
y
y
y的偏导数可以表示为
∂
z
∂
x
=
l
i
m
i
t
Δ
h
→
0
f
(
x
+
Δ
h
,
y
)
−
f
(
x
−
Δ
h
,
y
)
2
Δ
h
,
∂
z
∂
y
=
l
i
m
i
t
Δ
h
→
0
f
(
x
,
y
+
Δ
h
)
−
f
(
x
,
y
−
Δ
h
)
2
Δ
h
.
\frac{\partial z}{\partial x}=limit_{\Delta h\rightarrow0}\frac{f(x+\Delta h,y)-f(x-\Delta h,y)}{2\Delta h},\\ \frac{\partial z}{\partial y}=limit_{\Delta h\rightarrow0}\frac{f(x,y+\Delta h)-f(x,y-\Delta h)}{2\Delta h}.
∂x∂z=limitΔh→02Δhf(x+Δh,y)−f(x−Δh,y),∂y∂z=limitΔh→02Δhf(x,y+Δh)−f(x,y−Δh).
所谓的数值微分的方法,是指在实际计算中,我们取
Δ
h
\Delta h
Δh为较小的值,例如
1
×
1
0
−
4
1\times 10^{-4}
1×10−4,则上述两个偏导数计算为
∂
z
∂
x
=
f
(
x
+
Δ
h
,
y
)
−
f
(
x
−
Δ
h
,
y
)
2
Δ
h
,
∂
z
∂
y
=
f
(
x
,
y
+
Δ
h
)
−
f
(
x
,
y
−
Δ
h
)
2
Δ
h
.
\frac{\partial z}{\partial x}=\frac{f(x+\Delta h,y)-f(x-\Delta h,y)}{2\Delta h},\\ \frac{\partial z}{\partial y}=\frac{f(x,y+\Delta h)-f(x,y-\Delta h)}{2\Delta h}.
∂x∂z=2Δhf(x+Δh,y)−f(x−Δh,y),∂y∂z=2Δhf(x,y+Δh)−f(x,y−Δh).
对于神经网络而言,直接计算损失函数
J
J
J的计算量大,因此计算
J
(
w
i
,
j
+
Δ
h
)
J(w_{i,j}+\Delta h)
J(wi,j+Δh)和
J
(
w
i
,
j
−
Δ
h
)
J(w_{i,j}-\Delta h)
J(wi,j−Δh)的计算量大。此外需要更新的参数量大,对于每个参数都需要计算损失函数的偏微分,所以用数值微分的方法太过复杂。因此在神经网络中,有一种成为后向传播的方法来高效地计算每个参数对应的损失函数的偏导数。
2. DNN的后向传播算法
为了简单,不考虑mini-batch,因此下面的推导针对(1)中每次只有一个样本经过神经网络的情况。对于min-batch中一次多个样本参与训练的情况,算法完全一样,区别在于更新时将所有样本的偏导数求和(对应
∑
k
∈
B
\sum_{k\in B}
∑k∈B)。
首先我们约定一些对于DNN的符号。对于层数的表示,用上标"
(
l
)
(l)
(l)",于是一个
L
L
L层的DNN有
l
=
0
,
1
,
…
L
−
1
l=0,1,\dots L-1
l=0,1,…L−1;对于向量中的元素的index,用下标表示。DNN中层
l
l
l所用的激活函数记为
σ
l
\sigma_l
σl,则如下图,对于一个向量
x
(
l
)
\bm{x}^{(l)}
x(l),他通过激活函数后记为
σ
l
(
x
(
l
)
)
\sigma_l(\bm{x}^{(l)})
σl(x(l))。(实际上,激活函数是否相同不影响算法的推导正确性,这里只是为了表示简单。)对于神经网络的层
l
l
l,他的输入是上一层的输出向量
y
(
l
−
1
)
\bm{y}^{(l-1)}
y(l−1),这里用列向量表示,即
y
l
−
1
=
[
y
0
(
l
−
1
)
y
1
(
l
−
1
)
⋮
y
n
l
−
1
−
1
(
l
−
1
)
]
.
\bm{y}^{l-1}= \left[ \begin{array}{c} y^{(l-1)}_0\\ y^{(l-1)}_1\\ \vdots\\ y^{(l-1)}_{n_{l-1}-1} \end{array} \right].
yl−1=⎣⎢⎢⎢⎢⎡y0(l−1)y1(l−1)⋮ynl−1−1(l−1)⎦⎥⎥⎥⎥⎤.
其中
n
l
−
1
n_{l-1}
nl−1是该列向量的长度,也是上一层(层
l
−
1
l-1
l−1)的输出数目。图中的
n
(
l
−
1
)
n(l-1)
n(l−1)即文中的
n
l
−
1
n_{l-1}
nl−1。于是我们有
y
(
l
)
=
σ
l
(
x
(
l
)
)
,
l
=
0
,
1
,
…
,
L
−
1.
\bm{y}^{(l)}=\sigma_l(\bm{x}^{(l)}), l=0,1,\dots,L-1.
y(l)=σl(x(l)),l=0,1,…,L−1.
层
l
l
l的权重用矩阵
W
(
l
)
\bm{W}^{(l)}
W(l)表示,有
W
(
l
)
=
[
W
0
,
0
(
l
)
W
0
,
1
(
l
)
…
W
0
,
n
l
−
1
−
1
(
l
)
W
1
,
0
(
l
)
W
1
,
1
(
l
)
…
W
1
,
n
l
−
1
−
1
(
l
)
⋮
⋮
⋱
⋮
W
n
l
−
1
,
0
(
l
)
W
n
l
−
1
,
1
(
l
)
…
W
n
l
−
1
,
n
l
−
1
−
1
(
l
)
]
,
\bm{W}^{(l)}= \left[ \begin{array}{cccc} W^{(l)}_{0,0} & W^{(l)}_{0,1} & \dots & W^{(l)}_{0,n_{l-1}-1}\\ W^{(l)}_{1,0} & W^{(l)}_{1,1} & \dots & W^{(l)}_{1,n_{l-1}-1}\\ \vdots&\vdots&\ddots&\vdots\\ W^{(l)}_{n_l-1,0} & W^{(l)}_{n_l-1,1} & \dots & W^{(l)}_{n_l-1,n_{l-1}-1} \end{array} \right],
W(l)=⎣⎢⎢⎢⎢⎡W0,0(l)W1,0(l)⋮Wnl−1,0(l)W0,1(l)W1,1(l)⋮Wnl−1,1(l)……⋱…W0,nl−1−1(l)W1,nl−1−1(l)⋮Wnl−1,nl−1−1(l)⎦⎥⎥⎥⎥⎤,
和
x
(
l
)
=
W
(
l
)
y
(
l
−
1
)
+
b
(
l
)
.
\bm{x}^{(l)}=\bm{W}^{(l)}\bm{y}^{(l-1)}+\bm{b}^{(l)}.
x(l)=W(l)y(l−1)+b(l).
其中
b
(
l
)
\bm{b}^{(l)}
b(l)是层
l
l
l的偏置(bias)向量。
有了上述符号,我们下面来推导DNN的反向传播算法
2.1 多元复合函数的微分:链式法则
反向传播算法求偏导的最重要的数学基础就是多元复合函数微分中的链式法则。一个简单的例子是,考虑函数
z
=
h
(
x
,
y
)
z=h(x,y)
z=h(x,y),
x
=
f
(
t
)
x=f(t)
x=f(t)和
y
=
g
(
t
)
y=g(t)
y=g(t),则有
∂
z
∂
t
=
∂
z
∂
x
∂
x
∂
t
+
∂
z
∂
y
∂
y
∂
t
.
\frac{\partial z}{\partial t}=\frac{\partial z}{\partial x}\frac{\partial x}{\partial t}+\frac{\partial z}{\partial y}\frac{\partial y}{\partial t}.
∂t∂z=∂x∂z∂t∂x+∂y∂z∂t∂y.
考虑一般情况
z
z
z是变量
y
0
,
y
1
,
…
,
y
n
y
−
1
y_0,y_1,\dots,y_{n_y-1}
y0,y1,…,yny−1的函数,同时
y
i
y_{i}
yi(
i
=
0
,
1
,
…
,
n
y
−
1
i=0,1,\dots,n_y-1
i=0,1,…,ny−1)均是
x
0
,
x
1
,
…
,
x
n
x
−
1
x_0,x_1,\dots,x_{n_x-1}
x0,x1,…,xnx−1的函数,则
z
z
z对于
x
i
x_i
xi(
i
=
0
,
1
,
…
,
n
x
−
1
i=0,1,\dots,n_x-1
i=0,1,…,nx−1)的偏导可以利用链式法则表示为
∂
z
∂
x
i
=
∑
i
=
0
n
y
−
1
∂
z
∂
y
i
∑
j
=
0
n
x
−
1
∂
y
i
∂
x
j
=
∑
i
=
0
n
y
−
1
∑
j
=
0
n
x
−
1
∂
z
∂
y
i
∂
y
i
∂
x
j
.
\frac{\partial z}{\partial x_i}=\sum^{n_y-1}_{i=0}\frac{\partial z}{\partial y_i}\sum^{n_x-1}_{j=0}\frac{\partial y_i}{\partial x_j}=\sum^{n_y-1}_{i=0}\sum^{n_x-1}_{j=0}\frac{\partial z}{\partial y_i}\frac{\partial y_i}{\partial x_j}.
∂xi∂z=i=0∑ny−1∂yi∂zj=0∑nx−1∂xj∂yi=i=0∑ny−1j=0∑nx−1∂yi∂z∂xj∂yi.
2.2 最后一层(层 L − 1 L-1 L−1)的偏导数
要求损失函数对于权重的偏导
∂
J
∂
W
(
L
−
1
)
\frac{\partial J}{\partial \bm{W}^{(L-1)}}
∂W(L−1)∂J,需要先求损失函数对于
x
(
L
−
1
)
\bm{x}^{(L-1)}
x(L−1)的偏导,因为
x
(
L
−
1
)
=
W
(
L
−
1
)
y
(
L
−
2
)
+
b
(
L
−
1
)
,
\bm{x}^{(L-1)}=\bm{W}^{(L-1)}\bm{y}^{(L-2)}+\bm{b}^{(L-1)},
x(L−1)=W(L−1)y(L−2)+b(L−1),
所以
∂
J
∂
W
(
L
−
1
)
\frac{\partial J}{\partial \bm{W}^{(L-1)}}
∂W(L−1)∂J可以通过链式法则计算得到。同理,要通过链式法则求损失函数对于
x
(
L
−
1
)
\bm{x}^{(L-1)}
x(L−1)的偏导
∂
J
∂
x
(
L
−
1
)
\frac{\partial J}{\partial \bm{x}^{(L-1)}}
∂x(L−1)∂J,需要先求损失函数对于
y
(
L
−
1
)
\bm{y}^{(L-1)}
y(L−1)的偏导
∂
J
∂
y
(
L
−
1
)
\frac{\partial J}{\partial \bm{y}^{(L-1)}}
∂y(L−1)∂J。
在后面的推导中,损失函数对于
x
(
l
)
\bm{x}^{(l)}
x(l)的偏导
∂
J
∂
x
(
l
)
\frac{\partial J}{\partial \bm{x}^{(l)}}
∂x(l)∂J是一个重要的中间量,因此我们记为
δ
(
l
)
=
∂
J
∂
x
(
l
)
,
l
=
0
,
1
,
…
,
L
−
1.
\bm{\delta}^{(l)}=\frac{\partial J}{\partial \bm{x}^{(l)}}, l=0,1,\dots,L-1.
δ(l)=∂x(l)∂J,l=0,1,…,L−1.
假设最后一层的输出
y
(
L
−
1
)
\bm{y}^{(L-1)}
y(L−1)是一个标量,则有
y
(
L
−
1
)
=
σ
L
−
1
(
x
(
L
−
1
)
)
y^{(L-1)}=\sigma_{L-1}(\bm{x}^{(L-1)})
y(L−1)=σL−1(x(L−1))。例如在图片识别中,将
x
(
L
−
1
)
\bm{x}^{(L-1)}
x(L−1)通过softmax函数,得到一个图片标签的预测值。假设损失函数是均方差,样本的标签为
t
t
t,那么有
J
=
1
2
(
y
(
L
−
1
)
−
t
)
2
=
1
2
(
σ
L
−
1
(
x
(
L
−
1
)
)
−
t
)
2
.
J=\frac{1}{2}(y^{(L-1)}-t)^2=\frac{1}{2}(\sigma_{L-1}(\bm{x}^{(L-1)})-t)^2.
J=21(y(L−1)−t)2=21(σL−1(x(L−1))−t)2.
显然,
∂
J
∂
y
(
L
−
1
)
=
y
(
L
−
1
)
−
t
.
\frac{\partial J}{\partial y^{(L-1)}}=y^{(L-1)}-t.
∂y(L−1)∂J=y(L−1)−t.
我们需要进一步求
δ
(
L
−
1
)
=
∂
J
∂
x
(
L
−
1
)
\bm{\delta}^{(L-1)}=\frac{\partial J}{\partial \bm{x}^{(L-1)}}
δ(L−1)=∂x(L−1)∂J.根据链式法则,
δ
i
(
L
−
1
)
=
∂
J
∂
x
i
(
L
−
1
)
=
∂
J
∂
y
(
L
−
1
)
∂
y
(
L
−
1
)
∂
x
i
(
L
−
1
)
=
(
y
(
L
−
1
)
−
t
)
∂
σ
L
−
1
(
x
(
L
−
1
)
)
∂
x
i
(
L
−
1
)
.
\delta^{(L-1)}_i=\frac{\partial J}{\partial x^{(L-1)}_i}=\frac{\partial J}{\partial y^{(L-1)}}\frac{\partial y^{(L-1)}}{\partial x^{(L-1)}_i}=(y^{(L-1)}-t)\frac{\partial \sigma_{L-1}(\bm{x}^{(L-1)})}{\partial x^{(L-1)}_i}.
δi(L−1)=∂xi(L−1)∂J=∂y(L−1)∂J∂xi(L−1)∂y(L−1)=(y(L−1)−t)∂xi(L−1)∂σL−1(x(L−1)).
写成向量形式,为
δ
(
L
−
1
)
=
∂
J
∂
x
(
L
−
1
)
=
(
y
(
L
−
1
)
−
t
)
(
σ
L
−
1
′
(
x
(
L
−
1
)
)
.
\bm{\delta}^{(L-1)}=\frac{\partial J}{\partial \bm{x}^{(L-1)}}=(y^{(L-1)}-t)(\sigma^{'}_{L-1}(\bm{x}^{(L-1)}).
δ(L−1)=∂x(L−1)∂J=(y(L−1)−t)(σL−1′(x(L−1)).
至此,我们展示了如何计算DNN最后一层的
δ
(
L
−
1
)
\bm{\delta}^{(L-1)}
δ(L−1)。
2.3 中间层 l l l的偏导数
这一节我们展示如何通过
δ
(
l
)
\bm{\delta}^{(l)}
δ(l)反向传播计算得到
δ
(
l
−
1
)
\bm{\delta}^{(l-1)}
δ(l−1)。
因为有
x
(
l
)
=
W
(
l
)
y
(
l
−
1
)
=
W
(
l
)
σ
l
−
1
(
x
(
l
−
1
)
)
\bm{x}^{(l)}=\bm{W}^{(l)}\bm{y}^{(l-1)}=\bm{W}^{(l)}\sigma_{l-1}(\bm{x}^{(l-1)})
x(l)=W(l)y(l−1)=W(l)σl−1(x(l−1)),我们先考虑由
δ
(
l
)
=
∂
J
∂
x
(
l
)
\bm{\delta}^{(l)}=\frac{\partial J}{\partial \bm{x}^{(l)}}
δ(l)=∂x(l)∂J计算
∂
J
∂
y
(
l
−
1
)
\frac{\partial J}{\partial \bm{y}^{(l-1)}}
∂y(l−1)∂J。重写
x
(
l
)
\bm{x}^{(l)}
x(l)和
y
(
l
−
1
)
\bm{y}^{(l-1)}
y(l−1)如下
[
x
0
(
l
)
x
1
(
l
)
⋮
x
n
l
−
1
(
l
)
]
=
[
W
0
,
0
(
l
)
W
0
,
1
(
l
)
…
W
0
,
n
l
−
1
−
1
(
l
)
W
1
,
0
(
l
)
W
1
,
1
(
l
)
…
W
1
,
n
l
−
1
−
1
(
l
)
⋮
⋮
⋱
⋮
W
n
l
−
1
,
0
(
l
)
W
n
l
−
1
,
1
(
l
)
…
W
n
l
−
1
,
n
l
−
1
−
1
(
l
)
]
[
y
0
(
l
−
1
)
y
1
(
l
−
1
)
⋮
y
n
l
−
1
−
1
(
l
−
1
)
]
+
[
b
0
(
l
)
b
1
(
l
)
⋮
b
n
l
−
1
(
l
)
]
.
\left[ \begin{array}{c} x^{(l)}_0\\ x^{(l)}_1\\ \vdots\\ x^{(l)}_{n_l-1} \end{array} \right] =\left[ \begin{array}{cccc} W^{(l)}_{0,0} & W^{(l)}_{0,1} & \dots & W^{(l)}_{0,n_{l-1}-1}\\ W^{(l)}_{1,0} & W^{(l)}_{1,1} & \dots & W^{(l)}_{1,n_{l-1}-1}\\ \vdots&\vdots&\ddots&\vdots\\ W^{(l)}_{n_l-1,0} & W^{(l)}_{n_l-1,1} & \dots & W^{(l)}_{n_l-1,n_{l-1}-1} \end{array} \right] \left[ \begin{array}{c} y^{(l-1)}_0\\ y^{(l-1)}_1\\ \vdots\\ y^{(l-1)}_{n_{l-1}-1} \end{array} \right]+ \left[ \begin{array}{c} b^{(l)}_0\\ b^{(l)}_1\\ \vdots\\ b^{(l)}_{n_{l}-1} \end{array} \right].
⎣⎢⎢⎢⎢⎡x0(l)x1(l)⋮xnl−1(l)⎦⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡W0,0(l)W1,0(l)⋮Wnl−1,0(l)W0,1(l)W1,1(l)⋮Wnl−1,1(l)……⋱…W0,nl−1−1(l)W1,nl−1−1(l)⋮Wnl−1,nl−1−1(l)⎦⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎡y0(l−1)y1(l−1)⋮ynl−1−1(l−1)⎦⎥⎥⎥⎥⎤+⎣⎢⎢⎢⎢⎡b0(l)b1(l)⋮bnl−1(l)⎦⎥⎥⎥⎥⎤.
根据链式法则不难看出
∂
J
∂
y
i
(
l
−
1
)
=
∂
J
∂
x
0
(
l
)
W
0
,
i
(
l
)
+
∂
J
∂
x
1
(
l
)
W
1
,
i
(
l
)
+
⋯
+
∂
J
∂
x
n
l
−
1
(
l
)
W
n
l
−
1
,
i
(
l
)
,
i
=
0
,
1
,
…
,
n
l
−
1
−
1.
\frac{\partial J}{\partial y^{(l-1)}_i}=\frac{\partial J}{\partial x^{(l)}_0}W^{(l)}_{0,i}+\frac{\partial J}{\partial x^{(l)}_1}W^{(l)}_{1,i}+\dots+\frac{\partial J}{\partial x^{(l)}_{n_l-1}}W^{(l)}_{n_l-1,i}, i=0,1,\dots,n_{l-1}-1.
∂yi(l−1)∂J=∂x0(l)∂JW0,i(l)+∂x1(l)∂JW1,i(l)+⋯+∂xnl−1(l)∂JWnl−1,i(l),i=0,1,…,nl−1−1.
所以写成向量形式,有
∂
J
∂
y
i
(
l
−
1
)
=
[
W
0
,
i
(
l
)
,
W
1
,
i
(
l
)
,
…
,
W
n
l
−
1
,
i
(
l
)
]
[
∂
J
∂
x
0
(
l
)
∂
J
∂
x
1
(
l
)
⋮
∂
J
∂
x
n
l
−
1
(
l
)
]
=
[
W
0
,
i
(
l
)
,
W
1
,
i
(
l
)
,
…
,
W
n
l
−
1
,
i
(
l
)
]
δ
(
l
)
,
i
=
0
,
1
,
…
,
n
l
−
1
−
1.
\frac{\partial J}{\partial y^{(l-1)}_i}=\left[W^{(l)}_{0,i},W^{(l)}_{1,i},\dots,W^{(l)}_{n_l-1,i}\right] \left[ \begin{array}{c} \frac{\partial J}{\partial x^{(l)}_0}\\ \frac{\partial J}{\partial x^{(l)}_1}\\ \vdots\\ \frac{\partial J}{\partial x^{(l)}_{n_l-1}} \end{array} \right]=\left[W^{(l)}_{0,i},W^{(l)}_{1,i},\dots,W^{(l)}_{n_l-1,i}\right]\bm{\delta}^{(l)},\\ i=0,1,\dots,n_{l-1}-1.
∂yi(l−1)∂J=[W0,i(l),W1,i(l),…,Wnl−1,i(l)]⎣⎢⎢⎢⎢⎢⎡∂x0(l)∂J∂x1(l)∂J⋮∂xnl−1(l)∂J⎦⎥⎥⎥⎥⎥⎤=[W0,i(l),W1,i(l),…,Wnl−1,i(l)]δ(l),i=0,1,…,nl−1−1.
进一步,
∂
J
∂
y
(
l
−
1
)
=
[
∂
J
∂
y
0
(
l
−
1
)
∂
J
∂
y
1
(
l
−
1
)
⋮
∂
J
∂
y
n
l
−
1
−
1
(
l
−
1
)
]
=
[
W
0
,
0
(
l
)
W
1
,
0
(
l
)
…
W
n
l
−
1
,
0
(
l
)
W
0
,
1
(
l
)
W
1
,
1
(
l
)
…
W
n
l
−
1
,
1
(
l
)
⋮
⋮
⋱
⋮
W
0
,
n
l
−
1
−
1
(
l
)
W
1
,
n
l
−
1
−
1
(
l
)
…
W
n
l
−
1
,
n
l
−
1
−
1
(
l
)
]
δ
(
l
)
=
(
W
(
l
)
)
T
δ
(
l
)
.
\frac{\partial J}{\partial \bm{y}^{(l-1)}}= \left[ \begin{array}{c} \frac{\partial J}{\partial y^{(l-1)}_0}\\ \frac{\partial J}{\partial y^{(l-1)}_1}\\ \vdots\\ \frac{\partial J}{\partial y^{(l-1)}_{n_{l-1}-1}} \end{array} \right]= \left[ \begin{array}{cccc} W^{(l)}_{0,0}&W^{(l)}_{1,0}&\dots&W^{(l)}_{n_l-1,0}\\ W^{(l)}_{0,1}&W^{(l)}_{1,1}&\dots&W^{(l)}_{n_l-1,1}\\ \vdots&\vdots&\ddots&\vdots\\ W^{(l)}_{0,n_{l-1}-1}&W^{(l)}_{1,n_{l-1}-1}&\dots&W^{(l)}_{n_l-1,n_{l-1}-1} \end{array} \right] \bm{\delta}^{(l)}=(\bm{W}^{(l)})^T\bm{\delta}^{(l)}.
∂y(l−1)∂J=⎣⎢⎢⎢⎢⎢⎡∂y0(l−1)∂J∂y1(l−1)∂J⋮∂ynl−1−1(l−1)∂J⎦⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡W0,0(l)W0,1(l)⋮W0,nl−1−1(l)W1,0(l)W1,1(l)⋮W1,nl−1−1(l)……⋱…Wnl−1,0(l)Wnl−1,1(l)⋮Wnl−1,nl−1−1(l)⎦⎥⎥⎥⎥⎤δ(l)=(W(l))Tδ(l).
于是,
δ
(
l
−
1
)
=
[
∂
J
∂
x
0
(
l
−
1
)
∂
J
∂
x
1
(
l
−
1
)
⋮
∂
J
∂
x
n
l
−
1
−
1
(
l
−
1
)
]
=
[
∂
J
∂
y
0
(
l
−
1
)
σ
l
−
1
′
(
x
0
(
l
−
1
)
)
∂
J
∂
y
1
(
l
−
1
)
σ
l
−
1
′
(
x
1
(
l
−
1
)
)
⋮
∂
J
∂
y
n
l
−
1
−
1
(
l
−
1
)
σ
l
−
1
′
(
x
n
l
−
1
−
1
(
l
−
1
)
)
]
=
(
W
(
l
)
)
T
δ
(
l
)
⊙
σ
l
−
1
′
(
x
(
l
−
1
)
)
.
\bm{\delta}^{(l-1)}= \left[ \begin{array}{c} \frac{\partial J}{\partial x^{(l-1)}_0}\\ \frac{\partial J}{\partial x^{(l-1)}_1}\\ \vdots\\ \frac{\partial J}{\partial x^{(l-1)}_{n_{l-1}-1}} \end{array} \right]= \left[ \begin{array}{c} \frac{\partial J}{\partial y^{(l-1)}_0}\sigma^{'}_{l-1}(x^{(l-1)}_0)\\ \frac{\partial J}{\partial y^{(l-1)}_1}\sigma^{'}_{l-1}(x^{(l-1)}_1)\\ \vdots\\ \frac{\partial J}{\partial y^{(l-1)}_{n_{l-1}-1}}\sigma^{'}_{l-1}(x^{(l-1)}_{n_{l-1}-1}) \end{array} \right]=(\bm{W}^{(l)})^T\bm{\delta}^{(l)}\odot\sigma^{'}_{l-1}(\bm{x}^{(l-1)}).
δ(l−1)=⎣⎢⎢⎢⎢⎢⎡∂x0(l−1)∂J∂x1(l−1)∂J⋮∂xnl−1−1(l−1)∂J⎦⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎢⎡∂y0(l−1)∂Jσl−1′(x0(l−1))∂y1(l−1)∂Jσl−1′(x1(l−1))⋮∂ynl−1−1(l−1)∂Jσl−1′(xnl−1−1(l−1))⎦⎥⎥⎥⎥⎥⎥⎤=(W(l))Tδ(l)⊙σl−1′(x(l−1)).
其中
⊙
\odot
⊙是点乘。至此,我们推导出DNN中前几层
δ
(
l
)
\bm{\delta}^{(l)}
δ(l)的递推关系
δ
(
l
−
1
)
=
(
W
(
l
)
)
T
δ
(
l
)
⊙
σ
l
−
1
′
(
x
(
l
−
1
)
)
\bm{\delta}^{(l-1)}=(\bm{W}^{(l)})^T\bm{\delta}^{(l)}\odot\sigma^{'}_{l-1}(\bm{x}^{(l-1)})
δ(l−1)=(W(l))Tδ(l)⊙σl−1′(x(l−1))。可见,反向传播时,层
l
l
l的
δ
\delta
δ左乘该层权重矩阵
W
(
l
)
\bm{W}^{(l)}
W(l)的转置,再点乘层
l
−
1
l-1
l−1的激活函数的导数向量。
2.4 权重 W ( l ) \bm{W}^{(l)} W(l)和偏置 b ( l ) \bm{b}^{(l)} b(l)的偏导
在讲如何计算每层权重和偏置的偏导之前,先总结一下前面的结果。
输出层 L − 1 L-1 L−1 | δ ( L − 1 ) = ∂ J ∂ y ( L − 1 ) ⊙ σ L − 1 ′ ( x ( L − 1 ) ) \bm{\delta}^{(L-1)}=\frac{\partial J}{\partial \bm{y}^{(L-1)}}\odot\sigma^{'}_{L-1}(\bm{x}^{(L-1)}) δ(L−1)=∂y(L−1)∂J⊙σL−1′(x(L−1)) |
---|---|
前面层 l l l, l = 1 , … , L − 1 l=1,\dots,L-1 l=1,…,L−1 | δ ( l − 1 ) = ( W ( l ) ) T δ ( l ) ⊙ σ l − 1 ′ ( x ( l − 1 ) ) \bm{\delta}^{(l-1)}=(\bm{W}^{(l)})^T\bm{\delta}^{(l)}\odot\sigma^{'}_{l-1}(\bm{x}^{(l-1)}) δ(l−1)=(W(l))Tδ(l)⊙σl−1′(x(l−1)) |
利用这两个式子,可以求出所有层的
δ
(
l
)
\bm{\delta}^{(l)}
δ(l)。
为了方便,重写前面的一个式子。
[
x
0
(
l
)
x
1
(
l
)
⋮
x
n
l
−
1
(
l
)
]
=
[
W
0
,
0
(
l
)
W
0
,
1
(
l
)
…
W
0
,
n
l
−
1
−
1
(
l
)
W
1
,
0
(
l
)
W
1
,
1
(
l
)
…
W
1
,
n
l
−
1
−
1
(
l
)
⋮
⋮
⋱
⋮
W
n
l
−
1
,
0
(
l
)
W
n
l
−
1
,
1
(
l
)
…
W
n
l
−
1
,
n
l
−
1
−
1
(
l
)
]
[
y
0
(
l
−
1
)
y
1
(
l
−
1
)
⋮
y
n
l
−
1
−
1
(
l
−
1
)
]
+
[
b
0
(
l
)
b
1
(
l
)
⋮
b
n
l
−
1
(
l
)
]
.
\left[ \begin{array}{c} x^{(l)}_0\\ x^{(l)}_1\\ \vdots\\ x^{(l)}_{n_l-1} \end{array} \right] =\left[ \begin{array}{cccc} W^{(l)}_{0,0} & W^{(l)}_{0,1} & \dots & W^{(l)}_{0,n_{l-1}-1}\\ W^{(l)}_{1,0} & W^{(l)}_{1,1} & \dots & W^{(l)}_{1,n_{l-1}-1}\\ \vdots&\vdots&\ddots&\vdots\\ W^{(l)}_{n_l-1,0} & W^{(l)}_{n_l-1,1} & \dots & W^{(l)}_{n_l-1,n_{l-1}-1} \end{array} \right] \left[ \begin{array}{c} y^{(l-1)}_0\\ y^{(l-1)}_1\\ \vdots\\ y^{(l-1)}_{n_{l-1}-1} \end{array} \right]+ \left[ \begin{array}{c} b^{(l)}_0\\ b^{(l)}_1\\ \vdots\\ b^{(l)}_{n_{l}-1} \end{array} \right].
⎣⎢⎢⎢⎢⎡x0(l)x1(l)⋮xnl−1(l)⎦⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡W0,0(l)W1,0(l)⋮Wnl−1,0(l)W0,1(l)W1,1(l)⋮Wnl−1,1(l)……⋱…W0,nl−1−1(l)W1,nl−1−1(l)⋮Wnl−1,nl−1−1(l)⎦⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎡y0(l−1)y1(l−1)⋮ynl−1−1(l−1)⎦⎥⎥⎥⎥⎤+⎣⎢⎢⎢⎢⎡b0(l)b1(l)⋮bnl−1(l)⎦⎥⎥⎥⎥⎤.
在该式中,含有权重
W
(
l
)
\bm{W}^{(l)}
W(l)和偏置
b
(
l
)
\bm{b}^{(l)}
b(l),而我们现在已经得到了每一层的
δ
(
l
)
=
∂
J
∂
x
(
l
)
\bm{\delta}^{(l)}=\frac{\partial J}{\partial \bm{x}^{(l)}}
δ(l)=∂x(l)∂J,因此利用链式法则计算
∂
J
∂
W
(
l
)
\frac{\partial J}{\partial \bm{W}^{(l)}}
∂W(l)∂J和
∂
J
∂
b
(
l
)
\frac{\partial J}{\partial \bm{b}^{(l)}}
∂b(l)∂J并不困难。注意
∂
J
∂
W
(
l
)
\frac{\partial J}{\partial \bm{W}^{(l)}}
∂W(l)∂J是一个矩阵:
∂
J
∂
W
(
l
)
=
[
∂
J
∂
W
0
,
0
(
l
)
∂
J
∂
W
0
,
1
(
l
)
…
∂
J
∂
W
0
,
n
l
−
1
−
1
(
l
)
∂
J
∂
W
1
,
0
(
l
)
∂
J
∂
W
1
,
1
(
l
)
…
∂
J
∂
W
1
,
n
l
−
1
−
1
(
l
)
⋮
⋮
⋱
⋮
∂
J
∂
W
n
l
−
1
,
0
(
l
)
∂
J
∂
W
n
l
−
1
,
1
(
l
)
…
∂
J
∂
W
n
l
−
1
,
n
l
−
1
−
1
(
l
)
]
=
[
∂
J
∂
x
0
(
l
)
y
0
(
l
−
1
)
∂
J
∂
x
0
(
l
)
y
1
(
l
−
1
)
…
∂
J
∂
x
0
(
l
)
y
n
l
−
1
−
1
(
l
−
1
)
∂
J
∂
x
1
(
l
)
y
0
(
l
−
1
)
∂
J
∂
x
1
(
l
)
y
1
(
l
−
1
)
…
∂
J
∂
x
1
(
l
)
y
n
l
−
1
−
1
(
l
−
1
)
⋮
⋮
⋱
⋮
∂
J
∂
x
n
l
−
1
(
l
)
y
0
(
l
−
1
)
∂
J
∂
x
n
l
−
1
(
l
)
y
1
(
l
−
1
)
…
∂
J
∂
x
n
l
−
1
(
l
)
y
n
l
−
1
−
1
(
l
−
1
)
]
=
δ
(
l
)
(
y
(
l
−
1
)
)
T
.
\begin{aligned} \frac{\partial J}{\partial \bm{W}^{(l)}}&= \left[ \begin{array}{cccc} \frac{\partial J}{\partial W^{(l)}_{0,0}} & \frac{\partial J}{\partial W^{(l)}_{0,1}} & \dots & \frac{\partial J}{\partial W^{(l)}_{0,n_{l-1}-1}}\\ \frac{\partial J}{\partial W^{(l)}_{1,0}} & \frac{\partial J}{\partial W^{(l)}_{1,1}} & \dots & \frac{\partial J}{\partial W^{(l)}_{1,n_{l-1}-1}}\\ \vdots&\vdots&\ddots&\vdots\\ \frac{\partial J}{\partial W^{(l)}_{n_l-1,0}} & \frac{\partial J}{\partial W^{(l)}_{n_l-1,1}} & \dots & \frac{\partial J}{\partial W^{(l)}_{n_l-1,n_{l-1}-1}} \end{array} \right]\\ &=\left[ \begin{array}{cccc} \frac{\partial J}{\partial x^{(l)}_{0}}y^{(l-1)}_0 & \frac{\partial J}{\partial x^{(l)}_{0}}y^{(l-1)}_1 & \dots & \frac{\partial J}{\partial x^{(l)}_{0}}y^{(l-1)}_{n_{l-1}-1}\\ \frac{\partial J}{\partial x^{(l)}_{1}}y^{(l-1)}_0 & \frac{\partial J}{\partial x^{(l)}_{1}}y^{(l-1)}_1 & \dots & \frac{\partial J}{\partial x^{(l)}_{1}}y^{(l-1)}_{n_{l-1}-1}\\ \vdots&\vdots&\ddots&\vdots\\ \frac{\partial J}{\partial x^{(l)}_{n_l-1}}y^{(l-1)}_0 & \frac{\partial J}{\partial x^{(l)}_{n_l-1}}y^{(l-1)}_1 & \dots & \frac{\partial J}{\partial x^{(l)}_{n_l-1}}y^{(l-1)}_{n_{l-1}-1} \end{array} \right]\\ &=\bm{\delta}^{(l)}(\bm{y}^{(l-1)})^T \end{aligned}.
∂W(l)∂J=⎣⎢⎢⎢⎢⎢⎢⎡∂W0,0(l)∂J∂W1,0(l)∂J⋮∂Wnl−1,0(l)∂J∂W0,1(l)∂J∂W1,1(l)∂J⋮∂Wnl−1,1(l)∂J……⋱…∂W0,nl−1−1(l)∂J∂W1,nl−1−1(l)∂J⋮∂Wnl−1,nl−1−1(l)∂J⎦⎥⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎢⎡∂x0(l)∂Jy0(l−1)∂x1(l)∂Jy0(l−1)⋮∂xnl−1(l)∂Jy0(l−1)∂x0(l)∂Jy1(l−1)∂x1(l)∂Jy1(l−1)⋮∂xnl−1(l)∂Jy1(l−1)……⋱…∂x0(l)∂Jynl−1−1(l−1)∂x1(l)∂Jynl−1−1(l−1)⋮∂xnl−1(l)∂Jynl−1−1(l−1)⎦⎥⎥⎥⎥⎥⎥⎤=δ(l)(y(l−1))T.
可见,某一层的损失函数关于权重的偏导数是当前层的
δ
(
l
)
\bm{\delta}^{(l)}
δ(l)右乘当前层的输入向量的转置。注意这里当
l
=
0
l=0
l=0的时候,
y
(
l
−
1
)
\bm{y}^{(l-1)}
y(l−1)应该取整个DNN的输入数据向量。
∂
J
∂
b
(
l
)
\frac{\partial J}{\partial \bm{b}^{(l)}}
∂b(l)∂J同样利用链式法则,发现其等于
δ
(
l
)
\bm{\delta}^{(l)}
δ(l).
∂ J ∂ W ( l ) = δ ( l ) ( y ( l − 1 ) ) T \frac{\partial J}{\partial \bm{W}^{(l)}}=\bm{\delta}^{(l)}(\bm{y}^{(l-1)})^T ∂W(l)∂J=δ(l)(y(l−1))T |
---|
∂ J ∂ b ( l ) = δ ( l ) \frac{\partial J}{\partial \bm{b}^{(l)}}=\bm{\delta}^{(l)} ∂b(l)∂J=δ(l) |
3. CNN的后向传播算法
CNN和DNN在后向传播算法的推导上最大的区别在于:1.CNN基本是二维矩阵的计算(除了全连接层);DNN基本是向量的计算。2.CNN含有DNN没有的卷积层和池化层。因此,下面从卷积和池化两个方面来说明CNN的后向传播算法。全连接层的后向传播算法与DNN完全相同。
3.1 池化层的后向传播
假设层
l
l
l是一个池化层,如上图。需要注意,他的前一层可能是不待激活函数的卷积层,虽然图中画了激活函数,但是可以认为该激活函数为
y
(
l
−
1
)
=
σ
l
−
1
(
x
(
l
−
1
)
)
=
x
(
l
−
1
)
\bm{y}^{(l-1)}=\sigma_{l-1}(\bm{x}^{(l-1)})=\bm{x}^{(l-1)}
y(l−1)=σl−1(x(l−1))=x(l−1)。图中也标出了张量数据的大小,例如
x
(
l
−
1
)
\bm{x}^{(l-1)}
x(l−1)含有
c
l
−
1
c_{l-1}
cl−1个通道,每个通道上的特征图的大小为
m
l
−
1
×
n
l
−
1
m_{l-1}\times n_{l-1}
ml−1×nl−1。值得注意的是,对于池化层,池化前后通道数目不变,即
c
l
=
c
l
−
1
c_l=c_{l-1}
cl=cl−1。最常见的池化为最大池化和平均池化。类似于DNN中的符号,在CNN中我们也记
δ
(
l
)
=
∂
J
∂
x
(
l
)
\bm{\delta}^{(l)}=\frac{\partial J}{\partial \bm{x}^{(l)}}
δ(l)=∂x(l)∂J,但是这里的
x
(
l
)
\bm{x}^{(l)}
x(l)是高维张量。
考虑通道数目为1,即
c
l
=
c
l
−
1
=
1
c_l=c_{l-1}=1
cl=cl−1=1,并另
m
l
−
1
×
n
l
−
1
=
4
×
4
m_{l-1}\times n_{l-1}=4\times 4
ml−1×nl−1=4×4。设池化长度为
2
×
2
2\times 2
2×2,步长为2,则有
m
l
×
n
l
=
2
×
2
m_{l}\times n_{l}=2\times 2
ml×nl=2×2。下图显示了两种池化方案中,层
l
l
l的偏导数
δ
(
l
)
=
∂
J
∂
x
(
l
)
\bm{\delta}^{(l)}=\frac{\partial J}{\partial \bm{x}^{(l)}}
δ(l)=∂x(l)∂J是如何后向传播得到
∂
J
∂
y
(
l
−
1
)
\frac{\partial J}{\partial \bm{y}^{(l-1)}}
∂y(l−1)∂J。对于平均池化,因为认为每个元素对于池化后的特征图的对应元素的贡献相等,因此
δ
(
l
)
\bm{\delta}^{(l)}
δ(l)在反向传播的时候将平均分配到每个元素上。对于最大池化,认为只有最大的元素才对池化后的特征图对应元素有影响,因此反向传播时也只将
δ
(
l
)
\bm{\delta}^{(l)}
δ(l)传播到原最大元素上。例如图中的b,池化后的特征图中(0,0)位置对应原特征图中的最大值的位置(0,1),因此0.4只回传到原来的(0,0)位置;池化后的特征图中(1,1)位置对应原特征图中的最大值的位置(2,2),因此0.6只回传到原来的(2,2)位置。
将上过程记为
∂
J
∂
y
(
l
−
1
)
=
u
n
s
a
m
p
l
e
(
δ
(
l
)
)
\frac{\partial J}{\partial \bm{y}^{(l-1)}}=unsample(\bm{\delta}^{(l)})
∂y(l−1)∂J=unsample(δ(l))。为了得到
δ
(
l
−
1
)
\bm{\delta}^{(l-1)}
δ(l−1),还需要利用链式法则,
δ
(
l
−
1
)
=
∂
J
∂
y
(
l
−
1
)
⊙
σ
l
−
1
′
(
x
(
l
−
1
)
)
=
u
n
s
a
m
p
l
e
(
δ
(
l
)
)
⊙
σ
l
−
1
′
(
x
(
l
−
1
)
)
\bm{\delta}^{(l-1)}=\frac{\partial J}{\partial \bm{y}^{(l-1)}}\odot\sigma^{'}_{l-1}(\bm{x}^{(l-1)})=unsample(\bm{\delta}^{(l)})\odot\sigma^{'}_{l-1}(\bm{x}^{(l-1)})
δ(l−1)=∂y(l−1)∂J⊙σl−1′(x(l−1))=unsample(δ(l))⊙σl−1′(x(l−1))。
3.2 卷积层的后向传播
x
(
l
)
\bm{x}^{(l)}
x(l),
y
(
l
)
\bm{y}^{(l)}
y(l),
δ
(
l
)
\bm{\delta}^{(l)}
δ(l)均是3维张量,因此我们用下标
(
i
,
j
,
k
)
(i,j,k)
(i,j,k)表示第
i
i
i通道的特征图的在位置
(
i
,
j
)
(i,j)
(i,j)上的元素,例如
x
i
,
j
,
k
(
l
)
\bm{x}^{(l)}_{i,j,k}
xi,j,k(l)。此外,
x
i
,
:
,
:
(
l
)
\bm{x}^{(l)}_{i,:,:}
xi,:,:(l)表示整个第
i
i
i通道的特征图,他是一个2维矩阵。
x
i
,
:
,
k
(
l
)
\bm{x}^{(l)}_{i,:,k}
xi,:,k(l)和
x
i
,
j
,
:
(
l
)
\bm{x}^{(l)}_{i,j,:}
xi,j,:(l)分别表示第
i
i
i通道的特征图的第
k
k
k列和第
j
j
j行构成的列向量和行向量。其他张量和
x
\bm{x}
x的表示一样。
在卷积层
l
l
l中,卷积后特征通道为
j
j
j的特征图需要与
c
l
−
1
c_{l-1}
cl−1个输入特征图进行卷积,因此他的filter需要有
c
l
−
1
c_{l-1}
cl−1卷积核和一个偏置。记这
c
l
−
1
c_{l-1}
cl−1个卷积核为
W
0
,
j
(
l
)
,
W
1
,
j
(
l
)
,
…
,
W
c
l
−
1
−
1
,
j
(
l
)
\bm{W}^{(l)}_{0,j},\bm{W}^{(l)}_{1,j},\dots,\bm{W}^{(l)}_{c_{l-1}-1,j}
W0,j(l),W1,j(l),…,Wcl−1−1,j(l),他们是2维矩阵,大小均为
p
l
×
p
l
p_l\times p_l
pl×pl。记这个偏置为
b
i
(
l
)
b^{(l)}_i
bi(l),他是一个标量。
在一个卷积层中,有
x
i
,
:
,
:
(
l
)
=
∑
j
=
0
c
l
−
1
−
1
y
j
,
:
,
:
(
l
−
1
)
∗
W
i
,
j
(
l
)
+
b
i
(
l
)
,
i
=
0
,
1
,
…
,
c
l
−
1.
(2)
\bm{x}^{(l)}_{i,:,:}=\sum^{c_{l-1}-1}_{j=0}\bm{y}^{(l-1)}_{j,:,:}*\bm{W}^{(l)}_{i,j}+\bm{b}^{(l)}_{i},i=0,1,\dots,c_l-1.\tag{2}
xi,:,:(l)=j=0∑cl−1−1yj,:,:(l−1)∗Wi,j(l)+bi(l),i=0,1,…,cl−1.(2)
这里的
b
i
(
l
)
\bm{b}^{(l)}_{i}
bi(l)是大小与
x
i
,
:
,
:
(
l
)
\bm{x}^{(l)}_{i,:,:}
xi,:,:(l)相同(
m
l
×
n
l
m_l\times n_l
ml×nl),且所有元素均为
b
i
(
l
)
b^{(l)}_i
bi(l)的矩阵。
由于卷积层的后向传播算法较为复杂,我们仍然按照讲DNN后向传播算法时的划分方法,先推导
δ
(
l
)
\bm{\delta}^{(l)}
δ(l)的递推公式,然后推导如何由每一层的
δ
(
l
)
\bm{\delta}^{(l)}
δ(l)求得对应的
∂
J
∂
W
(
l
)
\frac{\partial J}{\partial \bm{W}^{(l)}}
∂W(l)∂J和
∂
J
∂
b
(
l
)
\frac{\partial J}{\partial \bm{b}^{(l)}}
∂b(l)∂J。
3.2.1 卷积层的 δ ( l ) \bm{\delta}^{(l)} δ(l)递推公式
和DNN一样,最后一层的
δ
(
L
−
1
)
\bm{\delta}^{(L-1)}
δ(L−1)可以容易求得(这里的最后一层是指最后一个卷积层),因此我们需要知道
δ
(
l
)
\bm{\delta}^{(l)}
δ(l)到
δ
(
l
−
1
)
\bm{\delta}^{(l-1)}
δ(l−1)的递推公式,以求得所有卷积层的
δ
(
l
)
\bm{\delta}^{(l)}
δ(l)。
为了推导方便,我们将(2)中的矩阵形式进一步写成标量形式。我们这里只考虑卷积步长为1的情况。考虑矩阵
x
i
,
:
,
:
(
l
)
\bm{x}^{(l)}_{i,:,:}
xi,:,:(l)中的某个元素
x
i
,
u
,
v
(
l
)
\bm{x}^{(l)}_{i,u,v}
xi,u,v(l),有
0
≤
u
<
m
l
0\leq u<m_l
0≤u<ml和
0
≤
v
<
n
l
0\leq v<n_l
0≤v<nl。对于该元素,卷积公式(2)变为
x
i
,
u
,
v
(
l
)
=
∑
j
=
0
c
l
−
1
−
1
∑
u
′
=
0
p
l
−
1
∑
v
′
=
0
p
l
−
1
y
j
,
u
+
u
′
,
v
+
v
′
(
l
−
1
)
W
i
,
j
;
u
′
,
v
′
(
l
)
+
b
i
(
l
)
.
(3)
x^{(l)}_{i,u,v}=\sum^{c_{l-1}-1}_{j=0}\sum^{p_l-1}_{u^{'}=0}\sum^{p_l-1}_{v^{'}=0}y^{(l-1)}_{j,u+u^{'},v+v^{'}}W^{(l)}_{i,j;u^{'},v^{'}}+b^{(l)}_i.\tag{3}
xi,u,v(l)=j=0∑cl−1−1u′=0∑pl−1v′=0∑pl−1yj,u+u′,v+v′(l−1)Wi,j;u′,v′(l)+bi(l).(3)
现在要推导
δ
(
l
)
=
∂
J
∂
x
(
l
)
\bm{\delta}^{(l)}=\frac{\partial J}{\partial \bm{x}^{(l)}}
δ(l)=∂x(l)∂J到
δ
(
l
−
1
)
=
∂
J
∂
x
(
l
−
1
)
\bm{\delta}^{(l-1)}=\frac{\partial J}{\partial \bm{x}^{(l-1)}}
δ(l−1)=∂x(l−1)∂J的递推关系,我们先由上式推导
δ
(
l
)
=
∂
J
∂
x
(
l
)
\bm{\delta}^{(l)}=\frac{\partial J}{\partial \bm{x}^{(l)}}
δ(l)=∂x(l)∂J到
∂
J
∂
y
(
l
−
1
)
\frac{\partial J}{\partial \bm{y}^{(l-1)}}
∂y(l−1)∂J的递推关系。
现在考虑某个输入通道
j
j
j,
∂
J
∂
y
j
,
:
,
:
(
l
−
1
)
\frac{\partial J}{\partial y^{(l-1)}_{j,:,:}}
∂yj,:,:(l−1)∂J在位置
(
u
,
v
)
(u,v)
(u,v)上的元素记为
∂
J
∂
y
j
,
u
,
v
(
l
−
1
)
\frac{\partial J}{\partial y^{(l-1)}_{j,u,v}}
∂yj,u,v(l−1)∂J。根据链式法则,我们需要求
J
J
J对所有包含
y
j
,
u
,
v
(
l
−
1
)
y^{(l-1)}_{j,u,v}
yj,u,v(l−1)的变量的偏导。因此有
∂
J
∂
y
j
,
u
,
v
(
l
−
1
)
=
∑
i
=
0
c
l
−
1
∑
(
u
′
,
v
′
)
∈
Q
i
∂
J
∂
x
i
,
u
′
,
v
′
(
l
)
∂
x
i
,
u
′
,
v
′
(
l
)
∂
y
j
,
u
,
v
(
l
−
1
)
.
\frac{\partial J}{\partial y^{(l-1)}_{j,u,v}}=\sum^{c_{l}-1}_{i=0}\sum_{(u^{'},v^{'})\in Q_i}\frac{\partial J}{\partial x^{(l)}_{i,u^{'},v^{'}}}\frac{\partial x^{(l)}_{i,u^{'},v^{'}}}{\partial y^{(l-1)}_{j,u,v}}.
∂yj,u,v(l−1)∂J=i=0∑cl−1(u′,v′)∈Qi∑∂xi,u′,v′(l)∂J∂yj,u,v(l−1)∂xi,u′,v′(l).
其中
Q
i
Q_i
Qi是输出信道
i
i
i中,与
y
j
,
u
,
v
(
l
−
1
)
y^{(l-1)}_{j,u,v}
yj,u,v(l−1)有关的
x
i
,
u
′
,
v
′
(
l
)
x^{(l)}_{i,u^{'},v^{'}}
xi,u′,v′(l)的下标
(
u
′
,
v
′
)
(u^{'},v^{'})
(u′,v′)的集合。(这里的"有关"指的是在卷积运算中的包含关系)实际上,有
Q
0
=
Q
1
=
⋯
=
Q
c
l
−
1
=
Q
Q_0=Q_1=\dots=Q_{c_l-1}=Q
Q0=Q1=⋯=Qcl−1=Q。因此重写上式为
∂
J
∂
y
j
,
u
,
v
(
l
−
1
)
=
∑
i
=
0
c
l
−
1
∑
(
u
′
,
v
′
)
∈
Q
∂
J
∂
x
i
,
u
′
,
v
′
(
l
)
∂
x
i
,
u
′
,
v
′
(
l
)
∂
y
j
,
u
,
v
(
l
−
1
)
.
\frac{\partial J}{\partial y^{(l-1)}_{j,u,v}}=\sum^{c_{l}-1}_{i=0}\sum_{(u^{'},v^{'})\in Q}\frac{\partial J}{\partial x^{(l)}_{i,u^{'},v^{'}}}\frac{\partial x^{(l)}_{i,u^{'},v^{'}}}{\partial y^{(l-1)}_{j,u,v}}.
∂yj,u,v(l−1)∂J=i=0∑cl−1(u′,v′)∈Q∑∂xi,u′,v′(l)∂J∂yj,u,v(l−1)∂xi,u′,v′(l).
我们需要形象地表示出
Q
Q
Q所包含的坐标,因此下图给出一个大小为
3
×
3
3\times 3
3×3的卷积核的示例。左边的矩阵是被卷积矩阵,右边是卷积后的矩阵。考虑被卷积矩阵坐标为
(
u
,
v
)
(u,v)
(u,v)的元素,不难看出,卷积后的矩阵元素,涉及该元素运算的是图中坐标为
(
u
−
2
,
v
−
2
)
(u-2,v-2)
(u−2,v−2),
(
u
−
2
,
v
)
(u-2,v)
(u−2,v),
(
u
,
v
−
2
)
(u,v-2)
(u,v−2)和
(
u
,
v
)
(u,v)
(u,v)四个元素围成的矩形中的所有元素。记卷积后的特征图大小为
m
×
n
m\times n
m×n,则
Q
Q
Q可以表示为
Q
=
{
(
u
′
,
v
′
)
:
u
′
>
=
0
,
v
′
>
=
0
,
u
′
<
m
,
v
′
<
n
,
u
′
=
u
−
2
,
u
−
1
,
…
,
u
,
v
′
=
v
−
2
,
v
−
1
,
…
,
v
}
Q=\{(u^{'},v^{'}):u^{'}>=0,v^{'}>=0,u^{'}<m,v^{'}<n,u^{'}=u-2,u-1,\dots,u,v^{'}=v-2,v-1,\dots,v\}
Q={(u′,v′):u′>=0,v′>=0,u′<m,v′<n,u′=u−2,u−1,…,u,v′=v−2,v−1,…,v}。这里需要注意的是
u
′
u^{'}
u′和
v
′
v^{'}
v′均需要大于等于0,这是因为在卷积过程中,有些坐标是无效的。例如
(
u
,
v
)
=
(
1
,
1
)
(u,v)=(1,1)
(u,v)=(1,1)的时候,左图的红色框和蓝色框其实是无法完成卷积的,实际上右图中没有横坐标为
u
−
2
=
−
1
u-2=-1
u−2=−1的元素。当然,对作图进行补零可以解决这个问题,但是我们这里的卷积没有补零。
有了以上对
Q
Q
Q的讨论,上面的式子变为
∂
J
∂
y
j
,
u
,
v
(
l
−
1
)
=
∑
i
=
0
c
l
−
1
∑
u
′
=
u
−
p
l
+
1
u
∑
v
′
=
v
−
p
l
+
1
v
∂
J
∂
x
i
,
u
′
,
v
′
(
l
)
∂
x
i
,
u
′
,
v
′
(
l
)
∂
y
j
,
u
,
v
(
l
−
1
)
=
∑
i
=
0
c
l
−
1
∑
u
′
=
u
−
p
l
+
1
u
∑
v
′
=
v
−
p
l
+
1
v
∂
J
∂
x
i
,
u
′
,
v
′
(
l
)
W
i
,
j
;
u
−
u
′
,
v
−
v
′
(
l
)
=
∑
i
=
0
c
l
−
1
∑
u
′
=
u
−
p
l
+
1
u
∑
v
′
=
v
−
p
l
+
1
v
δ
i
,
u
′
,
v
′
(
l
)
W
i
,
j
;
u
−
u
′
,
v
−
v
′
(
l
)
,
0
≤
u
′
<
m
l
,
0
≤
v
′
<
n
l
.
(4)
\begin{aligned} \frac{\partial J}{\partial y^{(l-1)}_{j,u,v}}&=\sum^{c_{l}-1}_{i=0}\sum^{u}_{u^{'}=u-p_l+1}\sum^{v}_{v^{'}=v-p_l+1}\frac{\partial J}{\partial x^{(l)}_{i,u^{'},v^{'}}}\frac{\partial x^{(l)}_{i,u^{'},v^{'}}}{\partial y^{(l-1)}_{j,u,v}}\\ &=\sum^{c_{l}-1}_{i=0}\sum^{u}_{u^{'}=u-p_l+1}\sum^{v}_{v^{'}=v-p_l+1}\frac{\partial J}{\partial x^{(l)}_{i,u^{'},v^{'}}}W^{(l)}_{i,j;u-u^{'},v-v^{'}}\\ &=\sum^{c_{l}-1}_{i=0}\sum^{u}_{u^{'}=u-p_l+1}\sum^{v}_{v^{'}=v-p_l+1}\delta^{(l)}_{i,u^{'},v^{'}}W^{(l)}_{i,j;u-u^{'},v-v^{'}},\\ &0\leq u^{'}<m_l,0\leq v^{'}<n_l.\tag{4} \end{aligned}
∂yj,u,v(l−1)∂J=i=0∑cl−1u′=u−pl+1∑uv′=v−pl+1∑v∂xi,u′,v′(l)∂J∂yj,u,v(l−1)∂xi,u′,v′(l)=i=0∑cl−1u′=u−pl+1∑uv′=v−pl+1∑v∂xi,u′,v′(l)∂JWi,j;u−u′,v−v′(l)=i=0∑cl−1u′=u−pl+1∑uv′=v−pl+1∑vδi,u′,v′(l)Wi,j;u−u′,v−v′(l),0≤u′<ml,0≤v′<nl.(4)
为了对比方便,我们把(3)抄写如下
x
i
,
u
,
v
(
l
)
=
∑
j
=
0
c
l
−
1
−
1
∑
u
′
=
0
p
l
−
1
∑
v
′
=
0
p
l
−
1
y
j
,
u
+
u
′
,
v
+
v
′
(
l
−
1
)
W
i
,
j
;
u
′
,
v
′
(
l
)
+
b
i
(
l
)
.
(3)
x^{(l)}_{i,u,v}=\sum^{c_{l-1}-1}_{j=0}\sum^{p_l-1}_{u^{'}=0}\sum^{p_l-1}_{v^{'}=0}y^{(l-1)}_{j,u+u^{'},v+v^{'}}W^{(l)}_{i,j;u^{'},v^{'}}+b^{(l)}_i.\tag{3}
xi,u,v(l)=j=0∑cl−1−1u′=0∑pl−1v′=0∑pl−1yj,u+u′,v+v′(l−1)Wi,j;u′,v′(l)+bi(l).(3)
(4)和(3)所表示的卷积有十分相似的结构。但是好像(4)式还是不能完全转化成(3)式所表示的卷积。现考虑一个新的卷积核,他是原卷积核
W
i
,
j
(
l
)
=
[
W
i
,
j
;
0
,
0
(
l
)
W
i
,
j
;
0
,
1
(
l
)
…
W
i
,
j
;
0
,
p
l
−
1
(
l
)
W
i
,
j
;
1
,
0
(
l
)
W
i
,
j
;
1
,
1
(
l
)
…
W
i
,
j
;
1
,
p
l
−
1
(
l
)
⋮
⋮
⋱
⋮
W
i
,
j
;
p
l
−
1
,
0
(
l
)
W
i
,
j
;
p
l
−
1
,
1
(
l
)
…
W
i
,
j
;
p
l
−
1
,
p
l
−
1
(
l
)
]
.
\bm{W}^{(l)}_{i,j}= \left[ \begin{array}{cccc} W^{(l)}_{i,j;0,0}&W^{(l)}_{i,j;0,1}&\dots&W^{(l)}_{i,j;0,p_l-1}\\ W^{(l)}_{i,j;1,0}&W^{(l)}_{i,j;1,1}&\dots&W^{(l)}_{i,j;1,p_l-1}\\ \vdots&\vdots&\ddots&\vdots\\ W^{(l)}_{i,j;p_l-1,0}&W^{(l)}_{i,j;p_l-1,1}&\dots&W^{(l)}_{i,j;p_l-1,p_l-1} \end{array} \right].
Wi,j(l)=⎣⎢⎢⎢⎢⎡Wi,j;0,0(l)Wi,j;1,0(l)⋮Wi,j;pl−1,0(l)Wi,j;0,1(l)Wi,j;1,1(l)⋮Wi,j;pl−1,1(l)……⋱…Wi,j;0,pl−1(l)Wi,j;1,pl−1(l)⋮Wi,j;pl−1,pl−1(l)⎦⎥⎥⎥⎥⎤.
旋转180度得到的,记为
r
o
t
180
(
W
)
i
,
j
(
l
)
=
[
W
i
,
j
;
p
l
−
1
,
p
l
−
1
(
l
)
W
i
,
j
;
p
l
−
1
,
p
l
−
2
(
l
)
…
W
i
,
j
;
p
l
−
1
,
0
(
l
)
W
i
,
j
;
p
2
−
2
,
p
l
−
1
(
l
)
W
i
,
j
;
p
l
−
2
,
p
l
−
2
(
l
)
…
W
i
,
j
;
p
l
−
2
,
0
(
l
)
⋮
⋮
⋱
⋮
W
i
,
j
;
0
,
p
l
−
1
(
l
)
W
i
,
j
;
0
,
p
l
−
2
(
l
)
…
W
i
,
j
;
0
,
0
(
l
)
]
.
rot_{180}(\bm{W})^{(l)}_{i,j}= \left[ \begin{array}{cccc} W^{(l)}_{i,j;p_l-1,p_l-1}&W^{(l)}_{i,j;p_l-1,p_l-2}&\dots&W^{(l)}_{i,j;p_l-1,0}\\ W^{(l)}_{i,j;p_2-2,p_l-1}&W^{(l)}_{i,j;p_l-2,p_l-2}&\dots&W^{(l)}_{i,j;p_l-2,0}\\ \vdots&\vdots&\ddots&\vdots\\ W^{(l)}_{i,j;0,p_l-1}&W^{(l)}_{i,j;0,p_l-2}&\dots&W^{(l)}_{i,j;0,0} \end{array} \right].
rot180(W)i,j(l)=⎣⎢⎢⎢⎢⎡Wi,j;pl−1,pl−1(l)Wi,j;p2−2,pl−1(l)⋮Wi,j;0,pl−1(l)Wi,j;pl−1,pl−2(l)Wi,j;pl−2,pl−2(l)⋮Wi,j;0,pl−2(l)……⋱…Wi,j;pl−1,0(l)Wi,j;pl−2,0(l)⋮Wi,j;0,0(l)⎦⎥⎥⎥⎥⎤.
他们的关系有
r
o
t
180
(
W
)
i
,
j
;
u
,
v
(
l
)
=
W
i
,
j
;
p
l
−
1
−
u
,
p
l
−
1
−
v
(
l
)
rot_{180}(W)^{(l)}_{i,j;u,v}=W^{(l)}_{i,j;p_l-1-u,p_l-1-v}
rot180(W)i,j;u,v(l)=Wi,j;pl−1−u,pl−1−v(l)。现在我们将(4)中的
W
i
,
j
(
l
)
\bm{W}^{(l)}_{i,j}
Wi,j(l)用
r
o
t
180
(
W
)
i
,
j
(
l
)
rot_{180}(\bm{W})^{(l)}_{i,j}
rot180(W)i,j(l)替代,有
∂
J
∂
y
j
,
u
,
v
(
l
−
1
)
=
∑
i
=
0
c
l
−
1
∑
u
′
=
u
−
p
l
+
1
u
∑
v
′
=
v
−
p
l
+
1
v
δ
i
,
u
′
,
v
′
(
l
)
r
o
t
180
(
W
)
i
,
j
;
p
l
−
1
−
u
+
u
′
,
p
l
−
1
−
v
+
v
′
(
l
)
,
0
≤
u
′
<
m
l
,
0
≤
v
′
<
n
l
.
\frac{\partial J}{\partial y^{(l-1)}_{j,u,v}}=\sum^{c_{l}-1}_{i=0}\sum^{u}_{u^{'}=u-p_l+1}\sum^{v}_{v^{'}=v-p_l+1}\delta^{(l)}_{i,u^{'},v^{'}}rot_{180}(W)^{(l)}_{i,j;p_l-1-u+u^{'},p_l-1-v+v^{'}},\\ 0\leq u^{'}<m_l,0\leq v^{'}<n_l.
∂yj,u,v(l−1)∂J=i=0∑cl−1u′=u−pl+1∑uv′=v−pl+1∑vδi,u′,v′(l)rot180(W)i,j;pl−1−u+u′,pl−1−v+v′(l),0≤u′<ml,0≤v′<nl.
用
u
′
′
=
p
l
−
1
−
u
+
u
′
u^{''}=p_l-1-u+u^{'}
u′′=pl−1−u+u′和
v
′
′
=
p
l
−
1
−
v
+
v
′
v^{''}=p_l-1-v+v^{'}
v′′=pl−1−v+v′进行变量替换,有
∂
J
∂
y
j
,
u
,
v
(
l
−
1
)
=
∑
i
=
0
c
l
−
1
∑
u
′
′
=
0
p
l
−
1
∑
v
′
′
=
0
p
l
−
1
δ
i
,
u
+
u
′
′
−
p
l
+
1
,
v
+
v
′
′
−
p
l
+
1
(
l
)
r
o
t
180
(
W
)
i
,
j
;
u
′
′
,
v
′
′
(
l
)
,
0
≤
u
+
u
′
′
−
p
l
+
1
<
m
l
,
0
≤
v
+
v
′
′
−
p
l
+
1
<
n
l
.
(5)
\frac{\partial J}{\partial y^{(l-1)}_{j,u,v}}=\sum^{c_{l}-1}_{i=0}\sum^{p_l-1}_{u^{''}=0}\sum^{p_l-1}_{v^{''}=0}\delta^{(l)}_{i,u+u^{''}-p_l+1,v+v^{''}-p_l+1}rot_{180}(W)^{(l)}_{i,j;u^{''},v^{''}},\\ 0\leq u+u^{''}-p_l+1<m_l,0\leq v+v^{''}-p_l+1<n_l.\tag{5}
∂yj,u,v(l−1)∂J=i=0∑cl−1u′′=0∑pl−1v′′=0∑pl−1δi,u+u′′−pl+1,v+v′′−pl+1(l)rot180(W)i,j;u′′,v′′(l),0≤u+u′′−pl+1<ml,0≤v+v′′−pl+1<nl.(5)
(5)和(3)十分相似,但是并不能完全表示成(3)的样子,好像不是一个卷积运算,接下来我们将证明(5)表示的是补零的卷积运算。仍然考虑(3)所表示的卷积运算,但是忽略偏置。并且,对被卷积的图片进行补零,补零的行数和列数等于
2
(
p
l
−
1
)
2(p_l-1)
2(pl−1)。下图给出了一个例子,其中卷积核大小为
3
×
3
3\times 3
3×3,卷积前后的特征图大小均为
5
×
5
5\times 5
5×5。卷积运算之前,在特征图周围进行补零,补
2
×
(
3
−
1
)
=
4
2\times(3-1)=4
2×(3−1)=4行和
2
×
(
3
−
1
)
=
4
2\times(3-1)=4
2×(3−1)=4列的零。
采用上述补零的卷积,并把上图中左边和右边的特征图分别用
x
\bm{x}
x和
y
\bm{y}
y表示,记
x
\bm{x}
x的大小为
m
x
×
n
x
m_x\times n_x
mx×nx,
y
\bm{y}
y的大小为
m
y
×
n
y
m_y\times n_y
my×ny,卷积核大小为
p
×
p
p\times p
p×p,于是有大小关系
m
x
=
m
y
−
p
+
1
m_x=m_y-p+1
mx=my−p+1和
n
x
=
n
y
−
p
+
1
n_x=n_y-p+1
nx=ny−p+1。将上述卷积计算用类似于(3)的式子记为
x
u
,
v
=
∑
u
′
=
0
p
−
1
∑
v
′
=
0
p
−
1
y
u
+
u
′
−
p
+
1
,
v
+
v
′
−
p
+
1
W
u
′
,
v
′
.
(6)
x_{u,v}=\sum^{p-1}_{u^{'}=0}\sum^{p-1}_{v^{'}=0}y_{u+u^{'}-p+1,v+v^{'}-p+1}W_{u^{'},v^{'}}.\tag{6}
xu,v=u′=0∑p−1v′=0∑p−1yu+u′−p+1,v+v′−p+1Wu′,v′.(6)
为了方便,上面的式子允许负坐标的存在,例如,作图中红框中9个元素的坐标如下
(
−
2
,
−
2
)
(
−
2
,
−
1
)
(
−
2
,
0
)
(
−
1
,
−
2
)
(
−
1
,
−
1
)
(
−
1
,
0
)
(
0
,
−
2
)
(
0
,
−
1
)
(
0
,
0
)
.
\begin{array}{ccc} (-2,-2)&(-2,-1)&(-2,0)\\ (-1,-2)&(-1,-1)&(-1,0)\\ (0,-2)&(0,-1)&(0,0) \end{array}.
(−2,−2)(−1,−2)(0,−2)(−2,−1)(−1,−1)(0,−1)(−2,0)(−1,0)(0,0).
为了去掉负坐标的存在,并去掉式子中的0元素,我们把(6)进一步改写为
x
u
,
v
=
∑
u
′
=
0
p
−
1
∑
v
′
=
0
p
−
1
y
u
+
u
′
−
p
+
1
,
v
+
v
′
−
p
+
1
W
u
′
,
v
′
,
0
≤
u
+
u
′
−
p
+
1
<
m
y
,
0
≤
v
+
v
′
−
p
+
1
<
n
y
.
(7)
x_{u,v}=\sum^{p-1}_{u^{'}=0}\sum^{p-1}_{v^{'}=0}y_{u+u^{'}-p+1,v+v^{'}-p+1}W_{u^{'},v^{'}},\\ 0\leq u+u^{'}-p+1<m_y,\\ 0\leq v+v^{'}-p+1<n_y. \tag{7}
xu,v=u′=0∑p−1v′=0∑p−1yu+u′−p+1,v+v′−p+1Wu′,v′,0≤u+u′−p+1<my,0≤v+v′−p+1<ny.(7)
为了对比明显,我们将(5)和(7)写在一起:
(5) | ∂ J ∂ y j , u , v ( l − 1 ) = ∑ i = 0 c l − 1 ∑ u ′ = u − p l + 1 u ∑ v ′ = v − p l + 1 v δ i , u ′ , v ′ ( l ) r o t 180 ( W ) i , j ; p l − 1 − u + u ′ , p l − 1 − v + v ′ ( l ) , 0 ≤ u + u ′ ′ − p l + 1 < m l , 0 ≤ v + v ′ ′ − p l + 1 < n l \frac{\partial J}{\partial y^{(l-1)}_{j,u,v}}=\sum^{c_{l}-1}_{i=0}\sum^{u}_{u^{'}=u-p_l+1}\sum^{v}_{v^{'}=v-p_l+1}\delta^{(l)}_{i,u^{'},v^{'}}rot_{180}(W)^{(l)}_{i,j;p_l-1-u+u^{'},p_l-1-v+v^{'}},0\leq u+u^{''}-p_l+1<m_l,0\leq v+v^{''}-p_l+1<n_l ∂yj,u,v(l−1)∂J=∑i=0cl−1∑u′=u−pl+1u∑v′=v−pl+1vδi,u′,v′(l)rot180(W)i,j;pl−1−u+u′,pl−1−v+v′(l),0≤u+u′′−pl+1<ml,0≤v+v′′−pl+1<nl |
---|---|
(7) | x u , v = ∑ u ′ = 0 p − 1 ∑ v ′ = 0 p − 1 y u + u ′ − p + 1 , v + v ′ − p + 1 W u ′ , v ′ , 0 ≤ u + u ′ − p + 1 < m y , 0 ≤ v + v ′ − p + 1 < n y x_{u,v}=\sum^{p-1}_{u^{'}=0}\sum^{p-1}_{v^{'}=0}y_{u+u^{'}-p+1,v+v^{'}-p+1}W_{u^{'},v^{'}},0\leq u+u^{'}-p+1<m_y,0\leq v+v^{'}-p+1<n_y xu,v=∑u′=0p−1∑v′=0p−1yu+u′−p+1,v+v′−p+1Wu′,v′,0≤u+u′−p+1<my,0≤v+v′−p+1<ny |
显然,(5)是一个补零卷积在多通道上的表达式。我们把(5)重新记为
∂
J
∂
y
j
(
l
−
1
)
=
∑
i
=
0
c
l
−
1
p
a
d
d
i
n
g
(
δ
)
i
(
l
)
∗
r
o
t
180
(
W
)
i
,
j
(
l
)
.
(8)
\frac{\partial J}{\partial \bm{y}^{(l-1)}_{j}}=\sum^{c_{l}-1}_{i=0}padding(\bm{\delta})^{(l)}_{i}*rot_{180}(\bm{W})^{(l)}_{i,j}.\tag{8}
∂yj(l−1)∂J=i=0∑cl−1padding(δ)i(l)∗rot180(W)i,j(l).(8)
其中,
p
a
d
d
i
n
g
(
δ
)
i
(
l
)
padding(\bm{\delta})^{(l)}_{i}
padding(δ)i(l)是对矩阵
δ
i
(
l
)
\bm{\delta}^{(l)}_{i}
δi(l)四周补上
2
(
p
l
−
1
)
2(p_l-1)
2(pl−1)行和
2
(
p
l
−
1
)
2(p_l-1)
2(pl−1)列零得到的补零矩阵,
r
o
t
180
(
W
)
i
,
j
(
l
)
rot_{180}(\bm{W})^{(l)}_{i,j}
rot180(W)i,j(l)是将
W
i
,
j
(
l
)
\bm{W}^{(l)}_{i,j}
Wi,j(l)旋转180度得到的旋转卷积核。
在计算得到
∂
J
∂
y
j
,
u
,
v
(
l
−
1
)
\frac{\partial J}{\partial y^{(l-1)}_{j,u,v}}
∂yj,u,v(l−1)∂J之后,只需要乘上激活函数的导数计科得到
δ
j
,
u
,
v
(
l
−
1
)
\delta^{(l-1)}_{j,u,v}
δj,u,v(l−1):
δ
j
(
l
−
1
)
=
∂
J
∂
y
j
(
l
−
1
)
⊙
σ
l
−
1
′
(
x
j
(
l
−
1
)
)
.
\bm{\delta}^{(l-1)}_{j}=\frac{\partial J}{\partial \bm{y}^{(l-1)}_{j}}\odot \sigma^{'}_{l-1}(\bm{x}^{(l-1)}_{j}).
δj(l−1)=∂yj(l−1)∂J⊙σl−1′(xj(l−1)).
因此对于通道
j
=
0
,
1
,
…
,
c
l
−
1
−
1
j=0,1,\dots,c_{l-1}-1
j=0,1,…,cl−1−1,
δ
j
(
l
)
\bm{\delta}^{(l)}_j
δj(l)的递推关系是
δ
j
(
l
−
1
)
=
∑
i
=
0
c
l
−
1
p
a
d
d
i
n
g
(
δ
)
i
(
l
)
∗
r
o
t
180
(
W
)
i
,
j
(
l
)
⊙
σ
l
−
1
′
(
x
j
(
l
−
1
)
)
.
(9)
\bm{\delta}^{(l-1)}_{j}=\sum^{c_{l}-1}_{i=0}padding(\bm{\delta})^{(l)}_{i}*rot_{180}(\bm{W})^{(l)}_{i,j}\odot \sigma^{'}_{l-1}(\bm{x}^{(l-1)}_{j}).\tag{9}
δj(l−1)=i=0∑cl−1padding(δ)i(l)∗rot180(W)i,j(l)⊙σl−1′(xj(l−1)).(9)
3.2.1 卷积层的 ∂ J ∂ W ( l ) \frac{\partial J}{\partial \bm{W}^{(l)}} ∂W(l)∂J和 ∂ J ∂ b ( l ) \frac{\partial J}{\partial \bm{b}^{(l)}} ∂b(l)∂J递推公式
通过上一节的递推公式,我们可以得到所有卷积层的
δ
(
l
−
1
)
\bm{\delta}^{(l-1)}
δ(l−1),本节介绍如何由
δ
(
l
−
1
)
\bm{\delta}^{(l-1)}
δ(l−1)计算得到
∂
J
∂
W
(
l
)
\frac{\partial J}{\partial \bm{W}^{(l)}}
∂W(l)∂J和
∂
J
∂
b
(
l
)
\frac{\partial J}{\partial \bm{b}^{(l)}}
∂b(l)∂J。为了方便,重写式子(2)和(3)如下
x
i
,
:
,
:
(
l
)
=
∑
j
=
0
c
l
−
1
−
1
y
j
,
:
,
:
(
l
−
1
)
∗
W
i
,
j
(
l
)
+
b
i
(
l
)
,
i
=
0
,
1
,
…
,
c
l
−
1.
(2)
\bm{x}^{(l)}_{i,:,:}=\sum^{c_{l-1}-1}_{j=0}\bm{y}^{(l-1)}_{j,:,:}*\bm{W}^{(l)}_{i,j}+\bm{b}^{(l)}_{i},i=0,1,\dots,c_l-1.\tag{2}
xi,:,:(l)=j=0∑cl−1−1yj,:,:(l−1)∗Wi,j(l)+bi(l),i=0,1,…,cl−1.(2)
x
i
,
u
,
v
(
l
)
=
∑
j
=
0
c
l
−
1
−
1
∑
u
′
=
0
p
l
−
1
∑
v
′
=
0
p
l
−
1
y
j
,
u
+
u
′
,
v
+
v
′
(
l
−
1
)
W
i
,
j
;
u
′
,
v
′
(
l
)
+
b
i
(
l
)
.
(3)
x^{(l)}_{i,u,v}=\sum^{c_{l-1}-1}_{j=0}\sum^{p_l-1}_{u^{'}=0}\sum^{p_l-1}_{v^{'}=0}y^{(l-1)}_{j,u+u^{'},v+v^{'}}W^{(l)}_{i,j;u^{'},v^{'}}+b^{(l)}_i.\tag{3}
xi,u,v(l)=j=0∑cl−1−1u′=0∑pl−1v′=0∑pl−1yj,u+u′,v+v′(l−1)Wi,j;u′,v′(l)+bi(l).(3)
因为
W
i
,
j
(
l
)
\bm{W}^{(l)}_{i,j}
Wi,j(l)只是通道
i
i
i上
x
i
,
:
,
:
(
l
)
\bm{x}^{(l)}_{i,:,:}
xi,:,:(l)的变量,因此对于
W
i
,
j
(
l
)
\bm{W}^{(l)}_{i,j}
Wi,j(l)上的某个元素
W
i
,
j
;
,
u
,
v
(
l
)
W^{(l)}_{i,j;,u,v}
Wi,j;,u,v(l),利用链式法则,有
∂
J
∂
W
i
,
j
;
u
,
v
(
l
)
=
∑
(
u
′
,
v
′
)
∈
Q
i
∂
J
∂
x
i
,
u
′
,
v
′
(
l
)
∂
x
i
,
u
′
,
v
′
(
l
)
∂
W
i
,
j
;
u
,
v
(
l
)
.
\frac{\partial J}{\partial W^{(l)}_{i,j;u,v}}=\sum_{(u^{'},v^{'})\in Q_i}\frac{\partial J}{\partial x^{(l)}_{i,u^{'},v^{'}}}\frac{\partial x^{(l)}_{i,u^{'},v^{'}}}{\partial W^{(l)}_{i,j;u,v}}.
∂Wi,j;u,v(l)∂J=(u′,v′)∈Qi∑∂xi,u′,v′(l)∂J∂Wi,j;u,v(l)∂xi,u′,v′(l).
这里的
Q
i
Q_i
Qi指的是与
W
i
,
j
;
u
,
v
(
l
)
W^{(l)}_{i,j;u,v}
Wi,j;u,v(l)有关的
x
i
,
u
′
,
v
′
(
l
)
x^{(l)}_{i,u^{'},v^{'}}
xi,u′,v′(l)的下标
(
u
′
,
v
′
)
(u^{'},v^{'})
(u′,v′)的集合。不难看出,对于某个权重,所有的
x
i
,
u
′
,
v
′
(
l
)
x^{(l)}_{i,u^{'},v^{'}}
xi,u′,v′(l)均与之有关。所以上式变为
∂
J
∂
W
i
,
j
;
u
,
v
(
l
)
=
∑
u
′
=
0
m
l
−
1
∑
v
′
=
0
n
l
−
1
∂
J
∂
x
i
,
u
′
,
v
′
(
l
)
∂
x
i
,
u
′
,
v
′
(
l
)
∂
W
i
,
j
;
u
,
v
(
l
)
=
∑
u
′
=
0
m
l
−
1
∑
v
′
=
0
n
l
−
1
∂
J
∂
x
i
,
u
′
,
v
′
(
l
)
y
j
,
u
+
u
′
,
v
+
v
′
(
l
−
1
)
=
∑
u
′
=
0
m
l
−
1
∑
v
′
=
0
n
l
−
1
δ
i
,
u
′
,
v
′
(
l
)
y
j
,
u
+
u
′
,
v
+
v
′
(
l
−
1
)
.
\begin{aligned} \frac{\partial J}{\partial W^{(l)}_{i,j;u,v}}&=\sum^{m_l-1}_{u^{'}=0}\sum^{n_l-1}_{v^{'}=0}\frac{\partial J}{\partial x^{(l)}_{i,u^{'},v^{'}}}\frac{\partial x^{(l)}_{i,u^{'},v^{'}}}{\partial W^{(l)}_{i,j;u,v}}\\ &=\sum^{m_l-1}_{u^{'}=0}\sum^{n_l-1}_{v^{'}=0}\frac{\partial J}{\partial x^{(l)}_{i,u^{'},v^{'}}}y^{{(l-1)}}_{j,u+u^{'},v+v^{'}}\\ &=\sum^{m_l-1}_{u^{'}=0}\sum^{n_l-1}_{v^{'}=0}\delta^{(l)}_{i,u^{'},v^{'}}y^{{(l-1)}}_{j,u+u^{'},v+v^{'}}. \end{aligned}
∂Wi,j;u,v(l)∂J=u′=0∑ml−1v′=0∑nl−1∂xi,u′,v′(l)∂J∂Wi,j;u,v(l)∂xi,u′,v′(l)=u′=0∑ml−1v′=0∑nl−1∂xi,u′,v′(l)∂Jyj,u+u′,v+v′(l−1)=u′=0∑ml−1v′=0∑nl−1δi,u′,v′(l)yj,u+u′,v+v′(l−1).
显然上式表示的是卷积关系,于是我们写成矩阵形式有
∂
J
∂
W
i
,
j
(
l
)
=
y
j
,
:
,
:
(
l
−
1
)
∗
δ
i
(
l
)
.
\frac{\partial J}{\partial \bm{W}^{(l)}_{i,j}}=\bm{y}^{(l-1)}_{j,:,:}*\bm{\delta}^{(l)}_{i}.
∂Wi,j(l)∂J=yj,:,:(l−1)∗δi(l).
考虑某个通道
i
i
i,其偏置
b
i
(
l
)
b^{(l)}_i
bi(l)是一个标量,且所有
x
i
,
u
′
,
v
′
(
l
)
x^{(l)}_{i,u^{'},v^{'}}
xi,u′,v′(l)均与之有关,因此利用链式法则,有
∂
J
∂
b
i
(
l
)
=
∑
u
′
=
0
m
l
−
1
∑
v
′
=
0
n
l
−
1
∂
J
∂
x
i
,
u
′
,
v
′
(
l
)
=
∑
u
′
=
0
m
l
−
1
∑
v
′
=
0
n
l
−
1
δ
i
,
u
′
,
v
′
(
l
)
.
\begin{aligned} \frac{\partial J}{\partial b^{(l)}_{i}}&=\sum^{m_l-1}_{u^{'}=0}\sum^{n_l-1}_{v^{'}=0}\frac{\partial J}{\partial x^{(l)}_{i,u^{'},v^{'}}}\\ &=\sum^{m_l-1}_{u^{'}=0}\sum^{n_l-1}_{v^{'}=0}\delta^{(l)}_{i,u^{'},v^{'}}. \end{aligned}
∂bi(l)∂J=u′=0∑ml−1v′=0∑nl−1∂xi,u′,v′(l)∂J=u′=0∑ml−1v′=0∑nl−1δi,u′,v′(l).
4. 总结与示例
4.1全连接层
递推公式 | δ ( l − 1 ) = ( W ( l ) ) T δ ( l ) ⊙ σ l − 1 ′ ( x ( l − 1 ) ) \bm{\delta}^{(l-1)}=(\bm{W}^{(l)})^T\bm{\delta}^{(l)}\odot \sigma^{'}_{l-1}(\bm{x}^{(l-1)}) δ(l−1)=(W(l))Tδ(l)⊙σl−1′(x(l−1)) |
---|---|
权重偏导 | ∂ J ∂ W ( l ) = δ ( l ) ( y ( l − 1 ) ) T \frac{\partial J}{\partial \bm{W}^{(l)}}=\bm{\delta}^{(l)}(\bm{y}^{(l-1)})^T ∂W(l)∂J=δ(l)(y(l−1))T |
偏置偏导 | ∂ J ∂ b ( l ) = δ ( l ) \frac{\partial J}{\partial \bm{b}^{(l)}}=\bm{\delta}^{(l)} ∂b(l)∂J=δ(l) |
考虑全连接层输入向量大小为
6
×
1
6\times 1
6×1,输出大小为
3
×
1
3\times 1
3×1,设权重矩阵为
W
(
l
)
=
[
0.1
−
0.2
0.3
0.2
−
0.1
0.2
−
0.7
0.4
0.1
−
0.1
0.4
−
0.5
0.8
−
0.9
0.3
0.1
−
0.2
0.1
]
,
\bm{W}^{(l)}= \left[ \begin{array}{cccccc} 0.1&-0.2&0.3&0.2&-0.1&0.2\\ -0.7&0.4&0.1&-0.1&0.4&-0.5\\ 0.8&-0.9&0.3&0.1&-0.2&0.1 \end{array} \right],
W(l)=⎣⎡0.1−0.70.8−0.20.4−0.90.30.10.30.2−0.10.1−0.10.4−0.20.2−0.50.1⎦⎤,
偏置向量为
b
(
l
)
=
[
0.2
0.1
−
0.5
]
.
\bm{b}^{(l)}= \left[ \begin{array}{c} 0.2\\ 0.1\\ -0.5 \end{array} \right].
b(l)=⎣⎡0.20.1−0.5⎦⎤.
前向传播表示为
y
(
l
)
=
σ
l
(
W
(
l
)
y
(
l
−
1
)
+
b
(
l
)
)
=
σ
l
(
x
(
l
)
)
.
\bm{y}^{(l)}=\sigma_{l}(\bm{W}^{(l)}\bm{y}^{(l-1)}+\bm{b}^{(l)})=\sigma_{l}(\bm{x}^{(l)}).
y(l)=σl(W(l)y(l−1)+b(l))=σl(x(l)).
假设对于当前层,前向传播传来的是
y
(
l
−
1
)
=
[
−
0.2
0.3
0.1
]
,
\bm{y}^{(l-1)}= \left[ \begin{array}{c} -0.2\\ 0.3\\ 0.1 \end{array} \right],
y(l−1)=⎣⎡−0.20.30.1⎦⎤,
反向传播时输入的偏导数是
δ
(
l
)
=
∂
J
∂
x
(
l
)
=
[
0.1
−
0.4
0.2
]
.
\bm{\delta}^{(l)}=\frac{\partial J}{\partial \bm{x}^{(l)}}= \left[ \begin{array}{c} 0.1\\ -0.4\\ 0.2 \end{array} \right].
δ(l)=∂x(l)∂J=⎣⎡0.1−0.40.2⎦⎤.
则需要传到上一层的偏导数为
δ
(
l
−
1
)
=
(
W
(
l
)
)
T
δ
(
l
)
⊙
σ
l
−
1
′
(
x
(
l
−
1
)
)
=
[
0.1
−
0.7
0.8
−
0.2
0.4
−
0.9
0.3
0.1
0.3
0.2
−
0.1
0.1
−
0.1
0.4
−
0.2
0.2
−
0.5
0.1
]
⋅
[
0.1
−
0.4
0.2
]
⊙
σ
l
−
1
′
(
x
(
l
−
1
)
)
.
\bm{\delta}^{(l-1)}= (\bm{W}^{(l)})^T\bm{\delta}^{(l)}\odot \sigma^{'}_{l-1}(\bm{x}^{(l-1)})= \left[ \begin{array}{ccc} 0.1&-0.7&0.8\\ -0.2&0.4&-0.9\\ 0.3&0.1&0.3\\ 0.2&-0.1&0.1\\ -0.1&0.4&-0.2\\ 0.2&-0.5&0.1 \end{array} \right]\cdot \left[ \begin{array}{c} 0.1\\ -0.4\\ 0.2 \end{array} \right]\odot \sigma^{'}_{l-1} ( \bm{x}^{(l-1)} ).
δ(l−1)=(W(l))Tδ(l)⊙σl−1′(x(l−1))=⎣⎢⎢⎢⎢⎢⎢⎡0.1−0.20.30.2−0.10.2−0.70.40.1−0.10.4−0.50.8−0.90.30.1−0.20.1⎦⎥⎥⎥⎥⎥⎥⎤⋅⎣⎡0.1−0.40.2⎦⎤⊙σl−1′(x(l−1)).
对于权重的偏导,有
∂
J
∂
W
(
l
)
=
δ
(
l
)
(
y
(
l
−
1
)
)
T
=
[
0.1
−
0.4
0.2
]
⋅
[
−
0.2
0.3
0.1
]
.
\frac{\partial J}{\partial \bm{W}^{(l)}}=\bm{\delta}^{(l)}(\bm{y}^{(l-1)})^T= \left[ \begin{array}{c} 0.1\\ -0.4\\ 0.2 \end{array} \right]\cdot \left[ \begin{array}{ccc} -0.2&0.3&0.1 \end{array} \right].
∂W(l)∂J=δ(l)(y(l−1))T=⎣⎡0.1−0.40.2⎦⎤⋅[−0.20.30.1].
对于偏置的偏导有
∂
J
∂
b
(
l
)
=
δ
(
l
)
.
\frac{\partial J}{\partial \bm{b}^{(l)}}=\bm{\delta}^{(l)}.
∂b(l)∂J=δ(l).
4.2 卷积层
递推公式 | δ j ( l − 1 ) = ∑ i = 0 c l − 1 p a d d i n g ( δ ) i ( l ) ∗ r o t 180 ( W ) i , j ( l ) ⊙ σ l − 1 ′ ( x j ( l − 1 ) ) \bm{\delta}^{(l-1)}_{j}=\sum^{c_l-1}_{i=0}padding(\bm{\delta})^{(l)}_i*rot_{180}(\bm{W})^{(l)}_{i,j}\odot \sigma^{'}_{l-1}(\bm{x}^{(l-1)}_j) δj(l−1)=∑i=0cl−1padding(δ)i(l)∗rot180(W)i,j(l)⊙σl−1′(xj(l−1)) |
---|---|
权重偏导 | ∂ J ∂ W i , j ( l ) = y j , : ( l − 1 ) ∗ δ i ( l ) \frac{\partial J}{\partial \bm{W}^{(l)}_{i,j}}=\bm{y}^{(l-1)}_{j,:}*\bm{\delta}^{(l)}_i ∂Wi,j(l)∂J=yj,:(l−1)∗δi(l) |
偏置偏导 | ∂ J ∂ b i ( l ) = ∑ u , v δ i , u , v ( l ) \frac{\partial J}{\partial b^{(l)}_i}=\sum_{u,v}\bm{\delta}^{(l)}_{i,u,v} ∂bi(l)∂J=∑u,vδi,u,v(l) |
实例太麻烦了,懒得写,所以略。补零和矩阵旋转的方式详见3.2.1的推导。
4.3 池化层
最大池化 | 偏导数反向传播给取最大值的index |
---|---|
平均池化 | 偏导数反向传播给所有原输入,平均分配数值 |
实例见3.1
5. 参考文献
[1] 刘建平Pinard,深度神经网络(DNN)反向传播算法(BP),2017-02-21。
[2] 刘建平Pinard,卷积神经网络(CNN)反向传播算法,2017-03-03。
[3] 人工智能技术干货,池化层pooling操作如何参与反向传播?,2020-09-23。
[4] 丶Minskyli,深度学习之CNN反向传播,2018-04-12。
欢迎批评指正。