Pytorch L1,L2正则化

news2024/11/21 2:24:34

L1正则化和L2正则化是常用的正则化技术,用于在机器学习模型中控制过拟合。它们的主要区别在于正则化项的形式和对模型参数的影响。

L1正则化(Lasso正则化):

  • 正则化项形式:L1正则化使用模型参数的绝对值之和作为正则化项,即L1范数。
  • 影响模型参数:L1正则化倾向于将一些模型参数压缩为0,从而实现特征选择和稀疏性。因此,它可以用于特征选择和模型简化。
  • 其他特点:由于L1正则化的非光滑性,优化问题在参数接近零时更容易找到解,因此它对于具有大量无关特征的问题更有效。

L2正则化(Ridge正则化):

  • 正则化项形式:L2正则化使用模型参数的平方和作为正则化项,即L2范数。
  • 影响模型参数:L2正则化倾向于使模型参数趋向于较小的值,但不会将其完全压缩为零。它通过减小模型参数的绝对值来控制参数的大小。
  • 其他特点:L2正则化是光滑的,优化问题在参数接近零时相对平滑,因此对于许多问题都能得到较好的结果。

总结:

  • L1正则化倾向于稀疏性和特征选择,适用于具有大量无关特征的问题。
  • L2正则化倾向于模型参数较小,适用于控制模型复杂度和减少过拟合。
  • 在某些情况下,可以同时使用L1和L2正则化形成弹性网络(Elastic Net),综合了两者的优点。

选择使用L1正则化还是L2正则化取决于具体问题和数据集的特点。通常建议先尝试L2正则化,如果模型仍然过拟合或需要进行特征选择,则可以考虑使用L1正则化。

对L1产生稀疏权值和L2产生平滑权值的理解

L1的定义是L1 = |w1| + |w2| + |w3| + ... + |wn|

L2的定义是L2 = w1^2 + w2^2 + w3^2 + ... + wn^2

L1和L2分别对w求导可得

dL1/dw = sign(wi)

dL2/dw = wi

假设wi为某个大于零的浮点数,学习率lr为0.5,根据梯度下降算法,

L1的权值更新方式为wi = wi - lr*(dL1/dw) = wi - lr*1 = wi - 0.5

L2的权值更新方式为wi = wi - lr*(dL2/dw) = wi - lr*wi = wi - 0.5wi

可以看出,L1每次更新都是减去一个固定的值,那就可能在多次迭代之后,权值为0的情况

而L2虽然权值也在减小,但是总不为0

需要注意的是,通常情况下,我们更倾向于对权值进行正则化,而不是对偏置进行正则化的原因有以下几点:

  1. 偏置的作用:偏置(bias)是模型中的一个常数项,它的作用是调整模型预测值与实际值之间的偏差。偏置通常用来解决模型在数据特征上的平移问题,而不会引入过多的复杂性。由于偏置只是一个常数,它的取值并不像权值那样会随着训练过程而变化,因此对偏置进行正则化对于控制模型的复杂度影响较小。

  2. 影响模型容量:正则化的目的是通过限制参数的取值范围来控制模型的复杂度,避免过拟合。权值在模型中起到了控制特征的重要作用,对权值进行正则化可以有效地减少模型的复杂度,提高泛化能力。而偏置的作用相对较小,对偏置进行正则化往往对模型的泛化能力影响较小。

  3. 数据中的偏移:在实际的数据中,通常会存在一些偏移(bias),即使我们对权值不进行正则化,模型也可以通过调整偏置来适应这种偏移。因此,对偏置进行正则化可能会导致对数据中的偏移进行过度拟合,而忽略了模型对其他特征的学习能力。

测试代码如下

import torch
import matplotlib.pyplot as plt

torch.manual_seed(25)

x_train = torch.tensor([1,2,3,4,5,6,7,8,9,10],dtype=torch.float32).unsqueeze(-1)
y_train = torch.tensor([0.52,8.54,6.94,20.76,32.17,30.65,40.46,80.12,75.12,98.83],dtype=torch.float32).unsqueeze(-1)
plt.scatter(x_train.detach().numpy(),y_train.detach().numpy(),marker='o',s=50,c='r')

