深度学习回归任务要谨慎使用Dropout

目录

一. 回归问题要谨慎使用Dropout的原因

在做NLP的 _回归_任务时,若直接套用做分类问题的代码,仅仅修改损失函数,会发现验证损失一直在震荡波动,不收敛,但别人的代码loss却能够稳定下降,最终下降到0.1左右,而这个却一直飘,最终只能下降到0.14如下图:

深度学习回归任务要谨慎使用Dropout
通过对比别人的代码,发现主要是有两行代码的差异:
深度学习回归任务要谨慎使用Dropout
于是,尝试把bert内部的dropout全部关掉,最终得到以下的一个loss,对比可得,这个loss下降就非常平稳,模型收敛。
可是,dropout相当于ensemble,能随机砍掉一些结果,按理应该是能够防止过拟合,增加模型稳健性得,为什么这里用了dropout反而性能损失这么大?

原文:
为什么回归问题不能用Dropout

; 二. 原因阐述

回顾dropout用法:

dropout在训练时会以 p 的概率将隐藏层的神经元设置为0,同时会将其他神经元乘以 1/1-p, 保证输出期望的一致性。

然后推导一下dropout输出值的均值和方差,可以发现其经过dropout后,
均值并没有发生变化,而方差发生了变化。

由于经过dropout的输出还要经过非线性层(比如Linear + ReLU),非线性层可以理解为把它输入的一个分布转换成另外一个分布(ReLU其实就相当于把小于0的部分全部砍掉了),那它输出的均值没有发生改变, 但是方差发生了变化,这个变化就会导致非线性层输出的均值发生偏移,最终导致整个网络的输出值发生偏移。

也就是说, 如果使用了dropout,在训练时隐藏层神经元的输出的方差会验证时输出的方差不一致,这个方差的变化在经过非线性层的映射之后会导致输出值发生偏移,最终导致了在验证集的效果很差。

三. 总结

由于回归问题输出是一个绝对值,对这种变化就很敏感,但是分类问题输出只是一个相对的logit,对这种变化就没那么敏感,因此,在回归问题上最好可以少用dropout(看情况),而在分类问题上可以用dropout。

不过,根据上面的分析,其实dropout最好是不要加在网络的中间,在最后输出层前面加一般应该还是没问题的,不会有明显的性能损失,但也不会有提高,因此,回归任务要谨慎使用dropout。

四. 参考

  1. Pitfalls with Dropout and BatchNorm in regression problems | by Søren Rasmussen | Towards Data Science
  2. The Magic of No Dropout | Kaggle
  3. (PDF) Effect of Dropout Layer on Classical Regression Problems

Original: https://blog.csdn.net/qq_53250079/article/details/127360816
Author: 磨人的Big_data
Title: 深度学习回归任务要谨慎使用Dropout

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/634597/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球