tutorial of CNN 笔记

来源:互联网 发布:python 获取js跳转url 编辑:程序博客网 时间:2024/05/21 22:53

tutorial of CNN 笔记

Vanilla BP Through Fully Connected Networks

这里只考虑二维CNN的情况

Feedforward Pass

这里使用平方误差Loss Function,对于一个c类N个sample的分类器,设 tnk 为第n个图像在k-th维度上对应的label,ynk 为CNN的输出层对于第n个输入的pattern在第k个维度上的输出,则error为:

EN=12n=1Nk=1c(tnkynk)2

多分类器的label大多采用one-hot code(e.g:[0,0,1,0,0])

由于整个dataset的error只是N张输入的error的加和,这里为了简便假定input只有一张图,那么

En=12k=1c(tnkynk)2=12tnyn22

为了将权值W引入计算,设 表示当前层号,输入层为1层,输出层为L层,定义这一层的输出为:
x=f(u),withu=Wx1+b

f(.)为激活函数(sigmoid或tanh),f(x)=atanh(bx),但是把数据正则化(normalizing)为期望为0方差为1的数据会改善梯度下降中改善收敛的性能,所以tanh较好一点.LeCun推荐a=1.7159 并且b=2/3,so that the point of maximum nonlinearity occurs at f(±1)=±1and will thus avoid saturation during training if the desired training targets are normalized to take on the values ±1.

Backpropagation Pass

这里的error可以视为每一个神经元对bias(b)上的扰动的敏感度(大雾),公式为

Eb=Euub=δ

ub=1,也就是说

Eb=Eu=δ

那么有

δ=Eu=Eu+1u+1xxu

Eu+1u+1xxu=δ+1=(W+1)T=f(u)

得到反向传播的最重要的公式:
δ=(W+1)Tδ+1f(u)

对输出层,公式变为
f(u)δL=yuL=f(u)(yntn)

那么对每一个给定的神经元,更新权值W只需要知道输入和对应的delta(delta法则)
EW=uWEu=x1(δ)T

W=ηEW

实际应用中对每一个Wi,j都对应一个学习率ηi,j

Convolutional Neural Networks

Convolution Layers

导出convolution layers 的bp更新公式,在convolution layer,前一层的特征图和一个可以学习的kernel进行卷积并且在最后加上一个activation function,每一个convolution layer的output map可能由多个输入卷积之后叠加而成,设Mj为选中的input map(a selection of input map),公式为:

xj=f(iMjx1iki,j+bj)

对于input map selection的设置,一般选择每两个一组或者每三个一组。

Computing the Gradients

我们假定每一个卷积层 的后面都有一个降采样层(pooling?)+1 。和全连接的BP网络不同,在CNN中一个卷积层后面是一个降采样层,那么下一层的图像上的一个像素点在上一层中对应一个block的像素点,也就是这一像素点对应的δ 在上一层中对应一个block的像素点,因为有降采样层的存在, 层中的每一个unit只对应+1层中的一个unit。为了有效率地计算 层的δ ,我们可以upsample+1层的δ 组成的map,使得这一个map和上一个卷积层的大小一致,然后和上一层的f(uj)进行元素相乘。在降采样层的map定义的权值全部都等于β (constent),所以我们只需要把上一步操作的结果乘上β 来结束 层的δ 的计算,所以对convolutional层的每一个map j,都有:

δj=β+1j(f(uj)up(δ+1j))

up(.)表示upsampling操作,即将每一个像素点横向和纵向地重复n次(假设降采样层是以n*n的大小降采样的),一个有效的计算这个过程的方法是使用Kronecker product

如果A是一个 m x n 的矩阵,而B是一个 p x q 的矩阵,克罗内克积则是一个 mp x nq 的矩阵

AB=a11Bam1Ba1nBamnB

那么

up(x)x1n×n

那么我们很快就可以计算出bias的梯度:
Ebj=u,v(δj)uv.

最后,卷积核权值的梯度可以用BP得出,因为权值共享,只需要把所有涉及到给定权值的连接的梯度相加即可
Eki,j=u,v(δj)uv(P1i)uv

