Reducing Overfitting in Deep CNNs
Posted yhl_leo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Reducing Overfitting in Deep CNNs相关的知识,希望对你有一定的参考价值。
本系列文章由 @yhl_leo 出品,转载请注明出处。
文章链接: http://blog.csdn.net/yhl_leo/article/details/66969915
源自: Yhlleo’s Notes
大家好,今天我要讲的内容是在深度学习的卷积神经网络中,如何减弱过拟合问题的相关研究,最近刚好在修改论文,就把相关的方法和技术整理出来,对于怎样选择和设计网络模型具有一定的指导性,希望对大家有帮助。
内容主要分为三个模块,首先对过拟合问题的产生原因、以及解决方向进行简单的介绍,然后会就不同的解决方案,讲解一些解决方法;最后是简单说一下自己的一些研究工作(最后一部分略)。
在讲过拟合问题前,先简单介绍一下偏差和方差权衡的问题,假设存在一组观测数据 x,y ,如果存在一组理想的映射,使得每个观测值经过该映射后,能够与它对应的预测值一一对应,这就是识别、分类以及回归问题的本质,这里我们先不管怎么去优化这个理想的映射中的未知参数,我们也意识到对于观测数据,本身其实也是有噪声的,我们假设观测数据满足这样一个分布模式,也就是观测值经过理想的映射后还含有一个随机的高斯噪声项 ϵ ,这样就构成了采样数据的分布模式,经过学习后,我们得到了一个模型,满足学习模型的预测值与采样数据的预测值的差的平方的期望值最小化,一般满足这样的条件,得到的模型就是我们想要的了。把这个约束项展开,我们最后就能得到这个结果,也就是采样数据的噪声的方差,学习模型的方差,学习模型与采样模型之间的偏差期望的平方之和。
为什么说很多时候学习算法就是学习模型在偏差和方差上的权衡呢,原因很简单,我们看下面的公式,统计方差项是针对学习模型的,如果我们想要这一项较小,那么我们的学习模型应该是线性的或者说接近线性的,但是对于非线性问题,这一项满足最小化原则的话,那很容易就造成高偏差问题,也就是欠拟合问题,比如使用线性函数拟合非线性函数,可以保证线性函数的预测值符合方差最小分布,但是预测值与真实值之间却有较大偏差;而偏差项可以看到,是预测值与采样值之间的差异的期望的平方,如果这一项满足最小化原则,那么就要求预测模型的分布模式尽可能符合采样数据的分布模式,同样如果是针对非线性问题,这样很容易导致高方差,也就是过拟合问题。因为,偏差和方差会存在此消彼长的现象,我们的目的就是解决这一一个tradeoff问题。
这里给出一个简单的例子,深蓝色的圆点,就是采样数据,绿色曲线是这组数据样本的真实分布函数,我们分布用1次,4次,15次多项式曲线拟合,对于1次线性函数,这样的拟合结果,符合预测值方差最小,但效果显然并不好,因为很多预测值与采样数据之间的偏差过大;而15次多项式曲线拟合的结果,虽然达到了预测值与所有的采样数据之间偏差最小,但是如果再引入新的采样数据,那么效果就会明显变差;4次多项式拟合结果,虽然方差大于1次,偏差大于15次,但是很明显却是拟合最好的。
一般来讲,欠拟合的结果表现为,在训练数据和新的测试数据上都表现不佳,通常使用过于简单的模型或者方法拟合非线性问题,就会产生这种问题,学习到的模型,具有高偏差低方差的性质;而过拟合的结果表现为在训练数据上表现良好,但是在新的数据上泛化能力一般,通常使用过于复杂的模型或者方法拟合非线性问题,就有可能遭遇这种问题,学习到的模型,具有低偏差高方差的性质。深度学习中的卷积神经网络,引入了以往机器学习前所未有的参数规模,虽然能够适用和解决很多非线性问题,但是过拟合问题也经常出现,这也就是为什么一直以来大家对这个问题比较关注的主要原因。
造成模型过拟合的主要原因,简单来讲有三个方面,首先是数据不足,如果采样数据不足,很有可能不能反映出数据的真实分布,这也就限制了学习模型的预测能力;其次是使用的模型和学习算法,尤其是学习算法参数规模较大,比如CNN,参数规模可以达到几十兆甚至上百兆,理论上能够拟合大多数非线性问题,但是也非常容易造成过拟合问题;最后是正则化方法,所谓正则化,就是一种限制学习算法的复杂度的方法,比如这张图里的蓝色曲线,在采样数据上的偏差都为0,但是经过正则化限制后,复杂度衰减成为绿色的曲线,对于未知的数据分布具有更好的泛化能力。
这里,根据卷积神经网络的操作过程,分为5个方面讲述,一些减弱过拟合的方法。首先是数据量不足时,对数据进行重采样或者数据扩充;然后是网络模型以及一些特殊结构本身能降低过拟合;激活函数是使卷积神经网络具有非线性能力的基础,不同的激活函数不单在训练过程中表现出不同的收敛状态,在某种程度上,也对过拟合有所影响;卷积神经网络使用大量的隐含参数,在训练优化过程中,通过梯度传导调整隐含参数,调整过程往往表现为不可知、不可控,这就很容易导致隐含参数之间具有较强的相关性,这对于学习、强化多种有效特征是不利的,很容易对训练数据过好地表达,但是泛化能力一般;最后,就是使用一些正则化的方法,降低模型的复杂度,提高泛化能力。
数据扩充,以前讲深度学习的例会中也提到过,比如AlexNet论文里,为了避免由于数据样本不足的问题造成过拟合,进行数据拓充(Data Augmentation),使用了两种方法:第一种是随机Crop,训练的时候,将输入的256x256的图像,随机裁剪成为224x224+水平翻转拓展了2048倍;第二种是对RGB空间做PCA,即主成分分析,然后对主成分做一个轻微的高斯扰动;其实都是数据重采样过程,但是这种方法产生的效果很有限,在AlexNet的识别分类应用中,仅仅把测试阶段的错误率降低了1个百分点。
数据重采样中,有一个很有价值的研究点,那就是当我们的数据存在不均衡的类分布时,也就是属于某一类别的观测样本的数量显著少于其它类别,这种现象很多情形下都存在,尤其是在异常检测是至关重要的的场景中很明显。根据长尾理论,在机器学习中,学习算法学习到的特征将会被那些具有大量采样数据的样本类别所主导,以至于对于那些只有少量采样数据的类别不利。也就是说,采样数据少的类别的特征很有可能淹没在其他大量采样数据类别的特征中,因为特征没有得到足够的学习或者强化,在这些学习算法在这些类别上的预测能力会大打折扣。前面讲偏差方差权衡的时候,提到我们的学习算法其实就是在优化二者之和,不难理解,对于一个学习算法来说,如果对于大多数采样数据都满足了损失代价最小,按照优化的原则,就有理由认为已经达到了理想的状态,但是这样的理想状态显然不是我们想要的,我们真正追求的并不是整体的大多数准确,而是每个类别的大多数准确,这两者还是有区别的。
这里给出几个语义分割的数据集,每个数据集都存在这样的不均衡的类分布问题。数量占优的类别与不占优的类别之间的差异往往可能很大,比如我之前做的裂缝检测,采样数据中绝大多数的像素都是非裂缝像素,如果一个分类器把全部的像素都分为非裂缝,那整体上的精度仍然是超过90%,显然这样的分类器对我们没什么用。
这是SegNet中使用的一份街景分割的数据集,同样也存在这样的问题。
目前来讲,这种情形下主要有两种解决方案,首先很容易想到,调整损失函数,把数量多的类别的单个训练样本的损失代价降低,相反地把类别数量少的单个训练样本的损失代价提高;另一个经常用到的方法就是对数据集进行重采样。
这里列出两个class reweighting的代表,其实本质上是一样的,都是根据采样数据的统计结果,重新赋予每个类别相应的类别损失权值。HED 网络是进行contour detection,所以每个训练的batch中的非contour像素数与全部像素数的比值作为contour类别的损失代价,类似得把contour像素与全部像素的比值作为非contour类别的损失代价。MSCNN是针对多类别的语义分割的网络,他同样先统计每个类别的像素数,与其分布的图像上的像素总和的比值,作为每个类别的频率,再对统计的频率进行排序,得到中值频率,然后使用中值频率逐一处以每个类别的频率,就得到每个类别对应的损失权重。
再来看另一个方向,数据重采样,关于这方面的研究内容相对比较多,这里列出一部分
先来看两种比较粗暴的方法,随机降采样和过采样,对于前者,不重复地从类别1中抽取10%,这样减少了类别1 的实例数,从而间接地提高了类别2在数据中的比例。优点:它可以提升运行时间;并且当训练数据集很大时,可以通过减少样本数量来解决存储问题;缺点:它会丢弃对构建分类器很重要的有价值的潜在信息,被随机欠采样选取的样本可能具有偏差,它不能准确代表大多数。从而在实际的测试数据集上得到不精确的结果。随机过采样,把类别2的数据复制20次,这样就增加了少数派的比例,相比于欠采样,这种方法不会带来信息损失,表现应该是比欠采样好一些的,但是由于复制少数类事件,它加大了过拟合的可能性。
然后是基于聚类的过采样,比如采用K均值聚类算法独立地被用于两个类的实例,随后,每一个聚类都被过采样以至于相同类的所有聚类有着同样的实例数量,这样做有助于克服由不同子聚类组成的类之间的不平衡,但是还是有可能会造成过拟合训练。
然后是合成少数类过采样技术,这种方法,是把少数类中的部分数据抽取出来,进行合成新数据的操作,合成的方法是多样的,可以像AlexNet那样crop + 颜色扰动,然后再把新生产的数据添加到原有数据中,这样做的好处是,不会损失有价值的信息,而且通过随机采样生成的合成样本而非实例的副本,可以缓解过拟合的问题;当然缺点也是有的,受限于合成技术,一般不会把来自其他类的相邻实例考虑进来,这样就有可能导致类间的重叠增加,也有可能引入额外的噪声;另外,这种方式对于高维数据不是很有效,像AlexNet,对数据扩充了几千倍,但是最终的精度也仅仅是微微提升了一个百分点。
从原始数据集中,随机可重复采样,生成n个数据集,然后分别使用n个分类器去拟合每个数据集,再把每个分类器的结果组合在一起,得到最终的拟合结果。这种方式是一种机器学习中的经典方法之一,可以提高及其学习算法的稳定性和准确性,不过这种策略的有效前提条件是基本分类器效果还不错,不然很有可能会使效果更差。后来CNN里很出名的,Dropout方法的思路其实就是bagging的思路。
还有一些机器学习的重采样方法,但是在CNN中很少用到,这里就不再提。总体上来讲,常见的数据扩充这种重采样方式,往往都是针对整个数据集,并不会针对性的对那些少数类进行特殊处理,所以单纯的数据扩充并不能起到强化少数类特征学习的效果,在这种前提下,权衡类别损失代价就显得更为有效,但是这样过拟合的问题其实还是存在。对于需要标注的监督学习,这其实是件很麻烦的事情,目前的做法能够缓解过拟合的程度还是有限,想要真正避免,还是要从数据本身入手。成本和精度也是个tradeoff的问题,最终还是取决于应用需求。
再来看CNN的网络结构,这方面的研究相对而言比较多,我们经常见到最新的方法将基础网络换一下,性能就会得到很大的提升,这也就意味着,好的网络结构本身就有能够减弱过拟合的能力。因此,研究并设计一个更好的网络模型变得至关重要。经典的神经网络模型主要在“宽度”与“深度”方面进行不同程度的扩增。借助于大规模数据的训练,AlexNet、VGG经典网络通过深度增加可以有效地提升其模型的表达能力。但是很快就遇到了瓶颈,也就是当我们这样一味地追求深度时候,有个难以回避的问题,梯度消失,一些弱的但是有效的特征会在经历了深层卷积和多层池化后消失,反而导致性能下降,而且受限于显卡显存,我们也不可能无限制增加网络深度。之后网络框架的探索主要集中在如何合理地增加网络宽度,提升网络性能。比如GoogLeNet和inception网络,把同一层的单一卷积扩展成多种卷积操作并联的结构,以及残差网络的shortcut结构,这两种结构成为了后来很多网络探索的基础,比如ResNeXt, inception-v4.
这里的几个同样也都是以残差网络和Inception的框架为基础
这里简单介绍几个比较有影响力的网络结构
Inception 模块,不同于Lenet,Alexnet,VGG那些串行的单路网络,inception的结构通过类似于并联的方式,在同一层的卷积过程中,引入不同感受野大小的卷积操作,从而在训练过程中,挖掘更多潜在网络隐含单元,Inception v1-v4四篇论文,都是谷歌的同一个大神研究员发表。
在GoogLeNet中,关于inception的进一步探索比较少,但是随后的Inception v3的探索中,提出一些设计理论,首先,特征图的降采样,应该遵循渐进式地,而不要很突兀地一下把特征图缩小很多,这样容易造成特征的过度压缩,特征维度增加的过程也要避免表征瓶颈的问题,作者也意识到适当地增加卷积网络的深度和宽度,可以提升网络性能,但是会导致计算量的增加,因此这个过程中要考虑怎么减少不必要的计算;然后是关于卷积核的一些思路,接着关于不同卷积阶段的监督在网络里起着什么作用以及是否有必要,还有关于更好的降采样方式等。因为其中的一些探索还是很有价值的,我们细看一下。
第一代版本中,同一层的卷积操作,分别使用了1x1,3x3,5x5大小的卷积核,后续的论文里作者分析认为,5x5大小的卷积核首先在计算消耗上是3x3卷积核的差不多3倍左右,这么做不划算
从效果上来看,一个5x5大小的卷积核实现的效果,跟左边这个1x1,3x3,3x3的过程是一样的,分解后参数的规模还可以缩减很多
基于前面卷积核分解的思考,我们是不是可以继续假设,那些大于3x3的卷积核,因为都可以分解成一系列的3x3大小的卷积核,因此就显得没那么有必要。那是不是又可以把3x3的卷积核再分解成更小的卷积核呢,作者首先去测试了分解成2x2,发现使用这种对称结构的卷积效果比非对称的卷积效果更好,所谓非对称的卷积,就是不再是nxn标准的窗口,而是nx1或者1xn的窗口,这么做同样也可以缩减参数规模,但是遗憾的是,作者在测试的时候发现,这种结构对于网络的早期阶段,特征图plane size 较大的时候并不起作用,而在特征图大小在12x12到20x20范围内时,才有效,而且设置成1x7和7x1的卷积核最好。但是后来在inception-v4 和 Inception-resnet-v2中,作者在feature map较大的情况下仍然使用了这种非对称分解,说白了,其实并没有严格的标准,还是怎么效果好,就怎么改。
这里辅助分类器,是指网络早期卷积阶段学习到的特征进行预测,从而通过监督各个阶段的卷积特征学习,这个DSN(深度监督网络)是一样的思路, 测试的发现,其实有没有这样的辅助分类器,对于网络早期的训练结果影响不大,但是在训练的后期,确实可以是的网络的精度提升。另外,在网络的早期阶段引入辅助分类器,还有助于强化那些容易出问题的 low-level 的特征。因此,也可以把这些辅助分类器看做一种正则化方法。
在减小特征图plane size 或者叫grid size时, 如果我们先扩充特征的维度,再进行pooling操作,或者先后完成了plane size 降采样再进行特征维度增长,这两种做法在串行的单路网络中很常见,但是两种操作都不是好的做法,因为这两种做法都面临着,输入特征维度到输出特征维度,骤降的过程,也就是有表征瓶颈的风险,作者就想出一种新的方法,融合卷积和pooling的结果的方式,这里卷积步长不再是1,而是2,在实现特征图plane size 减小的同时还可以增加特征维度,是的表征瓶颈的问题得以减弱,而且计算量上比前两种都还小一些。
残差网络非常简单,想左图那样,通过设置一些shortcut,把卷积操作之前的特征和映射后的特征进行求和,这样可以在一定程度上补偿那些卷积过程损失掉的有效特征,后面一些论文分析,这么做之所以有利于学习,最主要的可能是因为shortcut增加了潜在的组成网络是数量。
Inception-resnet v2还是inception 系列的,这里保持了以往inception的基本结构和优点,另外也把resnet的结构引入其中,效果还不错。
分型网络,由于包含不同深度的子网络,分形网络对总体深度的选取不敏感;在训练阶段,会找出有用的子网络集合。它是第一个在极深卷积神经网络领域对于 ResNet 的替代品,这也表明了残差学习对于极深网络不是必需的,最重要的还是前面讲的,要增加潜在的组成网络的数目。网络结构其实很简单,像这样包含多条路径。
分型网络中存在多条连接路径,在训练的阶段,假设即使一些路径抛弃掉,仍至少存在一条路径是有效的,这就是它的路径舍弃原则,在训练阶段,Drop-path 有两种模式,local 和 global ,前者使用固定的概率值,抛弃一些path, 但是保证至少有一条path是通的,Global 是全局唯一一条选中的path是通的,其他都抛弃掉,这就跟Bagging的思路相似,在多个分类器都比较有效的情形下,对自举样本集进行训练,并组合训练结果,这种方式在不进行数据扩充的情况下,仍然取得能和ResNet相比的结果。
DFN,跟FractalNet一样,都是多路径的网络结构,这类网络都可以理解为一种组合网络,组合网络可以分解成为一系列不同深度的网络,他们在实验整对这些网络进行单独训练,得到的结果是,融合网络里较深的网络组合能够使网络性能提升,较浅的组合网络反而使网络性能下降,但是由于浅层的网络容易收敛,它们能够帮助深层的网络进行优化。既然我们认为最终的表现是一种集成的近似,那么我们是否可以着手寻找更优的组合网络以达到整体性能的提升?通过这里的组合网络之间相互影响的启发,我们认为极深的网络会产生“拖后腿”的效果,反而较深但又不是特别深的“中间”网络会对结果影响比较大。这是我看到的第一篇把从组成网络的角度去思考网络性能的论文,之前的很多网络更多的通过实验证明可行,却没有一篇说明,为什么一些增加宽度的网络可以使效果更好。
我们现在已经知道,需要浅层网络来帮助训练较深网络,而且实际设计神经网络的时候很难做到只保留中间深度的网络结构。那么一个折中的方案是把这里面最深的组成网络去掉,去除极深的组成网络不会对整体性能产生太大影响,有时候反而会提高最终结果,尤其是随着网络深度不断增大的时候。
因此作者认为一个好的网络结构应该包含如下两个特性:足够多的潜在网络数目,以及足够好的组成网络。最简单的策略是去掉“拖后腿”的极深网络,将其变成“中间”深的组成网络。为此,提出的Inception-Like结构与Merge-and-Run结构都去除了极深的那一条线路,但是Inception-Like的组合数目比相同参数下的ResNet要少,最终Merge-and-Run形式比较符合前面的分析与观察。
这篇方法是MSRA最近刚刚发布的,突破了传统标准卷积窗口的限制,使用可变形的卷积窗口和池化窗口。受启发于Spatial Transformer Networks,那个方法里是对特征图进行形变,这里是对卷积核池化窗口进行形变。其中关于双线性插值的方法,基本沿用了STN。在传统的卷积特征图一般都是稀疏矩阵,固定卷积窗口,相当于对图像的潜在特征等间距采样表达,但是如果稀疏特征甚至没有意义的特征占图像面积较大,这样等间距采样表达对于学习算法是不利的,很容易想到,好的方式应该是对于感兴趣的区域投以更多的关注,学习更多特征,这也就是作者在论文中的论述:并非所有的 pixel 位置感受野内的特征对最后的相应结果具有相同的价值。
这是在卷积和池化过程中学习
简单总结一下,网络结构上的一些特点,首先宽度和深度都很重要,尤其是深度;后来的很多拓展宽度的方法,其实都是为了减弱深度扩展的负面影响,从而提升网络性能;在宽度扩展的问题上,基本都是在保证计算更高效,同时减少模型参数的前提下进行,而扩展宽度的核心似乎是,增加潜在的组成网络的数目,整个训练过程就转化成了寻找一组最优网络组合的问题。另外,我也发现一个有趣的问题,像单路、多路的网络现在在图像识别分类的问题上都已经比较成熟,相关的探索非常多,但是对于那些非图像级的应用,而是像素级的语义问题,似乎现在只有单路的网络,包括语义分割,GAN等,都是单路串行的网络,我也有尝试把inception,resnet的结构应用在像素级的问题上,发现网络训练的结果表现为不收敛,原因目前我还不清楚,我还在摸索中。
非线性激活单元,一般都很简单,但是却是CNN能够描述非线性问题的根本。在研究过拟合问题的时候,激活单元按照原理来讲,并不会直接影响模型过拟合,但是对模型的训练收敛影响较大,同样的网络结构,使用不同的激活函数,最终的预测精度可能会差异很大,这就间接反映出激活单元对过拟合问题其实也有一定的影响。目前激活函数,已经有一个家族,按照函数本身的平滑性,可以分为3类,首先是平滑的非线性函数,其次是连续但是并非处处可导的,还有就是部分离散的。
平滑非线性函数里面,最早被使用的是Tanh 和 Sigmoid, 但是后来在AlexNet 网络中对这两个激活函数进行了分析,由于他们的两端处于饱和状态,容易产生梯度消失,对于网络的收敛不利,被ReLU 取代,之后使用就较少,Softplus 和 Softsign 也存在同样的问题,被使用的更少,而ELU是比较新的一种激活函数,现在不少网络里都能看到它,大于0 的部分跟ReLU一样,小与0的部分改成了指数函数的形式,可以略微提升网络的性能。
连续非处处可导的非线性激活单元,全都是ReLU的变体,ReLU激活函数有很多优点,相比于它之前的激活函数,它足够简单,计算量很小,能够使模型快速收敛,非饱和的性质也缓解了梯度消失的问题,提供了神经网络的稀疏表达能力等,缺点也有,可能会出现神经元死亡,权重无法更新的情况。如果发生这种情况,那么流经神经元的梯度从这一点开始将永远是0。也就是说,ReLU神经元在训练中不可逆地死亡了。
部分离散是指,在激活过程中引入高斯噪声,使得网络在接近饱和状态时,仍然存在梯度,网络仍然可以继续进行优化,比如NAF,使用退火机制控制噪声的程度,在训练的早期阶段,投入大量的噪声,使得网络能够在优化空间内进行更多的探索,随着收敛过程,逐渐减少噪声。不过这种引入噪声的机制对性能的提升其实比较有限,而且增大了激活函数的复杂度,目前来看,使用的很少,还有待开发吧
激活函数源自于神经网络中的闸门机制,或者说是疼痛的闸门控制理论,这个理论简单来讲,就是非疼痛的输入可以阻止疼痛的感觉传递到中枢神经系统中。因此,通过无害的刺激输入是可以抑制疼痛的。这也是麻醉剂的基本原理
我们可以把那些传输痛感的神经纤维,称为传入疼痛感受神经,人体内的这种神经纤维并不是单一的,而是多种的,简单可以分为两种,一种是AB纤维,传递剧烈疼痛,C纤维传递绞痛、慢性痛,而且彼此之间还会相互影响,而回顾CNN的激活单元,一个网络结构都是单一的激活单元,更不存在激活单元之间的相互影响,因此,未来有可能这方面还会有更多的探索。
去相关这类的整体思路认为,CNN中的隐含单元,在学习特征的过程中,存在一定的相关性,换种说法就是,存在相互重叠冗余的特征表征,从而使得潜在性能不能完全发挥出来,因此想寻求一种方法,约束隐含单元,使他们尽可能学到不相关的有效特征
这是早一些的学习算法,玻尔兹曼机,基于生理神经的一些研究模型,认为大脑视觉神经皮层的细胞,可以看成由一对半调制线性滤波器,像这样滤波输出的平方的和再开方,对于隐含层的优化函数使用的有两个部分,前一部分,是相关系数,就是约束隐含单元尽可能学到多样的,不相关特征,后面的一项主要是约束迭代过程中收敛的,在收敛后,前后两次迭代结果的差异应该足够小。
到深度学习后,其实还是延续着这个领域还是延续着这个思路,不过,目前来看,这种对隐含单元相关性限制主要是利用最后的输出层的结果,中间隐含层隐含单元的相关性依赖于梯度下降优化过程的间接调整,这也不难理解,一般我们认为隐含单元之间的相关性过强会弱化网络的能力,但是有些隐单元之间的相关性对于部分特征的学习和增强也不能忽略,这样一来,我们并不知道优化过程中哪些隐单元之间会形成这样的相关性,也就很难去建立约束规则,另一方面,全部进行约束,需要耗费很多计算在计算方差,协方差等上面,所以大型网络还没见到隐含层使用去相关操作的。DCCA公式很简单,不多说。
相关性神经网络,跟前面讲述的DCCA方法,研究的问题相似,对于每个sample数据含有two views,比如把图像拆分成左右两半,输入到两个网络中独立调整参数,重点是,得到两组输出后,假设对于同一个sample的两个视图,他们应该是强相关的,因为是强相关的,那就有希望利用其中一个重建另一个,这应该算是一种生成模型,但是不像GAN,没有生成器和判别器的 tradeoff 过程。
DeCov的设计思路很有趣,改变了以往单个sample训练的方式,把两张sample组合成一张图,这沿用了前面的two views的思想,同时约束隐含层的相关性,统计相关性损失代价,这里其实隐含一个重要的信息,相关性约束其实可以再细分,对于卷积阶段的隐含单元,为了学习特征的多样和有效,应该尽量使他们相关性较小,然而并不能做到完全去相关,一种可行的方法是对隐含单元进行分组,按照组内强相关,组间弱相关的原则,进行约束。
SDC,是基于DeCov的方法升级,隐含单元之间的相关性限制包括两个方面,扩展了DeCov的 group 的做法,组内强相关,组外弱相关。
总的来说,这一类方法,理论上来说应该是有效的,但是目前的研究主要还是处于应用在分类识别的问题上,测试数据集不大,还没看到有人拿来用在目标检测或者像素级语义上。
最后,简单讲一讲一些网络中起着正则化作用的操作,有助于减弱网络过拟合问题。
首先是权值衰减,也就是在常规的损失函数里,添加一项权值更新的约束项,权值在更新的过程中更加平滑的调整,并且使得优化后的权值向量,整体上平方和最小,避免了权值差异过大,可能原因是权值过大会过分强化部分特征,如果很不巧这部分特征源自数据本身的采样或者统计噪声,可能对于训练数据拟合较好,但泛化能力很差。所以作者在论文里分析,使用权值缩减的策略可以抑制权值向量中一些不相关的成分,如果衰减系数选择的合适,还可以在一定程度上抑制数据本身的噪声,从而提高泛化能力。
Dropout在减弱网络模型的过拟合问题上,影响力还是非常大的,是很多减弱过拟合方法的baseline,直到现在很多网络里还在使用。Dropout的思路是这样,作者也意识对于拟合能力很强,训练样本不足情景,网络模型很容易过拟合,一个可行的解决方案,是整合很多个不同的网络预测结果的,这就是Bagging的策略,当然分别训练这样一些网络时间成本太高,Dropout的方法是,当网络在输入一个训练样本时,隐含层的每个隐单元都有概率为p的可能被忽略掉,在测试阶段只需要把权值的输出结果乘以概率p,就能实现在一个网络中,在共享网络参数的情形下,实现多个网络预测结果的融合。如果一个网络含有n个隐单元,在整个网络中使用Dropout,就相当于有2^n个网络,应该说在数目上还是非常庞大的。被忽略的隐含单元,是根据二项分布随机选择的。
使用dropout能够使网络学习的特征更加有效,图左和图右是在小数据集上的测试差异很明显,左边的隐单元之间必须通过相互合作才能产生好的重建结果,每个隐单元看起来都是杂乱的、没有意义的,而使用dropout的网络,在训练过程中更加强调每个隐单元的重建结果,所以每个隐单元呈现出更有意义的特征信息。这里回顾前面去相关的方法,其实全局Dropout就是使每个隐单元之间的相关性最小。
关于对哪些隐单元使用Dropout ,测试结果看起来,对所有的层都使用最好
关于对哪些隐单元使用Dropout ,测试结果看起来,对所有的层都使用最好,而且隐含层和数据输入层的dropout 比率还会有些区别,一般来讲最优的设置是,输入层0.8, 隐含层根据隐含层隐单元数量的多少,一般设置在0.5-0.8之间;数据集大小对于dropout方法也有影响,如果数据量过少,dropout是不起作用的,而且还有可能产生负面影响,随着数据增多,dropout的增益效果才体现出来,但是如果数据量非常丰富,不存在过拟合问题,用不用dropout没什么差别。
DropConnect是基于Dropout的变体,改动也很简单,一般卷积过程是,先对输入v进行卷积,在对结果进行非线性激活,dropout是在非线性激活后,通过随机选择的方式生成一个二值的mask,作用于输出结果,DropConnect 就考虑是不是可以把这个mask放置在权值矩阵进行卷积之前,也能稍微改善一点精度。
一般来讲,在使用一个数据集训练的时候,受限于显卡显存和计算能力的限制,不会一次性把整个数据集投入训练,往往会采用从数据集中采样出一个batch,称这样的batch为mini-batch,经验上来看,当batch的大小增加时,训练过程中的梯度损失,应该是与整个数据集的分布状态更符合,而且从效果上来看,batch的大小一般是大于1的偶数时,往往比数据逐个训练要高效,这是计算过程的并行加速效果。在权值更新过程中,都存在这样的现象,最终的输出结果,要受到全局参数的影响,网络参数很小的变化都有可能在深层的网络中被急速放大,这就要求,卷积层在表征特征分布模式时,需要连续地适应新的数据分布模式。以往的网络为了解决这个问题,会设置很小的学习率,以及专门进行初始化。
这就是Batch normalization的过程,可以缓解前面说的问题,对一个mini-batch 训练数据,进行标准化,核心公式是这样。允许使用更大的学习率,不用精心地进行初始化。
(完)
以上是关于Reducing Overfitting in Deep CNNs的主要内容,如果未能解决你的问题,请参考以下文章
Reducing and Profiling GPU Memory Usage in Keras with TensorFlow Backend
[论文速读] StrokeGAN Reducing Mode Collapse in Chinese Font Generation via Stroke Encoding
java8中Collectors.groupingBy下用Collectors.reducing的疑惑
Java集合框架 流 Streams| Mapping| Filtering| Slicing | Sorting |Reducing | Collectors|...
linux 使用memtester测试内存稳定性德时候提示: trying mlock ...too many pages, reducing...
Reducing Participation Costs via Incremental Verification for Ledger Systems学习笔记