【深度学习】神经网络正则化方法之Dropout

前言

       正则化是一种广泛用于机器学习和深度学习的手段,它的目的就是阻碍模型过度学习(过拟合),从而提升算法的泛化能力。

       Dropout 是一种常见的缓解过拟合的方法。接下来,本文将从原理和实践来介绍Dropout技术。

一、Dropout原理

      丢弃法(Dropout Method):在训练一个深度神经网络时,可以随机丢弃一部分神经元(同时丢弃其对应的连接边)来避免过拟合
训练时,每次选择丢弃的神经元是随机的,这些随机选出隐藏层的神经元将被删除,它们将不再传递信号。
0
 
常规dropout
(训练测试不一致,测试时调整输入保持一致)     
设置一个固定的概率𝑝,对每一个神经元都以概率𝑝 来判定不要保留。对于一个神经层𝒚 = 𝑓(𝑾𝒙 + 𝒃),可引入一个掩蔽函数mask(⋅) 使得𝒚 = 𝑓(𝑾mask(𝒙) + 𝒃)。掩蔽函数mask(⋅)的定义为:
0
      但在测试时,所有神经元都可激活,这会造成训练和测试时网络的输出不一致。为了缓解这个问题,在测试时需要将神经层的输入𝒙 乘以 𝑝,也相当于把不同的神经网络做了平均。(这里的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
 
posted @ 2023-04-16 22:35  LeonYi  阅读(173)  评论(0编辑  收藏  举报