目标检测中的数学原理

从数学方面重新学习目标检测的相关算法和优化原理。可以有助于我们更深刻的理解算法,找到优化方向。这样做当然是一个极为艰难的过程,但是一定要坚持做下去。主要参考吴恩达老师的深度学习课程。

首先对于最近在学的网络就要这样学起,所以每次更新的内容可能都不一样,有的可能看不到什么关联性,我会一边更新一边整理的,参考的内容和博文也会一一列在每一部分内容之后。之所以选择这种手打的方式,一面是在打字的过程中进行思考,另一面是整理后易于查询补充,废话不多说了,开始学习。

 

1.分组卷积

分组卷积主要用于轻量化网络结构,其着手点在于在相同计算量下尽可能的增加通道数量,最直接的做法是将通道进行稀疏连接。分组卷积就是一种非常有效的稀疏连接方式。

标准卷积操作,输入特征图尺寸为目标检测中的数学原理 ,进行卷积操作时,卷积核尺寸为h×w,卷积核在整个特征图上进行滑动,并对所有通道c1进行卷积,之后将卷积结果进行加和,就得到了该卷积核的输出。计算卷积计算量时只考虑了乘法的计算量。卷积核的个数=输出的通道数,所以假设有目标检测中的数学原理个卷积核,则输出图像尺寸为目标检测中的数学原理,最终的计算量为目标检测中的数学原理

采用分组卷积时,每个卷积核不对上一个c1通道中的所有进行卷积,而是将其分为g份,每个卷积核对目标检测中的数学原理个通道数进行卷积,所以单个卷积的计算量变为目标检测中的数学原理,有目标检测中的数学原理个卷积核,则最终的计算量为目标检测中的数学原理,可以看到计算量是原来的目标检测中的数学原理.

这就是分组卷积,可以看到分组卷积的每一个卷积核没有学习上一层的所有特征,降低了通道之间的信息流通和表示能力,于是在shufflenet中提出了通道混洗,通道混洗是允许卷积能够得到不同组的输入,尽量关联各个通道,如下图所示:

目标检测中的数学原理

所以如果单独使用一层通道混洗应该是没有效果的,因为还是各自独立的,但是几层连用就可以起到信息流通交互的作用。

通道混洗的操作实现如下:

目标检测中的数学原理

Shufflenet使用大量的分组卷积,由于优化的原因,分组卷积的效率很低。理论计算的复杂度往往和实际的执行速度不完全对等。提出了4个指导原则:卷积的输入和输出通道数应尽可能的一致,谨慎使用分组卷积,减少网络碎片,逐元素运算的开销不能忽视。总的来说就是通道混洗放在了concat的连接之后,放一个v1和v2的对比图:目标检测中的数学原理

将分组卷积做到极致,产生了目标检测中的数学原理(depthwise)和目标检测中的数学原理(pointwise)卷积,同样是为了减低参数量和计算量。对于目标检测中的数学原理输入图像,将其每个通道单独分组,一个通道使用一个卷积核进行卷积,输出图像的尺寸为目标检测中的数学原理,那么计算量为目标检测中的数学原理,接着做目标检测中的数学原理卷积,目标检测中的数学原理卷积对提取的特征进行聚合并调整通道数。若要求输出通道数为目标检测中的数学原理,则使用目标检测中的数学原理目标检测中的数学原理卷积核进行卷积,计算量为目标检测中的数学原理最后得到和传统卷积一样的图像大小和通道数。对比可知计算量变为原来的目标检测中的数学原理。可以看到这样做虽然效果看起来一样,

但是在分组卷积时就丧失了多样性,减少了信息量。同时这样做可以看到,channel少的特征图后接relu,破坏通道,很容易导致更多信息的丢失,所以在v2当中有了类似于resnet的结构,加入了未卷积的特征,同时resnet改为反金字塔结构,先升维再降维,同时再res结构中最后一个pw卷积(通道数下降了的)后使用线性**函数。如图所示:

目标检测中的数学原理

Relu6是限制relu的最大输出之为6,为了在移动端设备的float16时也能有很好的数值分辨率,易于描述。

总结:一个分组卷积直接串起了4个网络结构,shufflenetv1-2,mobilenetv1-2,这个操作还是很直观明显的。卷积核都是比较正常的卷积核,所以直接反向传播更新就可以了。

 

