深度学习pytorch——减少过拟合的几种方法(持续更新)

1、增加数据集

2、正则化(Regularization)

正则化:得到一个更加简单的模型的方法。

以一个多项式为例:

随着最高次的增加,会得到一个更加复杂模型,模型越复杂就会更好的拟合输入数据的模型(图-1),拟合的程度越大,表现在参数上的现象就是高次的系数趋近于0,如果直接将趋近于0的高次去掉,就可以得到一个更加简单的模型,这种方法称为正则化

图-1

 直观的看,经过正则化的模型更加平滑(图-2).

图-2

 正则化的方法:

(1)L1-正则化:在原来的模型基础上加上一个 1-范数(这里使用二分类模型作为示例):

 (2)L2-正则化:在原来的模型基础上加上一个 2-范数(这里使用二分类模型作为示例):

 代码示例:

# L2-正则化
device = torch.device('cuda:0')
net = MLP.to(device)
optimizer = optim.SGD(net.parameters,lr = learning_rate,weight_decay=0.01) #weight_decay=0.01就代表进行L2-正则化
criteoon = nn.CrossEntropyLoss().to(device)
# L1-正则化
# 对于L1-正则化,pytorch并没有提供直接的方法,就只能使用人工去做了
regularization_loss = 0
for param in model.parameters():                # 相求1-范数的总和
    regularization_loss += torch.sum(torch.abs(param))

classify_loss = criteon(logits,target)
loss = classify_loss + 0.01*regularization_loss     # 再将得到的正则损失加入模型损失,其中0.01是1-范数总和前面的系数

optimizer.zero_grad()
loss.backward()
optimizer.step()

3、加入动量(momentum)

动量即惯性——本次向哪移动,还需要考虑上一次移动的方向。

正常更新梯度的公式(公式-1):

公式-1

加入动量之后的公式(公式-2):

公式-2

将z(k+1)带入梯度更新公式,即公式-1减去,其中Z(k)相当于上一次的梯度,系数\alpha和β的大小决定了是当前梯度对方向的决定性大,还是上一梯度对方向的决定性大。

当动量为0时的梯度更新情况(图-3):

图-3

 动量不为0时的梯度更新情况(图-4):

图-4

将图-3和图-4对比,可以得出动量不为0,即考虑上一梯度,梯度更新更加稳定,不会出现巨大的跳跃情况,并且不加动量的没有找到最小点,一直在局部最小值点徘徊,如果加入动量,考虑到上一梯度,可以在一定程度上解决这种情况(图-4是加入动量之后最好的情况)。

代码演示,直接在优化器部分使用momentum属性就可以了,但是如果使用Adam优化器,就不需要添加,因为在Adam优化器内部定义的有momentum属性:

4、学习率(Learning Rate ) 

不同学习率梯度更新情况(图-5):

图-5

当学习率太小的时候,梯度更新比较慢,需要较多次的更新。

当学习率太大的时候,梯度更新比较激烈,找到的极值点Loss太大。

如何找到正确的的学习率?

在训练之初,可以先设置一个较大的学习率加快更新的速度,然后逐步减小学习率,即设置一个动态学习率。

图-6

 从图-6,可以看到有一个突然下降的点,这个点就是学习率训练一些数据之后,学习率突然变小导致的结果。在此之前可以看到Loss趋于不变,可以合理的猜测是因为学习率太大了,出现了来回摇摆不定的情况(图-7):

图-7

 当学习率突然减小,梯度更新变慢,易找到极小点(图-8):

图-8

 代码演示:

 5、dropout

dropout:减少神经元之间的连接,减少模型的学习量。标准的神经网络是全连接的,相比经过dropout的神经网络减少了一些连接(图-9)。

图-9

代码演示,可以使用Dropout方法断开连接,0.5代表断开两层之间的50% :

 这种方法被用在模型训练中,但当模型测试过程中,为了提高test的表现,要结束这个操作,将所有的连接都使用上,可以使用net_dropped.eval()方法结束这个操作,代码演示如下:

6、随机梯度下降 (Strochastic Gradient Descent )

这里的随机并不是指任意,这里面是有一套规则的,是一套映射的关系,即将原来的数据x送入f(x)得到一种分布。经过随机从原数据中得到一组小数据,使用这一小组数据训练模型。

 学习:课时60 Early stopping, dropout等_哔哩哔哩_bilibili

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实现Redis缓存预热的技巧与方法

🍎个人博客:个人主页 🏆个人专栏:Linux ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 什么是缓存预热? 缓存预热的作用 如何实现Redis缓存预热? 结语 我的其他博客 前言 在实际的软件开发中…

Java代码基础算法练习-报数问题-2024.03.26

任务描述: 有n个人围成一个圆圈分别编号1~n,从第1个到m循环报数,凡是报到m者离开,求n个 人离开圆圈的次序。 任务要求: 代码示例: package M0317_0331;import java.util.ArrayList; import java.util.List; import j…

