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

目录

  • 一. 回归问题要谨慎使用Dropout的原因
  • 二. 原因阐述
  • 三. 总结
  • 四. 参考

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

在做NLP的回归任务时,若直接套用做分类问题的代码,仅仅修改损失函数,会发现验证损失一直在震荡波动,不收敛,但别人的代码loss却能够稳定下降,最终下降到0.1左右,而这个却一直飘,最终只能下降到0.14如下图:
深度学习回归任务要谨慎使用Dropout_第1张图片
通过对比别人的代码,发现主要是有两行代码的差异:
深度学习回归任务要谨慎使用Dropout_第2张图片
于是,尝试把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

你可能感兴趣的:(深度学习,机器学习,人工智能)