原文链接:https://www.yuque.com/yahei/hey-yahei/regularization
正则化指的是为模型引入一些约束,一定程度上限制模型的拟合能力,减缓收敛速度,从而缓解过拟合现象的一系列方法。
参考:
常见的正则化技术:
参考:
欠拟合:模型拟合能力不足,存在高偏差问题,不能很好地从训练数据拟合出预测模型;
过拟合:模型拟合能力太强,存在高方差问题,过分拟合于训练集,甚至直接把训练集记了下来(就像是学生只会刷题,而且记性很好,甚至逐渐把答案背了下来,却没有掌握真正的知识,没法做到举一反三)
(分类任务:欠拟合、恰当拟合、过拟合)
在训练曲线上,过拟合表现为,随着迭代次数的增加,
因素 | 损失曲线/准确率曲线 |
---|---|
训练集大小 | |
模型复杂度 | |
正则化程度 | |
迭代次数 |
如何解决欠拟合问题?
如何解决过拟合问题?
每经过一定迭代次数之后将模型用于验证集上的评估,暂存、更新最近几次在验证集上有一定loss下降的模型(称为快照snapshot或检查点checkpoint);
当连续几次在验证集上没有出现明显的loss下降(甚至有可能回升)时终止训练;
提前终止简单有效,通常都能表现的很好,如果和其他正则化技术共同使用可以获得更好的表现
又称权重衰减(weight decay)、岭回归(ridge regression)、Tikhonov正则化(Tikhonov regularization)。
l 2 = 1 2 λ ∣ ∣ ω ∣ ∣ 2 2 = 1 2 λ ∑ i w i 2 l_2 = \frac{1}{2} \lambda ||\omega||^2_2 = \frac{1}{2} \lambda\sum_i w_i^2 l2=21λ∣∣ω∣∣22=21λi∑wi2
其中 λ \lambda λ 控制正则项大小,取值越大对模型复杂度的约束程度越大;
一般将该L2惩罚项加入到目标函数中,通过目标函数的误差反向传播
又称Elastic正则化。
l 1 = λ ∣ ∣ ω ∣ ∣ 1 = ∑ i ∣ ω i ∣ l_1 = \lambda ||\omega||_1 = \sum_i |\omega_i| l1=λ∣∣ω∣∣1=i∑∣ωi∣
L1正则化不仅能够约束参数量级,还可以使参数稀疏化,使优化后部分参数置为0,并且也有去除噪声的效果;
L1和L2惩罚可以联合使用,如 λ 1 ∣ ∣ ω ∣ ∣ 1 + λ 2 ∣ ∣ ω ∣ ∣ 2 2 \lambda_1 ||\omega||_1 + \lambda_2 ||\omega||_2^2 λ1∣∣ω∣∣1+λ2∣∣ω∣∣22;
L1和L2正则化限制了权重大小,也就限制了梯度的大小,因此有利于减少梯度爆炸的发生。
L2正则化、L1正则化将L2范数、L1范数加入到损失函数中对权重的大小进行约束,而最大范数的正则化方式不同,它是对更新后的权重直接进行缩放来达到约束权重大小的目的。
在每步训练之后,对权重 w w w进行一定约束
w ′ = w r ∣ ∣ w ∣ ∣ 2 w' = w \frac{r}{||w||_2} w′=w∣∣w∣∣2r
其中, r r r为超参数max-norm, ∣ ∣ w ∣ ∣ 2 ||w||_2 ∣∣w∣∣2为 w w w的L2范数;
减小 r r r将增加惩罚的力度,这将有助于抑制过拟合。
同时,最大范数也有抑制梯度消失与爆炸的作用,通常跟Dropout结合使用;但随着BN层的广泛使用,通常也不需要最大范数来抑制梯度消失与梯度爆炸。
论文:
参考:《深度学习500问 - Ch03深度学习基础 - Dropout系列问题》
在每一步训练中,所有神经单元(包含输入神经单元,但不包含输出神经单元)有一定概率 p p p被忽略(但在预测时使用整个网络);
这里 p p p称为dropout rate,对应的还有一个keep probability,即 q = 1 − p q = 1 - p q=1−p。
每步训练时都有一部分单元缺失,使得每个单元都有机会在本次训练中具备一定的重要性,从而使得各个单元可以更好地从训练集中学习,使整个网络在工作时更有弹性;
部分“队友”的缺失、部分“输入数据”的缺失,在这种训练下,每个单元有更强的鲁棒性;
或者换个角度看,Dropout每次使一部分神经元失活,相当于每次迭代都使用一个一定限制下的随机结构进行训练。
由于各个单元是一定概率 q q q参与训练的,使得每一层输出的分布发生变化,所以在需要对这些单元进行一定补偿——
这两种方式二选其一即可,虽然不完全等价,但实际效果时差不多的
关于dropout rate,
参考《Why would I need to apply a dropout layer before a convolutional layer? | Quora》
卷积层参数数量远少于全连接层,过拟合现象的发生也没有全连接那么严重。
大多数经典框架都只在全连接层上使用dropout,参考《经典的CNN分类架构 | Hey~YaHei!》
不过,也有一些在卷积层上使用Dropout并且一定提升的例子,比如
也有一些关于对卷积层使用Dropout或者Dropout的变体的论文,比如
Towards Dropout Training for Convolutional Neural Networks(2015)
Efficient Object Localization Using Convolutional Networks(2015)
Analysis on the Dropout Effect in Convolutional Neural Networks(2016)
Dropout与BN不易兼容
Dropout导致训练过程中每一层输出的方差发生偏移,使得BN层统计的方差不准确,影响BN的正常使用。对于BN层的广泛使用,卷积层上的Dropout变得非常少见。但也有论文指出Dropout和BN是互相独立的正则化技术,当网络足够宽(每一层输出通道数量比较大)时,方差偏移带来的影响会逐渐减小,此时往带BN的卷积层加入Dropout依旧能取得提升。
「挖坑待填:实际有好几篇论文讨论过Dropout跟BN兼容使用的问题,有机会再回来填上」
也可以称为“数据扩充”,指人为地对训练集原始数据进行变换或加噪,达到扩充数据集的目的,可以有效地减少过拟合现象的发生。
但这种修改必须是“可学习的”,比如添加白噪声是没意义的,因为白噪声不可学习;
比如做图片分类的时候,可以平移、旋转、缩放图片甚至改变亮度来做到对图像进行加噪处理,使得模型对图片的位置、角度、大小不那么敏感。
训练过程中的数据增广通常是带有随机性的,以保证每个生成的样本略有不同,用这些假数据来“扩充”实际的训练数据集;而在预测过程中这种随机性是没有必要,甚至有害的(难以在验证集上复现相同结果)。
由于这样的数据增广带有随机性,不得不在训练的时候在线对数据进行处理,会占用部分CPU/GPU资源。有时候为了更快的训练,会减弱一部分随机性,比如预先将数据集扩增5-10倍放在硬盘上备用(当然,这需要占用更多硬盘空间),训练时直接读取即可,甚至可以预先制作出IO效率更高的专门的数据文件。
常见图像增广Python库:
论文:《Imagenet Classification with Deep Convolutional Neural Networks(2012)》
和AlexNet网络一同提出,
Fancy PCA可以近似捕获自然图像的一个重要特性——物体特质与光照强度和颜色变化无关
其中, α i \alpha_i αi 为0均值0.1标准差的高斯分布随机值
1. 每一个epoch之后,重新选取一次$$\alpha_i$$进行扰动
海康威视在2016ImageNet竞赛的场景分类任务中提出;
在以物体为中心的图像分类任务中,随机抠取图像块可以取得比较好的效果;
但对于依靠图像整体蕴含的高层语义的场景分类任务中,随机抠取图像块很可能会抠取到关联性比较差的结果(比如“海滩”中抠取到“树”和“天空”);
可以借助图像标记信息解决这一问题:
可以直接将最后一层卷积层特征按深度方向加和得到,也可以参照论文《Learning Deep Features for Discriminative Localization (2015)》生成分类激活图(class activation map);
该热力图可以指示图像区域与场景标记之间的相关概率
4. 根据上述概率映射回原图选择较强相关的图像区域作为抠取的图像块