正则化技术

原文链接:https://www.yuque.com/yahei/hey-yahei/regularization

正则化指的是为模型引入一些约束,一定程度上限制模型的拟合能力,减缓收敛速度,从而缓解过拟合现象的一系列方法。

参考:

  1. 《Hands-On Machine Learning with Scikit-Learn and TensorFlow(2017)》Chap11
  2. 《卷积神经网络——深度学习实践手册(2017.05)》

常见的正则化技术:

  1. 提前终止(Early Stop)
  2. 权重正则化(Weights Regularization)
  3. 随机失活(Dropout)
  4. 数据增广(Data Augmentation)
  5. 批归一化(Batch Normalization, BN)
  6. 重叠池化(Overlapping Pooling)
  7. 随机池化(Stochastic Pooling)
  8. 平滑标签(Label Smoothing Regularization, LSR)

欠拟合&过拟合

参考:

  • 《深度学习500问 - Ch02机器学习基础 - 图解欠拟合、过拟合》
  • 《深度学习500问 - Ch02机器学习基础 - 如何解决过拟合与欠拟合》

欠拟合:模型拟合能力不足,存在高偏差问题,不能很好地从训练数据拟合出预测模型;
过拟合:模型拟合能力太强,存在高方差问题,过分拟合于训练集,甚至直接把训练集记了下来(就像是学生只会刷题,而且记性很好,甚至逐渐把答案背了下来,却没有掌握真正的知识,没法做到举一反三)
正则化技术_第1张图片
(分类任务:欠拟合、恰当拟合、过拟合)

在训练曲线上,过拟合表现为,随着迭代次数的增加,

  • 训练集的损失逐步减小,准确率逐步提高
  • 验证集却损失逐步增加,准确率逐步下降
因素 损失曲线/准确率曲线
训练集大小 正则化技术_第2张图片
模型复杂度 正则化技术_第3张图片
正则化程度 正则化技术_第4张图片
迭代次数 正则化技术_第5张图片

如何解决欠拟合问题?

  • 增大模型复杂度(增加层数、参数,增加额外特征项或高次特征等)
  • 减小正则化技术的使用(减小正则化系数等)

如何解决过拟合问题?

  • 每轮训练后冲洗数据集,使每个Batch模型见到的样本组合不同
  • 增加样本数量
  • 降低模型复杂度
  • 增加噪声
  • 决策树等树模型可以进行剪枝
  • 增加正则化技术的使用

提前终止

每经过一定迭代次数之后将模型用于验证集上的评估,暂存、更新最近几次在验证集上有一定loss下降的模型(称为快照snapshot或检查点checkpoint);
当连续几次在验证集上没有出现明显的loss下降(甚至有可能回升)时终止训练;
提前终止简单有效,通常都能表现的很好,如果和其他正则化技术共同使用可以获得更好的表现

权重正则化

L2正则化