class Linear(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.layers = torch.nn.Sequential(
            torch.nn.Linear(in_features=1, out_features=3),
            torch.nn.Sigmoid(),
            torch.nn.Linear(in_features=3,out_features=5),
            torch.nn.Sigmoid(),
            torch.nn.Linear(in_features=5, out_features=10),
            torch.nn.Sigmoid(),
            torch.nn.Linear(in_features=10,out_features=5),
            torch.nn.Sigmoid(),
            torch.nn.Linear(in_features=5, out_features=1),
            torch.nn.ReLU(),
        )

    def forward(self,x):
        return self.layers(x)

linear = Linear()

opt = torch.optim.Adam(linear.parameters(),lr= 0.005)
loss_fn = torch.nn.MSELoss()


for epoch in range(1000):
    for iter in range(10):
        L1 = 0
        L2 = 0
        for name,param in linear.named_parameters():
            if 'bias' not in name:
                L1 += torch.norm(param, p=1) * 1e-3
                L2 += torch.norm(param, p=2) * 1e-3

        opt.zero_grad()
        output = linear(x_train[iter])
        loss = loss_fn(output, y_train[iter]) + L1 + L2
        loss.backward()
        opt.step()


if __name__ == '__main__':
    predict_loss = 0
    for i in range(1000):
        x = torch.tensor([i/100], dtype=torch.float32)
        y_predict = linear(x)
        plt.scatter(x.detach().numpy(),y_predict.detach().numpy(),s=2,c='b')
        plt.scatter(i/100,i*i/10000,s=2,c='y')
        predict_loss = (i*i/10000 - y_predict)**2/(y_predict)**2 + predict_loss
plt.show()

不使用L1,L2正则化的情况如下

只使用L1正则化的情况如下

只使用L2正则化的情况如下

同时使用L1和L2正则化的情况如下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1149436.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RUP核心工作流2021-架构师(六十四)

1、根据传统的软件生命周期方法学,可以把软件生命周期划分为()。 A、软件定义、软件开发、软件测试、软件维护 B、软件定义、软件开发、软件运行、软件维护 C、软件分析、软件设计、软件开发、软件维护 D、需求获取、软件设计、软件开发、…

跳槽一定用得上的大厂Java题库!

2023年已经接近尾声了,疫情的影响也在逐渐减小,市场慢慢复苏。不过最近还是会有一些读者粉丝朋友反馈,“Java市场饱和了”、“大环境还是不好”、“投几十个简历都没有一个约面的”。其实并不是岗位需求量变少了,是越来越多的公司…

Calcite 优化层详解

1、关系代数与火山模型 1)关系代数 基本的关系代数运算有选择、投影、集合并、集合差、笛卡儿积等。 在这些基本运算之外,还有一些集合之间的交集、连接、除和赋值等运算。 连接运算可分为连接、等值连接、自然连接、外连接、左外连接和右外连接。 …

腰背肌筋膜炎能彻底治愈吗

腰背肌筋膜炎:急性期腰部疼痛剧烈,有烧灼感,腰部活动时症状加重,局部压痛显著,有时体温升高、血液检查可见白细胞增高。急性发作后,少数患者症状完全消退,多数会遗留疼痛,或相隔数月…

SSM律师事务所业务管理系统 毕业设计-附源码01664

摘 要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,律师事务所业务管理系统当然也不能排除在外。律师事务所业务管理系统是以实际运用为开发背景,运用软件工程原…

QT实现在线流媒体播放平台

文章目录 QT实现在线流媒体播放平台简介开发视频ffmpeg下载SimpleVideoPlayer.hSimpleVideoPlayer.cpp 开发音频添加功能打开文件夹播放暂停播放上下一首选择倍速 效果展示项目下载 QT实现在线流媒体播放平台 简介 Qt是一种流行的C开发框架,它提供了用于构建图形用…

基于 Center 的 3D 目标检测和跟踪

论文地址:https://arxiv.org/abs/2006.11275 论文代码:https://github.com/tianweiy/CenterPoint 3D 目标通常表示为点云中的 3D Boxes。 CenterPoint 在第一阶段,使用关键点检测器检测对象的中心,然后回归到其他属性&#xff0…

【骑行探秘】穿越海晏村,揭秘贝丘渔场的神秘面纱

在这个阳光明媚的周末,我们校长骑行群一行人骑着自行车,从大观公园门口出发,开始了一段别开生面的骑行之旅。沿途我们将穿越草海隧道湿地公园、迎海路、海埂公园西门(第二集合点)、宝丰湿地公园、斗南湿地公园、蓝光城…

