来源:投稿 作者:梦飞翔
编辑:学姐
为什么提出这种方法?
神经网络在训练过程中,由于正负样本不均衡、样本特征显著性不足、训练参数不合适等原因会导致发生过拟合现象,即模型参数陷入局部最优,仅对训练集中样本有较好预测能力,对于其他数据表现会非常差。因此,需要引入正则化(Normalization)改善网络训练过程。DropOut方法便是由此而生,被用来缓解网络过拟合风险。
这种方法本质是什么?
本质是通过随机删除部分神经元(特征)及其对应连接,实现对网络特征提取的随机修正,这种过程被称作随机正则化,过程如Figure1所示。
作者称,这种思想来源于人工智能领域的遗传算法,通过随机变异的方式,来促进整个种群的整体进化,个人理解可以通过式1进行表示,在n个参数的某种配置下,预测结果可能接近参考结果,然而此时的目标函数可能处于凸优化中的一个鞍点(局部最优),此时,只需随机改变数个参数,所有的参数都将被迫随之改变,进入下一轮的优化过程:
如何实现?
这里以Pytorch为例,Dropout在实现里面被设置成一种方法对象的形式,即先定义方法构成对象,再用来处理数据,这里附上Pytorch的官方教程链接
(https://pytorch.org/docs/master/generated/torch.nn.Dropout.html?highlight=dropout#torch.nn.Dropout)
简要描述一下,即先定义随机丢弃率(p),是否采用再赋值方式调用(inplace),以及最为重要的训练过程指示标志(training),在训练过程结束后,一定要注意将该标志改为false,否则,在验证过程中,它依旧会进行随机的特征丢弃,大大降低网络模型所表现出的性能。
快速调用可以写作:
>>> m = nn.Dropout(p=0.2)
>>> input = torch.randn(20, 16)
>>> output = m(input)
其中,第一句话为生成方法对象,第二句随机生成一个例子tensor,第三句实现dropout,input在真实项目中即为动态网某层输出。
据我在使用过程中的经验,dropout一般在浅层网络尽量少的使用,因为过拟合一般是在深层网络中出现,浅层网络一般属于欠拟合问题。
深浅的界限因人而异,据我观察,在Res16、Res32中,如果在网络特征提取过程中引入dropout,会降低网络性能,在Res32最后的全连接层加入,会有小幅性能提升。
Res50中,在网络中游加入,可以产生一定正向影响,综上所述,我个人认为深层浅层大概是以50层为界限,当然,ResNet独特的残差连接(skip connection)可以提高网络的训练效果,因此可能效果不是特别明显,在VGG这种密集FCN里面的效果可就大展神威了,通过这里也可以看出,网络模型不是越深越强,根据任务选择最合适的层数会有事半功倍的效果!
结果如何?
作者给出了规范的对比表格,其中,MNIST简单手写数字数据集结果:
对于彩色视觉数据集:
其他的不在一一赘述,有兴趣可以直接参考论文原文:
《Dropout: A Simple Way to Prevent Neural Networks from Overfitting》。
总结
Dropout这是一种非常好用,实现也简单的减弱过拟合风险的方法,个人实验发现的已知适用场景:数据量大却特征显著性不足、网络模型深不易训练。如果百尺竿头了,也许能利用它更进一步!
关注学姐👇👇👇每日分享大佬经验+AI干货资源