动手深度学习-欠拟合和过拟合

news2024/11/20 19:33:46

目录

  • 训练误差和泛化误差
  • K-折交叉验证
  • 欠拟合和过拟合
    • 模型复杂性
    • 数据集大小
  • 权重衰减
    • 权重衰减简洁实现
  • 暂退法(Dropout)
    • 从零开始实现Dropout
    • 简洁实现

参考教程:https://courses.d2l.ai/zh-v2/

训练误差和泛化误差

训练误差(training error)是指, 模型在训练数据集上计算得到的误差。 泛化误差(generalization error)是指, 模型在新数据上的误差。

K-折交叉验证

当训练数据稀缺时,我们甚至可能无法提供足够的数据来构成一个合适的验证集。 这里我们采用K-折交叉验证的方法:将训练数据分割成K块,使用第i(0<i<=k)块作为验证数据集,其余的作为验证数据集, 最后,通过对K次实验的结果取平均来估计训练和验证误差。

欠拟合和过拟合

过拟合是指模型能很好地拟合训练样本,但对新数据的预测准确性很差。
欠拟合是指模型不能很好地拟合训练样本,且对新数据的预测准确性也不好。
是否过拟合或欠拟合可能取决于模型复杂性和可用训练数据集的大小。

模型复杂性

高阶多项式函数比低阶多项式函数复杂得多。 高阶多项式的参数较多,模型函数的选择范围较广。 在这里插入图片描述

数据集大小

训练数据集中的样本越少,我们就越有可能(且更严重地)过拟合。 随着训练数据量的增加,泛化误差通常会减小。对于固定的任务和数据分布,模型复杂性和数据集大小之间通常存在关系。 给出更多的数据,我们可能会尝试拟合一个更复杂的模型。 能够拟合更复杂的模型可能是有益的。 如果没有足够的数据,简单的模型可能更有用。 对于许多任务,深度学习只有在有数千个训练样本时才优于线性模型。 从一定程度上来说,深度学习目前的生机要归功于 廉价存储、互联设备以及数字化经济带来的海量数据集。

权重衰减

我们总是可以通过去收集更多的训练数据来缓解过拟合。 但这可能成本很高,耗时颇多,或者完全超出我们的控制,因而在短期内不可能做到。 假设我们已经拥有尽可能多的高质量数据,我们便可以将重点放在正则化技术上。权重衰减(weight decay)是最广泛使用的正则化的技术之一, 它通常也被称为L2正则化。
在这里插入图片描述
每一次权重更新,也就是每一次梯度下降法的学习,w的权重都要进行一些缩小,也叫做w的系数衰减。
使用L2范数的一个原因是它对权重向量的大分量施加了巨大的惩罚。 在实践中,这可能使它们对单个变量中的观测误差更为稳定。 相比之下,L1惩罚会导致模型将权重集中在一小部分特征上, 而将其他权重清除为零。

权重衰减简洁实现

def train_concise(wd):
    net = nn.Sequential(nn.Linear(num_inputs, 1))
    for param in net.parameters():
        param.data.normal_()
    loss = nn.MSELoss(reduction='none')
    num_epochs, lr = 100, 0.003
    trainer = torch.optim.SGD([
        {"params":net[0].weight,'weight_decay': wd},#实例化优化器时直接通过weight_decay指定weight decay超参数
        {"params":net[0].bias}], lr=lr)
    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:
            trainer.zero_grad()
            l = loss(net(X), y)
            l.mean().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())
    train_concise(0)
    #w的L2范数: 14.670721054077148
    train_concise(3)
    #w的L2范数: 0.3454631567001343

wd=0:
在这里插入图片描述
wd=3:
在这里插入图片描述

  • 正则化是处理过拟合的常用方法:在训练集的损失函数中加入惩罚项,以降低学习到的模型的复杂度。

暂退法(Dropout)

