秃姐学AI系列之:丢弃法 + 代码实现 | 数值稳定性

丢弃法

动机

一个好的模型需要对输入数据的扰动鲁棒

  • 使用有噪音的数据等价于Tikhonov正则
  • 丢弃法:在层之间加入噪音

正则都可以理解为它在控制模型不要过拟合,不要太大

丢弃法不在数据中增加噪音,转而在层中增加噪音,所以丢弃法其实也是一种正则

 无偏差的加入噪音

 意味着,我以p的概率丢弃x,在剩下的概率里面我把x变大(因为p是一个0~1之间的数,所以1-p一定小于1)。

为什么要除一个1-p呢?,因为我们希望加入噪声之后我们的数据期望不变,而期望需要乘一个概率,当我们给x除了一个1-p之后可以看出,数据的期望公式并没有发生改变

训练中的丢弃法

通常将丢弃法作用在隐藏全连接层的输出上

推理中的丢弃法

dropout是一个正则项,而正则项只在训练中使用(包括L2正则等待):他们影响模型参数的更新

  • 因为正则项只会对权重造成影响

其实最早dropout被提出的时候,作者没把他当成一个正则项,他的想法是:模型每次dropout可以看作是激活了不同的很小的神经子网络,最终训练出n个很小的子神经网络去平均。这样训练一个模型可以用很多小神经网络去平均,效果肯定会好。

但是后面被大家研究研究..发现它在实践中其实就是一个正则项

在推理过程中,丢弃法直接返回输出,即输出的是他本身:h = dropout(h)

  • 这样也能保证确定性的输出

总结

  • 丢弃法将一些输出项随机置0来控制模型复杂度
  • 常作用在多层感知机的隐藏层输出上(很少用在cnn啊那些模型上面)
  • 丢弃概率是控制模型复杂度的超参数(在1不丢~0全丢之间,一般最常见的丢弃概率是0.5、0.9、0.1)

 代码实现

从0开始实现

我们实现dropout_layer函数,该函数以dropout的概率丢弃张量输入X中的元素

import torchdef dropout_layer(X, droupout):assert 0 <= dropout <= 1    # 一个断言,确定dropout率保持在正常区间if dropout == 1:return torch.zero_like(X)    # 直接返回全 0if dropout == 0:return X    # 不用丢,直接返回X# 随机生成一个0~1的向量,根据是否大于dropout生成一个布尔值(大于赋 1,小于赋 0)mask = (torch.randn(X.shape) > dropout).float()return mask * X / (1.0 - dropout)

为什么代码中挑出mask之后不直接 X[mask] = 0,来将值全部设成0?

        因为无论对于GPU还是CPU来说,做乘法远远比去选一个元素来的快 

 定义具有两个隐藏层的多层感知机,每个隐藏层包含256个单元

num_inputs, num_outputs, num_hiddens1, num_hiddens2 = 784, 10, 256, 256
dropout1, dropout2 = 0.2, 0.5class Net(nn.Module):def __init__(self, num_inputs, num_outputs, num_hiddens1, num_hiddens2, is_training = True):super(Net, self).__init__()self.num_inputs = num_inputsself.training = is_trainingself.lin1 = nn.Linear(num_inputs, num_hiddens1)self.lin2 = nn.Linear(num_hiddens1, num_hiddens2)self.lin3 = nn.Linear(num_hiddens2, num_outputs)self.relu = nn.ReLU()def forward(self, X):H1 = self.relu(self,lin1(X.reshape((-1, self.num_inputs))))if self.training == True:H1 = dropout_layer(H1, dropout1)    # dropout一般作用在全连接隐藏层的输出上H2 = self.relu(self.lin2(H1))if self.training == True:H2 = dropout_layer(H2, dropout2)out = self.lin3(H2)    # 注意!!输出层是不作用dropout的!return outnet = Net(num_inputs, num_outputs, num_hiddens1, num_hiddens2)

简洁实现

net = nn.Sequential(nn.Flatten(), nn.Linear(784, 256), nn.ReLU(),nn.Dropout(dropout1), nn.Linear(256, 256), nn.ReLU(),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)

