权重衰退
2024-09-27 20:32:56 # 深度学习入门 # 多层感知机

我们已经知道了随着模型复杂度的不断提升,如果已有的数据量保持不变的话,那么模型的过拟合风险就会不断提升。

因此,如果我们想要降低模型的过拟合风险,就必须降低模型复杂度,而模型复杂度在一定程度上又和模型参数的数量和参数的取值范围相关联。所以在模型的泛化问题上,往往从这两个方面入手。

从直觉上来说,降低模型参数的数量是最容易实现的,可是这种操作的粒度并不容易把握,一般不推荐这种方法。

我们从控制模型参数的范围入手

权重衰退

这种控制参数范围方法的核心思想是给定一个函数f, 当它的内部参数全为0时,我们说这个函数处于最简单的状态。根据这个核心思想,我们要做的就是缩小f中的参数与0的距离。

这个距离是如何被计算出来的?实际上,这一直是泛函分析和巴拿赫空间致力于解决的问题,是一个非常宏大的问题。

在机器学习中一般使用L2范数 ||W2|| 表示这个距离。因此权重衰退还有一个更加洪亮的名字:L2正则化

在引入L2正则化后,目标函数需要做出一定的修改:

Lmbda在这里被称为正则化参数,属于模型中的超参数。取值范围非负

注意到,在以往的实践中,目标函数与损失函数是等价的,而现在引入L2正则化后,目标函数和损失函数已经有了区别了。

目标函数修改后,对应地,小批量随机梯度下降优化算法也随之发生改变。

上式由参数矩阵w减去目标函数的梯度得到。其中B表示样本数,n表示学习率,上式中的最后一个项可以看作没有加入正则项前的梯度优化算法。

在解释完基础定义后,我们需要停下来思考为什么在目标函数中添加这么奇怪的一个项呢,即这个项的形式是如何得来的呢?进一步的,为什么添加这样一个项后,我们就可以达到限制参数范围的目的,进而减小模型复杂度呢?

首先解释第一个问题,lmbda作为超参数已经在前文中提及,我们看看为什么需要1/2? 这其实是为了计算方便,在求导时,可以很方便的将2消去,再来看看为什么要对欧几里得距离求平当?这还是出于计算方便的考量,在求导后,很容易得到 和的导数 就等于 导数的和了

解决完这个项为啥长这样后,再来看看它是如何生效的

我们可以观察到,目标函数新增了一个惩罚项(由于整个模型的拟合目标是找到最小的损失值,而lmbda又被规定为非负,所以我们称这个项为惩罚项),考虑如下情况,如果模型参数的取值范围不断增大,那么这个惩罚项相应的也会随之增大,所以为了得到最优的损失值,根据优化算法,模型自动地减小参数的取值范围,以此,达到我们减小模型复杂度的目的。

解决上述问题后,聪明的你可能还要提问,为什么我们使用L2范数呢?L1范数不行吗?还有为什么我们只针对权重矩阵W进行更新呢?偏置矩阵B该如何处理呢?

首先回答L1范数的问题,我们可以这样看待L2范数,它的目标是将模型参数整体调优,即整体下降到一个合理的范围。L1范数的作用更多的是关注一些特定的特征,而将其他的特征忽略,这一行为又被称为特征选择,在某些特定场景下L1范数更加有效。

对于偏置矩阵B的正则化一直是一个棘手的问题,在有些神经网络中,我们不对B进行正则化,而在其他一些网络中,我们对每个层次内的B做出不同的正则化,这里暂且按下不表。

L2正则化的简洁实现

直接在torch提供的优化器中配置即可,无需改变损失函数的定义

1
2
trainer = nn.optim.SGD([{"params":net[0].weights, weight_decay:wd},
{"params":net[0].bias}], lr = 0.01)