暂退法在前向传播过程中,计算每一内部层的同时注入噪声,这已经成为训练神经网络的常用技术。 这种方法之所以被称为暂退法,因为我们从表面上看是在训练过程中丢弃(drop out)一些神经元。 在整个训练过程的每一次迭代中,标准暂退法包括在计算下一层之前将当前层中的一些节点置零。
在这里插入图片描述
图中删除了h2和h5, 因此输出的计算不再依赖于h2或h5,并且它们各自的梯度在执行反向传播时也会消失。 这样,输出层的计算不能过度依赖于h1,…h5的任何一个元素。通常,我们在测试时不用暂退法。 给定一个训练好的模型和一个新的样本,我们不会丢弃任何节点,因此不需要标准化。
在标准暂退法正则化中,通过按保留(未丢弃)的节点的分数进行规范化来消除每一层的偏差。 换言之,每个中间活性值h以暂退概率p由随机变量h′替换,如下所示:
h ′ = { 0  概率为  p h 1 − p  其他情况  h^{\prime}= \begin{cases}0 & \text { 概率为 } p \\ \frac{h}{1-p} & \text { 其他情况 }\end{cases} h={01ph 概率为 p 其他情况 
根据此模型的设计,其期望值保持不变,即E[h′]=h。

  • 丢弃法将一些输出项随机置0来控制模型复杂度
  • 常作用在多层感知机的隐藏层输出上
  • 丢弃概率在控制模型复杂度的超参数中设置(0<p<1)

从零开始实现Dropout

def dropout_layer(X, dropout):
    assert 0 <= dropout <= 1
    # 在本情况中,所有元素都被丢弃
    if dropout == 1:
        return torch.zeros_like(X)
    # 在本情况中,所有元素都被保留
    if dropout == 0:
        return X
    mask = (torch.rand(X.shape) > dropout).float()
    return mask * X / (1.0 - dropout)
    

简洁实现

我们只需在每个全连接层之后添加一个Dropout层, 将暂退概率作为唯一的参数传递给它的构造函数。 在训练时,Dropout层将根据指定的暂退概率随机丢弃上一层的输出(相当于下一层的输入)。 在测试时,Dropout层仅传递数据。

net = nn.Sequential(nn.Flatten(),
        nn.Linear(784, 256),
        nn.ReLU(),
        # 在第一个全连接层之后添加一个dropout层
        nn.Dropout(dropout1),
        nn.Linear(256, 256),
        nn.ReLU(),
        # 在第二个全连接层之后添加一个dropout层
        nn.Dropout(dropout2),
        nn.Linear(256, 10))

def init_weights(m):
    if type(m) == nn.Linear:
        nn.init.normal_(m.weight, std=0.01)

net.apply(init_weights);
  • 暂退法在前向传播过程中,计算每一内部层的同时随机丢弃一些神经元。
  • 暂退法可以避免过拟合,它通常与控制权重向量的维数和大小结合使用的。

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

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

相关文章

5000字带你了解机房搬迁有哪些步骤?干货收藏!

机房搬迁不仅仅是把机房的设备迁移到新机房那么简单&#xff0c;而是要求网络系统的迁移和集中存储系统的迁移必须安全平稳&#xff0c;不能过长时间影响生产应用。表面上就是几个IT 民工的搬运&#xff0c;但实际是一项目高度集中的体力与脑力的综合项目。现将一般机房搬迁步骤…

基于纳什谈判理论的风–光–氢多主体能源系统合作运行方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Go语言进阶和依赖管理(二)——并发和依赖管理

文章目录一、本文重点内容&#xff1a;二、详细知识点介绍&#xff1a;1、并发和并行并发&#xff1a;并行&#xff1a;结论&#xff1a;2、Go的协程协程&#xff1a;线程&#xff1a;3、协程通信方式一&#xff1a;使用通道交换数据方式二&#xff1a;使用共享内存完成数据交换…

SpringBoot 与 SpringCloud 有什么区别?

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;SpringBoot 与 SpringCloud 有什么区别&#xff1f; ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&am…

深拷贝,浅拷贝,引用拷贝有什么区别?

目录 引用拷贝 浅拷贝 深拷贝 深拷贝,浅拷贝,引用拷贝有什么区别? 引用拷贝 当我们向复制一个对象的时候,自然想到的就是赋值,直接赋值给另外一个变量,这种做法只是赋值了对象的地址,即两个变量现在指向的是同一个对象,任意一个对象操作这个属性都会影响到另外一个变量,这…

成为一名网络安全工程师,你应该学习什么?

前言 这是我的建议如何成为网络安全工程师&#xff0c;你应该按照下面顺序学习。 简要说明 第一件事你应该学习如何编程&#xff0c;我建议首先学python&#xff0c;然后是java。 &#xff08;非必须&#xff09;接下来学习一些算法和数据结构是很有帮助的&#xff0c;它将帮…

jQuery select三级联动

功能描述&#xff1a; 1 实现三级联动&#xff0c;ajax请求数据。 根据选定级别&#xff0c;查询该级别下的项目类别&#xff1b;根据选择类别&#xff0c;查询该级别类别下所属项目列表&#xff1b; 前端涉及知识点&#xff1a; &#xff08;1&#xff09;(‘#app’).change…

【云原生kubernetes】k8s控制器Deployment使用详解

前言 在上一篇我们聊了k8s中各种控制器的使用&#xff0c;本篇将以控制器中比较常用的一种控制器Deployment 进行详细的说明。 一、Deployment 简介 为了更好解决服务编排的问题&#xff0c;kubernetes在V1.2版本开始&#xff0c;引入了Deployment控制器&#xff1b; 需要说明…

47 转置卷积【动手学深度学习v2】】

47 转置卷积【动手学深度学习v2】】 深度学习学习笔记 学习视频&#xff1a;https://www.bilibili.com/video/BV17o4y1X7Jn/?spm_id_from333.1007.top_right_bar_window_history.content.click&vd_source75dce036dc8244310435eaf03de4e330 转置卷积 卷积不会增大输入的高…

【Python小游戏】99%的人都不知道,“猜数字”游戏这么玩才能快速胜出,少年,要不要来猜猜看啊~(附源码)

前言 日子从不亏欠&#xff0c;每一个努力向上的人&#xff0c; 未来的走运, 都是过往尽力的积累。 人勤春来早&#xff0c;奋进正当时。新春伊始&#xff0c;我们迎来了2023年开工第一天。 栗子同学恭祝大家开工大吉&#xff0c;新年新气象&#xff0c;万事开门红&#xff…

Spring事务案例:模拟银行转账

Spring事务案例&#xff1a;模拟银行转账一. 概念二. 原程序2.1 表&#xff1a;2.2 service层接口&#xff1a;2.3 dao层接口&#xff1a;2.4 service实现类&#xff1a;2.5 测试用例&#xff1a;三.使用事务改进3.1 开启注解式事务驱动&#xff1a;3.2 开启事务&#xff1a;3.…

python使用pptx库-从一个ppt复制页面到另一个ppt里面

python使用pptx库-从一个ppt复制页面到另一个ppt里面 作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 一、原理 如题&#xff0c;我有一个模板课件.pptx&#xff1a; 其内容&#xf…

百趣代谢组学文献分享:大麦盐胁迫响应机制的组学分析

前言 百趣代谢组学文献分享&#xff0c;我国受盐碱化危害耕地面积超过1.4亿亩&#xff0c;严重危险粮食安全和三农问题的解决。因此开发耐盐农作物并研究其耐盐机制具有迫在眉睫的重要意义。 代谢组学文献分享&#xff0c;浙江大学吴德志教授研究组最近发表的研究成果比较了耐…

Jmeter之界面语言设置

一、临时性设置中文 临时性设置&#xff1a;设置后只对本次使用有效&#xff0c;重启Jmeter后恢复默认语言。 选择Options—>Choose Language—>选择其他语言&#xff08;例如&#xff1a;Chinese&#xff08;Simplified&#xff09;简体中文&#xff09;设置成功。重启…

32 基变换和图像压缩

一、知识概要 本节主题是线性变换与矩阵的关联&#xff0c;从图像压缩与信号处理的应用引入&#xff0c;介绍几种方便的基向量&#xff1a;傅里叶&#xff0c;小波。最后从代数角度大体上介绍了基变换与变换矩阵的关系。 二、图像处理 首先我们假设有一个 512 * 512 的黑白图…

StarRocks斩获「2022 掘金引力榜」年度技术品牌传播案例 Top 10!

近日&#xff0c;由稀土掘金技术社区打造的「掘金引力榜」正式公布&#xff0c;由StarRocks社区举办的StarRocks Summit Asia 2022荣获「掘金引力榜 2022 年度技术品牌传播案例 Top10」&#xff01;掘金是面向全球中文开发者的技术社区。「掘金引力榜」是由稀土掘金技术社区打造…

【MyBatis持久层框架】配置文件实现增删改查实战案例(下)

前言 前面我们学习了 MyBatis 持久层框架的原生开发方式和 Mapper 代理开发两种方式&#xff0c;解决了使用 JDBC 基础性代码操作数据库时存在的硬编码和操作繁琐的问题。 在配置文件实现增删改查上篇中&#xff0c;我们详细讲解了常用的查询操作&#xff0c;例如查询所有数据…

Spring Boot 项目 - API 文档搜索引擎

在线体验 : http://43.139.1.94:9090/index.html项目 Gitee 链接 : API 文档搜索引擎1.认识搜索引擎我们平时查百度, 搜狗的时候, 结果页会显示若干条相关结果 , 每个结果几乎都包含图片, 标题, 描述, 展示 URL以及时间等等.1.1 搜索引擎的本质输入一个查询词, 得到若干个结果,…

stm32学习笔记-1 STM32简介

1 STM32简介 [toc] 注&#xff1a;笔记主要参考 江科大自化协 教学视频“STM32入门教程-2023持续更新中”。 注&#xff1a;工程及代码文件放在了本人的Github仓库。 1.1 套件简介 本教程使用STM32最小系统板&#xff08;STM32F103C8T6&#xff09;面包板硬件平台进行学习。…

微信小程序 Springboot校园自动点餐系统带跑腿 java

开发语言&#xff1a;Java 小程序前端框架&#xff1a;uniapp 小程序运行软件&#xff1a;微信开发者 可选运行软件:webapp (hbuiderx) 前端开发语言:vue.js 后端技术:Springboot(SpringSpringMVCMyBatis) 可选技术:springboot 后端开发环境:idea和eclipse都支持 数据库:mysql …