QA

  • dropout随机置 0 对求梯度和反向传播的影响是什么?

        dropout置 0 的地方梯度就是 0,但是未置 0 的地方对应乘了一个数放大了,所以dropout对于梯度是一个对称的函数,而且置 0 的那些对应的权重这一轮就不会更新。

  • dropout如何保证结果的正确性和可重复性? 

        所谓正确性,机器学习没有正确性hhh只有效果好不好。所以机器学习,特别是神经网络,你哪怕逻辑出了很大的bug,甚至可能看不出来,最终对acc的影响也就一个点不到。 

        对于dropout来说,你下次丢弃的东西可能就不是这些了,不过是dropout,对于整个神经网络来说可重复性都是一个很难的问题。或者你可以固定一个随机种子random seed,那你的drop就是可重复的,但是你整个网络的随机性还是挺重的,比如初始权值也是随机的,甚至你的cudnn每次算的都是不太一样的,加的顺序不一样出来的数就会不一样...几乎不能重复,其实没啥必要可重复,在一个范围内就行了。

        机器学习的六字真言:越随机越稳定!!

  • BN和dropout的相关性和区别 

        可以理解为BN是给CNN卷积层用的,而dropout是给全连接层用的 

  • 在同样lr下,dropout的介入会不会造成参数收敛更慢? 

        是有可能的!,但是并不太需要因为dropout的存在而调大lr的需要。因为dropout不改变期望,lr是对期望和方差敏感一点点的。但是确实有可能会导致收敛变慢

数值稳定性

因为在神经网络中,我们做了太多的矩阵乘法,所以很容易导致参数数值的不稳定

数值稳定性的常见两个问题:

  • 梯度爆炸
  • 梯度消失

梯度爆炸的问题

值超过值域(infinity)

        对于16位浮点数尤为严重(数值区间6e-5~6e4)

我们经常采用16位浮点数,因为16位浮点数可以比32位浮点数块两倍 

对学习率敏感

  • 如果学习率太大 -> 大参数值 -> 更大的梯度
  • 如果学习率太小 -> 训练无进展
  • 我们可能需要在训练过程不断调整学习率

梯度消失的问题

梯度值变成 0

        对16位浮点数尤为严重

训练没有进展

        无论如何选择学习率

对于底层尤为严重

        仅仅顶部层训练的较好

        无法让神经网络更深

因为神经网络是从顶部回传的,到底部会变得特别特别小  

总结 

  • 当数值过大或者过小时会导致数值问题
  • 常发生在深度模型中,因为其会对n个数累乘

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

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

相关文章

JavaScript前端面试题——fetch

什么是fetch&#xff1f; fetch&#xff1a;fetch是浏览器内置的api&#xff0c;用于发送网络请求 ajax&axios&fetch的关系 ajax&#xff1a;ajax 是一种基于原生 JavaScript 的异步请求技术。它使用 XMLHttpRequest 对象来发送请求和接收响应。 axios&#xff1a;…

C++设计模式笔记(内附可运行代码示例)

持续更新, 欢迎关注....... 前言 设计目的 高内聚&#xff0c;低耦合 设计原则 1、开放封闭原则 类的改动是通过增加代码进行&#xff0c;而不是修改源代码。 2、单一职责原则 职责单一&#xff0c;对外只提供一种功能&#xff0c;引起类变化的原因都应该只有一个。 3…

GitHub Revert Merge Commit的现象观察和对PR的思考

文章目录 前言Pull Request 为什么会是这样&#xff1f;Pull Request Branch的差异 ?Two Dot Diff和Three Dot Diff 老生常谈&#xff1a; Merge 和 Rebasegit mergegit rebase Revert Main分支中的一个Merge Commit现象描述解决方案: Revert Feature分支中的一个Merge Commi…

Linux系统 腾讯云服务/宝塔面板安装《最新版本2024》禅道开源版本20.2

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 有两种方式1.自带有服务器安装和2.使用禅道官方的服务器免费使用 第一种&#xff1a;免费的提供5人使用&#xff0c;存储的数据大小也是有限制的范围的 禅道下载 - 禅道项目管理软件 下滑页面就能…

python中的魔术方法(特殊方法)

文章目录 1. 前言2. __init__方法3. __new__方法4. __call__方法5. __str__方法6. __repr__方法7. __getitem__方法8. __setitem__方法9. __delitem__方法10. __len__方法11. 富比较特殊方法12. __iter__方法和__next__方法13. __getattr__方法、__setattr__方法、__delattr__方…

Linux用户-普通用户

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注我&#xff0c;我尽量把自己会的都分享给大家&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux是一个多用户多任务操作系统,这意味着它可以同时支持多个用户登录并使用系统。…

微信小程序实现上传照片功能

案例&#xff1a; html: <view class"zhengjianCont fontSize30" style"margin-bottom: 40rpx;"><view class"kuai"><image binderror"imageOnloadError" bind:tap"upladPhoto" data-params"business…

杂谈c语言——3.内存对齐

先看两个例子&#xff1a; typedef struct S {int a;double b;char c; }S;typedef struct B {int a;char b;double c; }B;int main() {printf("S : %d\n", sizeof(S));printf("B : %d\n", sizeof(B));return 0; } 结果为&#xff1a; S:24; B:16&#xff…

