深度学习中的正则化
任何可以使学习算法有降低泛化误差意向的改动都是正则化。一个有效的正则化就是能显著地降低方差而不过度增加偏差。
最好的拟合模型总是一个适当正则化的大型模型!
1,参数范数惩罚与约束范数惩罚
- L2参数惩罚(岭回归):特征权重衰减,可以解释为权重为高斯先验的MAP贝叶斯推断。
- L1参数惩罚(Lasso回归用到L1):特征稀疏,有特征选择的效果,可以解释为权重为Laplace先验的MAP贝叶斯推断。
- 约束范数惩罚:带约束的最优化问题,可以将约束转化为正则项加入到原来的目标函数变成无约束的最优化问题,例如拉格朗日乘子法,其实L2、L1范数惩罚也可以看成是对范数的约束。
2,数据增强
数据增强是一种便宜且简单的方法来增加你训练数据的数量的方法。
- 颜色抖动:Fancy PCA就是一种颜色抖动的方法。
- 水平翻转:需要小心,有些情况的翻转,例如“b”和“d”的翻转会改变对象的内容。
- 随机剪切
- 向输入注入噪声
- 等等
3,噪声鲁棒性
上面数据增强已经提到,向输入中注入方差极小的噪声等价于对权重施加范数惩罚,一般情况***入噪声远比简单的收缩参数强大,特别是参数被添加到隐藏单元时会更加强大。
其他注入噪声的方法还有:
- 将噪声加到权重:施加于权重的噪声被解释为与更传统的正则化形式等同。
-
将噪声加到输出目标:例如标签平滑
标签平滑的优势是能够防止模型追求确切概率而不影响模型学习正确分类。
4,提前终止
提前终止需要用到验证集,因为它的本质是为了找到最佳的训练轮数或者参数更新次数。在不断的训练过程中,为了防止过拟合我们需要参考每轮训练完之后验证集的损失是否下降,如果验证集的损失不再下降了,说明训练轮数已经够了,再训练可能会导致过拟合,所以这个时候就可以终止训练返回训练轮数或者参数更新次数或者全部参数值。
提前终止可能是深度学习最常用的正则化形式。它的流行主要是因为它的有效性和简单性。
我们也可以认为提前终止是非常高效的超参数选择算法。按照这个观点,训练轮数或者参数更新次数仅是一个超参数。
为了在训练时也充分利用验证集,所以有以下两种策略:
- 在第一轮训练提前终止后,保存第一轮的最佳训练轮数,然后再次初始化模型,然后使用所有数据再次进行训练,在这个第二轮的训练过程当中,我们使用第一轮提前终止确定后的训练轮数。效果比较好,但对参数进行相同次数的更新还是对数据集进行相同次数的遍历哪个更好就不知道了。
- 保持第一轮训练获得的参数,然后使用全部的数据继续训练。此策略避免了重新训练模型的高成本,但表现并没有那么好。
常用第一种策略!
5,参数共享
前面都是加了参数范数惩罚或约束作为正则项,但我们也可以考虑使用一起其他方式来表示参数先验,例如参数之间的依赖关系,最普遍的依赖类型是:各个参数的值可能很接近。而参数共享就是这种思想,它假设一些参数都是相等的。例如:
- CNN
-
多任务学习:有所有任务共享的参数,也有每个具体任务各自的参数,如下图所示。
共享参数使得各个任务可以从所有任务的汇集数据中获益。
6,集成模型
- bagging
- boosting
- stacking
这里不详细介绍了…
7,Dropout
Dropout提供了正则化一大类模型的方法,计算方便但功能强大。它可以被认为是集成大量深度神经网络的实用Bagging方法。
用dropout时,一般输入层的keep_prob设为0.8,而隐藏层的keep_prob设为0.5。
8,对抗训练
对抗样本:在原始样本上加一些很小的噪声生成的那些人眼不会分错但模型会分错的样本。
我们应该在一些对抗样本上进行对抗训练,主要为了提高安全性,但有时候也会提高泛化能力。