(P1i)uvx1i中的一个patch,在卷积的过程中和ki,j进行对应元素相乘以得到在output mapxj的第(u,v)个元素,ki,j是从input map i 到output map j过程中使用的卷积核

上式可以在MATLAB中用一行写出,我们先对delta灵敏度map进行旋转,这样就可以进行互相关计算,而不是卷积(在卷积的数学定义中,特征矩阵(卷积核)在传递给conv2时需要先翻转(flipped)一下。也就是颠倒下特征矩阵的行和列)。然后把输出反旋转回来,这样我们在前向传播进行卷积的时候,卷积核才是我们想要的方向。

Eki,j=rot180(conv2(x1i,rot180(δj),valid)).

Sub-sampling Layers

降采样层提供了对input map的降采样的视角,如果有N个input map,那么就有N个output map,但是output map 要比input map小,或者

xj=f(βjdown(x1j+bj)),

down(.)表示降采样方程,一般采用n x n的区域计算(取最大或者取平均),所以output map 的大小要比input map的大小在两个空间维度上(x轴,y轴)小n倍,β 为乘性bias,b 为加性bias

Computing the Gradients

这里的难点在于计算δ maps,一旦我们得到了δ maps,需要学习的变量就只有β 和b,我们假设降采样层被卷积层上下包围。如果紧跟着降采样层的是全连接层,那么δ map可以直接用Vanilla BP公式算出

当我们计算section2.1.1的卷积核的梯度的时候,我们需要算出input中的哪一个patch对应output map中的给定的pixel,而在这里我们需要算出当前层的δ map对应下一层的δ map的pixel,因为需要使用形如δ=(W+1)Tδ+1f(u)δ迭代公式。另外,需要乘以输入patch与输出像素之间连接的权值,这个权值实际上就是卷积核的权值(已旋转的)。

δj=f(uj)conv2(δ+1j,rot180(k+1j),full).

像之前一样,我们先旋转卷积核来让卷积函数进行互相关计算,这里需要使用’full convolution’来处理边界情况,在边界补0,以免input中的一个patch无法被nxn的区域铺满

这时就可以开始计算β和b了,对于加性bias,同样只是把δ map中的所有元素加起来:

Ebj=u,v(δj)uv.

对于乘性bias,不可避免地要涉及到原来的在feedforward过程中的当前层的down-sampled的map,所以最好把这些map先保存起来,避免重复计算,定义:
dj:=down(x1j)

那么β的梯度:
Eβj=u,v(δjdj)uv.

Learning Combinations of Feature Maps

一般来说,使用多个input的卷积相加得出一个output map是有好处的。在一些著作中,这样的一些input map是手动选择的,但是我们可以尝试让CNN自己学习如何选择input maps,令αij表示input map i的权重,那么output map j可以表示为:

xj=f(i=1Ninputαij(x1iki)+bj)

并且
iαij=1,and0αij1.

为了满足上式可以把αij设置为由一组无限制的隐含权值通过softmax得到的值
αij=exp(cij)kexp(ckj)

因为上式的j是固定的,为了简便,我们去掉j,只考虑一个输出的情况,那么上面的那个softmax的函数的导数为:
αkci=δkiαiαiαk

这里的δ为Kronecker delta

Kronecker delta: δi,j=0ifijδi,j=1ifi=j

c那么α关于E的梯度:

Eαi=Euuαi=u,v(δ(x1iki))uv

uj=iαi(x1iki)+b

这里δ是输入为u的output map对应的δ map,并且这里的卷积为“vaild convolution”,使得结果的尺寸和δ map 的尺寸一致,现在可以用chain rule来计算E关于c的梯度:
Eci=kEαkαkci=αi(EαikEαkαk)

Enforcing Space Combinations(加强稀疏性组合)

为了使得α的分布是稀疏的(e.g:(0.1,0,0…,0,0.9)),也就是使得一个output map不至于和很多的input map相关联,可以在最后的Loss Function中加入regularization penalty(稀疏约束项)Ω(α),这样可以使得一部分权值朝着0方向变化,给出对一张图的error:

E˜n=En+λi,j|(α)ij|

只考虑一个输出的情况时:
Ωαi=λsign(αi)

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

因为
xsign(x)=|x|

那么总体上
E˜nci=Enci+Ωci