CNN反向求导推导

本文主要是借助参考文献1《Notes on Convolutional Neural Networks》的内容,以及博客【2】和【3】里面的内容,对卷积神经网络的推导做个梳理。

激活函数

logistic function

σ(x)=11+ex

hyperbolic tangent
tanh(x)=e2x1e2x+1

两者之间的关系
tanh(x)=2σ(2x)1

对激活函数求导,我们有
tanh(x)x=1tanh(x)2

σ(x)(x)=σ(x)(1σ(x))

Loss Function 及求导

一般定义pre-activation(输出层神经单元用k表示):

ak=hHLwhkbh

所以对于输出层,每个类别的概率可以用softmax函数来计算:
p(Ck|x)=eakKk=1eak

ground truth 的类别z用个one-of-k维的向量来表示。这样的话,目标label的概率为
p(z|x)=k=1Kyzkk

对于损失函数,一般可以用negtative log likelihood L(x,z)=lnp(z|x) ,得到:
L(x,z)=(z1)ln(1y)zlny

对于多分类的问题,可以有
L(x,z)=k=1Kzklnyk

或者采用【1】中最小二乘形式的损失函数
EN=12n=1Nk=1c(znkynk)2

znk (【1】用 znk 表示)是第n个实例的ground truth的对应第k个维度的label (0 or 1表示是否是这个类别).
从这个形式可以看出来,最小化差方形式的损失函数,等价于同时最大化truth label的概率,最小化false label的概率。而negtative log likelihood 只是最大化truth label的概率。
Loss function对output以及pre activation的求导:
L(x,z)yk=zkyk

对于二分类的情况
L(x,z)y=1z1yzy=yzy(1y)

利用链式法则,可以得到对于pre-activation的导数
L(x,z)a=L(x,z)yya=y(1y) yzy(1y)=yz

对于多分类的偏导,也可以使用类似的方式求偏导
L(x,z)ak=k=1KL(x,z)ykykak

最后可以得到
L(x,z)ak=ykzk

我们用上标 l 表示该蚕食是位于第l层,当前层,那么当前层的输出可以表示为
xl=θ(al),al=Wlxl+bl

θ 是激活函数,可以取sigmoid σ 或是 tanh 函数。

反向传播

由于神经网络是有多层,但是只有输出层才有ground truth的label以及模型输出,根据“误差”向误差减小方向调整权值。但是对于隐含层,没有ground truth label,这就需要由输出层将“误差”传播到隐含层。这里的“误差”,是损失函数对pre-activation的偏导,也可以看做损失函数对于bias b的敏感度:

δ=Eb=Eaab

al=Wlxl+bl 知道, ab=1 ,所以这个解释也可以说的过去。下面是如何反向传播 δ
δl=Exlxlal=xlalEal+1al+1xl=θ(al)(Wl+1)Tδl+1

其中 表示element-wise product。
对于输出层的 δ ,若是损失函数是negtative log, δL=Ea=yz
粗体 y 是softmax的输出概率, z 是目标label的one-of-k 向量。
对于差方损失, δ 可以得到
δL=θ(al)(ynzn)

有了 δ ,就可以通过链式法则来求得对于中间层的偏导:
EWl=EalalWl=δl(xl1)T

ΔWl=ηEWl
η 是学习速率,【1】中介绍实际中对于每个 Wij 都会有一个学习速率 ηij

卷积神经网络

卷积神经网络(CNN),含有两种类型的网络连接,卷积层和sub-sampling层。

卷积层

每个输出层可以由多个输入层卷积的组合得到,也就是说

xlj=θ(iMjxl1iklij+blj)

对于每个输出层map的每个输入层map,可以用不同的kernel klij
Mj 表示第 j 输出map的输入map集合。

下采样层

下采样层每个输出层是对对应输入层的下采样,所以输入层输出层都是N

xlj=θ(βljdown(xl1j)+blj)

down(.) 表示下采样,一般来说,这个函数会对一个 n×n 大小的block求和,然后乘以一个乘法 bias β 和一个加法 b .

卷积层梯度的计算

类似于BP算法过程,首先是求得下一层敏感度和下一层权值的内积,然后做点乘。在CNN中,卷积层与sub-sampling层是依次挨着的。sub-sampling对nxn大小的block求和,可以看做权值是1。所以先要用nxn大小的全1矩阵与下一层敏感度矩阵做Kronecker积,完成权值相乘与上采样,得到与当前层敏感度大小map。然后与激活函数导数做点乘。
当然,【1】中提到了下采样之后用一个大小为β的标量相乘,看做下采样层的权值都为 β ,所以这里在计算完之后乘以一个 β 。所以式子就是

δlj=βl+1j(θup(δl+1j))

其中,上采样就是与全1矩阵做一个Kronecker积
up(x)=x1n×n

这样的话,对于特定map的敏感度求和就得到了对应的bias偏导
Ebj=u,v(δlj)u,v

对权值求导就是该权值相连的前一层数据和和当前层的敏感度乘积,由于是共享权值,所以每个权值链接的不是单一输入输出,所以要对所有该权值连接的数据进行求和
EWlij=u,v(δlj)u,v(pl1i)u,v

