神经网络中的随机失活方法(神经网络的随机性)
ztj100 2025-07-20 00:01 12 浏览 0 评论
1. Dropout
如果模型参数过多,而训练样本过少,容易陷入过拟合。过拟合的表现主要是:在训练数据集上 loss 比较小,准确率比较高,但是在测试数据上 loss 比较大,准确率比较低。Dropout 可以比较有效地缓解模型的过拟合问题,起到正则化的作用。Dropout,中文是随机失活,是一个简单又机器有效的正则化方法,可以和 L1 正则化、L2 正则化和最大范数约束等方法互为补充。在训练过程中,Dropout 的实现是让神经元以超参数 pp 的概率停止工作或者激活被置为 0,
在训练过程中,Dropout 会随机失活,可以被认为是对完整的神经网络的一些子集进行训练,每次基于输入数据只更新子网络的参数。
在测试过程中,不进行随机失活,而是将 Dropout 的参数 p 乘以输出。
再来看 Dropout 论文中涉及到的一些实验:
上图是作者在 MNIST 数据集上进行的 Dropout 实验,可以看到 Dropout 可以破坏隐藏层单元之间的协同适应性,使得在使用 Dropout 后的神经网络提取的特征更加明确,增加了模型的泛化能力。另外可以从神经元之间的关系来解释 Dropout,使用 Dropout 能够随机让一些神经元临时不参与计算,这样的条件下可以减少神经元之间的依赖,权值的更新不再依赖固有关系的隐含节点的共同作用,这样会迫使网络去学习更加鲁棒的特征。再看一组实验,在隐藏层神经元数目不变的情况下,调节参数 p,观察对训练集和测试集上效果的影响。
以上实验是对 MNIST 数据集进行的实验,随着 p 的增加, 测试误差先降后升,p 在 [0.4, 0.8] 之间的时候效果最好,通常 p 默认值会被设为 0.5。
还有一组实验是通过调整数据集判断 Dropout 对模型的影响:
在数据量比较少的时候,Dropout 并没有给模型带来性能上的提升,但是在数据量变大的时候,Dropout 则会带来比较明显的提升,这说明 Dropout 有一定正则化的作用,可以防止模型过拟合。
在 pytorch 中对应的 Dropout 实现如下:
m = nn.Dropout(p=0.2)
input = torch.randn(20, 16)
output = m(input)
torch.nn.Dropout(p=0.5, inplace=False)
- p – probability of an element to be zeroed. Default: 0.5
- inplace – If set to True, will do this operation in-place. Default: False
对 input 没有任何要求,也就是说 Linear 可以,卷积层也可以。
2. Spatial Dropout
普通的 Dropout 会将部分元素失活,而 Spatial Dropout 则是随机将部分区域失失活, 这部分参考参考文献中的【2】,简单理解就是通道随机失活。一般很少用普通的 Dropout 来处理卷积层,这样效果往往不会很理想,原因可能是卷积层的激活是空间上关联的,使用 Dropout 以后信息仍然能够通过卷积网络传输。而 Spatial Dropout 直接随机选取 feature map 中的 channel 进行 dropout,可以让 channel 之间减少互相的依赖关系。
在 pytorch 中对应 Spatial Dropout 实现如下:
torch.nn.Dropout2d(p=0.5, inplace=False)
- p (python:float, optional) – probability of an element to be zero-ed.
- inplace (bool, optional) – If set to True, will do this operation in-place
对输入输出有一定要求:
- input shape: (N, C, H, W)
- output shape: (N, C, H, W)
m = nn.Dropout2d(p=0.2)
input = torch.randn(20, 16, 32, 32)
output = m(input)
此外对 3D feature map 中也有对应的 torch.nn.Dropout3d 函数,和以上使用方法除输入输出为 (N, C, D, H, W) 以外,其他均相同。
3. Stochastic Depth
在 DenseNet 之前提出,随机将 ResNet 中的一部分 Res Block 失活,实际操作和 Dropout 也很类似。在训练的过程中任意丢失一些 Block, 在测试的过程中使用所有的 block。使用这种方式, 在训练时使用较浅的深度 (随机在 resnet 的基础上跳过一些层),在测试时使用较深的深度,较少训练时间,提高训练性能,最终在四个数据集上都超过了 ResNet 原有的性能 (cifar-10, cifar-100, SVHN, imageNet)
4. DropBlock
一句话概括就是: 在每个 feature map 上按 spatial 块随机设置失活。
Dropout 对卷积层的效果没那么好(见图 (b))。文章认为是由于每个 feature map 中的点都对应一个感受野范围,仅仅对单个像素位置进行 Dropout 并不能降低 feature map 学习的特征范围,网络依然可以通过失活位置相邻元素学习对应的语义信息。所以作者提出一块一块的失活(见图 (c)), 这种操作就是 DropBlock.
DropBlock 有三个重要的参数:
- block size 控制 block 的大小
- γ 控制有多少个 channel 要进行 DropBlock
- keep prob 类别 Dropout 中的 p, 以一定的概率失活
经过实验,可以证明 block size 控制大小最好在 7x7, keep prob 在整个训练过程中从 1 逐渐衰减到指定阈值比较好。
5. Cutout
Cutout 和 DropBlock 非常相似,也是一个非常简单的正则化手段,下图是论文中对 CIFAR10 数据集进行的处理,移除输入图片中的一块连续区域。
此外作者也针对移除块的大小影响进行了实验,如下图:
可以看出,对 CIFAR-10 数据集来说,随着 patch length 的增加,准确率是先升后降。
可见在使用了 Cutout 后可以提高神经网络的鲁棒性和整体性能,并且这种方法还可以和其他正则化方法配合使用。不过如何选取合适的 Patch 和数据集有非常强的相关关系,如果想用 Cutout 进行实验,需要针对 Patch Length 做一些实验。
扩展:最新出的一篇 Attentive CutMix 中的有一个图很吸引人。作者知乎亲自答:
https://zhuanlan.zhihu.com/p/122296738
Attentive CutMix 具体做法如下如所示:
将原图划分为 7x7 的格子,然后通过一个小的网络得到热图,然后计算 49 个格子中 top N 个置信度最高的格子, 从输入图片中将这些网格对应的区域裁剪下来,覆盖到另一张待融合的图片上,用于训练神经网络。Ground Truth 的 Label 也会根据融合的图片的类别和剪切的区域的大小比例而相应修改。至于上图猫和狗面部的重合应该是一个巧合。
6. DropConnect
DropConnect 也是 Dropout 的衍生品,两者相似处在于都是对全连接层进行处理(DropConnect 只能用于全连接层而 Dropout 可以用于全连接层和卷积层),两者主要差别在于:
- Dropout 是对激活的 activation 进行处理,将一些激活随机失活,从而让神经元学到更加独立的特征,增加了网络的鲁棒性。
- DropConnect 则是对链接矩阵的处理,具体对比可以看下图。
DropConnect 训练的时候和 Dropout 很相似,是随机采样一个矩阵 M 作为 Mask 矩阵(值为 0 或者 1),然后施加到 W 上。
7. 总结
本文属于一篇的科普文,其中有很多细节、公式还需要去论文中仔细品读。
在 CS231N 课程中,讲到 Dropout 的时候引申出来了非常多的这种类似的思想,其核心就是减少神经元互相的依赖,从而提升模型鲁棒性。和 Dropout 的改进非常相似的有 Batch Normalization 的一系列改进(这部分启发自知乎 @mileistone):
一个 feature map 的 shape 为 [N, C, H, W]
- Batch Norm 是从 NHW 三个维度进行归一化
- Layer Norm 是从 CHW 三个维度进行归一化
- Instance Norm 是从 HW 两个维度进行归一化
- Group Nrom 是从CpartHWCpartHW 上做归一化,将 C 分为几个独立的部分。
与之类似的 Drop 系列操作(shape=[N, C, H, W]):
- Dropout 是将 NCHW 中所有的特征进行随机失活, 以像素为单位。
- Spatial Dropout 是随机将 CHW 的特征进行随机失活,以 channel 为单位。
- DropBlock 是随机将C[HW]partC[HW]part 的特征进行随机失活,以 HW 中一部分为单位。
- Stochastic Depth 是随机跳过一个 Res Block, 单位更大。
8. 参考文献
【1】 Dropout: A simple way to prevent neural networks from overfitting
【2】 Efficient object localization using convolutional networks.
【3】 Deep networks with stochastic depth.
【4】 DropBlock: A regularization method for convolutional networks.
【5】 Improved regularization of convolutional neural networks with cutout
【6】 Regularization of Neural Network using DropConnect
【7】Attentive CutMix:
https://arxiv.org/pdf/2003.13048.pdf
【8】
https://www.zhihu.com/question/300940578
相关推荐
- Linux集群自动化监控系统Zabbix集群搭建到实战
-
自动化监控系统...
- systemd是什么如何使用_systemd/system
-
systemd是什么如何使用简介Systemd是一个在现代Linux发行版中广泛使用的系统和服务管理器。它负责启动系统并管理系统中运行的服务和进程。使用管理服务systemd可以用来启动、停止、...
- Linux服务器日常巡检脚本分享_linux服务器监控脚本
-
Linux系统日常巡检脚本,巡检内容包含了,磁盘,...
- 7,MySQL管理员用户管理_mysql 管理员用户
-
一、首次设置密码1.初始化时设置(推荐)mysqld--initialize--user=mysql--datadir=/data/3306/data--basedir=/usr/local...
- Python数据库编程教程:第 1 章 数据库基础与 Python 连接入门
-
1.1数据库的核心概念在开始Python数据库编程之前,我们需要先理解几个核心概念。数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它就像一个电子化的文件柜,能让我们高效...
- Linux自定义开机自启动服务脚本_linux添加开机自启动脚本
-
设置WGCloud开机自动启动服务init.d目录下新建脚本在/etc/rc.d/init.d新建启动脚本wgcloudstart.sh,内容如下...
- linux系统启动流程和服务管理,带你进去系统的世界
-
Linux启动流程Rhel6启动过程:开机自检bios-->MBR引导-->GRUB菜单-->加载内核-->init进程初始化Rhel7启动过程:开机自检BIOS-->M...
- CentOS7系统如何修改主机名_centos更改主机名称
-
请关注本头条号,每天坚持更新原创干货技术文章。如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习1.前言本文将讲解CentOS7系统如何修改主机名。...
- 前端工程师需要熟悉的Linux服务器(SSH 终端操作)指令
-
在Linux服务器管理中,SSH(SecureShell)是远程操作的核心工具。以下是SSH终端操作的常用命令和技巧,涵盖连接、文件操作、系统管理等场景:一、SSH连接服务器1.基本连接...
- Linux开机自启服务完全指南:3步搞定系统服务管理器配置
-
为什么需要配置开机自启?想象一下:电商服务器重启后,MySQL和Nginx没自动启动,整个网站瘫痪!这就是为什么开机自启是Linux运维的必备技能。自启服务能确保核心程序在系统启动时自动运行,避免人工...
- Kubernetes 高可用(HA)集群部署指南
-
Kubernetes高可用(HA)集群部署指南本指南涵盖从概念理解、架构选择,到kubeadm高可用部署、生产优化、监控备份和运维的全流程,适用于希望搭建稳定、生产级Kubernetes集群...
- Linux项目开发,你必须了解Systemd服务!
-
1.Systemd简介...
- Linux系统systemd服务管理工具使用技巧
-
简介:在Linux系统里,systemd就像是所有进程的“源头”,它可是系统中PID值为1的进程哟。systemd其实是一堆工具的组合,它的作用可不止是启动操作系统这么简单,像后台服务...
- Linux下NetworkManager和network的和平共处
-
简介我们在使用CentoOS系统时偶尔会遇到配置都正确但network启动不了的问题,这问题经常是由NetworkManager引起的,关闭NetworkManage并取消开机启动network就能正...
你 发表评论:
欢迎- 一周热门
-
-
MySQL中这14个小玩意,让人眼前一亮!
-
旗舰机新标杆 OPPO Find X2系列正式发布 售价5499元起
-
面试官:使用int类型做加减操作,是线程安全吗
-
C++编程知识:ToString()字符串转换你用正确了吗?
-
【Spring Boot】WebSocket 的 6 种集成方式
-
PyTorch 深度学习实战(26):多目标强化学习Multi-Objective RL
-
pytorch中的 scatter_()函数使用和详解
-
与 Java 17 相比,Java 21 究竟有多快?
-
基于TensorRT_LLM的大模型推理加速与OpenAI兼容服务优化
-
这一次,彻底搞懂Java并发包中的Atomic原子类
-
- 最近发表
-
- Linux集群自动化监控系统Zabbix集群搭建到实战
- systemd是什么如何使用_systemd/system
- Linux服务器日常巡检脚本分享_linux服务器监控脚本
- 7,MySQL管理员用户管理_mysql 管理员用户
- Python数据库编程教程:第 1 章 数据库基础与 Python 连接入门
- Linux自定义开机自启动服务脚本_linux添加开机自启动脚本
- linux系统启动流程和服务管理,带你进去系统的世界
- CentOS7系统如何修改主机名_centos更改主机名称
- 前端工程师需要熟悉的Linux服务器(SSH 终端操作)指令
- Linux开机自启服务完全指南:3步搞定系统服务管理器配置
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)