[动手学习深度学习]12.权重衰退
1.介绍
权重衰退是常见的处理过拟合的方法
- 控制模型容量方法
- 把模型控制的比较小,即里面参数比较少
- 使参数选择范围小
- 约束就是正则项
每个特征的权重都大会导致模型复杂,从而导致过拟合。
控制权重矩阵范数可以使得减少一些特征的权重,甚至使他们权重为0,从而导致模型简单,减轻过拟合
使用均方范数作为硬性限制
权重衰退即是通过控制参数选择范围来控制模型容量的
- 公式表达:
m i n l ( w , b ) s u b j e c t t o ∣ ∣ w ∣ ∣ 2 ≤ θ min\ l(w,b)\ \ subject\ to ||w||^2 ≤ \theta min l(w,b) subject to∣∣w∣∣2≤θ
l l l:损失函数
w w w:参数
b b b:偏移
在最小化损失函数时加上限制,使参数的平方和小于一个特定的值,也就说明每个参数的值要小于 θ \theta θ开根
通常不限制偏移b
小的 θ \theta θ意味着更强的正则项
使用均方范数作为柔性限制
- Df:对每个 θ \theta θ,都可以找到 λ \lambda λ使得之前的目标函数等价于下面:
m i n l ( w , b ) + λ 2 ∣ ∣ w ∣ ∣ 2 min \ l(w,b)+\frac{\lambda}{2} || w||^2 min l(w,b)+2λ∣∣w∣∣2
(可以通过拉格朗日乘子来证明) - 超参数 λ \lambda λ控制了正则项的重要程度
- λ = 0 \lambda=0 λ=0:无作用(当 λ = 0 \lambda=0 λ=0时,即没有后面的限制,相当于上一个公式里 θ = ∞ \theta=\infty θ=∞)
- λ → ∞ , w ∗ → 0 \lambda \rightarrow \infty, w^* \rightarrow0 λ→∞,w∗→0:相当于上面 θ → 0 \theta \rightarrow0 θ→0,也就使 w ∗ → 0 w^* \rightarrow0 w∗→0
想通过控制模型参数使模型不要太复杂时,可以通过增加 λ \lambda λ来满足需求(这里 λ \lambda λ是一个平滑的,不像以前的硬性限制)
- 这里可以理解拉格朗日乘子法:
- 拉格朗日乘子法原本是用于解决约束条件下的多元函数极值问题。举例,求f(x,y)的最小值,但是有约束C(x,y) = 0。乘子法给的一般思路是,构造一个新的函数g(x,y,λ) = f(x,y) +λC(x,y),当同时满足g’x = g’y = 0时,函数取到最小值。这件结论的几何含义是,当f(x,y)与C(x,y)的等高线相切时,取到最小值。
- 具体到机器学习这里, C ( x , y ) = w 2 − θ C(x,y) = w^2 -θ C(x,y)=w2−θ。所以视频中的黄色圆圈,代表不同θ下的约束条件。θ越小,则最终的parameter离原点越近。
- 绿色的线就是原始损失函数l的等高线,优化损失函数l的最优解(波浪号即最优解)在中心位置
- 当原始损失加入 λ 2 \frac{\lambda}{2} 2λ项之后,这个项是一个二次项,假如w就两个值,x1(横轴)x2(纵轴),则在图上这个二次项的损失以原点为中心的等高线为橙色的图所示。所以合并后的损失为绿色和黄色的线加一起的损失
- 当加上损失项后,可知原来最优解对应的二次项的损失特别大,因此原来的最优解不是加上二次项后的公式的最优解了。若沿着橙色的方向走,原有l损失值会大一些,但是二次项罚的损失会变小,当拉到平衡点以内时,惩罚项减少的值不足以原有l损失增大的值,这样w*就是惩罚项后的最优解
- 损失函数加上正则项成为目标函数,目标函数最优解不是损失函数最优解。
正则项就是防止达到损失函数最优导致过拟合,把损失函数最优点往外拉一拉。 鼓励权重分散,将所有特征运用起来,而不是依赖其中的少数特征,并且权重分散的话他的内积就小一点 - l2正则项会对大叔之的权值进行惩罚
回顾平方损失:
相对原来的权重更新,再减去一个值后,使得这个权重更进一步减小,这样会导致这个权重所占的比例进一步减小
参数更新法则
2. 代码实现(手动实现)
%matplotlib inline
import torch
from torch import nn
from d2l import torch as d2l
像以前一样生成一些人工数据:
n_train, n_test, num_inputs, batch_size = 20,100,200,5
# 数据越简单,模型越复杂,越容易过拟合。
# num_inputs:特征维度true_w, true_b = torch.ones((num_inputs, 1))*0.01, 0.05
train_data = d2l.synthetic_data(true_w, true_b, n_train) # 生成人工数据集
train_iter = d2l.load_array(train_data, batch_size)
test_data = d2l.synthetic_data(true_w, true_b, n_test)
test_iter = d2l.load_array(test_data, batch_size, is_train=False)# 初始化模型参数
def init_params():w=torch.normal(0,1,size=(num_inputs,1), requires_grad=True)# 均值为0,方差为1,长度时num_inputs*1的向量,需要梯度b=torch.zeros(1,requires_grad=True)# b:为全0的标量return [w,b]# 定义L2范数惩罚项(核心)
def l2_penalty(w):return torch.sum(w.pow(2)) / 2# 注意不要把lambda写进去,因为要写在外面def train(lambd):w, b = init_params() # 初始化模型参数net, loss = lambda X:d2l.linreg(X,w,b), d2l.squared_loss# net做了个很简单的线性回归# 损失函数用平方损失num_epochs, lr = 100, 0.003 # 因为数据量很小,所以可以多训练几次animator = d2l.Animator(xlabel='epochs', ylabel='loss', yscale='log', xlim=[5,num_epochs], legend=['train', 'test']) # 实现动画效果# 标准训练过程for epoch in range(num_epochs):for X,y in train_iter:# with torch.enable_grad():l = loss(net(X), y) + lambd*l2_penalty(w) # L2范数惩罚项l.sum().backward()d2l.sgd([w,b], lr, batch_size) # 使用小批量随机梯度下降迭代模型参数if (epoch+1)%5==0:animator.add(epoch+1, (d2l.evaluate_loss(net, train_iter, loss), d2l.evaluate_loss(net, test_iter, loss)))print('w的L2范数是:', torch.norm(w).item())
3.简单实现(使用框架)
def train_concise(wd):net=nn.Sequential(nn.Linear(num_inputs, 1))for param in net.parameters():param.data.normal_()loss = nn.MSELoss()num_epoch, lr = 100,0.003trainer = torch.optim.SGD([{"params":net[0].weight,"weight_decay":wd},{'params':net[0].bias}], lr=lr)# 惩罚项既可以写在目标函数里,也可以写在训练算法里,每一次更新之前把当前的w乘以衰退因子weight_decayanimator=d2l.Animator(xlabel='epochs',ylabel='loss',yscale='log',xlim=[5, num_epoch],legend=['train','test'])for epoch in range(num_epoch):for X,y in train_iter:with torch.enable_grad():trainer.zero_grad()l = loss(net(X), y)l.backward()trainer.step()if (epoch+1) % 5 == 0:animator.add(epoch+1, (d2l.evaluate_loss(net, train_iter, loss), d2l.evaluate_loss(net, test_iter, loss)))print('w的L2范数是:', net[0].weight.norm().item())
相关文章:
[动手学习深度学习]12.权重衰退
1.介绍 权重衰退是常见的处理过拟合的方法 控制模型容量方法 把模型控制的比较小,即里面参数比较少使参数选择范围小 约束就是正则项 每个特征的权重都大会导致模型复杂,从而导致过拟合。 控制权重矩阵范数可以使得减少一些特征的权重,甚至…...
JVM内存结构笔记04-字符串常量池
文章目录 定义字符串常量池的位置JDK 1.7 为什么要将字符串常量池移动到堆中? StringTable案例1案例2案例3 String.intern()案例4案例5案例6总结 StringTable 垃圾回收案例1.创建100个字符串(不会触发垃圾回收)2.创建10000个字符串(触发垃圾回收) StringTable 性能调…...
STM32 HAL库实战:高效整合DMA与ADC开发指南
STM32 HAL库实战:高效整合DMA与ADC开发指南 一、DMA与ADC基础介绍 1. DMA:解放CPU的“数据搬运工” DMA(Direct Memory Access) 是STM32中用于在外设与内存之间直接传输数据的硬件模块。其核心优势在于无需CPU干预,…...
c语言闯算法--常用技巧
双指针 类别: 同向快慢指针 异常情况,慢指针才动 双向指针 视情况,左右指针动 最长无重复子串 int max(int a, int b){if(a < b){return b;}else{return a;} } int lengthOfLongestSubstring(char* s) {int count[300];for(int i 0; i …...
docker启动jenkins,jenkins中调用docker
在jenkins中执行docker 思路 jenkins中安装docker客户端,使用第三方的docker(需要付费)。jenkins中安装docker客户端,另一个容器中安装docker服务, docker-in-docker,需要特权模式,或者第三方的工具。jenkins中什么都…...
【设计模式】设计模式介绍
一、设计模式概述 设计模式分很多种,每种一般都用于解决某个软件开发过程中的问题。许多人认为设 计模式有23种,其实,对于这个数字也没必要那么教条,当然还有更多的设计模式种类,只 不过是这23种比较经典而已。甚至可…...
图形学面试题总结
图形学面试题总结 文章目录 图形学面试题总结Opengl 与 Vulkan1、OpenGL的渲染管线有哪些主要阶段?分别做什么?2、OpenGL中的VAO、VBO和EBO分别是什么?为什么需要它们?3、细分着色器与几何着色器是什么4、Vulkan与Opengl的区别是什…...
Spring Cloud Alibaba 实战:Sentinel 保障微服务的高可用性与流量防护
1.1 Sentinel 作用 Sentinel 是阿里巴巴开源的一款 流量控制和熔断降级 框架,主要用于: 流量控制:限制 QPS,防止流量暴增导致系统崩溃熔断降级:当某个服务不可用时自动降级,避免故障扩散热点参数限流&…...
Comfyui 与 SDwebui
ComfyUI和SD WebUI是基于Stable Diffusion模型的两种不同用户界面工具,它们在功能、用户体验和适用场景上各有优劣。 1. 功能与灵活性 ComfyUI:ComfyUI以其节点式工作流设计为核心,强调用户自定义和灵活性。用户可以通过连接不同的模块&…...
面试之《前端常见的设计模式》
前端开发中运用多种设计模式可以提高代码的可维护性、可扩展性和可复用性。以下是一些常见的前端设计模式: 创建型模式 1. 单例模式 定义:确保一个类只有一个实例,并提供一个全局访问点。应用场景:在前端中,像全局状…...
PostgreSQL异常:An IO error occurred while sending to the backend
在使用PostgreSQL数据库批量写入数据的时候,遇到了一个问题,异常内容如下: Cause: org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend.报错内容 报错提示1 Caused by: org.postgresql.util.PSQLExc…...
嵌入式八股C语言---面向对象篇
面向对象与面向过程 面向过程 就是把整个业务逻辑分成多个步骤,每步或每一个功能都可以使用一个函数来实现面向对象 对象是类的实例化,此时一个类就内部有属性和相应的方法 封装 在C语言里实现封装就是实现一个结构体,里面包括的成员变量和函数指针,然后在构造函数中,为结构体…...
一周学会Flask3 Python Web开发-使用SQLAlchemy动态创建数据库表
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 前面我们定义了模型,我们可以通过sqlalchemy对象提供的create_all()方法来映射和动态创建数据库表。 因为我们用到…...
【spring】springAOP
1.基本概念 AOP即面向切面编程,它利用的是一种横切技术,解剖开封装的对象内部,并将那些影响多个类的公共行为封装到一个可重 用模块,这就是所谓的Aspect方面/切面。所谓的切面,简单点所说,就是将哪些与业务…...
解决VMware虚拟机CentOS 7 忘记登陆密码问题
1. 重启虚拟机,在重启时不停按E键进入初始化脚本编辑界面 2.在初始化脚本编辑界面,按↓键向下拉到最后,找到LANG/zh_CN.UTF-8那里,输入空格,接着添加 "init/bin/sh" 。然后按ctrlX键进入下一步。 3. 在界面中…...
如何在 Windows 10 启用卓越性能模式及不同电源计划对比
在使用 powercfg -duplicatescheme 命令启用 “卓越性能模式”(即 Ultimate Performance 模式)之前,有几个前提条件需要注意: 前提条件: 系统版本要求:卓越性能模式 仅在 Windows 10 专业版 或更高版本&a…...
基于 GEE 利用 Sentinel-2 数据反演叶绿素与冠层水分含量
目录 1 数据加载与预处理 2 叶绿素含量反演 3 冠层水分反演 4 数据可视化与导出 5 完整代码 6 运行结果 在生态学和环境科学领域,植被的健康状况是评估生态系统稳定性和功能的关键指标之一。而叶绿素含量和冠层水分含量作为反映植被生理状态的重要参数&#x…...
《鸿蒙系统下AI模型训练加速:时间成本的深度剖析与优化策略》
在当今数字化浪潮中,鸿蒙系统凭借其独特的分布式架构与强大的生态潜力,为人工智能的发展注入了新的活力。随着AI应用在鸿蒙系统上的日益普及,如何有效降低模型训练的时间成本,成为了开发者与研究者们亟待攻克的关键课题。这不仅关…...
PyTorch分布式训练
本文结构: 分布式训练概述环境设置数据并行(DDP)模型并行启动训练性能优化建议示例代码参考资料和相关问题 以下是为您整理的PyTorch分布式训练教程指南: 一、PyTorch分布式训练核心概念 数据并行:通过分割数据集实…...
ubuntu22.04 关于挂在设备为nfts文件格式无法创建软连接的问题
最近遇到情况,解压工程报错,无法创建软连接 但是盘内还有130G空间,明显不是空间问题,查找之后发现是移动硬盘的文件格式是NTFS,在ubuntu上不好兼容,于是报错。 开贴记录解决方案。 1.确定文件格式 使用命…...
C++编程:进阶阶段—4.2对象
目录 4.2 对象特征 4.2.1 构造函数和析构函数 4.2.2 构造函数的分类 4.2.3 拷贝函数调用时机 4.2.4 构造函数调用规则 4.2.5 深拷贝与浅拷贝 4.2.6 初始化列表 4.2.7 类对象作为类成员 4.2.8 静态成员 4.2.9 成员变量和成员函数的存储 4.2.10 this指针 4.2.11 空指针…...
C++跨平台开发环境搭建全指南:工具链选型与性能优化实战
C跨平台开发环境搭建全指南:工具链选型与性能优化实战 目录 开发环境搭建工具链选型性能优化实战常见问题排查 开发环境搭建 操作系统环境准备 Windows# 安装Visual Studio Build Tools choco install visualstudio2022buildtools choco install cmake --instal…...
常见JVM命令
1. java -XX:PrintCommandLineFlags HelloGC 作用:打印 JVM 启动时的命令行参数,包括用户显式设置的参数和 JVM 自动默认设置的参数。用于确认 JVM 实际使用的配置。 2. java -Xmn10M -Xms40M -Xmx60M -XX:PrintCommandLineFlags -XX:PrintGC -XX:Prin…...
C语言实现队列数据结构:思路与代码详解
目录 一、引言 二、整体思路 三、代码模块分析 (一)头文件包含与宏定义 (二)数据类型定义 (三)队列操作函数 1. 队列初始化 2. 队列销毁 3. 入队操作 4. 出队操作 5. 获取队头元素 6…...
【Docker项目实战】使用Docker与Caddy部署BanBan任务管理工具
【Docker项目实战】使用Docker部署BanBan任务管理工具 一、BanBan介绍1.1 BanBan简介1.2 主要特点1.3 使用场景二、本次实践规划2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本四、下载BanBan镜像五、…...
AI重构私域增长:从流量收割到终身价值运营的三阶跃迁
私域运营的AI进化论:内容即服务的三个阶段 随着企业微信生态的成熟,私域运营正经历从"流量收割"到"关系养成"的本质转变。在AIGC技术的推动下,2024年私域场景正式进入**"内容即服务"**的价值共创期࿱…...
es扩容节点以后写入数据量增加1倍
背景: es扩容一倍的数据节点以后 写入数据量增加1倍 业务反馈业务访问量没增加。 最后定位是监控数据: PUT _cluster/settings {"persistent": {"xpack.monitoring.collection.enabled" : "false"} }这个索引记录的是 节…...
Go本地缓存设计与实现
本地缓存是一个项目中很常见的组件。在很多人的眼中就是一个简单的key-value的map存储即可实现,但实际上,设计一个本地缓存需要考虑的问题远比你想象的多,比如说,本地缓存是将数据存储在内存,若数据量激增突破了内存限…...
04 | 初始化 fastgo 项目仓库
提示: 所有体系课见专栏:Go 项目开发极速入门实战课;欢迎加入 云原生 AI 实战 星球,12 高质量体系课、20 高质量实战项目助你在 AI 时代建立技术竞争力(聚焦于 Go、云原生、AI Infra);本节课最终…...
Spring中复杂对象的创建方式:FactoryBean、实例工厂与静态工厂全解析
1.反转控制与依赖注入 控制:对于成员变量赋值的控制权 反转控制:把对于成员变量赋值的控制权,从代码中反转(转移)到Spring工厂和配置文件中完成 好处:解耦合 底层实现:工厂设计模式 依赖注入: 注入…...
异或和之和 第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 A 组
异或和之和 题目来源 第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 A 组 原题链接 蓝桥杯 异或和之和 https://www.lanqiao.cn/problems/3507/learning/ 问题描述 问题分析 要点1:异或运算 概念 异或(Exclusive OR,简称 XOR)是一种数学运算符,常用于逻辑运算与计算机…...
设计模式 一、软件设计原则
一、理解设计原则 1、单一原则 1.1 如何理解单一职责原则(SRP) 单一职责原则(Single Responsibility Principle,简称SRP),他要求一个类或模块应该只负责一个特定的功能,这有助于降低类之间的耦合度…...
修复Electron项目Insecure Content-Security-Policy(内容安全策略CSP)警告的问题
将以下代码粘贴进html的<header>标签内 <metahttp-equiv"Content-Security-Policy"content"default-src self; style-src self unsafe-inline; img-src self data:; "> 解释一下上面代码中的属性含义 default-src self:配置加载策…...
机器人交互系统 部署构建
环境要求 Ubuntu 20.04 或更高版本ROS Noetic 或兼容版本Python 3.8 安装步骤 1. 安装ROS环境(如未安装) sudo apt update sudo apt install ros-noetic-desktop-full source /opt/ros/noetic/setup.bash2. 创建工作空间并克隆代码 mkdir -p ~/code…...
当AI回答问题时,它的“大脑”里在炒什么菜?
文章目录 1. 拆解订单:AI如何听懂你的“暗号”?2. 调用工具:AI的“万能工具箱”里有什么?3. 知识不够?去“图书馆”现学现卖!4. 人类的秘密武器:给AI戴上“镣铐”5. 为什么AI会“胡言乱语”&…...
linux 软件扩展GPU显存
概述 共享内存可以通过 Unified Memory(统一内存)来实现,它允许 CPU 和 GPU 共享相同的内存地址空间,从而方便数据的传输和访问。 利用该技术可解决家用GPU 机器学习时显存不足的问题 (注: 虽然解决了爆显…...
【RabbitMQ】Spring Boot 结合 RabbitMQ 完成应用间的通信
🔥个人主页: 中草药 🔥专栏:【中间件】企业级中间件剖析 Spring 框架与 RabbitMQ 的整合主要通过 Spring AMQP(Advanced Message Queuing Protocol)模块实现,提供了便捷的消息队列开发能力。 引…...
DeepSeek本地化部署(DeepSeek+olloma+Dify)
文章目录 概要需要准备的工具Ollama准备内容Docker准备内容Dify准备内容本地访问Dify 概要 提示:本篇文章主要讲述如何部署本地Deepseek私有大模型,使用Windows无显卡环境进行部署 需要准备的工具 Ollama、Docker Desktop 下载地址: Ollama…...
Spring boot3-WebClient远程调用非阻塞、响应式HTTP客户端
来吧,会用就行具体理论不讨论 1、首先pom.xml引入webflux依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId> </dependency> 别问为什么因为是响应式....…...
Ubuntu22.04安装数据
数据库安装步骤: sudo apt-get update sudo apt install mysql-server mysql-client sudo systemctl start mysql sudo systemctl status mysql (1)在命令行登录 MySQL 数据库,并使用 mysql 数据库 (必须使用这个…...
【python-uiautomator2】手机上的ATX应用界面报错问题处理:无法提供服务,非am instrument启动
目录 一、前期准备 1.1 插入设备 1.2 安装atx-agent 二、解决报错:无法提供服务,非am instrument启动 2.1 出现报错 2.2 尝试解决 2.3 最终解决 三、开启ATX的悬浮窗权限 一、前期准备 1.1 插入设备 本地插入待执行设备,待执行设备…...
自动化测试介绍及学习路线
目录 一、自动化测试 1.1 自动化测试的概念 1.2 自动化测试的主流领域 接口自动化测试 UI自动化测试 持续集成 二、学习路线 一、自动化测试 1.1 自动化测试的概念 自动化测试是指利用软件工具或脚本来执行测试用例和比较实际结果与预期结果的过程,通过运行…...
Python:函数(一)
python函数相关的知识点 1. 函数定义与调用 定义:使用 def 关键字,后接函数名和参数列表。 def greet(name):"""打印问候语(文档字符串)"""print(f"Hello, {name}!") 调用:…...
qml c++混合编程注意事项
在Qml和C类进行数据交互时,通用的办法都是注册C到Qml中,但是很多时候C的对象是在C中进行创建,如果在Qml中创建了,数据之间的交互就会出现无法控制的问题。 信号与槽、上下文等都是数据交互的方式,但是当嵌套多层时&…...
Leetcode6-Z字形变换
题目链接:6. Z 字形变换 - 力扣(LeetCode) 思路: 定义numRows个字符数组,用于存每一行的字符;再定义一个标志行数的变量cnt,cnt在0到numRows-1之间不停的加一或减一(当cnt到0了&am…...
【eNSP实战】配置交换机端口安全
拓扑图 目的:让交换机端口与主机mac绑定,防止私接主机。 主机PC配置不展示,按照图中配置即可。 开始配置之前,使用PC1 ping 一遍PC2、PC3、PC4、PC5,让交换机mac地址表刷新一下记录。 LSW1查看mac地址表 LSW1配置端…...
React.js 基础与进阶教程
React.js 基础与进阶教程 React.js 是由 Facebook 开发的流行前端 JavaScript 库,专为构建用户界面(UI)设计,尤其适用于单页面应用(SPA)。它采用组件化开发模式,使 UI 结构更加清晰、可维护性更…...
Docker基础入门(一)
初识Docker 什么是Docker Docker是一个快速交付应用、运行应用的技术: 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统运行时利用沙箱机制形成隔离容器,各个应用互不干扰启动、移除都可以通过一行命令完成&…...
moment.js时间处理库
目录 一、moment().isValid()验证时间是否有效 二、moment().second()获取秒数或者设置秒数 三、moment().day()获取星期或者设置星期 四、moment().add()加法操作 五、moment().subtract()减法操作 六、moment.max()最大值 七、moment.min()最小值 八、克隆时间 一、mo…...
基于hive的电信离线用户的行为分析系统
标题:基于hive的电信离线用户的行为分析系统 内容:1.摘要 随着电信行业的快速发展,用户行为数据呈现出海量、复杂的特点。为了深入了解用户行为模式,提升电信服务质量和精准营销能力,本研究旨在构建基于 Hive 的电信离线用户行为分析系统。通…...