【白话机器学习系列】白话 Dropout

news2024/11/25 14:33:51

白话 Dropout

在这里插入图片描述

文章目录

    • 什么是Dropout
    • 理解缩放
    • 举个例子

什么是Dropout

Dropout 是神经网络的一种正则化技术,它在训练时以指定的概率 p p p(常见值为 p = 0.5 p=0.5 p=0.5)丢弃一个单元(连同连接)。在测试时,所有单元都存在,但权重按 p p p 缩放(即变为 p w pw pw)。

该思想是为了防止共同适应(co-adaptation),神经网络变得过于依赖特定的连接,因为这可能是过拟合的症状。直观上,Dropout 可以被认为是创建一个隐含的神经网络集合。

按照这个定义,PyTorch 的 nn.Dropout “使用来自伯努利分布的样本以概率 p p p 随机将输入张量的一些元素归零。 每个通道都将在每次转发呼叫时独立清零。”

Dropout 可以被认为是根据给定的概率 p p p 将输入张量中的一些元素随机归零。发生这种情况时,一部分输出将丢失。考虑到这一点,输出也按比例缩放 1 1 − p \frac{1}{1-p} 1p1

缩放使输入均值和输出均值大致相等。

理解缩放

可能很多人会对 Dropout 层如何缩放输入以及为什么要缩放输入感到困惑。这里详细解释一下。

PyTorch 官方文档 有指出:

此外,在训练期间,输出按 1 1 − p \frac{1}{1-p} 1p1 的比例缩放。这意味着在评估时,模块只是计算一个恒等函数。

那么这是如何完成的呢?为什么要这么做呢?让我们看一下 Pytorch 中的一些代码。

创建一个丢弃率 p = 0.4 p=0.4 p=0.4 的 Dropout 层 m

import torch
import numpy as np
p = 0.4
m = torch.nn.Dropout(p)

PyTorch 文档中解释道:

在训练期间,使用来自伯努利分布的样本以概率 p p p 随机将输入张量的某些元素归零。归零的元素在每次前向调用时随机化。

向 Dropout 层放置一个随机输入,并确认约 40% ( p = 0.4 p=0.4 p=0.4) 的元素已变为 0:

nbig = 5000000
inp = torch.rand(nbig, 10)
outp = m(inp)
print(f'输入中0元素的比例为: {(outp==0).numpy().mean():.5f}, p={p}')

上面代码运行后输出:

$ 输入中0元素的比例为: 0.40007, p=0.4

我们接着看一下缩放部分。

创建一个较小的随机输入并将其放入 Dropout 层。比较输入和输出:

np.random.seed(42)
inp = torch.rand(5, 4)
inp

上面代码创建一个5行4列的随机张量,输出如下:

$ tensor([[0.6485, 0.3114, 0.1626, 0.1022],
          [0.7352, 0.4634, 0.8206, 0.4228],
          [0.0322, 0.9399, 0.9163, 0.4169],
          [0.2574, 0.0467, 0.2213, 0.6171],
          [0.4146, 0.2288, 0.0388, 0.7752]])

我们可以在下面看到,通过比较下面两个张量中的非零元素,在训练期间输出按 1 1 − p \frac{1}{1-p} 1p1 倍缩放:

outp = m(inp)
inp/(1-p)
$ tensor([[1.0808, 0.5191, 0.2710, 0.1703],
          [1.2254, 0.7723, 1.3676, 0.7046],
          [0.0537, 1.5665, 1.5272, 0.6948],
          [0.4290, 0.0778, 0.3689, 1.0284],
          [0.6909, 0.3813, 0.0646, 1.2920]])

输出 output

$ tensor([[1.0808, 0.5191, 0.2710, 0.0000],
          [0.0000, 0.7723, 0.0000, 0.0000],
          [0.0000, 1.5665, 1.5272, 0.6948],
          [0.4290, 0.0778, 0.3689, 1.0284],
          [0.6909, 0.0000, 0.0646, 0.0000]])

我们可以在代码中断言该观察:

idx_nonzero = outp!=0
assert np.allclose(outp[idx_nonzero].numpy(), (inp/(1-p))[idx_nonzero].numpy())

那么为什么要这样做呢?

基本上,在评估/测试/推理期间,Dropout 层变成了一个恒等函数并且不改变它的输入。由于 Dropout 仅在训练期间处于活动状态而不在推理期间处于活动状态,因此在没有缩放的情况下,预期输出在推理期间会更大,因为元素不再被随机丢弃(设置为 0)。但是我们希望不管通过还是不通过 Dropout 层,预期输出都相同。因此,在训练期间,我们通过将 Dropout 层的输出放大 1 1 − p \frac{1}{1−p} 1p1 的比例因子来进行补偿。 p p p 越大意味着 Dropout 越激进,这意味着我们需要的补偿越多,即比例因子 1 1 − p \frac{1}{1−p} 1p1 越大。

下面的代码演示了比例因子如何将输出恢复到与输入相同的比例。

