详解L1和L2正则化

article/2025/9/21 7:37:54

大纲:

  • L1和L2的区别以及范数相关知识
  • 对参数进行L1和L2正则化的作用与区别
  • pytorch实现L1与L2正则化
  • 对特征进行L2正则化的作用

L1和L2的区别以及范数

  使用机器学习方法解决实际问题时,我们通常要用L1或L2范数做正则化(regularization),从而限制权值大小,减少过拟合风险,故其又称为权重衰减。特别是在使用梯度下降来做目标函数优化时。

L1和L2的区别
在机器学习中,

  • L1范数(L2 normalization)是指向量中各个元素绝对值之和,通常表述为 ∥ w i ∥ 1 \|\boldsymbol{w_i}\|_1 wi1,线性回归中使用L1正则的模型也叫Lasso regularization
    比如 向量A=[1,-1,3], 那么A的L1范数为 |1|+|-1|+|3|.

  • L2范数指权值向量w中各个元素的平方和然后再求平方根(可以看到Ridge回归的L2正则化项有平方符号),通常表示为 ∥ w i ∥ 2 \|\boldsymbol{w_i}\|_2 wi2, 线性回归中使用L2正则的模型又叫岭回归(Ringe regularization)。

简单总结一下就是:

  • L1范数: 为x向量各个元素绝对值之和。
  • L2范数: 为x向量各个元素平方和的1/2次方,L2范数又称Euclidean范数或者Frobenius范数
  • Lp范数: 为x向量各个元素绝对值p次方和的1/p次方.

下图为p从无穷到0变化时,三维空间中到原点的距离(范数)为1的点构成的图形的变化情况。以常见的L-2范数(p=2)为例,此时的范数也即欧氏距离,空间中到原点的欧氏距离为1的点构成了一个球面
在这里插入图片描述

参数正则化作用

  • L1: 为模型加入先验, 简化模型, 使权值稀疏,由于权值的稀疏,从而过滤掉一些无用特征,防止过拟合
  • L2: 根据L2的特性,它会使得权值减小,即使平滑权值,一定程度上也能和L1一样起到简化模型,加速训练的作用,同时可防止模型过拟合

关于为什么L1会使得权重稀疏,而L2会使得权值平滑,可以参考知乎上一位答主的台大林轩田老师人工智能基石课笔记,从凸优化,梯度更新,概率分布三个角度诠释L1和L2正则化的原理和区别。我把笔记搬运到这:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

pytorch实现L1与L2正则化

网上很多关于L2和L1正则化的对象都是针对参数的,或者说权重,即权重衰减,可以用pytorch很简单的实现L2惩罚:

class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False)

如上,weight_decay参数即为L2惩罚项前的系数
举个栗子,对模型中的某些参数进行惩罚时

#定义一层感知机
net = nn.Linear(num_inputs, 1)
#自定义参数初始化
nn.init.normal_(net.weight, mean=0, std=1)
nn.init.normal_(net.bias, mean=0, std=1)
optimizer_w = torch.optim.SGD(params=[net.weight], lr=lr, weight_decay=wd) # 对权重参数衰减,惩罚项前的系数为wd
optimizer_b = torch.optim.SGD(params=[net.bias], lr=lr)  # 不对偏差参数衰减

而对于L1正则化或者其他的就比较麻烦了,因为pytorch优化器只封装了L2惩罚功能,参考pytorch实现L2和L1正则化regularization的方法

class Regularization(torch.nn.Module):def __init__(self,model,weight_decay,p=2):''':param model 模型:param weight_decay:正则化参数:param p: 范数计算中的幂指数值,默认求2范数,当p=0为L2正则化,p=1为L1正则化'''super(Regularization, self).__init__()if weight_decay <= 0:print("param weight_decay can not <=0")exit(0)self.model=modelself.weight_decay=weight_decayself.p=pself.weight_list=self.get_weight(model)self.weight_info(self.weight_list)def to(self,device):'''指定运行模式:param device: cude or cpu:return:'''self.device=devicesuper().to(device)return selfdef forward(self, model):self.weight_list=self.get_weight(model)#获得最新的权重reg_loss = self.regularization_loss(self.weight_list, self.weight_decay, p=self.p)return reg_lossdef get_weight(self,model):'''获得模型的权重列表:param model::return:'''weight_list = []for name, param in model.named_parameters():if 'weight' in name:weight = (name, param)weight_list.append(weight)return weight_listdef regularization_loss(self,weight_list, weight_decay, p=2):'''计算张量范数:param weight_list::param p: 范数计算中的幂指数值,默认求2范数:param weight_decay::return:'''# weight_decay=Variable(torch.FloatTensor([weight_decay]).to(self.device),requires_grad=True)# reg_loss=Variable(torch.FloatTensor([0.]).to(self.device),requires_grad=True)# weight_decay=torch.FloatTensor([weight_decay]).to(self.device)# reg_loss=torch.FloatTensor([0.]).to(self.device)reg_loss=0for name, w in weight_list:l2_reg = torch.norm(w, p=p)reg_loss = reg_loss + l2_regreg_loss=weight_decay*reg_lossreturn reg_lossdef weight_info(self,weight_list):'''打印权重列表信息:param weight_list::return:'''print("---------------regularization weight---------------")for name ,w in weight_list:print(name)print("---------------------------------------------------")

