本文章包含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是损失函数对于该权重的偏导数。偏导数可以用数值微分的方法求得。
下面用一个简单的函数为例简要说明数值微分求偏导数的方法。考虑一个函数 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)的计算量大。此外需要更新的参数量大,对于每个参数都需要计算损失函数的偏微分,所以用数值微分的方法太过复杂。因此在神经网络中,有一种成为后向传播的方法来高效地计算每个参数对应的损失函数的偏导数。
为了简单,不考虑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的反向传播算法
反向传播算法求偏导的最重要的数学基础就是多元复合函数微分中的链式法则。一个简单的例子是,考虑函数 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.
要求损失函数对于权重的偏导 ∂ 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)。
这一节我们展示如何通过 δ ( 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的激活函数的导数向量。
在讲如何计算每层权重和偏置的偏导之前,先总结一下前面的结果。
输出层 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) |
CNN和DNN在后向传播算法的推导上最大的区别在于:1.CNN基本是二维矩阵的计算(除了全连接层);DNN基本是向量的计算。2.CNN含有DNN没有的卷积层和池化层。因此,下面从卷积和池化两个方面来说明CNN的后向传播算法。全连接层的后向传播算法与DNN完全相同。
假设层 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))。
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。
和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
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^{'}
有了以上对 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^{'}