Emacs之极速复制文件名、绝对路径等快捷键(一百三十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

大模型面试准备(五):图解 Transformer 最关键模块 MHA

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何备战、面试常考点分享等热门话题进行了深入的讨论。 合集在这…

优秀电源工程师需要的必备技能

随着电源市场的不断扩张,开关电源行业飞速发展,企业对电源工程师的需求日益增加,对电源工程师的技能要求也日渐提高,相信没有一位电源工程师会错过让自己变得更优秀的机会。作为一名数字电源从业者,今天就带大家细数一下优秀电源工程师具备的那些技能。 一、新手必备课程…

[leetcode]283. 移动零

前言:剑指offer刷题系列 问题: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例: 输入: nums …

【ZZULIOJ】1002: 简单多项式求值(Java)

目录 题目描述 输入 输出 样例输入 样例输出 code 题目描述 对用户输入的任一整数,输出以下多项式的值。 输入 输入整数x的值。 输出 输出一个整数,即多项式的值。 样例输入 1 样例输出 11 code import java.util.*;public class Ma…

【AI与WEB3】未来已来:十大领域揭示AI与Web3如何联手重塑全球经济版图

在不远的未来,当科技的脉搏跳动得愈发强劲有力,AI与Web3这两股创新力量正以前所未有的方式交织共舞,犹如科幻电影中的场景跃然现实。在这场颠覆性的技术革命中,我们正见证着十个关键领域的华丽转身,它们如同璀璨的星辰…

Copilot 编程助手的介绍及使用

介绍 Copilot 是2021年由 GitHub 与 OpenAI 合作研发的一款编程助手,同时也是全球首款使用OpenAI Codex模型(GPT-3后代)打造的大规模生成式AI开发工具。 Copilot 底层模型目前经过了数十亿行公开代码的训练,与大多数代码辅助工具…

白话模电:4.耦合、差分、无源滤波、反馈(考研面试常问问题)

一、介绍一下三极管多级放大电路的三种耦合方式及其特点?耦合的目的是什么? 多级放大电路中各放大级之间的连接方式称为耦合方式。常见的耦合方式有三种:阻容耦合(RC耦合)、直接耦合和变压器耦合。 耦合的目的是将信号…

ES6 字符串/数组/对象/函数扩展

文章目录 1. 模板字符串1.1 ${} 使用1.2 字符串扩展(1) ! includes() / startsWith() / endsWith()(2) repeat() 2. 数值扩展2.1 二进制 八进制写法2.2 ! Number.isFinite() / Number.isNaN()2.3 inInteger()2.4 ! 极小常量值Number.EPSILON2.5 Math.trunc()2.6 Math.sign() 3.…

蓝桥-数位排序

目录 题目链接: 思路: 代码: 题目链接: 0数位排序 - 蓝桥云课 (lanqiao.cn) 思路: 自定义排序比较函数 用一个函数来求某个数的数位和 sum() 用一个函数,自定义排序比较函数…

说说2024年度孝感建筑类初中级职称申报评审

说说2024年度孝感建筑类初中级职称申报评审 认真看,错过了就失去2024年申报孝感中级职称评审的机会。孝感中级职称申报评审一年两次,上半年一次,下半年一次。注意!职称水平能力测试是重点。 建筑类职称水平能力测试一年就一次机…

【精简】Spring笔记

文章目录 跳转链接(学习路线)及前言(更新中) 快速入门配置文件详解依赖注入(bean实例化)自动装配集合注入使用spring加载properties文件容器注解开发bean管理注解开发依赖注入第三方bean整合mybatis整合junit AOP入门案例切入点表…

1.Git快速入门

文章目录 Git快速入门1.Git概述2.SCM概述3.Git安装3.1 软件下载3.2 软件安装3.3 软件测试 Git快速入门 1.Git概述 Git是一个免费的,开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目,Git易于学习,占用空间小&…

全面剖析Java多线程编程,抢红包、抽奖实战案例

黑马Java进阶教程,全面剖析Java多线程编程,含抢红包、抽奖实战案例 1.什么是多线程? 2.并发与并行 CPU有这些,4,8,16,32,64 表示能同时进行的线程 3.多线程的第一种实现方式 package com.itheima.reggie;/*** Author lpc* Date …

关系型数据库mysql(7)sql高级语句

目录 一.MySQL常用查询 1.按关键字(字段)进行升降排序 按分数排序 (默认为升序) 按分数升序显示 按分数降序显示 根据条件进行排序(加上where) 根据多个字段进行排序 ​编辑 2.用或(or&…

Word通配符替换章节序号

这里写自定义目录标题 通配符替换章节序号切换域通配符替换内容插入编号切换域代码 通配符替换章节序号 碎片化学习word通配符知识 切换域 切换域:Alt F9 域都变成静态文字:Ctrl/Command Shift F9 通配符 内容通配符单个数字[0-9]多个数字&#…

【python从入门到精通】-- 第二战:注释和有关量的解释

🌈 个人主页:白子寰 🔥 分类专栏:python从入门到精通,魔法指针,进阶C,C语言,C语言题集,C语言实现游戏👈 希望得到您的订阅和支持~ 💡 坚持创作博文…

每天上万简历,录取不到1%!阿里腾讯的 offer 都给了哪些人?

三月天杨柳醉春烟~正是求职好时节~ 与去年秋招的冷淡不同,今年春招市场放宽了许多,不少企业纷纷抛出橄榄枝,各大厂的只差把“缺人”两个字写在脸上了。 字节跳动技术方向开放数10个类型岗位,研发需求占比60%,非研发新增…