深度学习之卷积神经网络CNN(二)训练方法

 

CNN的训练和DNN类似,使用前向传播得到预测值后,再用反向传播算法链式求导,计算损失函数对每个权重的偏导数,然后使用梯度下降法对权重进行更新。

 

一、参数初始化

神经网络的收敛结果很大程度取决于参数的初始化,理想的参数初始化方案使得模型训练事半功倍,不好的初始化方案不仅会影响网络收敛效果,甚至会导致梯度弥散或梯度爆炸。

注意参数不能全部初始化为0,这是因为在反向传播时梯度值相同,得到的所有参数都将是一样的,那么神经网络将无法训练模型。

        1、随机初始化

随机初始化是一种最直观的初始化算法,使用同一概率分布对参数赋予初值。常用的概率分布有:

        均匀分布:W~U(-0.01,+0.01)

        高斯分布:W~N(0,0.01)

随机初始化需要手动仔细设置初始化参数,否则可能训练速度慢或者不能收敛。当网络层次较深时,可能出现梯度弥散问题,导致前几层难以训练;或者收敛缓慢,网络效果还不如浅层网络的情况。

 

        2、Xavier初始化

这种方法考虑了随机初始化常见的梯度弥散问题,通过计算适当的随机初始化范围,使得网络在计算前向传播和反向传播时,每层输出数值的方差与上一层保持一致,这在一定程度上避免了网络加深导致的梯度弥散问题。

推导时首先将tanh函数0点附近近似为线性函数,令第 l 层的神经元数量为 n^{(l)},参数 w^{(l)} 和输入 x^{(l)} 为服从0均值的高斯分布,且相互独立,则有:

        \mathrm{Var}(x^{(l+1)})=\mathrm{Var}(\sum_{i=1}^{n^{(l)}}w_{i}^{(l)}x_{i}^{(l)})\\\\=\sum_{i=1}^{n^{(l)}}\mathrm{Var}(w_{i}^{(l)}x_{i}^{(l)})\\\\=\sum_{i=1}^{n^{(l)}}[E(w_{i}^{(l)})]^{2}\mathrm{Var}(x_{i}^{(l)})+[E(x_{i}^{(l)})]^{2}\mathrm{Var}(w_{i}^{(l)})+\mathrm{Var}(w_{i}^{(l)})\mathrm{Var}(x_{i}^{(l)})\\\\=\sum_{i=1}^{n^{(l)}}\mathrm{Var}(w_{i}^{(l)})\mathrm{Var}(x_{i}^{(l)})\\\\\\=n^{(l)}\mathrm{Var}(w^{(l)})\mathrm{Var}(x^{(l)})

为了防止梯度爆炸或梯度弥散,应使输入和输出的方差一致,因此:

        \mathrm{Var}(w^{(l)})=\frac{1}{n^{(l)}}

则前向传播k层后累积的方差为:

        \mathrm{Var}(x^{(k)})=\mathrm{Var}(x)\prod_{l=1}^{k}n^{(l)}\mathrm{Var}(w^{(l)})

k层网络反向传播后:

        \frac{\partial E}{\partial x^{(k-1)}}=\sum_{i=1}^{n}\frac{\partial E}{\partial x^{(k)}}\cdot w^{(k)}

        \mathrm{Var}(\frac{\partial E}{\partial x^{(k-1)}})=n^{(k)}\mathrm{Var}(\frac{\partial E}{\partial x^{(k)}})\mathrm{Var}(w^{(k)})

        \mathrm{Var}(\frac{\partial E}{\partial x^{(1)}})=\mathrm{Var}(\frac{\partial E}{\partial x^{(k)}})\prod_{l=1}^{k}n^{(l)}\mathrm{Var}(w^{(l)})

        \therefore \mathrm{Var}(w^{(l)})=\frac{1}{n^{(l)}}

前向传播时n表示输入的维度,反向传播时n表示输出的维度,而输出的维度等于下一层输入的维度,因此取二者的调和平均作为最终的方差:

        \mathrm{Var}(w^{(l)})=\frac{1}{n^{(l)}},    \mathrm{Var}(w^{(l)})=\frac{1}{n^{(l+1)}}

        \therefore \mathrm{Var}(w^{(l)})=\frac{2}{n^{(l)}+n^{(l+1)}}

使用均匀分布进行初始化,设初始化的范围是[-a,a],则方差为:

        Var(uniform)=\frac{((-a)-a)^{2}}{12}=\frac{a^{2}}{3}

        \frac{2}{n^{(l)}+n^{(l+1)}}=\frac{a^{2}}{3}\: \Rightarrow \: a=\sqrt{\frac{6}{n^{(l)}+n^{(l+1)}}}

所以Xavier初始化方法就是令参数服从下面区间内的均匀分布。

        W\sim U\left [ -\sqrt{\frac{6}{n^{(l)}+n^{(l+1)}}}, \sqrt{\frac{6}{n^{(l)}+n^{(l+1)}}} \right ]

这种方法是基于激活函数是线性的假设推导而来的,不适用于ReLU激活函数;还假设激活值关于0点对称,因此不适用于Sigmoid和ReLU激活函数。

 

        3、MSRA初始化

参数服从均值为0,方差为2/n(n为权重数量)的高斯分布。这种方法适用于深层网络、激活函数为ReLU的情况,当激活后方差发生变化时,初始权值也应相应变化。

        W\sim N\left ( 0,\sqrt{\frac{2}{n}} \right )

 

二、CNN的前向传播

        1、卷积层&激活层的前向传播