常用在线 Webshell 查杀工具推荐

一、简介 这篇文章将介绍几款常用的在线 Webshell 查杀工具&#xff0c;包括长亭牧云、微步在线云沙箱、河马和VirusTotal。每个工具都有其独特的特点和优势&#xff0c;用于帮助用户有效检测和清除各类恶意 Webshell&#xff0c;保障网站和服务器的安全。文章将深入探讨它们的…

【Redis】String字符串

目录 String字符串 常见命令 SET GET MSET MGET SETNX 计数命令 INCR INCRBY DECY DECYBY INCRBYFLOAT 其他命令 APPEND GETRANGE SETRANGE STRLEN 内部编码 String类型的典型使用场景 缓存(Cache)功能 计数功能 共享会话(Session) String字符串 字符…

类和对象(下)C++

1.初始化列表 1.为什么有初始化列表&#xff0c;它的作用&#xff1f; ->初始化列表&#xff0c;是构造函数初始化的另一种形式。 ->在语法上面理解&#xff0c;初始化列表可以认定为是每个成员变量定义初始化的地方. ->引用成员变量&#xff0c;const成员变量&am…

Qt实现简易CAD软件的开发:技术解析与实现

文章目录 简易CAD软件的开发&#xff1a;技术解析与实现引言项目概述程序入口主窗口的实现主窗口类定义&#xff08;mainwindow.h&#xff09;主窗口类实现&#xff08;mainwindow.cpp&#xff09; 自定义绘图视图自定义绘图视图类定义&#xff08;myqgraphicsview.h&#xff0…

亚信安全获国家信息安全服务(风险评估和安全工程类)二级资质

近日&#xff0c;亚信安全荣获由中国信息安全测评中心颁发的《国家信息安全测评信息安全服务资质证书—风险评估二级》和《国家信息安全测评信息安全服务资质证书—安全工程类二级》资质。亚信安全凭借综合实力和优秀的技术能力&#xff0c;成为为数不多的获得国家信息安全服务…

嵌入式C编程常用的异常错误处理

嵌入式C编程中&#xff0c;异常错误处理是确保系统稳定性和可靠性的重要部分。以下是一些常见的异常错误处理方法及其详细说明和示例&#xff1a; 1. 断言 (Assertions) 断言用于在开发阶段捕获程序中的逻辑错误。通过assert宏&#xff0c;可以在条件不满足时终止程序并输出错…

前端常用的【设计模式】和使用场景

设计原则 最重要的&#xff1a;开放封闭原则 对扩展开放对修改封闭 工厂模式 用一个工厂函数&#xff0c;来创建实例&#xff0c;隐藏 new 如 jQuery 的 $ 函数&#xff0c;React 的 createElement 函数 单例模式 全局唯一的实例(无法生成第二个) 如 Vuex 和 Redux 的 store…

鸿蒙AI功能开发【人脸活体验证控件】 机器学习-场景化视觉服务

人脸活体验证控件 介绍 本示例展示了使用视觉类AI能力中的人脸活体验证能力。 本示例模拟了在应用里&#xff0c;跳转人脸活体验证控件&#xff0c;获取到验证结果并展示出来。 需要使用hiai引擎框架人脸活体验证接口kit.VisionKit.d.ts。 效果预览 使用说明&#xff1a; …

Web性能监测的利器Performance Observer!!

前言 前段时间在研究前端异常监控平台&#xff0c;在思考性能监控时&#xff0c;想到了浏览器自带的观察者以及页面生命周期API 。于是在翻查资料时发现了&#xff0c;Performance ObserverAPI。正好趁着这个机会给大家好好讲讲Performance Observer API Performance Observe…

【python】Scrapy中常见的“Response Not Ready”或“Response Not 200”错误分析及解决

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

吴恩达机器学习笔记

1.机器学习定义&#xff1a; 机器学习就是让机器从大量的数据集中学习&#xff0c;进而得到一个更加符合现实规律的模型&#xff0c;通过对模型的使用使得机器比以往表现的更好 2.监督学习&#xff1a; 从给定的训练数据集中学习出一个函数&#xff08;模型参数&#xff09;…

【Jenkins未授权访问漏洞 】

默认情况下 Jenkins面板中用户可以选择执行脚本界面来操作一些系统层命令&#xff0c;攻击者可通过未授权访问漏洞或者暴力破解用户密码等进入后台管理服务&#xff0c;通过脚本执行界面从而获取服务器权限。 第一步&#xff1a;使用fofa语句搜索 搜索语句&#xff1a; port&…