深度学习正则化之Dropout

发布时间 2023-04-16 22:44:51作者: LeonYi

一、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集成近似)

 

未完待续:
(15条消息) PyTorch的F.dropout为什么要加self.training?_诸神缄默不语的博客-CSDN博客
不加train的话,相当于没有用dropout
(15条消息) F.dropout,nn.Dropout的验证使用,参数training,inplace_LUQC638的博客-CSDN博客
贝叶斯学习角度的解释
      丢弃法也可以解释为一种贝叶斯学习的近似。用? = ?(?; ?)来表示要学习的神经网络,贝叶斯学习是假设参数? 为随机向量,并且先验分布为?(?),贝叶斯方法的预测为:
0
其中?(?, ??)为第?次应用丢弃方法后的网络,其参数?? 为对全部参数?的一次采样