作者 | BetterBench 出品 | 对白的算法屋 编者寄语:
搞懂Dropout和R-Drop看这篇就够了。
大家好,我是对白。
既上一篇R-Drop:提升有监督任务性能最简单的方法,很多小伙伴们都私信我说,让我介绍一下Dropout和R-Drop之间的区别。相信大家看完这篇后,当面试官再问时,就可以轻松应对啦!
1、引言
在ML中存在两类严重的问题:过拟合和学习时间开销大
当过拟合时,得到的模型会在训练集上有非常好的表现,但是对新数据的预测结果会非常的不理想。为了解决过拟合问题,通常会采用训练多个模型来解决单模过拟合的问题。但又会带来时间开销大的问题。Dropout就很好的解决了这个问题,在单模内防止过拟合。对于时间开销大的地方是梯度下降,学习率衰减可以解决梯度下降中时间开销的问题。
Dropout是在训练过程中,随机地忽略部分神经元,即是在正向传播的过程中,这些被忽略的神经元对下游神经元的贡献暂时消失,在反向传播时,这些神经元也不会有任何权重的更新。
2、Dropout使用技巧
(1)经过验证,隐含节点Dropout率等于0.5的时候最佳,此时Dropout随机生成的网络结构最多。Dropout也可以用在输入层,作为一种添加噪声的方法。输入层设为更接近1时,使得输入变化不会太大,比如0.8。
(2)通常在网络中Dropout率为0.2~0.5。0.2是一个很好的起点,太低的概率产生的作用有限,太高的概率可能导致网络的训练不充分。
(3)当在较大的网络上使用Dropout时,可能会获得更好的表现,因为Dropout降低了模型训练过程中的干扰
(4)在输入层和隐藏层上使用Dropout。或者在网络的每一层都使用Dropout能有更佳的效果。
(5)使用较高的学习率,使用学习率衰减和设置较大的动量值,将学习率提高10~100倍,且使用0.9或0.99的动量值。
Keras中,momentum就是动量值 sgd = SGD(lr=0.1,momentum=0.8,decay=0.0,nesterov=False)
(6)限制网络权重的大小,打的学习率可能导致非常大的网络权重,对网络权重大小进行约束,例如大小为4或5的最大范数正则化(Max-norm Regularizationi)。
Keras中,通过指定Dense中的kernel_constrain=maxnorm(x)来限制网络权重
参考资料:Dropout: A Simple Way to Prevent Neural Networks from Overfitting
3、Dropout的拓展R-Dropout
3.1 简介
简单来说就是模型中加入dropout,在训练阶段的预测阶段,用同样的数据预测两次,去追求两次的结果尽可能接近,这种接近体现在损失函数上。虽然是同样的数据,但是因为模型中Dropout是随机丢弃神经元,会导致两次丢弃的神经元不一样,从而预测的结果也会不一样。R-Dropout思想就是去实现控制两次预测尽量保持一致,从而去优化模型。除了在NLP领域,其他的NLU、NLG、CV的分类等多种任务上都对R-Drop做了对比实验,大部分实验效果都称得上“明显提升”。
3.2 使用方法
和普通的Dropout方法不同,有封装的API可以一行代码使用。R-Dropout的使用需要自定义模型的输入和损失函数。举例如下,参考NLP 中Pytorch 实现R-Dropout
代码语言:javascript复制# define your task model, which outputs the classifier logits
model = TaskModel()
def compute_kl_loss(self, p, q pad_mask=None):
p_loss = F.kl_div(F.log_softmax(p, dim=-1), F.softmax(q, dim=-1), reduction='none')
q_loss = F.kl_div(F.log_softmax(q, dim=-1), F.softmax(p, dim=-1), reduction='none')
# pad_mask is for seq-level tasks
if pad_mask is not None:
p_loss.masked_fill_(pad_mask, 0.)
q_loss.masked_fill_(pad_mask, 0.)
# You can choose whether to use function "sum" and "mean" depending on your task
p_loss = p_loss.sum()
q_loss = q_loss.sum()
loss = (p_loss q_loss) / 2
return loss
# keep dropout and forward twice
logits = model(x)
logits2 = model(x)
# cross entropy loss for classifier
ce_loss = 0.5 * (cross_entropy_loss(logits, label) cross_entropy_loss(logits2, label))
kl_loss = compute_kl_loss(logits, logits2)
# carefully choose hyper-parameters
loss = ce_loss α * kl_loss
你好,我是对白,硕士毕业于清华,现大厂算法工程师,拿过八家大厂的SSP级以上offer。
高中荣获全国数学和化学竞赛二等奖。
本科时独立创业五年,成立两家公司,并拿过总计三百多万元融资(已到账),项目入选南京321高层次创业人才引进计划。创业做过无人机、机器人和互联网教育,保研后选择退居为股东。
我每周至少更新三篇原创,分享自己的算法技术、创业心得和人生感悟。