写点什么

【AI】浅谈使用正则化防止过拟合(下)

作者:sidiot
  • 2023-06-25
    浙江
  • 本文字数:4687 字

    阅读完需:约 15 分钟

前言


对于机器学习问题,我们最常遇到的一个问题便是过拟合。在对已知的数据集合进行学习的时候,我们选择适应度最好的模型最为最终的结果。虽然我们选择的模型能够很好的解释训练数据集合,但却不一定能够很好的解释测试数据或者其他数据,也就是说这个模型过于精细的刻画了训练数据,对于测试数据或者其他新的数据泛化能力不强。


因此,我们需要通过正则化的方法来防止过拟合,接下来跟博主一起来了解一下吧。


在上篇博文 【AI】浅谈使用正则化防止过拟合(上) 中讲述了过拟合产生的原因,以及简单的描述了一下正则化是如何解决过拟合的,接下来将详细展开讲述正则化及权重减少;


正则化 (Regularization)


机器学习中几乎都可以看到损失函数后面会添加一个额外项,常用的额外项一般有两种,一般英文称作  和 ,中文称作 L1 正则化 和 L2 正则化,或者 L1 范数 和 L2 范数


最常用的范数就是 ,即一般范数 ,若 ,那么



取 1,2 的时候分别是以下最简单的情形:





分别几个范数表示:


  • :指向量中非 0 的元素的个数;

  • :指向量中各个元素绝对值之和;

  • :指向量各元素的平方和的平方根;


用代码来简单表示一下


import torch
u = torch.tensor([3.0, -4.0])
# L1torch.abs(u).sum()# tensor(5.)
# L2torch.norm(u)# tensor(7.)
复制代码


L1 正则化和 L2 正则化可以看做是损失函数的惩罚项。所谓『惩罚』是指对损失函数中的某些参数做一些限制。对于线性回归模型,使用 L1 正则化的模型建叫做 Lasso 回归,使用 L2 正则化的模型叫做 Ridge 回归(岭回归)。


下面是 Python 中 Lasso 回归的损失函数,式中加号后面一项 即为 L1 正则化项。



下面是 Python 中 Ridge 回归的损失函数,式中加号后面一项 即为 L2 正则化项。



一般回归分析中 表示特征的系数,从上式可以看到正则化项是对系数做了处理(限制)。


L1 正则化和 L2 正则化的说明如下:


  • L1 正则化是指权值向量 中各个元素的绝对值之和,通常表示为

  • L2 正则化是指权值向量 中各个元素的平方和然后再求平方根(可以看到 Ridge 回归的 L2 正则化项有平方符号),通常表示为


一般都会在正则化项之前添加一个系数,Python 的机器学习包 sklearn 中用 表示,一些文章也用 表示,这个系数需要用户指定。


L1 正则化和 L2 正则化的作用:


  • L1 正则化可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择;

  • L2 正则化可以防止模型过拟合(overfitting),一定程度上, 也可以防止过拟合;


深入理解


L1 正则化


假设有如下带 L1 正则化的损失函数:



其中 是原始的损失函数,加号后面的一项是 L1 正则化项, 是正则化系数。注意到 L1 正则化是权值的绝对值之和, 是带有绝对值符号的函数,因此 是不完全可微的。机器学习的任务就是要通过一些方法(比如梯度下降)求出损失函数的最小值。当我们在原始损失函数 后添加 L1 正则化项时,相当于对 做了一个约束。


令:



,此时我们的任务变成 在 L 约束下求出 取最小值的时候的解考虑二维的情况,即只有两个权值 ,此时 。对于梯度下降法,求解 的过程可以画出等值线,同时 L1 正则化 的函数 也可以在 的二维平面上画出来。如下图:



图中等值线是 的等值线,黑色方形是 函数的图形。,这个函数画出来就是一个方框。


在图中,当 等值线与 图形首次相交的地方就是最优解。上图中 的一个顶点处相交,这个顶点就是最优解。注意到这个顶点的值是 。可以直观想象,因为 函数有很多『突出的角』(二维情况下四个,多维情况下更多), 与这些角接触的机率会远大于与 其它部位接触的机率(这是很直觉的想象,突出的角比直线的边离等值线更近些),而在这些角上,会有很多权值等于 0(因为角就在坐标轴上),这就是为什么 L1 正则化可以产生稀疏模型,进而可以用于特征选择


而正则化前面的系数 ,可以控制 图形的大小。 越小, 的图形越大(上图中的黑色方框); 越大, 的图形就越小,可以小到黑色方框只超出原点范围一点点,这时最优点的值 中的 可以取到很小的值。


L2 正则化


类似地,假设有如下带 L2 正则化的损失函数:



同样可以画出他们在二维平面上的图形,如下:



二维平面下 L2 正则化的函数图形是个圆(绝对值的平方和,是个圆),与方形相比,被磨去了棱角。因此 相交时使得 等于零的机率小了许多(这个也是一个很直观的想象) ,这就是为什么 L2 正则化不具有稀疏性的原因,因为不太可能出现多数 都为 0 的情况。


L2 正则化可以获得值很小的参数


以线性回归中的梯度下降法为例,使用 Andrew Ng 机器学习的参数表示方法。假设要求解的参数为 是我们的假设函数。线性回归一般使用平方差损失函数。单个样本的平方差是 ,如果考虑所有样本,损失函数是对每个样本的平方差求和,假设有 个样本,线性回归的代价函数如下,为了后续处理方便,乘以一个常数



