9.1 L1和L2正则化
L1和L2正则化技术是在深度学习模型训练过程中常用的解决模型过拟合的技术。这一节我们我就来详细学习。
9.1.1 什么是正则化
之前我们我们讲过模型的过拟合,过拟合就是模型在训练集上表现很好,但是在验证集上表现很差。这是模型过度拟合了训练数据里的非真正规律的噪声造成的。 之前我们也讲过模型过拟合的原因有几个,可能是训练数据太少,体现不了真正的规律。也有可能是训练时间过长。还有一种可能就是模型设计的太复杂。正则化(Regularization)技术就是通过一些技术手段来限制模型的复杂度,从而改进模型过拟合的问题,让模型有更好的泛化性。
9.1.2 奥卡姆剃刀
14世纪英国修士威廉·奥卡姆提出的著名哲学原理:"如无必要,勿增实体",在700年后的人工智能领域依然闪耀着智慧的光芒。这把无形的"剃刀"告诉我们:当两个理论具有相同的解释力时,更简单的那个往往更接近真理。这不仅是中世纪经院哲学的重要遗产,更成为现代科学方法论的重要基石。
天文学史上最著名的案例印证了这个原理的预见性。托勒密的地心说用80多个"本轮"和"均轮"的复杂组合描述行星运动,他将地球置于宇宙中心,从而需要不断的增加额外复杂的规则来计算其他行星的运行轨迹。而哥白尼的日心说仅用7个圆形轨道就解释了同样现象,最终被证明这才是宇宙本质。奥卡姆剃刀原理作为科学方法论同样指导着深度学习的正则化技术。那就是如果两个模型都可以预测同样的结果,那更简单的那个更接近本质的规律。
9.1.3 L1正则化
L1正则化的思想是在损失函数中额外加入模型所有参数的绝对值之和作为惩罚项。这样模型在训练过程中,会尽可能的让参数变小来降低Loss值,直到让某些参数为0。如果一个参数降为0,则等价于这个参数消失,起到了降低模型复杂度的作用。同样减小参数的值也是降低模型复杂度的一种方式。L1正则化的公式为:
其中是模型参数,是控制正则化强度的参数,一般初始设置为1e-3或者1e-4。设置过大会导致模型欠拟合。在训练过程中可以进根据实际情况进行调整,调整原则为如果数据量越少,模型越复杂,输入特征越多,那么就越大。因为这些情况都更容易出现过拟合。反之则可以减小。
9.1.4 L2正则化
L2正则化与L1正则化非常类似,它在损失函数中加入模型参数的平方和作为惩罚项。同样可以达到控制模型复杂度的效果。它的公式为:
其中的初始化和配置与L1类似。
9.1.5 L1和L2正则化的区别
L1正则化会让模型很多参数为0,也就是模型参数会变得稀疏。L2正则化会让模型参数变小,但是不会等于0。为什么会产生这种效果呢?
因为L1正则化每个参数是以绝对值的形式加入Loss函数,绝对值函数的导数在x大于0为1,x小于0为-1,在0处没有定义。所以它可以按照固定速度降低参数的绝对值,直到为0。L2正则化每个参数是以平方项的形式加入Loss函数,平方项的导数为,当越接近零,梯度会越小,所以参数只会接近0,而不会等于0。
当然调整参数过程大部分还是受原本Loss函数的影响。它和正则项一起优化出一个既有效又简单的模型来。L2正则化让所有参数均匀缩小,避免模型过度依赖某些特征,同时保留所有特征的贡献,适用于大多数场景。所以一般情况下都默认使用L2正则化,很少使用L1正则化。
9.1.5 在PyTorch里增加L2正则化
l2_norm = 0.0
for param in model.parameters():
l2_norm += param.pow(2).sum()
loss = criterion(outputs, labels) + 1e-4 * l2_norm
在PyTorch里增加L2正则化非常简单,就是遍历所有参数,对所有参数进行平方并加和。最终将这个值乘以一个很小的系数,比如上边代码里的1-e4,最终加入到loss中就可以。