[动手学习深度学习]12.权重衰退

1.介绍

权重衰退是常见的处理过拟合的方法

  • 控制模型容量方法
    1. 把模型控制的比较小,即里面参数比较少
    2. 使参数选择范围小
  • 约束就是正则项
    每个特征的权重都大会导致模型复杂,从而导致过拟合。
    控制权重矩阵范数可以使得减少一些特征的权重,甚至使他们权重为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∣∣w2θ
    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λ∣∣w2
    (可以通过拉格朗日乘子来证明)
  • 超参数 λ \lambda λ控制了正则项的重要程度
    • λ = 0 \lambda=0 λ=0:无作用(当 λ = 0 \lambda=0 λ=0时,即没有后面的限制,相当于上一个公式里 θ = ∞ \theta=\infty θ=
    • λ → ∞ , w ∗ → 0 \lambda \rightarrow \infty, w^* \rightarrow0 λ,w0:相当于上面 θ → 0 \theta \rightarrow0 θ0,也就使 w ∗ → 0 w^* \rightarrow0 w0

想通过控制模型参数使模型不要太复杂时,可以通过增加 λ \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())

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMq--消息可靠性

12.消息可靠性 1.消息丢失的情况 生产者向消息代理传递消息的过程中,消息丢失了消息代理( RabbitMQ )把消息弄丢了消费者把消息弄丢了 那怎么保证消息的可靠性呢,我们可以从消息丢失的情况入手——从生产者、消息代理&#xff0…

2019年蓝桥杯第十届CC++大学B组真题及代码

目录 1A:组队(填空5分_手算) 2B:年号字符(填空5分_进制) 3C:数列求值(填空10分_枚举) 4D:数的分解(填空10分) 5E:迷宫…

UI-APP---基于HBuilder X的微信小程序

目录 概要 Uni-app 和 HBuilderX 的关系 技术名词解释 ui-app: 概念: 核心特点: 技术细节 基本步骤: 开发流程 项目功能分析: ①首页包括公共头部、导航栏、轮播图、视频列表区域。 ②视频详情页包括公共头部区域、视频详情区域、…

多宠识别:基于计算机视觉的智能宠物管理系统架构解析

一、行业痛点与技术方案演进 在多宠家庭场景中,传统方案面临三大技术瓶颈: 1. 生物特征混淆:同品种/毛色宠物识别准确率低于65% 2. 动态场景适应:进食/奔跑状态下的误检率达30% 3. 数据孤岛问题:离线设备无法实现持续…

论文阅读分享——UMDF(AAAI-24)

概述 题目:A Unified Self-Distillation Framework for Multimodal Sentiment Analysis with Uncertain Missing Modalities 发表:The Thirty-Eighth AAAI Conference on Artificial Intelligence (AAAI-24) 年份:2024 Github:暂…

Unity组件大全之 Layout 组件 |(27)Content Size Fitter 内容大小适配器

📂 Unity 开发资源汇总 | 插件 | 模型 | 源码 💓 欢迎访问 Unity 打怪升级大本营 在 Unity 的 UI 系统中,Content Size Fitter 是一个重要的布局组件,能够根据内容动态调整 UI 元素的尺寸。它通过自动检测内容的大小来改变元素的宽…

<3D建模>.max文件转换为.fbx文件

今天在使用unity3D开发软件时,下载了.max文件。大家知道.max文件是3DMax生成的文件,然而我的电脑中也没有3DMax,而unity中的场景文件通常要用到.fbx文件,这可怎么办呢?难道要去下载一个3DMax软件吗?其实并不…

【js逆向】iwencai国内某金融网站实战

地址:aHR0cHM6Ly93d3cuaXdlbmNhaS5jb20vdW5pZmllZHdhcC9ob21lL2luZGV4 在搜索框中随便输入关键词 查看请求标头,请求头中有一个特殊的 Hexin-V,它是加密过的;响应数据包中全是明文。搞清楚Hexin-V的值是怎么生成的,这个值和cooki…

国内免费使用 Claude 3.7 Sonnt,GPT-4o,DeepSeek-R1联网极速响应