中间推导过程不再赘述,可以参考这篇博文:【AI】浅谈梯度下降算法(理论篇)


梯度下降算法中,为了尽快收敛,会沿梯度的负方向更新参数,因此在上式前添加一个负号,并乘以一个系数 (即学习率),得到最终用于迭代计算参数 的形式:



其中 是学习率(learning rate)。 上式是没有添加 L2 正则化项的迭代公式,如果在原始代价函数之后添加 L2 正则化,则迭代公式会变成下面的样子:



其中 就是正则化参数。从上式可以看到,与未添加 L2 正则化的迭代公式相比,每一次迭代, 都要先乘以一个小于 1 的因子(即 ,从而使得 不断减小,因此总的来看, 是不断减小的。


最开始也提到 L1 正则化一定程度上也可以防止过拟合。之前做了解释,当 L1 的正则化系数很小时,得到的最优解会很小,可以达到和 L2 正则化类似的效果。


权重减少


的目的是通过减少 的权重从而减少模型的复杂度,从而提高模型的泛华能力,为什么会这样呢?启发式地来说,如果代价函数没有正则化,那么权重向量的长度倾向于增长,而其它的都不变。随着时间推移,权重向量将会变得非常大。这可能导致权重向量被限制得或多或少指向同一个方向,因为当长度过长时,使代价函数的最优解发生偏离。


下面将从数学的角度出发给出了正则化为什么能减少 的权重,机器学习的实践应用中也得到了验证,但是正则化到底是如何影响模型的泛化能力,并没有科学的数据依据,难道 按照某种规则增加就不能提高模型的泛化能力吗?


从机器学习的领域经验表明:减少 的权重从而减少模型的复杂度,提高模型的泛化能力,因此正则化处理手段在机器学习的模型上得到广泛应用。




权重衰减


L2 正则化就是在代价函数后面再加上一个正则化项:



代表原始的代价函数,后面那一项就是 L2 正则化项,它是这样来的:所有参数 的平方的和,除以训练集的样本大小 就是正则项系数,权衡正则项与 项的比重。另外还有一个系数 经常会看到,主要是为了后面求导的结果方便,后面那一项求导会产生一个 2,与 相乘刚好凑整。


L2 正则化项是怎么避免 overfitting 的呢?我们推导一下看看,先求导:




可以发现 L2 正则化项对 的更新没有影响,但是对于 的更新有影响:



在不使用 L2 正则化时,求导结果中 前系数为 1,现在 前面系数为 ,因为 都是正的,所以 小于 1,它的效果是减小 ,这也就是权重衰减(weight decay)的由来。当然考虑到后面的导数项, 最终的值可能增大也可能减小。


另外,需要提一下,对于基于 mini-batch 的随机梯度下降, 更新的公式跟上面给出的有点不同:



对比上面 的更新公式,可以发现后面那一项变了,变成所有导数加和,乘以 再除以 是一个 mini-batch 中样本的个数。


到目前为止,我们只是解释了 L2 正则化项有让 “变小” 的效果,但是还没解释为什么 “变小” 可以防止 overfitting?一个所谓 “显而易见” 的解释就是:更小的权值 ,从某种意义上说,表示网络的复杂度更低,对数据的拟合刚刚好(这个法则也叫做奥卡姆剃刀),而在实际应用中,也验证了这一点,L2 正则化的效果往往好于未经正则化的效果。当然,对于很多人(包括我)来说,这个解释似乎不那么显而易见,所以这里添加一个稍微数学一点的解释(引自知乎):


过拟合的时候,拟合函数的系数往往非常大,为什么?如下图所示,过拟合,就是拟合函数需要顾忌每一个点,最终形成的拟合函数波动很大。在某些很小的区间里,函数值的变化很剧烈。这就意味着函数在某些小区间里的导数值(绝对值)非常大,由于自变量值可大可小,所以只有系数足够大,才能保证导数值很大。


而正则化是通过约束参数的范数使其不要太大,所以可以在一定程度上减少过拟合情况。




权重衰减


在原始的代价函数后面加上一个 L1 正则化项,即所有权重 的绝对值的和,乘以 (这里不像 L2 正则化项那样,需要再乘以 ,具体原因上面已经说过。)



同样先计算导数:



上式中 表示 的符号。那么权重 的更新规则为:



比原始的更新规则多出了 这一项。当 为正时,更新后的 变小。当 为负时,更新后的 变大——因此它的效果就是让 往 0 靠,使网络中的权重尽可能为 0,也就相当于减小了网络复杂度,防止过拟合。


另外,上面没有提到一个问题,当 为 0 时怎么办?当 等于 0 时, 是不可导的,所以我们只能按照原始的未经正则化的方法去更新 ,这就相当于去掉 这一项,所以我们可以规定 ,这样就把 的情况也统一进来了。



后记


以上就是 浅谈使用正则化防止过拟合(下) 的全部内容了,具体讲解了什么是正则化,并进行深入理解,以及 是如何进行权重衰减的,通过图文结合,公式推导,细致地讲述了要点,希望大家有所收获!

发布于: 刚刚阅读数: 2
用户头像

sidiot

关注

还未添加个人签名 2023-06-04 加入

还未添加个人简介

评论

发布
暂无评论
【AI】浅谈使用正则化防止过拟合(下)_人工智能_sidiot_InfoQ写作社区