机器学习之L1正则化和L2正则化(附源码解析)

article/2025/9/21 7:01:09

前言

今天还是机器学习的基础知识内容,也是最基础的哈。首先说一下什么是正则化,其实它就是一个减少方差的策略。那么什么是方差呢?在这里也引入一个和方差相辅相成的概念--偏差。

  • 偏差度量了学习算法的期望预测与真实结果的偏离程度, 即刻画了学习算法本身的拟合能力
  • 方差度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响

我们通常所说的过拟合现象,也就是指的高方差,就是模型在训练集上训练的超级好,几乎全部都能拟合。 但是这种情况如果换一个数据集往往就会非常差, 正则化的思想就是在我们的目标函数中价格正则项, 即:

在这里正则项有两种,分别是L1和L2,先来看一下两者的表达式:

 如果加上这种正则项,就是希望我们的代价函数小,同时也希望我们这里的w_i小,这样就说明每个样本的权重都很小,这样模型就不会太多的关注某种类型的样本, 模型参数也不会太复杂,有利于缓解过拟合现象。

L1正则化

先看一下带L1正则化的损失函数:

 ps:懒得打了,直接贴一位大佬总结的话吧,反正我是超级赞同的,写的很好。不过在这里我需要强调的一点就是正则化就是相当于给原来的损失函数加了一个约束,同时满足损失函数最小值的参数可能有很多选择,加了正则化之后就会选择同时满足损失函数和正则化函数的参数值。

 在这里需要注意的是,因为L1正则化图形的缘故,满足最优解的参数往往都在坐标轴上面,所以L1正则项往往能够使得模型产生稀疏的解,这是因为加上L1之后,我们参数的解往往会发生在坐标轴上导致某些参数的值为0。

 L2正则化

先看一下L2正则化的损失函数:

下图所示,这是L2正则。彩色的圈还是Cost等高线,下面黑色的圆圈是L2正则等高线(|w_1^2|+|w_2^2|=1) , 和上面的分析一样,如果我们在A’, B’, C’点确定最优解的话,依然是C’点, 因为它在Cost相等的情况下正则最小。但是我们发现L2正则下不过出现某个参数为0的情况,而是w1和w2都比较小。所以L2正则项的最优的参数值很小概率出现在坐标轴上,因此每一维的参数都不会是0。当最小化||w||时,就会使每一项趋近于0。

 在Pytorch中, L2正则项又叫做weight decay(权值衰减)。那么为啥这个东西叫做权值衰减呢? 怎么衰减了? 我们这样看:首先,我们原来的时候, 参数的更新公式是这样的:

 而现在,我们的Obj加上了一个L2正则项O b j=L o s s+\frac{\lambda}{2} * \sum_{i}^{N} w_{i}^{2} , 那么参数的更新方式也就变成了下面这个:

 我们知道λ 的取值是0-1的,那么就是说每一次迭代之后,这个参数w_i本身也会发生一个衰减。也就是说我们加上L2正则项与没有加L2正则项进行一个对比的话,加入L2正则项,这里的w_i就会发生数值上的一个衰减。故这就是这个L2正则项称为权值衰减的原因。

对于L2的代码实现,在API中为了求解方便,L2正则化项并不是加入损失函数中一起求导的,而是将损失函数求导完毕之后,再加上weight_decay的。可能有小伙伴疑问了,我为什么要管这些,直接调用API不久好了么,其实确实是这样,但是在优化器选择上面Adam+L2就会出现问题,不管是动量预测还是环境感知都不准确,所以才出现了新的优化器--AdamW。由此可见了解底层原理还是挺重要的。

接下来看一位大佬调试出来的代码,看看“后台”是如何运行的:

在这里插入图片描述

 好了,L2正则化的使用和内部实现机制就到这里吧,要知道L2正则化干啥用,怎么用差不多就行了。 一般是在模型过拟合的时候用到这个方式, 当然除了L2正则化,在模型发生过拟合的时候还有其他的方式,比如Dropout,也是常用的一种方式。