参考博客:https://blog.****.net/u011974639/article/details/79200559

 

2.Resnet残差结构

吴恩达老师首先从理论上推导了神经网络学习残差和学习普通网络一样容易。即目标检测中的数学原理,表达式展开目标检测中的数学原理,如果权值目标检测中的数学原理和偏置目标检测中的数学原理都为0的话,可以得出l目标检测中的数学原理的结论,所以加入残差最差也会具有原本网络的表现能力,增加了网络的选择。

另一方面说resnet结构能够增强学习能力,可以从反向传播来推导。由目标检测中的数学原理变为目标检测中的数学原理,反向传播时求导由目标检测中的数学原理变为目标检测中的数学原理,可以看到,如果出现梯度消失是因为<1的几个梯度连×所导致的,而现在+1,所以就缓解了梯度消失的问题,增强了网络的学习能力。

 

3.防止过拟合中的数学原理

通常训练集误差较低,验证集误差较大的情况,我们称之为方差较高,数据过拟合。减少抑制过拟合通常有两条路径,一是增强数据集,例如加大数据集,另一个方面是对学习到的权值进行优化。避免参数过多,模型复杂度高(对任何情况都尝试去逼近)。下面介绍减少过拟合的方法。

(1)正则化

正则化是在原来的损失函数中加入正则化项或者称为模型复杂度惩罚项。常用的正则化方法有L1正则化和L2正则化。

最小化损失函数为目标检测中的数学原理 ,

L1正则化加入L1范数:向量中每个元素绝对值的和,为:

                                                                           目标检测中的数学原理

L2正则化加入L2范数:向量元素绝对值的平方和再开平方,为:

                                                                           目标检测中的数学原理

首先对加入L1正则化的损失函数进行求导,观察正则化是如何对权值进行修改的。

L1对目标检测中的数学原理求导:没有加入正则化项之前的损失函数假设为目标检测中的数学原理,可得:目标检测中的数学原理

则更新权值公式如下:目标检测中的数学原理

可以看到L1正则化通过加上或者减去一个常量目标检测中的数学原理,让目标检测中的数学原理向0靠近,当目标检测中的数学原理很小是,L1的权重衰减较快,对大权重衰减较慢,最终模型权重主要集中在高重要度的特征上,不重要的特征权重很快会趋近于0,所以L1正则能让模型变得稀疏。

接着对L2正则化的损失函数进行求导。

L2对w目标检测中的数学原理求导:没有加入正则化项之前的损失函数假设为l0目标检测中的数学原理,可得:目标检测中的数学原理

则更新权值公式如下:目标检测中的数学原理

可以看到L2正则化使用了一个乘性因子目标检测中的数学原理去调整权重,权重会不断的衰减,并且在权重较大是衰减地快,权重较小时衰减地慢。当参数大小被限制后,模型就是一个简单的模型。高次项前的系数小,则对于输入不会过分的敏感,会向线性模型进行近似,所以保证了模型简单,提高了泛化能力。

 

    在这里我还想继续讨论一下SVM这种传统的网络模型。正则化就是一种结构风险最小化的原则。结构风险最小化:在经验风险最小化的基础上(也就是训练误差最小化),尽可能采用简单的模型,以此提高泛化预测精度。而SVM的策略就是结构风险最小化。将优化

最大间隔目标检测中的数学原理可以转化为求目标检测中的数学原理,将SVM的最优化目标和约束条件带入:

目标检测中的数学原理

这样的形式就和L2正则化是一致的了,后面一项是经验风险,最小误差。所以说SVM本身就自带有减少过拟合的能力。另外还加有惩罚因子这个软限制,所以SVM的效果很不错。但是由于核函数,将低维数据转化到高维,维数越多,过拟合的风险越大,所以SVM也会发生过拟合,同时还有离群点的存在,相当于加入了极大极小的噪声,也会造成过拟合。但是SVM本身的特性很值得我们的关注

参考自博客:https://www.jianshu.com/p/4bad38fe07e6

            https://blog.****.net/sinat_22336563/article/details/71159503

            https://blog.****.net/q199502092010/article/details/82461198

(2)Dropout

