深度学习模型调参正则化是解决过拟合问题吗
参考链接:
数据增强:
参考:
数据增强是扩充数据样本规模的⼀种有效地⽅法。
如何对图像数据进⾏有效的数据增强?
空间⼏何变换:翻转(⽔平和垂直)、随机裁剪、旋转、放射变换、视觉变换(四点透视变换)、分段放射
像素颜⾊变换类:噪声(⾼斯、椒盐)、CoarseDropout(在⾯积⼤⼩可选定、位置随机的矩形区域上丢失信息实现转换,所有通道的信息丢失产⽣⿊⾊矩形块,部分通道的信息丢失产⽣彩⾊噪声)、SimplexNoiseAlpha(产⽣连续单⼀噪声的掩模后,将掩模与原图像混合)、
FrequencyNoiseAlpha(在频域中⽤随机指数对噪声映射进⾏加权,再转换到空间域。在不同图像中,随着指数值逐渐增⼤,依次出现平滑的⼤斑点、多云模式、重复出现的⼩斑块)
模糊类:⾼斯模糊、ElasticTransformation
HSV对⽐度变换
RGB颜⾊扰动
随机擦除
超像素法
转化法
边界检测
Grayscale
锐化与浮雕
多样本合成:SMOTE、SamplePairing、Mixup
初始学习率设置:
在⼀次从头开始的训练过程的第⼀次epoch中,在每⼀个mini-batch的训练上从⼩到⼤不断增⼤学习率,记录随着学习率的变化⽽产⽣的loss值变化,最后绘制出⼀个变化曲线,如图⼆:
随着训练的不断深⼊,我们看到loss逐渐下降,并在⼀段特定的学习率区间内产⽣了剧烈的下降,⽽到最后,由于学习率增长到实在太⼤了,所以loss开始增⼤了。
所以从这张图中,我们该选择哪个点作为最合适的学习率呢?图中的最低点吗?不是,因为这时候其实loss已经呈现出了loss爆炸的趋势了,所以要⽐更适合作为最佳学习率,因为我们需要⼀个既能保证学习的速度,⼜能防⽌产⽣loss爆炸情况的学习率,所以要更适合,可能有⼈要问为什么不选曲线下降梯度最⼤的地⽅作为学习率,要知道此处loss快速下降是模型因为经过不断训练快速拟合到数据上的结果,⽽不是说loss在这⼀学习率上下降最快,要了解这张图的意义,我们要的最佳点是能保证最快速拟合,⼜不⾄于发⽣loss爆炸情况发⽣的点,所以还是需要⼀点伪科学的知识,去主观判断这样⼀个临界点,只不过这样⼀张图给了我们⼀定的参考,也就是不那么伪了。
Warm up热⾝
Warm up指的是⽤⼀个⼩的学习率先训练⼏个epoch,这是因为⽹络的参数是随机初始化的,假如⼀开始就采⽤较⼤的学习率容易出现数值不稳定。
然后等到训练过程基本上稳定了就可以使⽤原始的初始学习率进⾏训练了。
使⽤Warmup预热学习率的⽅式,即先⽤最初的⼩学习率训练,然后每个step增⼤⼀点点,直到达到最初设置的⽐较⼤的学习率时(注:此时预热学习率完成),采⽤最初设置的学习率进⾏训练(注:预热学习率完成后的训练过程,学习率是衰减的),有助于使模型收敛速度变快,效果更佳。
⽰例:
Resnet论⽂中使⽤⼀个110层的ResNet在cifar10上训练时,先⽤0.01的学习率训练直到训练误差低于80%(⼤概训练了400个steps),然后使⽤0.1的学习率进⾏训练。
学习率调整
loss在当前LR下⼀路降了下来, 但是半天不再降了,则需要进⼀步降低
验证集acc和loss波动⼤
参考:
就是⽹络在训练集上已经趋于收敛,但是在测试集上存在很严重的LOSS震荡的情况,怎么办?这时候,可以从以下⼏个⾓度考虑:训练集和测试集分布是否存在较⼤的差异?
是否由于数据增强做的太过分了?增强后的样本,理论上和我们的实际业务场景最接近的时候,才会达到性能最好。在进⾏增强的时候不要盲⽬增强,需要看⼀下看数据集增强之后的效果如何?
学习率是不是还很⾼?如果是,降低学习率,或者在等等,等到学习率到 10e-6/10e-7这样的⼤⼩
测试集LOSS的计算是基于单个batch还是整个测试集?(⼀定要基于整个测试集来看)
⽹络是否存在⽋拟合的可能,如果⽋拟合参考上⾯⽋拟合的⽅法
训练集loss不下降
训练集的loss在训练过程中迟迟不下降,⼀般是由这⼏个⽅⾯导致的,这⼀点在我之前的⽂章《深度学习:⽋拟合问题的⼏种解决⽅案》中基本都涉及到了,详细内容可以查看原⽂,本⽂中,将这些内容⾯再做⼀个扩充。
1.模型结构和特征⼯程存在问题
如果⼀个模型的结构有问题,那么它就很难训练,通常,⾃⼰“⾃主研发”设计的⽹络结构可能很难适应实际问题,通过参考别⼈已经设计好并实现和测试过的结构,以及特征⼯程⽅案,进⾏改进和适应性修改,可以更快更好的完成⽬标任务。当模型结构不好或者规模太⼩、特征⼯程存在问题时,其对于数据的拟合能⼒不⾜,是很多⼈在进⾏⼀个新的研究或者⼯程应⽤时,遇到的第⼀个⼤问题。
2.权重初始化⽅案有问题
神经⽹络在训练之前,我们需要给其赋予⼀个初值,但是如何选择这个初始值,则要参考相关⽂献资料,选择⼀个最合适的初始化⽅案。常⽤的初始化⽅案有全零初始化、随机正态分布初始化和随机均匀分布初始化等。合适的初始化⽅案很重要,⽤对了,事半功倍,⽤不对,模型训练状况不忍直视。博主之前训练⼀个模型,初始化⽅案不对,训练半天都训练不动,loss值迟迟居⾼不下,最后改了初始化⽅案,loss值就如断崖式下降。
3.正则化过度
L1 L2和Dropout是防⽌过拟合⽤的,当训练集loss下不来时,就要考虑⼀下是不是正则化过度,导致模型⽋拟合了。⼀般在刚开始是不需要加正则化的,过拟合后,再根据训练情况进⾏调整。如果⼀开始就正则化,那么就难以确定当前的模型结构设计是否正确了,⽽且调试起来也更加困难。
4.选择合适的激活函数、损失函数
不仅仅是初始化,在神经⽹络的激活函数、损失函数⽅⾯的选取,也是需要根据任务类型,选取最合适的。
⽐如,卷积神经⽹络中,卷积层的输出,⼀般使⽤ReLu作为激活函数,因为可以有效避免梯度消失,并
且线性函数在计算性能上⾯更加有优势。⽽循环神经⽹络中的循环层⼀般为tanh,或者ReLu,全连接层也多⽤ReLu,只有在神经⽹络的输出层,使⽤全连接层来分类的情况下,才会使⽤softmax这种激活函数。
⽽损失函数,对于⼀些分类任务,通常使⽤交叉熵损失函数,回归任务使⽤均⽅误差,有⾃动对齐的任务使⽤CTC loss等。损失函数相当于模型拟合程度的⼀个评价指标,这个指标的结果越⼩越好。⼀个好的损失函数,可以在神经⽹络优化时,产⽣更好的模型参数。
5.选择合适的优化器和学习速率
神经⽹络的优化器选取⼀般选取Adam,但是在有些情况下Adam难以训练,这时候需要使⽤如SGD之类的其他优化器。学习率决定了⽹络训练的速度,但学习率不是越⼤越好,当⽹络趋近于收敛时应该选择较⼩的学习率来保证到更好的最优点。所以,我们需要⼿动调整学习率,⾸先选择⼀个合适的初始学习率,当训练不动之后,稍微降低学习率,然后再训练⼀段时间,这时候基本上就完全收敛了。⼀般学习率的调整是乘以/除以10的倍数。不过现在也有⼀些⾃动调整学习率的⽅案了,不过,我们也要知道如何⼿动调整到合适的学习率。
6.训练时间不⾜
我有时会遇到有⼈问这样的问题,为什么训练了好⼏个⼩时了,怎么loss没降多少,或者怎么还没收敛。⼼急吃不了热⾖腐!各种深度学习的训练都有不同的计算量,当需要的计算量很⼤时,怎么可能⼏个⼩时就训练完,尤其是还在使⽤⾃⼰的个⼈电脑CPU来训练模型的情况下。⼀般解决⽅案就是,使⽤更快的硬件加速训练,⽐如GPU,在涉及到计算机视觉⽅⾯的任务时,加速效果显著,主要是卷积⽹络的缘故。当已经没有办法使⽤硬件来加速的时候,唯⼀的解决⽅案就是——等。
7.模型训练遇到瓶颈
这⾥的瓶颈⼀般包括:梯度消失、⼤量神经元失活、梯度爆炸和弥散、学习率过⼤或过⼩等。
梯度消失时,模型的loss难以下降,就像⾛在⾼原上,⼏乎任何地⽅都是⾼海拔,可以通过梯度的检验来验证模型当前所处的状态。有时梯度的更新和反向传播代码存在bug时,也会有这样的问题。
在使⽤Relu激活函数的时候,当每⼀个神经元的输⼊X为负时,会使得该神经元输出恒为0,导致失活,由于此时梯度为0,⽆法恢复。有⼀种解决⽅案是使⽤LeakyRelu,这时,Y轴的左边图线会有⼀个很⼩的正梯度,使得神经⽹络在⼀定时间后可以得到恢复。不过LeakyRelu并不常⽤,因为部分神经元失活并不影响结果,相反,这种输出为0还有很多积极的作⽤。因为Relu⽅程输⼊为负时,输出值为0,利⽤此特性可以很好地忽略掉卷积核输出负相关信息,同时保留相关信息。
Relu Function
LeakyRelu Function
梯度爆炸和梯度弥散产⽣的根本原因是,根据链式法则,深度学习中的梯度在逐层累积。如1.1的n次⽅⽆穷⼤,0.9的n次⽅⽆穷⼩。⽹络中某些层过⼤的输出也会造成梯度爆炸,此时应该为该输出取⼀个上界,可⽤最⼤范数约束。
关于学习率,可按照第5项内容进⾏调整。
8.batch size过⼤
batch size过⼩,会导致模型后期摇摆不定,迟迟难以收敛,⽽过⼤时,模型前期由于梯度的平均,导致收敛速度过慢。⼀般batch size 的⼤⼩常常选取为32,或者16,有些任务下⽐如NLP中,可以选取8作为⼀批数据的个数。不过,有时候,为了减⼩通信开销和计算开销的⽐例,也可以调整到⾮常⼤的值,尤其是在并⾏和分布式中。
9.数据集未打乱
不打乱数据集的话,会导致⽹络在学习过程中产⽣⼀定的偏见问题。⽐如张三和李四常常出现在同⼀批数据中,那么结果就是,神经⽹络看见了张三就会“想起”李四。主要原因是,梯度更新时,总时张三和李四的梯度平均,导致出现固定的梯度⾛向,使得数据集的丰富度降低了。数据打乱后,张三还会跟王
五⼀起平均,李四也会跟王五⼀起平均,那么梯度的⾛向会更丰富,也能更好地在整个数据集上学习到最有⽤的隐含特征。
10.数据集有问题
当⼀个数据集噪声过多,或者数据标注有⼤量错误时,会使得神经⽹络难以从中学到有⽤的信息,从⽽出现摇摆不定的情况。就像有⼈告诉你1+1=2,还有⼈告诉你1+1=3时,就会陷⼊困惑。或者还有可能时读取数据出错导致,这时实际情况跟数据标注错误是⼀样的。另外,类别的不平衡也会使得较少类别由于信息量不⾜,难以习得本质特征。
11.未进⾏归⼀化
未进⾏归⼀化会导致尺度的不平衡,⽐如1km和1cm的不平衡,因此会导致误差变⼤,或者在同样的学习率下,模型会以秒速五厘⽶的步伐,左右两边摇摆不定地,向前⾛1km。有时,不平衡是由于不同的度量单位导致的,⽐如kg和m,我们都知道,1kg和1m没有什么可⽐性,虽然数字都是1。因此,我们完全可以通过放缩,使得特征的数值分布更接近⼀些。
归⼀化前归⼀化后
12.特征⼯程中对数据特征的选取有问题
数据特征的选取不合理,就像数据标注错误⼀样,会使得神经⽹络难以到数据的本质特征进⾏学习。⽽机器学习的本质就是在做特征⼯程,以及清洗数据(逃)。
验证集loss不下降
验证集的loss不下降分为两种。⼀种是训练集上的loss也不下降,这时问题主要在训练集的loss上,应当先参考上述⽅法解决。另⼀种是训练集上的loss可以下降,但验证集上的loss已经不降了,这⾥我们主要说明这种情况下的问题。
由于验证集是从同⼀批训练数据中划分出来的,所以⼀般不存在数据集的问题,所以主要是过拟合。过拟合解决起来,其实不怎么复杂,⽆⾮就⼏种⽅法,但是对⼯程师⾃⾝的条件要求⽐较⾼。
1.适当的正则化和降维
正则化是⽤来解决模型过拟合问题的⼀个很重要的⼿段,博主之前在⽂章《机器学习:过拟合与⽋拟合问题》⾥⾯写到过,⽐如通过增加⼀个正则项,并且⼈为给定⼀个正则系数lambda,进⾏权重衰减,将⼀些相关性不⼤的特征项的参数衰减到⼏乎为0,相当于去掉了这⼀项特征,这跟降维类似,相当于减少了特征维度。⽽去掉基本⽆关的维度,那么就避免了模型对于这⼀维度特征的过分拟合。还有在神经⽹络两个层之间增加Dropout和Normal等,也起到了抑制过拟合的作⽤。
2.适当降低模型的规模
过拟合很重要的⼀个原因也是模型的复杂度太⾼,就像⼀亩地只种了⼀棵⼩麦,那么其他地⽅不种就会长杂草,于是就会过拟合了⼀些噪声。所以,除了正则化⼿段以外,适当减⼩模型的规模也是很重要的,尽量让神经⽹络结构的假设空间与预期⽬标模型需要存储的信息量相匹配。
3.获取更多的数据集
这是终极解决⽅案,深度学习就是在有⼤量数据的基础上发展起来的。深度学习的三件套:数据、模型和硬件。模型可以直接拿来⽤,硬件可以花钱买,但是数据需要⼀点⼀点去收集,⽽且很多问题的解决就依赖于⼤量的数据,没数据就没有⼀切。
4.对数据集做扰动和扩增
这个是直接对现有的数据集做扩容,⼀定程度上可以再次提⾼验证集上的准确率,⽐如对图像做旋转,对声⾳⽂件进⾏加噪处理等。最终的效果虽然⽐不上同等情况下的数据量的增加带来的效果增益,但是在现有条件下,算是扩增数据量的⼀个有效的⽅案。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。