又称权重衰减(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λiwi2
其中 λ \lambda λ 控制正则项大小,取值越大对模型复杂度的约束程度越大;
一般将该L2惩罚项加入到目标函数中,通过目标函数的误差反向传播

L1正则化

又称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=ww2r
其中, r r r为超参数max-norm, ∣ ∣ w ∣ ∣ 2 ||w||_2 w2 w w w的L2范数;
减小 r r r将增加惩罚的力度,这将有助于抑制过拟合。
同时,最大范数也有抑制梯度消失与爆炸的作用,通常跟Dropout结合使用;但随着BN层的广泛使用,通常也不需要最大范数来抑制梯度消失与梯度爆炸。

随机失活

论文:

  • 《Improving neural networks by preventing co-adaptation of feature detectors(2012)》首次提出
  • 《Dropout: A Simple Way to Prevent Neural Networks from Overfitting(2014)》讨论了细节

参考:《深度学习500问 - Ch03深度学习基础 - Dropout系列问题》

具体操作

在每一步训练中,所有神经单元(包含输入神经单元,但不包含输出神经单元)有一定概率 p p p被忽略(但在预测时使用整个网络);
这里 p p p称为dropout rate,对应的还有一个keep probability,即 q = 1 − p q = 1 - p q=1p

每步训练时都有一部分单元缺失,使得每个单元都有机会在本次训练中具备一定的重要性,从而使得各个单元可以更好地从训练集中学习,使整个网络在工作时更有弹性;
部分“队友”的缺失、部分“输入数据”的缺失,在这种训练下,每个单元有更强的鲁棒性;
或者换个角度看,Dropout每次使一部分神经元失活,相当于每次迭代都使用一个一定限制下的随机结构进行训练。

由于各个单元是一定概率 q q q参与训练的,使得每一层输出的分布发生变化,所以在需要对这些单元进行一定补偿——

  1. 可以在训练时,对每个单元的输出都除以q
  2. 也可以在预测时,为每个单元的输出都乘以q

这两种方式二选其一即可,虽然不完全等价,但实际效果时差不多的

关于dropout rate,

  1. 通常取 p = 0.5 p=0.5 p=0.5的效果最好,此时可以产生的随机结构数量最多;
  2. Dropout也可以用于Input层,直接对输入数据进行加噪处理,此时 p p p应当设得小一些(如0.2),确保输入数据不会发生太大变化;
  3. 如果说,在训练中加了dropout还是发现过拟合了,可以考虑增加dropout_rate(减小keep_prob);

缺点

  • Dropout减缓了收敛的速度
  • 而且,Dropout对卷积层似乎没有作用(一般只用于全连接层)

参考《Why would I need to apply a dropout layer before a convolutional layer? | Quora》

  • 卷积层参数数量远少于全连接层,过拟合现象的发生也没有全连接那么严重。
    大多数经典框架都只在全连接层上使用dropout,参考《经典的CNN分类架构 | Hey~YaHei!》

  • 不过,也有一些在卷积层上使用Dropout并且一定提升的例子,比如

    • Dropout: A Simple Way to Prevent Neural Networks from Overfitting(2014)
    • FAST AND ACCURATE DEEP NETWORK LEARNING BY EXPONENTIAL LINEAR UNITS (ELUS)(2016)
    • 92.45% on CIFAR-10 in Torch | Torch
    • Using convolutional neural nets to detect facial keypoints tutorial | danielnouri
  • 也有一些关于对卷积层使用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库:

  • https://github.com/mdbloice/Augmentor
  • https://github.com/aleju/imgaug

特殊的数据增广

  • Fancy PCA

论文:《Imagenet Classification with Deep Convolutional Neural Networks(2012)》

和AlexNet网络一同提出,

Fancy PCA可以近似捕获自然图像的一个重要特性——物体特质与光照强度和颜色变化无关

  1. 对整个数据集的R、G、B进行PCA操作,得到特征向量 p i p_i pi 和特征值 λ i \lambda_i λi,其中 i = 1 , 2 , 3 i=1,2,3 i=1,2,3
  2. 计算一组随机值 [ p 1 , p 2 , p 3 ] [ α 1 λ 1 , α 2 λ 2 , α 3 λ 3 ] T [p_1, p_2, p_3][\alpha_1 \lambda_1, \alpha_2 \lambda_2, \alpha_3 \lambda_3]^T [p1,p2,p3][α1λ1,α2λ2,α3λ3]T,将其作为扰动加到原像素值中;

其中, α i \alpha_i αi 为0均值0.1标准差的高斯分布随机值

1. 每一个epoch之后,重新选取一次$$\alpha_i$$进行扰动
  • 监督式数据增广(有先验的随机抠取操作)

海康威视在2016ImageNet竞赛的场景分类任务中提出;

在以物体为中心的图像分类任务中,随机抠取图像块可以取得比较好的效果;

但对于依靠图像整体蕴含的高层语义的场景分类任务中,随机抠取图像块很可能会抠取到关联性比较差的结果(比如“海滩”中抠取到“树”和“天空”);

可以借助图像标记信息解决这一问题:

  1. 根据原数据训练一个分类的初始模型
  2. 利用该模型对每张图生成激活图(activation map)或热力图(heat map)

可以直接将最后一层卷积层特征按深度方向加和得到,也可以参照论文《Learning Deep Features for Discriminative Localization (2015)》生成分类激活图(class activation map);

该热力图可以指示图像区域与场景标记之间的相关概率

4. 根据上述概率映射回原图选择较强相关的图像区域作为抠取的图像块
  • 像素混合Mixup,参见《深度学习小技巧(三):训练技巧 - 数据混合(Mixup)| Hey~YaHei!》

你可能感兴趣的:(深度学习,神经网络,机器学习)