总结

L1正则化的特点:

      不容易计算, 在零点连续但不可导, 需要分段求导
      L1模型可以将 一些权值缩小到零(稀疏)
      执行隐式变量选择。 这意味着一些变量值对结果的影响降为0, 就像删除它们一样
      其中一些预测因子对应较大的权值, 而其余的(几乎归零)
      由于它可以提供稀疏的解决方案, 因此通常是建模特征数量巨大时的首选模型
      它任意选择高度相关特征中的任何一个, 并将其余特征对应的系数减少到0
       L1范数对于异常值更具提抗力

L2正则化的特点:

      容易计算, 可导, 适合基于梯度的方法
      将一些权值缩小到接近0
      相关的预测特征对应的系数值相似
      当特征数量巨大时, 计算量会比较大
      对于有相关特征存在的情况, 它会包含所有这些相关的特征, 但是相关特征的权值分布        取决于相关性。
      对异常值非常敏感
      相对于L1正则会更加准确

参考: 系统学习Pytorch笔记九:正则化与标准化大总结


http://chatgpt.dhexx.cn/article/oAuQqmYa.shtml

相关文章

L2正则化(Regularization)

正则化(Regularization) 深度学习可能存在过拟合问题——高方差,有两个解决方法,一个是正则化,另一个是准备更多的数据,这是非常可靠的方法,但你可能无法时时刻刻准备足够多的训练数据或者获取…

pytorch实现L2和L1正则化regularization的方法

pytorch实现L2和L1正则化的方法 目录 目录 pytorch实现L2和L1正则化的方法 1.torch.optim优化器实现L2正则化 2. 如何判断正则化作用了模型? 2.1 未加入正则化loss和Accuracy 2.1 加入正则化loss和Accuracy 2.3 正则化说明 3.自定义正则化的方法 3.1 自定…

L1正则化与L2正则化的区别

摘要 正则化的本质是在Cost Function中添加的p-范数。本文从正则化的本质p-范数入手,解释了L1正则化和L2正则化的区别。 正则化 在Cost Function上添加了正则化项,就能降低模型的过拟合程度,这就是正则化的作用。 关于正则化更细节的讲述&…

正则化的作用以及L1和L2正则化的区别

0 正则化的作用 正则化的主要作用是防止过拟合,对模型添加正则化项可以限制模型的复杂度,使得模型在复杂度和性能达到平衡。 常用的正则化方法有L1正则化和L2正则化。L1正则化和L2正则化可以看做是损失函数的惩罚项。所谓『惩罚』是指对损失函数中的某些…

详解L1和L2正则化