inp = torch.rand(nbig, 10)
outp = m(inp)
print(f'dropout 层的平均输出 ({outp.mean():.4f}) 接近平均输入 ({inp.mean():.4f})')
$ dropout 层的平均输出 (0.5000) 接近平均输入 (0.5000)

举个例子

下面通过一个包含 100 个张量的例子,演示 Dropout 及其缩放比例如何影响输入。

import torch
import torch.nn as nn

# 生成 100 个 1
x = torch.ones(100) 
$ tensor([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
          1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
          1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
          1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
          1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
          1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])

当丢弃率为 p = 0.1 p = 0.1 p=0.1 时,大约有 10 个值应该置为 0。缩放率为
1 1 − 0.1 = 1 0.9 = 1. 1 ˙ \frac{1}{1-0.1} = \frac{1}{0.9} = 1.\dot{1} 10.11=0.91=1.1˙

# 输入 Dropout 层
output = nn.Dropout(p=0.1)(x)     
$ tensor([1.1111, 1.1111, 1.1111, 1.1111, 1.1111, 1.1111, 1.1111, 1.1111, 1.1111,
         1.1111, 1.1111, 1.1111, 1.1111, 0.0000, 1.1111, 1.1111, 1.1111, 1.1111,
         1.1111, 0.0000, 0.0000, 1.1111, 0.0000, 1.1111, 1.1111, 1.1111, 1.1111,
         1.1111, 1.1111, 1.1111, 1.1111, 1.1111, 1.1111, 1.1111, 1.1111, 1.1111,
         1.1111, 1.1111, 0.0000, 1.1111, 1.1111, 1.1111, 1.1111, 1.1111, 1.1111,
         1.1111, 1.1111, 1.1111, 1.1111, 1.1111, 1.1111, 1.1111, 1.1111, 1.1111,
         1.1111, 1.1111, 1.1111, 0.0000, 1.1111, 1.1111, 1.1111, 1.1111, 1.1111,
         1.1111, 1.1111, 1.1111, 1.1111, 1.1111, 1.1111, 1.1111, 1.1111, 1.1111,
         1.1111, 1.1111, 0.0000, 1.1111, 1.1111, 1.1111, 1.1111, 0.0000, 0.0000,
         1.1111, 1.1111, 1.1111, 1.1111, 1.1111, 1.1111, 1.1111, 1.1111, 1.1111,
         1.1111, 1.1111, 1.1111, 1.1111, 1.1111, 0.0000, 1.1111, 1.1111, 1.1111,
         1.1111])

结果如我们预期所示,其中 10 个值被完全归零,结果被缩放以确保输入和输出具有相同的均值——或尽可能接近。

print(x.mean(), output.mean())
$ tensor(1.) tensor(1.0000)

在本例中,输入和输出的均值为 1.0。

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

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

相关文章

【JUC并发编程】

本笔记内容为狂神说JUC并发编程部分 目录 一、什么是JUC 二、线程和进程 1、概述 2、并发、并行 3、线程有几个状态 4、wait/sleep 区别 三、Lock锁(重点) 四、生产者和消费者问题 五、八锁现象 六、集合类不安全 七、Callable ( 简单 )…

windows10企业版安装西门子博途V15---03安装仿真软件

1、选点这个 2、进入03.SIMATIC_PLCSIM_Advanced_V3,这个是什么东西,它就是真实的硬件设备的仿真软件,也就是说,现在没有真正的PLC硬件,PLC是这样的东西,它是一个硬件产品,而现在不可能去买个硬…

TRUNCATE 语句到底因何而慢?

作者通过源码分析 truncate 语句形成慢 SQL 的原因和解决方案,并与 MySQL 5.7就相关实现逻辑进行对比。 问题现象 收到反馈某测试环境执行批量操作时,有 truncate 语句存在于慢查询日志中。担心上线后可能影响数据库,请求 DBA 配合分析。 …

第八章 模型篇:transfer learning for computer vision

参考教程: transfer-learning transfer-learning tutorial 文章目录 transfer learning对卷积网络进行finetune把卷积网络作为特征提取器何时、如何进行fine tune 代码示例加载数据集构建模型fine-tune 模型模型作为feature extractor 定义train_loop和test_loop定…

【K8S系列】如何高效查看 k8s日志

序言 你只管努力,其他交给时间,时间会证明一切。 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记一级论点蓝色:用来标记二级论点 Kubernetes (k8s) 是一个容器编排平台&#x…

【C#每日一记】多线程实现的贪吃蛇原理—不允许你还不知道

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

软件测试技能,JMeter压力测试教程(一)

目录 前言 一、安装Java环境 二、安装JMeter环境 三、启动JMeter脚本测试 四、查看报告文件 前言 使用jmeter做压测的时候,在windows上不太稳定,所有一直在 Linux 服务器上使用 jmeter 做压力测试 本篇记录下 Linux上搭建 jmeter 环境&#xff0c…

