【深度学习】神经网络正则化方法之Dropout
1.【优化算法】从梯度下降到深度学习非凸优化
2.【深度学习】神经网络正则化方法之Dropout
3.【深度学习基础】基于Numpy的循环神经网络实现和反向传播训练4.【深度学习基础】基于Numpy在Minst上实现CNN反向传播训练5.【深度学习基础】基于Numpy的前馈神经网络(FFN)的构建和反向传播训练6.【深度学习基础】深度神经网络的参数初始化方法7.【深度学习基础】基于Numpy的感知机Perception构建和训练8.【大语言模型基础】-详解Transformer原理9.【预训练语言模型】使用Transformers库进行GPT2预训练10.【预训练语言模型】 使用Transformers库进行BERT预训练前言
正则化是一种广泛用于机器学习和深度学习的手段,它的目的就是阻碍模型过度学习(过拟合),从而提升算法的泛化能力。
Dropout 是一种常见的缓解过拟合的方法。接下来,本文将从原理和实践来介绍Dropout技术。
一、Dropout原理
丢弃法(Dropout Method):在训练一个深度神经网络时,可以随机丢弃一部分神经元(同时丢弃其对应的连接边)来避免过拟合。
训练时,每次选择丢弃的神经元是随机的,这些随机选出隐藏层的神经元将被删除,它们将不再传递信号。

常规dropout
(训练测试不一致,测试时调整输入保持一致)
设置一个固定的概率𝑝,对每一个神经元都以概率𝑝 来判定不要保留。对于一个神经层𝒚 = 𝑓(𝑾𝒙 + 𝒃),可引入一个掩蔽函数mask(⋅) 使得𝒚 = 𝑓(𝑾mask(𝒙) + 𝒃)。掩蔽函数mask(⋅)的定义为:

但在测试时,所有神经元都可激活,这会造成训练和测试时网络的输出不一致。为了缓解这个问题,在测试时需要将神经层的输入𝒙 乘以 𝑝,也相当于把不同的神经网络做了平均。(这里的p为保留率)
二、Dropout实现
每次正向传播时,self.mask中都会以False的形式保存要删除的神经元。
self.mask会随机生成和x形状相同的数组,并将值比dropout_ratio大的元素设为True。反向传播时的行为和ReLU相同。
也就是说,正向传播时传递了信号的神经元,反向传播时按原样传递信号;对于正向传播时没有传递信号的神经元,反向传播时信号将停止
大于丢弃率则保留 (不训练时乘以 1-p,保持输出期望不变)
实际dropout
在训练时就缩放,不改变其输入期望
实际在Pytorch中。F.dropout 是一个函数,参数包含输入的tensor,概率和training 为真还是假:
- training 为真时,才会将一部分元素置为0,其他元素会乘以 scale 1/(1-p).
- training 为false时,dropout直接就不起作用。默认情况下training是True。
实际操作:
- 对于输入层的神经元,其保留率通常设为更接近1的数,使得输入变化不会太大。对输入层神经元进行丢弃时,相当于给数据增加噪声,以此来提高网络的鲁棒性。
- 一般来讲,对于 中间隐藏层的神经元,其𝑝 = 0.5 时效果最好,这对大部分的网络和任务都比较有效。当𝑝 = 0.5时,在训练时有一半的神经元被丢弃,只剩余一半的神经元是可以激活的,随机生成的网络结构最具多样性。
- 输出层一般就不加了
集成学习角度的解释
每做一次丢弃,相当于从原始的网络中采样得到一个子网络。如果一个神经网络有𝑛 个神经元,那么总共可以采样出 2𝑛 个子网络。每次迭代都相当于训练一个不同的子网络,这些子网络都共享原始网络的参数。
那么,最终的网络可以近似看作集成了指数级个不同网络的组合模型。(子网络的平均,Dropout提供了一种廉价的Bagging集成近似)
参考内容
不加train的话,相当于没有用dropout
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?