二叉排序树c语言版

1、定义二叉树数据域、二叉树结点 /*** 二叉树节点数据 */ typedef struct treenodedata {int sort;char* name;} TreeNodeData;/**** 二叉树节点定义 */ typedef struct binarytree {/*** 结点数据域*/TreeNodeData* data;/**左子树*/struct binarytree* leftChild;/**左子树…

双11满减大促,直播间1折抢购!

你是知道的,双11本来是光棍节! 2009年,阿里掀起了一场网络促销活动,光棍节从此成了全民的购物节! 从2009年到2021年,阿里双11当天的交易额,从仅有的0.5亿猛增至5403亿,以惊人的速度…

【人口数据集总结】WorldPop、GWPv4等

1 全球人口数据WorldPop 数据详解可参见另一博客-【数据集8】全球人口数据WorldPop详解。 WorldPop是由南安普顿大学在2013年10月发起的全球人口数据评估,将AfriPop,AsiaPop和AmeriPop人口调查项目整合到一起。数据集已经被众多的组织和机构使用:联合国开发计划署,联合国…

实例教程:如何在应用中集成美狐直播美颜SDK

随着直播和视频应用的兴起,用户对于视频质量和外貌自然度的要求越来越高。为了满足这一需求,开发者们可以通过集成直播美颜SDK来提供更吸引人的视频体验。本文将为您提供一个实例教程,以演示如何在您的应用中成功集成直播美颜SDK。无论您是一…

Plant Physiology:DAP-seq助力揭示YABBY11转录因子调控杨树叶形自然变异的分子机制

2023年3月,北京林业大学生物学院宋跃朋教授课题组的研究成果发表在了Plant Physiology期刊上(影响因子7.4),文章题目为 “Enhanced genome-wide association reveals the role of YABBY11-NGATHA-LIKE1 in leaf serration develop…

win10 javaweb 项目8080端口被占用

文章目录 前言出现场景:解决思路: 前言 提示:生活该走向何处?也许你还不知道答案,但是你一定是答案的一部分。 出现场景: 解决思路: 找到运行的进程直接干掉 打开命令窗口(win r…

3.1每日一题(定积分求压力问题)

公式: (1) 压力等于压强乘以面积 (2) 压强等于ρgh(即密度,重力加速度,水的深度) 注:题目表面不一样,实际的原理都一样,做透一道题等于做懂一类题

一文搞懂Linux线程和进程区别?

1.什么是线程? 线程其实就是轻量级进程(LWP)。 轻量级进程(Light Weight Process)是指在操作系统级别上,将一个进程划分为多个执行单元,每个执行单元拥有自己的堆栈、程序计数器和资源使用情况…

LeetCode2741.特别的排列 状压

暴力枚举的话是n&#xff01; 考虑状压DP&#xff0c;其实就是用二进制表示状态 再进行暴力 同时加一个记忆化就好了 这里有常用技巧&#xff1a; 全集&#xff08;1<<n&#xff09;-1 增加某个元素 x | (1<<i) 删除某个元素 x & ~(1<<i) const i…

软件测试之接口测试详解

一、什么是接口测试 我们要想知道接口测试怎么做&#xff0c;首先要明白接口测试是什么?一般像系统内的组件接口数据交互测试、不同系统与系统之间的接口数据交互测试等&#xff0c;我们都可以称之为接口测试 ! 那么接口测试是怎么来测试接口的呢? 接口测试就是通过接口的不…

盛元广通化工实验室管理系统

随着时代的进步和网络技术的普及应用&#xff0c;管理化工实验室的日常工作和实验过程&#xff0c;企业科研单位对信息化、智能化和安全性日趋要求严格&#xff0c;根据化工实验室的实际需求出发&#xff0c;从完整的开发框架、调度引擎和丰富的组件、页面样例等快速响应应用需…

【开源】调测利器:I2C电流计 功率计

小飞机的板子画成这样&#xff1a; 然后就开始溜号了。。。真心希望有小伙伴能来一起搞一下啊~ 溜号是因为这次想在马达控制中加入电流闭环&#xff0c;所以就想测一下720空心杯带桨和不带桨状态下用锂电池供电的电流&#xff0c;正当要测时发现手上的万用表没电了&#xff0c…