欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

深度学习笔记之——揭秘dropout,带你有深度地了解dropout

程序员文章站 2022-03-06 21:23:40
...

什么是Dropout

Dropout是在神经网络中广泛应用的一种正则化技术,也可以称之为一个小Trick。由Hinton在其论文《Improving neural networks by preventing co-adaptation of feature detectors》中首次提出,并应用在CNN中,最终以优异的成绩取得2012年的ImageNet比赛冠军。

为什么要用Dropout

随着深度学习的兴起,神经网络的层数越来越多,规模越来越大,但是一般情况下,拿计算机视觉领域来说,获取样本的成本相对较高,使用大规模数据训练模型不太现实。当训练样本比较少,而网络规模又比较大时,就容易发生过拟合,也就是我们的模型过度依赖训练集的数据,缺乏泛化能力,这样的模型对我们来说没有利用价值。因此,研究人员们提出了各种各样的方法来避免overfitting,dropout就是其中之一。

Dropout工作原理

在论文中,Hinton说,dropout是通过削弱各神经元之间的相互作用关系来达到减弱过拟合的作用。如果程序中添加了dropout,每次进行前向传播的时候,都会随机使一部分神经元失活,如下图所示,不能将参数传递到下一层参与运算,最终损失函数计算出的结果也不包括失活掉的神经元的影响。反向传播更新梯度的时候,使用dropout后的损失进行反向传播也会忽略掉失活的神经元,这样一来,经过一轮计算,只有没有dropout掉的神经元的权重参数进行了更新,dropout掉的神经元保持原样。然后进行下一轮,重新随机dropout一批神经元,直到网络迭代完成。一般情况下,dropout运用在隐藏层中,但有时也应用在输入层中,即只给模型随机输入部分特征。在程序中是按照一定概率dropout的,因此这里会有一个超参数——keep-prob,keep-prob是一个介于0~1之间的浮点数,表示保留神经元的概率(即如果某一层有100个神经元,keep-prob设为0.2,则会有80个神经元被失活)。

Dropout如何达到正则化的效果

如上图所示,dropout每次按照一定概率失活一定数量的神经元,从某种意义上来说,这是不是将模型的规模缩小了呢?是的,模型这不是被我们缩小了嘛,在第二节中我们就说到因为模型太大训练数据太少导致的过拟合,现在我们将模型缩小了,不就在一定程度上缓解了过拟合的现象了嘛。
但是注意,dropout是随机的,我们每次更新都相当于是在不同的模型上进行,那最终训练出来的是什么呢?我个人认为应该是相当于很多种模型的集合吧,也就是模型集成。这又回来了,在dropout出现之前,研究人员为了缓解过拟合的现象,会训练多个模型,然后求平均。因为不同的模型过拟合的程度和方向都可能不同,多个模型过拟合的作用可能会相互抵消。经过实践证明,这种方法是可行的。除此之外,dropout的另一个作用就是破坏了神经网络的全连接性,每次都是学到部分特征,我认为这做了数据增强的工作,因为每次学习到的特征我们都是不知道的,这些随机特征的组合在一定程度上增加了样本的数量。
现在来看,dropout做了几种正则化方法的工作,有数据增强、模型集合、缩小模型规模。这也难怪dropout在预防过拟合上效果这么明显,这么流行。

dropout Python代码

// dropout
r = np.random.rand(tf.shape(w[l]));
a[l] = r * a[l];
a[l+1] = w[l+1] * a[l] + b[l+1]

note:代码仅仅提供思路,不可直接复制粘贴

Reference

[1]: 《Improving neural networks by preventing co-adaptation of feature detectors》
[2]: https://zhuanlan.zhihu.com/p/38200980