class Regularization的使用


# 检查GPU是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")print("-----device:{}".format(device))
print("-----Pytorch version:{}".format(torch.__version__))weight_decay=100.0 # 正则化参数model = my_net().to(device)
# 初始化正则化
if weight_decay>0:reg_loss=Regularization(model, weight_decay, p=2).to(device)
else:print("no regularization")criterion= nn.CrossEntropyLoss().to(device) # CrossEntropyLoss=softmax+cross entropy
optimizer = optim.Adam(model.parameters(),lr=learning_rate)#不需要指定参数weight_decay# train
batch_train_data=...
batch_train_label=...out = model(batch_train_data)# loss and regularization
loss = criterion(input=out, target=batch_train_label)
if weight_decay > 0:loss = loss + reg_loss(model)
total_loss = loss.item()# backprop
optimizer.zero_grad()#清除当前所有的累积梯度
total_loss.backward()
optimizer.step()

特征正则化作用

上面介绍了对于权重进行正则化的作用以及具体实现,其实在很多模型中,也会对特征采用L2归一化,有的时候在训练模型时,经过几个batch后,loss会变成nan,此时,如果你在特征后面加上L2归一化,可能可以很好的解决这个问题,而且有时会影响训练的效果,深有体会。
L2正则的原理比较简单,如下公式:
y = x i ∑ i = 0 D x i 2 \boldsymbol{y} = \frac{\boldsymbol{x_i}}{\sum_{i=0}^D\boldsymbol{{x_i}}^2 } y=i=0Dxi2xi
其中D为向量的长度,经过l2正则后 x i \boldsymbol{x_i} xi向量的元素平方和等于1

python实现

def l2norm(X, dim=-1, eps=1e-12):"""L2-normalize columns of X"""norm = torch.pow(X, 2).sum(dim=dim, keepdim=True).sqrt() + epsX = torch.div(X, norm)return X

在SSD目标检测的conv4_3层便使用了L2Norm

对特征进行L2正则的具体作用如下:

  • 防止梯度消失或者梯度爆炸
  • 统一量纲,加快模型收敛

参考:

机器学习中L1和L2的直观理解
几种范数的介绍


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

相关文章

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

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

L1正则化和L2正则化讲解

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

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

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

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

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

L1正则化和L2正则化

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

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

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

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

文章目录 正则化&#xff08;Regularization&#xff09;稀疏模型与特征选择的关系 L1和L2正则化的直观理解正则化和特征选择的关系为什么梯度下降的等值线与正则化函数第一次交点是最优解&#xff1f; 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"…

微信小程序——点击某个按钮实现下面弹窗的出现

效果图:(真的是图) wxml(代码里面有解释&#xff09; <button type"primary" bindtap"Popup">点我</button> <!--点击后灰色背景的设置--> <view wx:if"{{now_state}}" class"background" bindtap"hideM…

微信小程序实现底部向上弹框

本文转自 作者&#xff1a;smallzip 链接&#xff1a;https://www.jianshu.com/p/bd9a4f4b8e6a 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 效果 小程序自定义底部弹出modal框组件&#xff0c;仿照小程序sheet-action的效果&#xff0…

uniapp微信小程序的各种弹框提示(轻提示)

您直接复制粘贴即可使用不需要做特殊的处理。 如您满意请给莫成尘点个Fabulous 1&#xff1a; 纯文字提示框 uni.showToast({title: 只有文字弹窗,icon: none, //如果要纯文本&#xff0c;不要icon&#xff0c;将值设为noneduration: 2000 //持续时间为 2秒 }) 2&…

小程序实现弹出输入框

1.微信自带组件 样式&#xff1a; wxml <view class"close" bindtap"close">拒绝</view>js Page({//拒绝close(e) {wx.showModal({editable:true,//显示输入框placeholderText:输入拒绝原因,//显示输入框提示信息success: res > {if (re…

微信小程序提示弹窗大全

wx.showToast(OBJECT) 显示消息提示框 OBJECT参数说明&#xff1a; 示例代码&#xff1a; ? 1 2 3 4 5 wx.showToast({ title: 成功 , icon: success , duration: 2000 }) wx.hideToast() 隐藏消息提示框 ? 1 2 3 4 5 6 7 8 9 wx.showToast({ title: 加载中 , icon: lo…