随机失活同样是一种正则化方法,可以解决过拟合的问题。在训练中,随机失活会让神经元以超参数p的概率被**或者被设置为0. 目标检测中的数学原理

从图中可以看到失活的神经元不在接受输入,也不会再有输出。在训练时会多次做dropout,每次都会有不同的神经元被失活,所以相当于每次产生了一个子网络模型。在测试过程中不使用随机失活,相当于对数量较多的子网络做了模型集成,计算出了平均的预测。所以,可以看出dropout和bagging方法很相似。有人说可以把dropout类比成将许多大的神经网络进行集成的一种bagging的方法。对二者进行一下对比,在bagging中,所有的分类器都是独立的,而在dropout中,所有的模型都是共享参数的;在bagging中。所有的分类器都是在特定的训练集下训练至收敛,而在dropout中仅仅是提取特征,有可能会在局部产生较好的特征。这是理解dropout的一种角度,通过集成来减少泛化误差。

吴恩达老师在deeplearning课程中给出了更具体的参数上的解释,首先从直观上,想要得到最后的输出,不能特别依赖某一个神经元,因为该神经元有可能被清除,因此不会产生权值特别大的神经元,有点类似于L2正则化。不同的是,dropout更关注的是神经元的耦合,可以减轻耦合效应,更有可能会产生特征跨层级的效果。

以上都是在话语上,用直观的方法做出了解释,不符合本文的数学风格,但是dropout更多是一种编程上的实现。所以接下来对编程的实现进行一个说明。没有dropout时网络前向传播如下:

目标检测中的数学原理

目标检测中的数学原理

采用dropout时,需要先进行神经元是否**的判定:
目标检测中的数学原理

目标检测中的数学原理

目标检测中的数学原理

目标检测中的数学原理是随机生成的0,1向量,决定是否**。设定**的比例为keep-prob,为了最终进行测试时比例一致,期望值不变,所以对最后得到的结果按同样比例进行缩放。

 

参考https://blog.****.net/program_developer/article/details/80737724

    http://www.dataguru.cn/article-10459-1.html

(3)数据增强

出现过拟合的另一类原因就是数据集数据太少,解决这个问题可以使用数据扩增。比如图片旋转,裁剪,略微扭曲,调整光照对比度等等。现在还有使用生成对抗网络来生成数据图片的做法。就是训练一个生成器用来生成图片,然后用一个判别器来判别生成的图像真假,最后让生成的图片达到以假乱真的效果。GAN的生成网络用来生成图片,另一方面判别器中的网络也是一个很好的特征提取网络(通常具有很好的泛化能力)。从论文上看,目前这两个方向都有人在研究(同学语)。

但是总结而言,数据增强目的是为了增强图像,在这个过程中一定要确保图像足够的真实。旋转,裁剪这类对整幅图像所做的变化通常不会引起提取特征的改变。但在工业上常常会出现数据集极度少量的情况(病害多了证明工厂要不行了)。这个时候就需要进行一些ps生成图像的操作,这个过程中就会改变图像的原始信息,导致图像不够真。这个时候就需要很有图像处理经验的人来找出不够真的特征,我说说我遇到的几个情况,角度不同,人,物体态就会发生变化;比列不同;光线变化导致的阴影;ps后加入物体的边缘过于“锋利”等等。所以数据增强也有很多需要注意的地方。当然这些问题都可以通过数字图像处理来解决,也可以用GAN来解决,但重要的是,要有发现这些问题的思考。

(4)提早停止训练

及早停止训练时希望我们在一个权值中等大小的时候停止训练,选择了w范数较小的神经网络,自然就很少出现过拟合的情况。

但是这样做,同时也阻值了损失函数的进一步优化,所以吴恩达老师在课程中说,不能一次同时解决两个问题,不是一个特别好的方法,所以更倾向于使用正则化项。

后面的课程提到了正交化的思想,正交化的思想就是要分析评估在不同数据集上的结果,然后对具体的原因进行分析,调整时一次解决一个问题。而且解决方法尽量是独立的,要使用这种思想,一般不会使用提早停止训练这个选项。

 

 

持续更新中,我会每天在这里更新一点的,或者重开一章。。。但是这个****这个公式也太难用了吧,从word里复制过来都是乱码。。。