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

在回归问题中,直接应用Dropout可能导致模型在验证时损失震荡不收敛。这是因为Dropout改变了输出的方差,影响非线性层的输出均值,导致回归值的偏移。分类问题对这种变化不那么敏感,但在回归问题中,由于输出是绝对值,对模型性能影响较大。因此,回归任务中应谨慎使用dropout,特别是在网络中间层,而在输出层前使用可能影响较小。
摘要由CSDN通过智能技术生成

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值