令*表示卷积运算,则前向传播到第l层的计算为:

        a^{(l)}=g(z^{(l)})=g(\sum_{m=1}^{M}z_{m}^{(l)})=g(\sum_{m=1}^{M}a_{m}^{(l-1)}*w_{m}^{(l)})

其中,M为卷积核个数,g为ReLU激活函数。feature map的尺寸计算在上一篇已经学习过,这里不再赘述。

这一层需要定义的参数有:卷积核个数、卷积核尺寸、填充padding以及步长stride。

Padding的两种方式:

        Valid:不做padding;

        Same:padding后进行卷积的输出尺寸和输入尺寸相同 \frac{n+2p-f}{s}+1=n\; \Rightarrow \; p=\frac{n(s-1)-s+f}{2}

 

        2、池化层的前向传播

池化层不需要训练参数,作用是对输入进行成倍缩小,即输出矩阵维度为输入矩阵维度NⅹN除以池化尺寸kⅹk=\frac{N}{k}\frac{N}{k}a^{(l)}=pool(a^{(l-1)})

这一层需要定义的参数有:池化尺寸k以及池化方式Max/Average。

 

        3、全连接层的前向传播

与传统DNN的计算方法相同,激活函数为Sigmoid、tanh或Softmax:

        a^{(l)}=g(z^{(l)})=g(w^{(l)}a^{(l-1)})

这一层需要定义的参数有:激活函数以及神经元个数。

 

三、CNN的反向传播

        1、全连接层的反向传播

类似DNN的BP算法,直接利用概述篇的结论得到第l层的梯度 \delta ^{(l)} 为:

        \delta ^{(l)}=\delta ^{(l+1)}\cdot \frac{\partial E}{\partial z^{(l)}}=(w^{(l)})^T\delta ^{(l+1)}\odot g{}'(z^{(l)})

使用MBGD算法更新这一层的权重:

        w^{(l)}:=w^{(l)}-\eta \sum_{mini}^{ }\delta ^{(l+1)}(a^{(l)})^{T}

       

        2、池化层的反向传播

首先根据池化尺寸将特征图尺寸还原k倍,即进行上采样,然后分为两种情况:

(1)Max Pooling:除了前向传播记录下来的最大值处继承上层梯度 \delta ^{(l)} 外,其他位置都置零。

(2)Average Pooling:将梯度平均分成k*k份,传递到前面对应区域内即可。

 

由于池化层没有激活函数,可以令g(z)=z即激活函数的导数为1,梯度为:\delta ^{(l)}=upsample(\delta ^{(l+1)})\odot g{}'(z^{(l)})

 

        3、卷积层的反向传播

对含有卷积的式子求导时,需要将卷积核旋转180度(rot180),并在周围补零,即可得到上一层的梯度误差:

        z^{(l+1)}=g(z^{(l)})*w^{(l+1)}

        \delta ^{(l)}=\delta ^{(l+1)}\cdot \frac{\partial z^{(l+1)}}{\partial z^{(l)}}=\delta ^{(l+1)}*rot180(w^{(l+1)})\odot g{}'(z^{(l)})

得到梯度误差后即可求出w的更新(层内求导不翻转180度):

        \frac{\partial E}{\partial w^{(l)}}=\frac{\partial E}{\partial z^{(l)}}\frac{\partial z^{(l)}}{\partial w^{(l)}}=a^{(l-1)}*\delta ^{(l)}

        w^{(l)}:=w^{(l)}-\eta \sum_{mini}^{ }\delta ^{(l)}*rot180(a^{(l-1)})

 

三、微调Fine-tuning

当数据量较小时,想要使用已经训练好的网络,避免出现过拟合问题,可以使用fine-tuning方法,使模型快速收敛到一个较理想的状态,省时又省力。流程如下:

(1)准备训练数据和测试数据,并进行预处理;

(2)复用相同层次的参数,新的层参数取随机初始值;

(3)调整学习率和步长等参数,增大新层的学习率、减小复用层的学习率;

(4)修改最后几层的参数,并增大学习率。

 

  • CNN总结

INPUT → [[CONV → RELU]*N → POOL?]*M → [FC → RELU]*K → FC

CNN在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式,只要用已知的模式对卷积网络加以训练,网络就具有输入输出对之间的映射能力。CNN一个非常重要的特点就是头重脚轻(越靠近输入参数越少,越靠近输出参数越多),呈现出一个倒三角的形态,这就很好地避免了BP神经网络中反向传播的时候梯度损失得太快。

CNN主要用来识别位移、缩放及其他形式扭曲不变性的二维图形。由于CNN的特征检测层通过训练数据进行学习,所以在使用CNN时,避免了显式的特征抽取,而隐式地从训练数据中进行学习;再者由于同一特征映射面上的神经元权值相同,所以网络可以并行学习,这也是CNN相对于DNN的一大优势。CNN以其局部权值共享的特殊结构在语音识别和图像处理方面有着独特的优越性,其布局更接近于实际的生物神经网络,权值共享降低了网络的复杂性,特别是多维输入向量的图像可以直接输入网络这一特点避免了特征提取和分类过程中数据重建的复杂度。

 

参考资料

https://blog.csdn.net/u013576383/article/details/53425128

https://www.cnblogs.com/skyfsm/p/6790245.html

https://arxiv.org/pdf/1502.01852.pdf

http://www.doc88.com/p-8435048712809.html

https://blog.csdn.net/yunpiao123456/article/details/52437794

https://www.cnblogs.com/pinard/p/6489633.html

https://blog.csdn.net/nuannuanyingying/article/details/70833706

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值