按照【1】中的说法这里单独记录kernel的每个权值在相邻两层的连接元素比较麻烦,但是由于kernel和out map以及input map都是矩形,而且卷积过程是顺序操作,显然可以用互相关来得到对应元素的乘积。可以使用matlab的卷积来进行互相关运算,只不过要先将数据进行翻转。
可以这么解释,假设一个 k×k 大小的kernel和一个 N×N 大小的图像进行卷积操作,生成的map是 (Nk+1)×(Nk+1) ,对于kernel上的每个weight,会和原来图像的一个 (Nk+1)×(Nk+1) 大小的连续区域的所有元素进行乘积。假设 (1,1) 位置的kernel的weight,会和原来map(图像)右下方 (Nk+1)×(Nk+1) 的区域每个元素乘积,然后贡献到下层map的 (Nk+1)×(Nk+1) 的每个对应位置上。所以与(1,1)相关的元素是输入层map的右下方的 (Nk+1)×(Nk+1) 和输出层的 (Nk+1)×(Nk+1) 大小map。所以说反向传播过程中的偏导计算可以使用互相关操作来完成,用matlab代码:
Ekli,j=rot180(conv2(xl1i),rot180(δlj,valid))

注意到前面还有一个 rot180 操作,那是因为(1,1)在输入层map对应的是右下方 (Nk+1)×(Nk+1) 区域,所以互相关之后还是在右下方 (k,k) 位置,所以要旋转180度得到(1,1)位置。

下采样层梯度的运算

首先是计算敏感度map δlj ,由反向传播计算下一层的敏感度 δl+1j 计算,与kernel相乘然后与激活函数的导数做element-wise相乘。下一层是卷积操作,当前层map的每个元素通过kernel的不同链接与下一层的map的多个元素有链接。所以用下一层map敏感度与kernel进行互相关操作得到BP敏感度公式中权值和下层敏感度的乘积。

δlj=θ(alj)conv2(δl+1j,rot180(kl+1j),full)

注意到这里用的是full,在前向过程计算下层中,下层元素每维度少了 k1,nk+1)×(nk+1) ,所以对于边缘,例如input map (1,1)位置,只和output map的(1,1)有关,所以需要用0补全然后再做互相关操作。
然后就是求参数 bj βj 的偏导了。
bj 的偏导仍是把该层敏感度相加
Ebj=u,v(δlj)u,v

然后求权值偏导,首先保存下采样数据
dlj=down(xl1j)

然后对所有相连的数据相乘求和
Eβj=u,v(δljdlj)u,v

学习特征map的组合

现有的output map是由多个不同的map组合的,但是如何组合目前还是通过人工的方式进行选择,如何自动地进行学习哪些input map可以组成哪些output map呢?
我们设定 αij 是组成output map j时,input map i所占有的权重,所以就有:

xlj=θ(i=1Ninαij(xl1ikli+blj)

subject to
iαij=1,  and  0αij1

αij 是一个概率,可以用softmax函数来表示
αij=exp(cij)kexp(ckj)

cij 表示对应的weight,由于这里j都是一样,所以可以把下班j省立
cj 求偏导
αkci=δkiαiαiαk

这里的 δki 是指示函数,k==i时为1,不等时为0.
再求损失函数对 αi 的偏导
Eαi=Ealalαi=u,v(δl(xl1ikli))u,v

然后合并起来
Eci=kEαkαkci=αi(EαikEαkαk)

关于sparsity

加上1范数的regularization。

E~n=En+λi.j|(αi,j)|

求导:
Ωci=kΩαkαkci=λ(|αi|αik|αk|)

整个偏导公式:
E~nci=Enci+Ωci

参考文献:
【1】Notes on Convolutional Neural Networks
【2】 http://blog.csdn.net/zouxy09/article/details/9993371
【3】 http://www.cnblogs.com/tornadomeet/p/3468450.html
【4】Supervised Learning with Recurrent Neural Networks

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CNN卷积神经网络)是一种常用的深度学习模型,用于图像识别、目标检测等任务。而反向传播是CNN中用于训练网络的关键步骤之一。 反向传播(Backpropagation)是指通过计算误差(即预测值与真实值的差异)来调整神经网络的权重和偏置,以提高模型的预测准确度。在CNN中,反向传播的实现主要包括两个步骤:前向传播和反向传播。 首先,进行前向传播。首先将输入数据通过卷积层进行卷积运算,提取出图像的特征。然后,通过激活函数(如ReLU)来引入非线性。接下来,利用池化层来减小特征图的尺寸,并保留更显著的特征。最后,将处理后的特征输入到全连接层中,进行分类或回归等任务的预测。 其次,进行反向传播。首先,计算预测值与真实值之间的误差。然后,通过链式法则,将误差从输出层向输入层反向传播,并更新每个连接权重和偏置的数值。这样,网络中每个神经元的梯度都可以通过反向传播得到,从而调整网络参数,使其逐渐逼近真实值。此过程可以利用梯度下降等优化算法来完成。 具体地讲,反向传播过程主要分为四个步骤:计算损失函数对输出层的输入的偏导数、计算损失函数对输出层的权重的偏导数、计算损失函数对输入层的加权和的偏导数、计算损失函数对输入图像的偏导数。通过不断迭代这四个步骤,不断更新参数,从而提高网络的训练效果。 综上所述,CNN中的反向传播通过计算误差来调整网络的权重和偏置,以提高模型的准确度。这个过程主要包括前向传播和反向传播两个步骤,通过不断地更新参数,使得网络逐渐逼近真实值,从而达到优化模型的目的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值