卷积神经网络(CNN)反向传播算法&训练过程


卷积神经网络(CNN)因其接近人类视觉运作的特征提取方法、以及通过权值共享从而减轻计算任务的特点从而制霸计算机视觉领域,详细地大家可以通过这篇文章( 主要神经网络结构图解)品一品不同网络结构的特点。
我相信大家尤其是新手入门都看过不少“5min入门CNN”、“一张图搞定CNN”…等等之类的文章,虽然这种文章确实能够帮助我们快速理解CNN的特点,但是这种“过于轻松”的方式也可能会让我们丢掉许多卷积神经网络实现的细节问题,很难对CNN有更加深入的理解。
作为一个鉴定信仰“Math goes first”的人,写这篇文章的目的就在于帮助大家怎样用公式表达/推导,这样一种更加严谨老派的方式解释CNN训练过程,目的就在于:1)通过这种“辛苦”的脑力劳动,帮助大家更加深刻具体的理解数据、结构、参数、损失、函数训练这些要素怎样在一起工作运转起来的;2)而来也是为了帮助大家以后能够更好地阅读前沿文献,不至于看到公式就皱眉头。好了,接下来就让我们一起愉快地学习吧!

1、前向传播

1.1卷积层前向传播

前向传播公式
z j l = ∑ i = 1 M a i l − 1 ∗ w i j l + b j l , a j l = σ ( z j l ) z_j^{l}=\sum_{i=1}^{M}a_{i}^{l-1} * w_{i j}^{l}+b_j^{l},a_j^{l}=\sigma\left(z_j^{l}\right) zjl=i=1Mail1wijl+bjl,ajl=σ(zjl)
其中, z j l z_j^l zjl表示总输入通道数为 M M M的节点 a i a_i ai 经第 l l l层神经网络处理后产生的第 j j j个输出节点,然后经激活函数 σ \sigma σ激活后,也就变成下一层网络的第 j j j个输入通道的特征节点 a j l a_j^l ajl
注意要点:

  1. 假设输入节点 i i i的总个数为M,输出节点 j j j的总个数为N,那么总的卷积核 w i j w_{ij} wij个数就为 M ⋅ N M\cdot N MN;
  2. 在结构确定的情况下,反向传播算法需要更新的就是卷积核的值和偏置;

1.2池化层前向传播

前向传播公式 z j l = d o w n ( a j l − 1 ) , a j l = σ ( z j l ) z_j^{l} = down(a_j^{l-1}),a_j^l = \sigma(z_j^l) zjl=down(ajl1),ajl=σ(zjl)
其中, z j l z_j^l zjl表示输入节点 a j a_j aj 经第 l l l层池化层后就变成输出节点 z j l z_j^l zjl,注意要点:
3. 池化操作并改变输出节点或者说特征图个数,即输入多少张特征图,经池化后输出多少张特征图;
4. 池化一般并没有激活函数,所以此处可以把激活函数的输出等于输入。

1.3全连接层前向传播

前向传播公式 z j l = ∑ i = 1 M a i l − 1 ∗ w i j l + b j l , a j l = σ ( z j l ) z_j^{l}=\sum_{i=1}^{M} a_{i}^{l-1} * w_{i j}^{l}+b_j^{l},a_j^{l}=\sigma\left(z_j^{l}\right) zjl=i=1Mail1wijl+bjl,ajl=σ(zjl)
全连接层的公式基本和卷积层一样,因为形式上可以把全连接层看成一种卷积核尺寸和输入节点或者特征图尺寸一样的卷积,
5. 所以如果输入节点或者特征图的总个数为 M M M,输出节点的总个数为 N N N,那么总的卷积核个数就为 M ∗ N M*N MN
6. 在结构确定的情况下,反向传播算法需要更新的就是卷积核的值和偏置。

2、损失函数