地址我放在下面了!打开即用,也支持在ChatBox、Cursor、Dify、VSCode这些平台调用API令牌 注册登录进来之后,系统会自动赠送免费额度,可以使用Open、Claude、DeepSeek这些系统支持的全部模型。 我将经常使用到的模型型号都列在下…

面向高质量视频生成的扩散模型方法-算法、架构与实现【附核心代码】

目录 算法原理 架构 代码示例 算法原理 正向扩散过程:从真实的视频数据开始,逐步向其中添加噪声,随着时间步 t 的增加,噪声添加得越来越多,最终将原始视频数据变成纯噪声。数学上,t 时刻的视频数据与 t…

使用免费IP数据库离线查询IP归属地

一、准备工作 1.下载免费IP数据库 首先,访问 MaxMind官网(https://www.maxmind.com/en/home)如果你还没有MaxMind账号,可以通过此链接地址(https://www.maxmind.com/en/geolite2/signup)进行账号注册&…

Python----数据可视化(Seaborn二:绘图一)

常见方法 barplot方法 单独绘制条形图 catplot方法 可以条形图、散点图、盒图、小提亲图、等 countplot方法 统计数量 一、柱状图 seaborn.barplot(dataNone, xNone, yNone, hueNone, colorNone, paletteNone) 函数描述data用于绘图的数据集。x用于绘制长格式数据的输入。…

C/C++中使用CopyFile、CopyFileEx原理、用法、区别及分别在哪些场景使用

文章目录 1. CopyFile原理函数原型返回值用法示例适用场景 2. CopyFileEx原理函数原型返回值用法示例适用场景 3. 核心区别4. 选择建议5. 常见问题6.区别 在Windows系统编程中,CopyFile和CopyFileEx是用于文件复制的两个API函数。它们的核心区别在于功能扩展性和控制…

SpringBoot 如何调用 WebService 接口

前言 调用WebService接口的方式有很多&#xff0c;今天记录一下&#xff0c;使用 Spring Web Services 调用 SOAP WebService接口 一.导入依赖 <!-- Spring Boot Web依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId…

tomcat单机多实例部署

一、部署方法 多实例可以运行多个不同的应用&#xff0c;也可以运行相同的应用&#xff0c;类似于虚拟主机&#xff0c;但是他可以做负载均衡。 方式一&#xff1a; 把tomcat的主目录挨个复制&#xff0c;然后把每台主机的端口给改掉就行了。 优点是最简单最直接&#xff0c;…

计算机视觉算法实战——老虎个体识别(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​ 1. 领域介绍 老虎个体识别是计算机视觉中的一个重要应用领域&#xff0c;旨在通过分析老虎的独特条纹图案&#xff0c;自动识别和区…

【数据结构】初识集合框架及背后的数据结构(简单了解)

目录 前言 如何学好数据结构 1. 什么是集合框架 2. 集合框架的重要性 3. 背后所涉及的数据结构以及算法 3.1 什么是数据结构 3.2 容器背后对应的数据结构 3.3 相关java知识 3.4 什么是算法 3.5 基本关系说明&#xff08;重要&#xff0c;简单了解&#xff09; 前言 …

Hadoop命令行语句

一、前言 1、启动虚拟机 2、连接工具 3、启动Hadoop并查询确保进程为51 start-all.shjps练习完请一定 stop-all.sh 关掉hadoop进程 关掉虚拟机 再关机电脑 二、Hadoop命令行主命令 1、进入Hadoop安装目录的bin路径 cd /training/hadoop-3.3.0/bin/2、查看低下的执行文…

TypeScript系列07-类型声明文件

在现代前端开发中&#xff0c;TypeScript已成为提升代码质量和开发体验的利器。对于React和React Native项目&#xff0c;合理利用类型声明文件不仅能提供更好的智能提示和类型检查&#xff0c;还能显著减少运行时错误。本文将深入探讨类型声明文件的编写与使用。 1. 声明文件…

迎接AI智能体新时代,推动新质生产力加快发展

随着人工智能技术的飞速发展&#xff0c;AI智能体正逐步成为推动新质生产力加快发展的重要力量。2025年&#xff0c;被业界普遍认为是AI智能体的爆发元年&#xff0c;这一技术范式的深刻变革&#xff0c;正重塑着人机关系&#xff0c;为各行各业带来前所未有的机遇与挑战。本文…