大纲: L1和L2的区别以及范数相关知识对参数进行L1和L2正则化的作用与区别pytorch实现L1与L2正则化对特征进行L2正则化的作用 L1和L2的区别以及范数 使用机器学习方法解决实际问题时,我们通常要用L1或L2范数做正则化(regularization&#xf…

L1正则化和L2正则化的详细直观解释

正则化(Regularization) 转自:此处 机器学习中几乎都可以看到损失函数后面会添加一个额外项,常用的额外项一般有两种,一般英文称作ℓ1ℓ1-norm和ℓ2ℓ2-norm,中文称作L1正则化和L2正则化,或者…

L1正则化和L2正则化讲解

L1正则化和L2正则化讲解 在机器学习实践过程中,训练模型的时候往往会出现过拟合现象,为了减小或者避免在训练中出现过拟合现象,通常在原始的损失函数之后附加上正则项,通常使用的正则项有两种:L1正则化和L2正则化。 L1…

L1正则化和L2正则化的区别

文章目录 前言一、L1和L2正则化是什么?二、区别三、其他问题 前言 在防止过拟合的方法中有L1正则化和L2正则化,那么这两者有什么区别呢? 一、L1和L2正则化是什么? L1和L2是正则化项,又叫做惩罚项,是为了限…

数据预处理之L1,L2正则化

一、L1、L2正则化概述 1. L1和L2的定义 L1正则化,又叫Lasso Regression 如下图所示,L1是向量各元素的绝对值之和 L2正则化,又叫Ridge Regression 如下图所示,L2是向量各元素的平方和,然后再求平方根 2.L1和L2的异同点 …

L1正则化和L2正则化

在机器学习以及深度学习中我们经常会看到正则化这一名词,下面就浅谈一下什么是正则化?以及正则化的意义所在? 一、什么是正则化? 正则化项 (又称惩罚项),惩罚的是模型的参数,其值恒为非负 λ是正则化系数&…

【应用】【正则化】L1、L2正则化

L1正则化的作用:特征选择从可用的特征子集中选择有意义的特征,化简机器学习问题。著名的LASSO(Least Absolute Shrinkage and Selection Operator)模型将L1惩罚项和线性模型结合,使用最小二乘代价函数。L1正则化导致模…

机器学习中正则化项L1和L2的直观理解

文章目录 正则化(Regularization)稀疏模型与特征选择的关系 L1和L2正则化的直观理解正则化和特征选择的关系为什么梯度下降的等值线与正则化函数第一次交点是最优解? L2正则化和过拟合的关系 正则化参数的选择L1正则化参数L2正则化参数 Refer…

微信小程序自定义授权弹框

前言 最近微信获取用户信息的接口有调整&#xff0c;就是这货&#xff1a;wx.getUserInfo(OBJECT)&#xff0c;文档描述如下&#xff1a; 此接口有调整&#xff0c;使用该接口将不再出现授权弹窗&#xff0c;请使用 <button open-type"getUserInfo"></but…

微信小程序组件 - 中间底部弹出输入弹框

GitHub Demo 地址: jh-weapp-demo 实现一些常用效果、封装通用组件和工具类 小程序码 一、 jh-input-alert 中间输入弹框&#xff0c;可设置最大输入长度&#xff0c;单行多行显示 单行 <jh-input-alert title输入框标题 placeholder请输入 maxlength10 bind:cancelcancel …

微信小程序展示弹窗的几种方式

小程序中展示弹窗有四种方式&#xff1a;showToast、showModal、showLoading、showActionSheet 官方文档链接 效果图 wxml <!-- 1.消息提示框 --> <button size"mini" bindtap"handleShowToast">ShowToast</button><!-- 2.模态对话…

微信小程序——小程序自己的页面弹框

微信小程序——小程序自己的页面弹框 1. 页面样式: 2.代码块 在这里插入代码片 &#xff08;一&#xff09;.wxml文件中给一个触发事件 <image src"../../img/icon-delete.png" bindtapdeleteCar data-id{{car.platecard}} class"icon"></imag…

微信小程序底部弹出框

微信小程序的底部弹出框 wxml <!-- 弹出框 start --> <view class"dialog_screen" bindtap"hideModal" wx:if"{{showModalStatus}}"></view> <view animation"{{animationData}}" class"dialog_attr_bo…

【微信小程序】小程序中的各种弹窗API

前言&#xff1a;小程序中提供了很多种快捷方便的弹窗API供开发者使用&#xff0c;例如wx.showToast&#xff0c;wx.showModal&#xff0c;wx.showActionSheet&#xff0c;wx.showLoading还有wxml中的loading标签。 一、直接上代码 <!-- test.wxml --> <view class&q…

小程序带输入框的弹窗

老规矩&#xff0c;直接上代码 <block wx:if"{{isShowConfirm}}"><view classtoast-box><view classtoastbg></view><view classshowToast><view classtoast-title><text>确认支付</text></view><view cla…

微信小程序 自定义弹框组件

话不多说直接上代码 目录 1、wxml 2、js 3、wxss 4、json 5、效果展示&#xff08;具体内容可以自定义&#xff09; 1、wxml <!--pages/components/confirmBox/confirmBox.wxml--> <wxs src"../../../filter/urlFilter.wxs" module"filter"…