1. 正则化(regularization)
正则化是指修改学习算法,使其降低泛化误差而非训练误差。
1) L2正则化,也称权重衰减(weight decay),正则项为
加入正则化后,总的目标函数为:
求其偏导:
梯度下降更新权重:
所以,加入权重衰减后会引起学习规则的修改,即在执行梯度更新之前先收缩权重向量。
过拟合,就是拟合函数需要考虑每一个点,最终形成的拟合函数波动过大,在某些小区间内,函数值的变化很剧烈,意味着函数的导数值的绝对值很大,所以相对来书权重系数很大。而L2正则化通过约束参数使其不要太大,所以在一定程度上缓解过拟合现象。
Pytorch中常用优化算法为Adam,其中有权重衰减项,默认值为0, torch.optim.Adam(params, lr=0.001,betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False)
2) L1正则化,正则项为
总的目标函数:
求其偏导:
代表各个元素的正负号
可以看到L1正则化并没有收缩权重向量,当为正时,更新后的变小,当为负时,更新后的变大,因此它的效果就是让w往0靠,使网络中的权重尽可能为0,也就相当于减小了网络复杂度,防止过拟合,L1的主要作用是产生稀疏模型,进行特征选择。
2. 数据增强(data augmention)
数据增强简单的方法有图像水平翻转(Horizontal Flip)、随机抠取(random crops)、旋转(rotating)、平移,添加噪声。
Pytorch中对应的函数分别为:
torchvision.transforms.RandomHorizontalFlip(p=0.5)
torchvision.transforms.RandomCrop(size,padding=0, pad_if_needed=False)
torchvision.transforms.RandomRotation(degrees,resample=False, expand=False, center=None)
3. 随机失活(Dropout)
Dropout是指在网络的训练过程中,随机使某些神经元失活,即随机丢弃某些神经元。因为神经元是随机失活的,所以每个mini-batch对应的网络会较大概率不同。Dropout一般用在全连接层的比较多,也可以用在中间层中的卷积层。一般默认为随机失活概率p=0.5,
为什么Dropout能防止过拟合?分为两种观点:1)类似于集成的方法,即训练多个模型做组合,对于一个N节点的神经网络,加入Dropout后且当p=0.5时,就可以看作是个模型的集合了。2)直观上看dropout是一种组合模型,实际上,是在一个神经网络中进行的,最后只训练出一套模型参数,所以dropout可以解释为,它强迫一个神经元和随机挑选出来的其他神经元共同工作,达到更好的效果,消除减弱神经元节点间的联合适应性,增强泛化能力。
Dropout在网络测试的时候神经元会产生方差偏移。
4. 批规范化(batch normalization)
1) 为什么要归一化?(泛化能力和训练速度)
神经网络学习过程的本质就是学习数据的分布,一旦训练数据和测试数据的分布不同,那么网络的泛化能力就会很低;另一方面一旦每个batch 的训练数据的分布不同,网络就会学习不同的分布,这样就会大大降低网络的训练效率。
2) 为什么要Batch Normalization?
假设网络的输入数据已经归一化,但随着网络参数的调整,网络各层的输出数据即下一层的输入数据则不断变化,那么各层的训练就需要不断改变以适应这种新的数据的分布,从而造成训练困难,难以拟合的问题。
BN算法通过对每一层的输入进行归一化,保证每一层的输入数据是稳定的,从而达到加速训练的目的。
3) BN算法
(1) 对输入数据进行归一化处理,归一化为均值为0,方差为1的分布
(2) 当对每一层的数据进行归一化操作以后,有一个问题就是每层的数据分布是固定的,这样与网络所学习的特征就不一致了,破坏了现有的学习到的特征。所以加入两个可学习变量去还原学习到的特征。
总的来说就是先求该层输入的归一化,然后学习参数去还原数据的输入。
5. Bagging和其他集成方法
Bagging是通过结合几个模型降低泛化误差的技术,主要想法是分别训练几个不同的模型,然后让所有模型表决测试样例的输出,模型平均奏效的原因是不同的模型通常不会在测试集上产生完全相同的误差。
Bagging具体的操作是对原始数据集进行有放回的随机抽样,得到若干个与原数据集相同大小的新数据集的一种技术。在得到k个数据集后,最简单的方法就是用模型某型分别作用于k个数据集,从而得到k个分类器,最后对k个分类器的分类结果进行表决得到最终的结果。
Boosting方法通过改变训练样本的权重,串行训练多个分类器,并将这些分类器进行线性组合来构建强分类器。其具体的方法表现为:boosting构建分类器的过程中,每个新分类器都是根据已训练出的分类器的性能来进行训练的,即将被已有分类器错分的那些数据的权重增大,而被正确分类的数据权重减小。最终在训练得到m个分类器后,依据各分类器的分类性能给予相应的权重,并组合得到最终的分类器。
两者的不同在于:1)训练实例构建:Bagging为随机重抽样,Boosting根据已训练出的分类器性能调整权重;2)子分类器构建: Bagging基于重抽样的数据集构建,相互独立,Boosting根据权重调整后的数据集构建,串行,相互依赖;
3)产生最终分类器:Bagging多数表决的投票法,Boosting权重依赖子分类器性能的加权组合。
6. 提前终止
过拟合的现象就是训练误差越来越小,而测试误差与训练误差的间距越来越大,即测试误差先从大变小,然后有从小变大,在某一临界点出,达到最佳的测试误差。而这个临界点就由验证集的测试误差来确定。
在训练模型的过程中,每迭代一定的次数就求取验证集的测试误差,如果每次验证集的误差有所改善,就存储模型参数;当验证集的误差在事先制定的允许次数内没有进一步的改善,就终止算法,最终返回模型参数。
7. 微调(fine-tuning)
微调策略可以看作是迁移学习中的一种方法,它主要是通过在规模比较大的数据集上训练的模型作为小数据集上的模型的初,然后在小数据集上进行训练。微调的方式有多种,比如只训练softmax层,训练中间层+softmax层,训练所有层。
总结,模型过拟合说到底还是因为数据跟模型的参数不匹配,所以防止模型过拟合的方法大概可以分为四大类:数据方面、模型方面、损失函数、训练技巧方面。
1) 数据方面:准备大量的数据,还可以用数据增强的方式产生大量数据;
2) 模型方面:(1)设计合适的模型,(2)选择预训练模型进行微调;(3)在模型的中间使用BN层;(4)在模型的fc层处使用dropout;
3) 损失函数方面:通过在损失函数上添加正则项,要控制w的快速衰减,所以有L1、L2正则的方法;
4) 训练技巧方面:(1)因为在训练时,训练误差是一直减小的,而测试误差是先减小再增大,所以在合适的时间(测试误差最小)停止训练;(2)bagging和其他集成方法
正则化参考网址:https://blog.csdn.net/jinping_shi/article/details/52433975
https://blog.csdn.net/zouxy09/article/details/24971995
http://www.cnblogs.com/alexanderkun/p/6922428.html
Bagging和Boosting参考网址:
https://blog.csdn.net/blateyang/article/details/78367586
Batch Normalization参考网址:
https://zhuanlan.zhihu.com/p/24810318
https://blog.csdn.net/hjimce/article/details/50866313
BN和Dropout联合使用参考网址:
http://www.sohu.com/a/218382470_465975