分布式学习第二天 redis学习

目录 1. 数据库类型 1.1 基本概念 1.2 关系/非关系型数据库搭配使用 2. Redis 2.1 基本知识点 2.2 redis常用命令 2.4 redis数据持久化 3 hiredis的使用 4. 复习 1. 数据库类型 1.1 基本概念 关系型数据库 - sql 操作数据必须要使用sql语句 数据存储在磁盘 存储的…

如何使用CDN给OSS做加速详解

意义 用户直接访问OSS资源,速度会受到OSS下行带宽以及Bucket地域的限制,若通过CDNOSS的方式进行访问,带宽上限更高,并且可以将OSS的资源缓存至就近的CDN节点,通过CDN节点进行分发,可以缩短网络传输距离&am…

Linux学习之CentOS(八)--Linux系统的分区概念

不知不觉已经记录了8篇Linux学习随笔了,虽然还是漂浮在Linux系统的表面,还有很多很多没有学,但是坚持学下去、坚持写下去就是成功的!!!! 在讲Linux系统分区之前,首先得介绍一下硬盘…

【SpringCloud】2.微服务的熔断和降级

目 录 1. 熔 断1.1 发生场景1.2 熔断实现1.3 熔断测试 2. 降 级2.1 发生场景2.2 降级处理2.3 降级测试 在 上篇博客,我们完成了项目的基本搭建工作,那这篇博客就来实现一下微服务的熔断和降级。 1. 熔 断 1.1 发生场景 在前面,我们用 spri…

【Java高级语法】(八)反射机制:有朋友问反射到底是怎样玩的?看完这篇文章你就清楚了~

Java高级语法详解之反射机制 :one: 概念:two: 优势和缺点:three: 使用3.1 Class类3.2 获取类的结构信息- 构造函数3.3 获取类的结构信息- 方法3.4 获取类的结构信息- 字段3.5 动态创建对象、调用方法和设置属性3.6 动态代理 :four: 底层原理:five: 应用场景:ear_of_rice: 总结:…

SedonaSQL 聚合函数使用说明

ST_Envelope_Aggr 函数说明: 返回几何的外边界 语法: ST_Envelope_Aggr (A:geometryColumn) 支持版本: v1.0.0 Spark SQL 举例说明: SELECT ST_Envelope_Aggr(pointdf.arealandmark) FROM pointdf运行示例(AggregateFunctionTest.java): ST_Intersection_Aggr 函数说明: …

大文件如何传输到电脑?亲测又快又简单!

我们平时可以因为各种原因,如更换新电脑、高清视频分享等,需要将大文件传输到另一台电脑上。大文件如何传输到电脑?相信这是很多朋友都想知道如何实现吧。我们为您提供了2种轻松将大文件从PC传输到PC的方法。话不多说,上技巧! 方…

腾讯云服务器地域有什么区别?怎么选比较好

腾讯云服务器地域有什么区别?云服务器地域怎么选择?地域是指云服务器所在机房的地理位置,用户距离地域越近网络延迟越低,速度越快,所以地域就近选择即可。广州上海北京等地域网站域名需要备案,中国香港或其…

SpringBoot使用MockMVC单元测试Controller

前言: 在SpringBoot应用程序中,Controller是接受客户端请求并返回响应数据的核心组件。为了保证Controller的正确性和稳定性,我们可以使用MockMVC框架进行单元测试。MockMVC是Spring框架提供的一个HTTP客户端,用于模拟HTTP请求和响…

2023年智能优化算法之——增长优化器Growth Optimizer(GO),附MATLAB代码

增长优化器的主要设计灵感来源于个人在社会成长过程中的学习和反思机制。学习是个体通过从外部世界获得知识而成长的过程。反思是检查个人自身不足并调整个人学习策略以帮助个人成长的过程。参考文献如下: Zhang, Qingke, et al. “Growth Optimizer: A Powerful M…

二维码在固定资产实物盘点中的应用

很多企业为了掌握固定资产的后续使用情况和状态,会定期对投入使用的固定资产进行盘点,然而固定资产常会出现分散情况,在这种情况下让财务人员到达每个固定资产的所在处进行实地盘点显得极为不现实。 也有不少企业会在盘点过程中使用到固定资…

聊天室(一)___常见的基本功能实现

最近搞聊天室的人还挺多,正好自己也弄就总结自己遇到必不可少的一些功能,本篇文章主要为自己和看到我文章的人一种思路,希望大家不要把聊天室想的太复杂。 上图是我自己做的一个聊天室,类似微信的单聊群聊收藏等功能,根…

python+requests接口自动化框架详解,没有比这个更详细的了

目录 为什么要做接口自动化框架 正常接口测试的流程是什么? 一、接口框架如下: 二、接口的数据规范设计---Case设计 2.1注册接口用例 2.2登录接口用例 三、创建utils包:用来存放公共的类 3.1 ParseExcel.py 操作封装excel的类&#xf…