假设我们总共有 P P P组数据, { x 0 , y 0 } , { x 1 , y 1 } , . . . , { x P , y P } \{x^0,y^0\},\{x^1,y^1\},...,\{x^P,y^P\} {x0,y0},{x1,y1},...,{xP,yP},其中 p p p表示第 p p p组数据;假设卷积神经网络的最后一层 L L L层的输出节点为 a L a^L aL,我们处理的是一个多元分类问题,比如说判断一张图片中的数字是0~9中哪一个数字,那么任意一组训练输出节点就是一个 1 ∗ 10 1*10 110的行向量,那么误差函数也就为:
J = 1 2 ∣ ∣ a L − y ∣ ∣ 2 = ∑ k = 1 1 0 ( x k − y k ) 2 J = \frac{1}{2}||a^L-y||^2 = \sum_{k=1}^10\left({x_k-y_k}\right)^2 J=21aLy2=k=110(xkyk)2而总的误差也就应为 ∑ p = 0 P J p \sum_{p=0}^PJ_p p=0PJp,为了方便描述,总的误差后面我们仍然用 J J J表示总的误差,当然了,物产函数有很多种,大家根据需要灵活挑选就行啦,至此数据变经过层层处理最总形成了我们的目标函数 J J J
因为我们构造神经网络的目的就是为了找到一种网络结构,能够在给定输入的情况下,能够让输出和目标想匹配,也就是说让 J J J最小,想要让 J J J最小,那就是说需要找到一组参数使得: ( W , b ) = a r g m i n ( J ( w , b , x , y ) ) (W,b) = argmin(J(w,b,x,y)) (W,b)=argmin(J(w,b,x,y))这里就需要引入梯度下降法来不断更新卷积核权值和偏置: ( W , b ) n + 1 = ( W , b ) n − r ⋅ g r a d ( J ( W , b ) n ) (W,b)^{n+1} = (W,b)^{n}-r\cdot grad(J(W,b)^n) (W,b)n+1=(W,b)nrgrad(J(W,b)n)这里,r就是学习速率的意思,通过不断调整权重和偏置的权值,从而使得 J J J不断减小达到或者符合我们的预期误差值。

3、反向传播

既然我们要求误差对(W,b)的偏导值,那么我们首先要明确一下几点内容:

  1. 我们要首先明白在整个神经网络结构确定的情况下,,我们需要动态调整的参数主要有:1)卷积层的权重w和偏置;2)因为池化层只有一个反向池化操作,不存在偏置和激活函数的问题,所以我们基本可以说不存在调整参数的问题;3)因为从形式上看,全连接层可以看成一种特俗结构的卷积神经网络(即卷积核大小和输入的特征节点或者特征图尺寸相同),所以即使假设存在多层的全连接层,具体的处理过程参照卷积层推导即可;
  2. 为了确定 ∂ J ( W , b ) ∂ W , ∂ J ( W , b ) ∂ b \frac{\partial J(W,b)}{\partial W},\frac{\partial J(W,b)}{\partial b} WJ(W,b),bJ(W,b),我们需要引入一个间接量 δ z = ∂ J ( W , b ) ∂ z \delta _z = \frac{\partial J(W,b)}{\partial z} δz=zJ(W,b), δ z \delta _z δz则表示未经激活的加权输出和变化对目标激活函数的影响;

那么,我们基本就可以明白接下来的任务就主要分为三类:1)已知池化层 δ l \delta^l δl,如何推导上一层的 δ l − 1 \delta^{l-1} δl1;2)已知卷积层 δ l \delta^l δl,如何推导上一层的 δ l − 1 \delta^{l-1} δl1;3)已知卷积层 δ l \delta ^l δl,如何 ∂ J ( W , b ) ∂ W l , ∂ J ( W , b ) ∂ b l \frac{\partial J(W,b)}{\partial W^l}, \frac{\partial J(W,b)}{\partial b^l} WlJ(W,b),blJ(W,b)

3.1 已知池化层 δ l \delta^l δl,推导上一层的 δ l − 1 \delta^{l-1} δl1

推导公式: δ j l − 1 = u p s a m p l e ( δ j l ) \delta_j^{l-1} = upsample(\delta_j^l) δjl1=upsample(δjl)
因为池化层不存在激活函数这一说,而常见的池化操作有两种:maxpooling和average pooling,所以根据下图就可以很容易理解推导出上一层 δ l − 1 \delta ^{l-1} δl1的过程,假设已知: δ j l = ( 2 8 4 6 ) \delta_j^l = \left( \begin{array}{ccc} 2& 8 \\ 4& 6 \end{array} \right) δjl=(2486)那么,如果池化操作为average pooling,则 δ j l − 1 \delta_j^{l-1} δjl1就为: ( 0.5 0.5 2 2 0.5 0.5 2 2 1 1 1.5 1.5 1 1 1.5 1.5 ) \left( \begin{array}{ccc} 0.5&0.5&2&2 \\ 0.5&0.5&2&2 \\ 1&1&1.5&1.5 \\ 1&1&1.5&1.5 \end{array} \right) 0.50.5110.50.511221.51.5221.51.5,如果池化操作为max pooling,则 δ j l − 1 \delta_j^{l-1} δjl1就为: ( 2 0 0 0 0 0 0 8 0 4 0 0 0 0 6 0 ) \left( \begin{array}{ccc} 2&0&0&0 \\ 0&0& 0&8 \\ 0&4&0&0 \\ 0&0&6&0 \end{array} \right) 2000004000060800

3.2 已知卷积层 δ l \delta^l δl,推导上一层的 δ l − 1 \delta ^{l-1} δl1

推导公式: δ i l − 1 = ∂ J ( W , b ) ∂ z l − 1 = δ j l ( ∂ z j l ∂ z i l − 1 ) = δ j l ∗ r o t 180 ( W i j l ) ⊙ σ ′ ( z i l − 1 ) \delta_i^{l-1}= \frac{\partial J(W,b)}{\partial z^{l-1}} = \delta_j^{l}(\frac{\partial z_j^{l}}{\partial z_i^{l-1}}) = \delta_j ^{l}*rot180(W_{ij}^{l}) \odot \sigma^{'}(z_i^{l-1}) δil1=zl1J(W,b)=δjl(zil1zjl)=δjlrot180(Wijl)σ(zil1)这一步的推导很难也很抽象,尤其是像 r o t 180 rot180 rot180这种操作,不过大家不要慌,怎么推导的我会给大家解释的清清楚楚,在次之前首先要明确几点概念和问题:

  1. 上式中的 ∗ * 代表卷积, ⊙ \odot 代表的是矩阵的点积的意思;
  2. 接下来的描述很重要!很重要!很重要!希望大家认真品一品,我们的任务是什么?就是已知误差函数J对卷积层输出z的偏导(或者说J对卷积层输出矩阵 z l z^{l} zl中任一元素)的情况下,怎样获得函数J对上一层未激活输出 z l z^{l} zl的偏导
  3. J J J是标量,而 z , z l − 1 z,z^{l-1} z,zl1是矩阵,标量对矩阵求偏导很好表示,无非就是标量对矩阵每一个元素求导,那矩阵对矩阵求导呢,就比如上式中 ∂ z j l ∂ z i l − 1 \frac{\partial z_j^{l}}{\partial z_i^{l-1}} zil1zjl是一个矩阵对矩阵求导的过程,该怎么处理呢?答案是 ∂ z j l ∂ z i l − 1 \frac{\partial z_j^{l}}{\partial z_i^{l-1}} zil1zjl只是一个表示方法,严格来讲这种写法是不准确的,并不能直接用来使用推导公式,那上面公式最右端的式子是怎么推导出来的?
  4. 在上式中,注意 δ i l − 1 \delta_i^{l-1} δil1的下标和 δ j l \delta_j^{l} δjl的下标是不一样的,这个该怎么处理?

好的,接下来我会慢慢分析,来帮助大家理解上面内容或问题,首先先回顾一下链式求导法则对于函数 h ( x ) = f ( g ( x ) ) , 则 h ′ ( x ) = f ′ ( g ( x ) ) g ′ ( x ) h(x)=f(g(x)),则h'(x)=f'(g(x))g'(x) h(x)=f(g(x))h(x)=f(g(x))g(x),那么假设第 l − 1 l-1 l1层的输出 a l − 1 a^{l-1} al1是一个3x3矩阵,第 l l l层的卷积核是一个一个2x2矩阵,那么偏置为 b l b^l bl,则有 a l − 1 ∗ W l + b l = z l a^{l-1}*W^l +b^l = z^{l} al1Wl+bl=zl,如下 ( a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ) ∗ ( W 11 W 12 W 21 W 22 ) + ( b 11 b 12 b 21 b 22 ) = ( Z 11 Z 12 2 21 Z 22 ) \left(\begin{array}{lll} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{array}\right) *\left(\begin{array}{cc} W_{11} & W_{12} \\ W_{21} & W_{22} \end{array}\right)+\left(\begin{array}{ll} b_{11} & b_{12} \\ b_{21} & b_{22} \end{array}\right)=\left(\begin{array}{cc} Z_{11} & Z_{12} \\ 2_{21} & Z_{22} \end{array}\right) a11a21a31a12a22a32a13a23a33(W11W21W12W22)+(b11b21b12b22)=(Z11221Z12Z22)而且 z 11 = a 11 w 11 + a 12 w 12 + a 21 w 21 + a 22 w 22 + b 11 z_{11} = a_{11}w_{11} + a_{12}w_{12} + a_{21}w_{21} + a_{22}w_{22} + b_{11} z11=a11w11+a12w12+a21w21+a22w22+b11 z 12 = a 12 w 11 + a 13 w 12 + a 22 w 21 + a 23 w 22 + b 12 z_{12} = a_{12}w_{11} + a_{13}w_{12} + a_{22}w_{21} + a_{23}w_{22} +b_{12} z12=a12w11+a13w12+a22w21+a23w22+b12 z 21 = a 21 w 11 + a 22 w 12 + a 31 w 21 + a 32 w 22 + b 21 z_{21} = a_{21}w_{11} + a_{22}w_{12} + a_{31}w_{21} + a_{32}w_{22} + b_{21} z21=a21w11+a22w12+a31w21+a32w22+b21 z 22 = a 22 w 11 + a 23 w 12 + a 32 w 21 + a 33 w 22 + b 22 z_{22} = a_{22}w_{11} + a_{23}w_{12} + a_{32}w_{21} + a_{33}w_{22} + b_{22} z22=a22w11+a23w12+a32w21+a33w22+b22,那我们现在已经都知道 δ l \delta_l δl,即 ∂ J ∂ z 11 l , ∂ J ∂ z 12 l , ∂ J ∂ z 21 l , ∂ J ∂ z 22 l \frac{\partial J}{\partial z_{11}^{l}},\frac{\partial J}{\partial z_{12}^{l}},\frac{\partial J}{\partial z_{21}^{l}},\frac{\partial J}{\partial z_{22}^{l}} z11lJ,z12lJ,z21lJ,z22lJ也已知,那要求 ∂ J ∂ a 11 l , ∂ J ∂ a 12 l , ∂ J ∂ a 13 l . . . . . \frac{\partial J}{\partial a_{11}^{l}},\frac{\partial J}{\partial a_{12}^{l}},\frac{\partial J}{\partial a_{13}^{l}}..... a11lJ,a12lJ,a13lJ.....,那根据链式求导法则,就需要看 a 11 , a 12 , a 13 . . . a_{11},a_{12},a_{13}... a11,a12,a13... z 11 , z 12 , z 21 . . . z_{11},z_{12},z_{21}... z11,z12,z21...之间的关系了,首先根据上面的一列式子,我们发现和 a 11 a_{11} a11相关的只有 z 11 z_{11} z11一项,和 a 12 a_{12} a12相关的却有 z 11 , z 12 z_{11},z_{12} z11,z12两项,和 a 13 a_{13} a13相关的有 z 12 z_{12} z12一项,因此推导下来,我们可以得到以下式子: ∂ J ( w , b ) ∂ a 11 1 − 1 = ∂ J ( w , b ) ∂ z 11 2 w 11 = δ 11 w 11 ∂ J ( w , b ) ∂ a 12 = ∂ J ( w , b ) ∂ z 11 w 12 + ∂ J ( w , b ) ∂ z 12 w 11 = δ 11 w 12 + δ 12 w 11 ∂ J ( W , b ) ∂ a 13 = ∂ J ( w , b ) ∂ z 12 w 12 = δ 12 w 12 ∂ J ( W , b ) ∂ a 21 = ∂ J ( w ⋅ b ) ∂ z 11 w 21 + ∂ J ( w 1 b ) d z 21 w 11 = δ 11 w 21 + δ 21 w 11 ∂ J ( w , b ) d a 22 = ∂ J ( w , b ) ∂ z 11 w 22 + ∂ J ( w , b ) ∂ z 12 w 21 + ∂ J ( w , b ) ∂ z 21 w 12 + ∂ J ( w , b ) ∂ z 22 w 11 ∂ J ( w , b ) ∂ a 23 = ∂ J ( w , b ) ∂ z 12 w 22 + ∂ J ( w , b ) ∂ z 22 w 12 = δ 12 w 22 + δ 22 w 12 ∂ J ( w , b ) ∂ a 31 = ∂ J ( w , b ) ∂ z 21 w 21 = δ 21 w 21 ∂ J ( w 1 b ) ∂ a 32 = ∂ J ( w , b ) ∂ z 21 w 22 + ∂ J ( w , b ) ∂ z 22 W 21 = δ 21 w 22 + δ 22 w 21 ∂ J ( w , b ) ∂ a 33 = ∂ J ( w , b ) ∂ z 22 W 22 = δ 22 ⋅ w 22 \begin{aligned} &\frac{\partial J(w, b)}{\partial a_{11}^{1-1}}=\frac{\partial J(w, b)}{\partial z_{11}^{2}} w_{11}=\delta_{11} w_{11}\\ &\frac{\partial J(w, b)}{\partial a_{12}}=\frac{\partial J(w, b)}{\partial z_{11}} w_{12}+\frac{\partial J(w, b)}{\partial z_{12}} w_{11}=\delta_{11} w_{12}+\delta_{12} w_{11}\\ &\frac{\partial J(W, b)}{\partial a_{13}}=\frac{\partial J(w, b)}{\partial z_{12}} w_{12}=\delta_{12} w_{12}\\ &\frac{\partial J(W, b)}{\partial a_{21}}=\frac{\partial J(w \cdot b)}{\partial z_{11}} w_{21}+\frac{\partial J\left(w_{1} b\right)}{d z_{21}} w_{11}=\delta_{11} w_{21}+\delta_{21} w_{11}\\ &\frac{\partial J(w, b)}{d a_{22}}=\frac{\partial J(w, b)}{\partial z_{11}} w_{22}+\frac{\partial J(w, b)}{\partial z_{12}} w_{21}+\frac{\partial J(w, b)}{\partial z_{21}} w_{12}+\frac{\partial J(w, b)}{\partial z_{22}} w_{11}\\ &\frac{\partial J(w, b)}{\partial a_{23} }=\frac{\partial J(w, b)}{\partial z_{12}} w_{22}+\frac{\partial J(w, b)}{\partial z_{22}} w_{12} = \delta_{12} w_{22} + \delta_{22} w_{12}\\ &\frac{\partial J(w, b)}{\partial a_{31}}=\frac{\partial J(w, b)}{\partial z_{21}} w_{21} = \delta_{21} w_{21}\\ &\frac{\partial J\left(w_{1} b\right)}{\partial a_{32}}=\frac{\partial J(w, b)}{\partial z_{21}} w_{22}+\frac{\partial J(w, b)}{\partial z_{22}} W_{21}=\delta_{21} w_{22} + \delta_{22} w_{21} \\ &\frac{\partial J(w, b)}{\partial a_{33}}=\frac{\partial J(w, b)}{\partial z_{22}} W_{22}=\delta_{22} \cdot w_{22} \end{aligned} a1111J(w,b)=z112J(w,b)w11=δ11w11a12J(w,b)=z11J(w,b)w12+z12J(w,b)w11=δ11w12+δ12w11a13J(W,b)=z12J(w,b)w12=δ12w12a21J(W,b)=z11J(wb)w21+dz21J(w1b)w11=δ11w21+δ21w11da22J(w,b)=z11J(w,b)w22+z12J(w,b)w21+z21J(w,b)w12+z22J(w,b)w11a23J(w,b)=z12J(w,b)w22+z22J(w,b)w12=δ12w22+δ22w12a31J(w,b)=z21J(w,b)w21=δ21w21a32J(w1b)=z21J(w,b)w22+z22J(w,b)W21=δ21w22+δ22w21a33J(w,b)=z22J(w,b)W22=δ22w22 将上面九个式子整理以后,我们可以用下面这个卷积的形式表达: ( ∂ J ∂ a 11 ∂ J ∂ a 12 ∂ J ∂ a 13 ∂ J ∂ a 21 ∂ J ∂ a 22 ∂ J ∂ a 23 ∂ J ∂ a 31 ∂ J ∂ a 32 ∂ J ∂ a 33 ) = ( 0 0 0 0 0 δ 11 δ 12 0 0 δ 21 δ 22 0 0 0 0 0 ) ∗ ( w 22 w 21 w 12 w 11 ) \begin{array}{c} \left(\begin{array}{ccc} \frac{\partial J}{\partial a_{11}} & \frac{\partial J}{\partial a_{12}} & \frac{\partial J}{\partial a_{13}} \\ \frac{\partial J}{\partial a_{21}} & \frac{\partial J}{\partial a_{22}} & \frac{\partial J}{\partial a_{23}} \\ \frac{\partial J}{\partial a_{31}} & \frac{\partial J}{\partial a_{32}} & \frac{\partial J}{\partial a_{33}} \end{array}\right)=\left(\begin{array}{cccc} 0 & 0 & 0 & 0 \\ 0 & \delta_{11} & \delta_{12} & 0 \\ 0 & \delta_{21} & \delta_{22} & 0 \\ 0 & 0 & 0 & 0 \end{array}\right) *\left(\begin{array}{cc} w_{22} & w_{21} \\ w_{12} & w_{11} \end{array}\right) \end{array} a11Ja21Ja31Ja12Ja22Ja32Ja13Ja23Ja33J=00000δ11δ2100δ12δ2200000(w22w12w21w11)这也就解释了卷积核反转180的原因,除此之外,对于任意的 l l l层卷积层输出节点或者说特征图 z j z_{j} zj,其对应的 l − 1 l-1 l1层输出 a l − 1 a^{l-1} al1肯定有不止有一个节点,但是对于任一节点 a i l − 1 a_i^{l-1} ail1,都可以用如下公式表示: ∂ J ( W , b ) ∂ a i l − 1 = ∂ J ( W , b ) ∂ z j l ∗ r o t 180 ( W i j l ) \frac{\partial J(W,b)}{\partial a_i^{l-1}} = \frac{\partial J(W,b)}{\partial z_j^{l}}*rot180(W_{ij}^{l}) ail1J(W,b)=zjlJ(W,b)rot180(Wijl)进一步推导: ∂ J ( W , b ) ∂ z i l − 1 = ∂ J ( W , b ) ∂ a i l − 1 ⊙ σ ′ ( z i l − 1 ) = ∂ J ( W , b ) ∂ z j l ∗ r o t 180 ( W i j l ) ⊙ σ ′ ( z i l − 1 ) \frac{\partial J(W,b)}{\partial z_i^{l-1}} = \frac{\partial J(W,b)}{\partial a_i^{l-1}} \odot \sigma^{'}(z_i^{l-1}) = \frac{\partial J(W,b)}{\partial z_j^{l}}*rot180(W_{ij}^{l}) \odot \sigma^{'}(z_i^{l-1}) zil1J(W,b)=ail1J(W,b)σ(zil1)=zjlJ(W,b)rot180(Wijl)σ(zil1)

3.3 已知卷积层 δ l \delta^l δl,推导该层的 W , b W,b Wb参数

因为池化层并不存在参数问题,而形式上全连接层可以理解成一种结构较为特殊的卷积层,或者参照深度神经网络反向传播算法的推导过程DNN反向传播算法,所以我们比较关系但也是最重要的参数求导过程就是卷积层权重和偏置的求导过程。推导公式如下: ∂ J ( W , b ) ∂ W l = a l − 1 ∗ δ l \frac{\partial J(W,b)}{\partial W^{l}}=a^{l-1} *\delta^l WlJ(W,b)=al1δl
∂ J ( W , b ) ∂ b l = ∑ u , v ( δ l ) u , v \frac{\partial J(W,b)}{\partial b^{l}} = \sum\limits_{u,v}(\delta^l)_{u,v} blJ(W,b)=u,v(δl)u,v同样,参照链式求导法则,假设第 l − 1 l-1 l1层的输出 a l − 1 a^{l-1} al1是一个3x3矩阵,第 l l l层的卷积核是一个一个2x2矩阵,那么偏置为 b l b^l bl,则有 a l − 1 ∗ W l + b l = z l a^{l-1}*W^l +b^l = z^{l} al1Wl+bl=zl,同样用矩阵表达的话, ( a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ) ∗ ( W 11 W 12 W 21 W 22 ) + ( b 11 b 12 b 21 b 22 ) = ( Z 11 Z 12 2 21 Z 22 ) \left(\begin{array}{lll} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{array}\right) *\left(\begin{array}{cc} W_{11} & W_{12} \\ W_{21} & W_{22} \end{array}\right)+\left(\begin{array}{ll} b_{11} & b_{12} \\ b_{21} & b_{22} \end{array}\right)=\left(\begin{array}{cc} Z_{11} & Z_{12} \\ 2_{21} & Z_{22} \end{array}\right) a11a21a31a12a22a32a13a23a33(W11W21W12W22)+(b11b21b12b22)=(Z11221Z12Z22) z 11 = a 11 w 11 + a 12 w 12 + a 21 w 21 + a 22 w 22 + b 11 z_{11} = a_{11}w_{11} + a_{12}w_{12} + a_{21}w_{21} + a_{22}w_{22} + b_{11} z11=a11w11+a12w12+a21w21+a22w22+b11 z 12 = a 12 w 11 + a 13 w 12 + a 22 w 21 + a 23 w 22 + b 12 z_{12} = a_{12}w_{11} + a_{13}w_{12} + a_{22}w_{21} + a_{23}w_{22} +b_{12} z12=a12w11+a13w12+a22w21+a23w22+b12 z 21 = a 21 w 11 + a 22 w 12 + a 31 w 21 + a 32 w 22 + b 21 z_{21} = a_{21}w_{11} + a_{22}w_{12} + a_{31}w_{21} + a_{32}w_{22} + b_{21} z21=a21w11+a22w12+a31w21+a32w22+b21 z 22 = a 22 w 11 + a 23 w 12 + a 32 w 21 + a 33 w 22 + b 22 z_{22} = a_{22}w_{11} + a_{23}w_{12} + a_{32}w_{21} + a_{33}w_{22} + b_{22} z22=a22w11+a23w12+a32w21+a33w22+b22
那我们根据链式求导法则,很容易得出以下的式子 ∂ J ( W , b ) ∂ W 11 = ∂ J ( W , b ) ∂ z 11 ⋅ ∂ z 11 ∂ W 11 + ∂ J ( W , b ) ∂ z 12 ⋅ ∂ z 12 ∂ W 11 + ∂ J ( W , b ) ∂ z 21 ⋅ ∂ z 21 ∂ W 11 + ∂ J ( W , b ) ∂ z 22 ⋅ ∂ z 22 ∂ W 11   = a 11 δ 11 + a 12 δ 12 + a 21 δ 21 + a 22 δ 22 \frac{\partial J(W,b)}{\partial W_{11}}=\frac{\partial J(W,b)}{\partial z_{11}} \cdot \frac{\partial z_{11}}{\partial W_{11}}+\frac{\partial J(W,b)}{\partial z_{12}} \cdot \frac{\partial z_{12}}{\partial W_{11}}+\frac{\partial J(W,b)}{\partial z_{21}} \cdot \frac{\partial z_{21}}{\partial W_{11}}+\frac{\partial J(W,b)}{\partial z_{22}} \cdot \frac{\partial z_{22}}{\partial W_{11}} \\\ = a_{11}\delta_{11} + a_{12}\delta_{12} + a_{21}\delta_{21} + a_{22}\delta_{22} W11J(W,b)=z11J(W,b)W11z11+z12J(W,b)W11z12+z21J(W,b)W11z21+z22J(W,b)W11z22 =a11δ11+a12δ12+a21δ21+a22δ22同理可得;

∂ J ( W , b ) ∂ W 12 l = a 12 δ 11 + a 13 δ 12 + a 22 δ 21 + a 23 δ 22 ∂ J ( W , b ) ∂ W 13 l = a 13 δ 11 + a 14 δ 12 + a 23 δ 21 + a 24 δ 22 ∂ J ( W , b ) ∂ W 21 l = a 21 δ 11 + a 22 δ 12 + a 31 δ 21 + a 32 δ 22 \\\frac{\partial J(W,b)}{\partial W_{12}^{l}} = a_{12}\delta_{11} + a_{13}\delta_{12} + a_{22}\delta_{21} + a_{23}\delta_{22} \\\frac{\partial J(W,b)}{\partial W_{13}^{l}} = a_{13}\delta_{11} + a_{14}\delta_{12} + a_{23}\delta_{21} + a_{24}\delta_{22} \\\frac{\partial J(W,b)}{\partial W_{21}^{l}} = a_{21}\delta_{11} + a_{22}\delta_{12} + a_{31}\delta_{21} + a_{32}\delta_{22} W12lJ(W,b)=a12δ11+a13δ12+a22δ21+a23δ22W13lJ(W,b)=a13δ11+a14δ12+a23δ21+a24δ22W21lJ(W,b)=a21δ11+a22δ12+a31δ21+a32δ22,进一步整理: ∂ J ( W , b ) ∂ W l = ( a 11 a 12 a 13 a 14 a 21 a 22 a 23 a 24 a 31 a 32 a 33 a 34 a 41 a 42 a 43 a 44 ) ∗ ( δ 11 δ 12 δ 21 δ 22 ) = a l − 1 ∗ δ l \frac{\partial J(W,b)}{\partial W^{l}} =\left( \begin{array}{ccc} a_{11}&a_{12}&a_{13}&a_{14} \\ a_{21}&a_{22}&a_{23}&a_{24} \\ a_{31}&a_{32}&a_{33}&a_{34} \\ a_{41}&a_{42}&a_{43}&a_{44} \end{array} \right) * \left( \begin{array}{ccc} \delta_{11}& \delta_{12} \\ \delta_{21}&\delta_{22} \end{array} \right) = a^{l-1} * \delta ^l WlJ(W,b)=a11a21a31a41a12a22a32a42a13a23a33a43a14a24a34a44(δ11δ21δ12δ22)=al1δl 相对而言, ∂ J ( W , b ) ∂ b l \frac {\partial J(W,b)}{\partial b^l} blJ(W,b)就比较好处理了, ∂ J ( W , b ) ∂ b l = δ l \frac {\partial J(W,b)}{\partial b^l} = \delta^l blJ(W,b)=δl至此,有关反向传播的所有环节就已经结束了。

4、卷积神经网络训练过程总结

在整个神经网络架构已经清晰明确且训练数据确定的情况下,我们就可以编写代码来训练我们的神经网络了,步骤如下:

  1. 初始化网络中所有权值 W W W和偏置参数 b b b
  2. 利用前向传播算法计算最后一层输出 a L a^L aL
  3. 使用softmax对输出处理,并计算损失函数 J J J;
  4. 根据反向传播算法,计算损失函数 J J J对各项权重或者偏置的偏导 ∂ J ∂ ( W , b ) \frac{\partial J}{\partial {(W,b)}} (W,b)J
  5. 利用梯度下降流,更新权重和偏置, ( W , b ) i + 1 = ( W , b ) i − r ⋅ ∂ J ∂ ( W , b ) {(W,b)} ^{i+1} = {(W,b)}^i - r \cdot {\frac{\partial J}{\partial {(W,b)}}} (W,b)i+1=(W,b)ir(W,b)J,返回至步骤2直至损失函数小于我们的预设值;

参考资料

1、卷积神经网络(CNN)反向传播算法
2、卷积神经网络的训练方法

  • 8
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
卷积神经网络CNN)是一种常用于图像识别和处理任务的深度学习网络,其训练算法如下: 1. 数据预处理:首先,需要将输入的图像数据进行预处理。这包括对图像进行缩放、归一化和标准化等操作,以便使输入数据适合网络的要求。 2. 初始化参数:为了开始训练网络,需要初始化CNN的参数。通常,权重矩阵和偏置项是随机初始化的,以便给网络提供足够的学习空间。 3. 前向传播:在CNN中,前向传播是指输入数据通过网络的各个层,逐层传递并经过卷积、非线性激活函数、池化等操作,最终得到输出结果。在这个过程中,需要计算并保存每一层的中间结果和激活值。 4. 计算损失函数:得到输出结果后,需要与真实标签进行对比并计算损失函数。常见的损失函数有交叉熵损失函数、均方差损失函数等。 5. 反向传播:通过反向传播算法,将损失函数的梯度反向传播到每一层的参数上。这个过程包括计算梯度、更新权重矩阵和偏置项等操作,以调整网络参数使损失函数逐渐减小。 6. 参数更新:基于反向传播计算得到的梯度,使用优化算法(如随机梯度下降法)来更新网络中的参数。通过迭代循环多次,不断优化网络参数,以使模型更好地逼近真实结果。 7. 重复迭代:通过多次迭代进行上述步骤,直到达到预定义的停止条件,例如达到最大迭代次数或收敛到一定的训练误差。 8. 模型评估:训练完成后,使用验证集或测试集来评估训练得到的模型的性能。可以计算并比较准确率、召回率、精确率等指标,来评价模型在未知数据上的预测能力。 以上就是Python卷积神经网络CNN)的训练算法的基本步骤。通过不断的迭代优化,CNN可以逐渐学习到输入数据的特征,并对未知数据进行准确的预测。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值