深度学习Dropout技术分析
阅读原文时间:2023年07月09日阅读:1

深度学习Dropout技术分析

什么是Dropout?

dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而每一个mini-batch都在训练不同的网络。dropout是CNN中防止过拟合提高效果的一个大杀器,但对于其为何有效,却众说纷纭。在下读到两篇代表性的论文,代表两种不同的观点,特此分享给大家。

从神经网络的难题出发,一步一步引出dropout为何有效的解释。大规模的神经网络有两个缺点:

1)费时

2)容易过拟合

这两个缺点真是抱在深度学习大腿上的两个大包袱,一左一右,相得益彰,额不,臭气相投。过拟合是很多机器学习的通病,过拟合了,得到的模型基本就废了。而为了解决过拟合问题,一般会采用ensemble方法,即训练多个模型做组合,此时,费时就成为一个大问题,不仅训练起来费时,测试起来多个模型也很费时。总之,几乎形成了一个死锁。

当一个复杂的前馈神经网络被训练在小的数据集时,容易造成过拟合。为了防止过拟合,可以通过阻止特征检测器的共同作用来提高神经网络的性能。

当一个复杂的前馈神经网络被训练在小的数据集时,容易造成过拟合。为了防止过拟合,可以通过阻止特征检测器的共同作用来提高神经网络的性能。

在机器学习的模型中,如果模型的参数太多,而训练样本又太少,训练出来的模型很容易产生过拟合的现象。在训练神经网络的时候经常会遇到过拟合的问题,过拟合具体表现在:模型在训练数据上损失函数较小,预测准确率较高;但是在测试数据上损失函数比较大,预测准确率较低。过拟合是很多机器学习的通病。如果模型过拟合,那么得到的模型几乎不能用。为了解决过拟合问题,一般会采用模型集成的方法,即训练多个模型进行组合。此时,训练模型费时就成为一个很大的问题,不仅训练多个模型费时,测试多个模型也是很费时。综上所述,训练深度神经网络的时候,总是会遇到两大缺点:(1)容易过拟合(2)费时Dropout可以比较有效的缓解过拟合的发生,在一定程度上达到正则化的效果。

深入了解DNNs,CNNs以及RNNs中的Dropout来进行正则化,蒙特卡洛不确定性和模型压缩的方法。

在深度机器学习中训练一个模型的主要挑战之一是协同适应。这意味着神经元是相互依赖的。他们对彼此的影响相当大,相对于他们的输入还不够独立。也经常发现一些神经元具有比其他神经元更重要的预测能力的情况。换句话说,会过度依赖于个别的神经元的输出。

这些影响必须避免,权重必须具有一定的分布,以防止过拟合。某些神经元的协同适应和高预测能力可以通过不同的正则化方法进行调节。其中最常用的是Dropout。然而,dropout方法的全部功能很少被使用。

取决于它是DNN,一个CNN或一个RNN,不同的dropout方法可以被应用。在实践中,只(或几乎)使用一个。我认为这是一个可怕的陷阱。所以在本文中,将从数学和可视化上深入到dropouts的世界中去理解:

·   标准的Dropout方法

·   标准Dropout的变体

·   用在CNNs上的dropout方法

·   用在RNNs上的dropout方法

·   其他的dropout应用(蒙特卡洛和压缩)

符号

标准的Dropout

最常用的dropout方法是Hinton等人在2012年推出的Standard dropout。通常简单地称为“Dropout”,由于显而易见的原因,在本文中将称之为标准的Dropout。

为了防止训练阶段的过拟合,随机去掉神经元。在一个密集的(或全连接的)网络中,对于每一层,给出了一个dropout的概率p。在每次迭代中,每个神经元被去掉的概率为p。Hinton等人的论文建议,输入层的dropout概率为“p=0.2”,隐藏层的dropout概率为“p=0.5”。显然,对输出层感兴趣,这是的预测。所以不会在输出层应用dropout。

数学上,说每个神经元的丢弃概率遵循概率p伯努利分布。因此,用一个mask对神经元向量(层)进行了一个元素级的操作,其中每个元素都是遵循伯努利分布的随机变量。

测试(或推断)阶段,没有dropout。所有的神经元都是活跃的。为了补偿与训练阶段相比较的额外信息,用出现的概率来衡加权权重。所以神经元没有被忽略的概率,是“1 - p”。

DropConnect

也许你已经熟悉标准的Dropout方法。但也有很多变化。要对密集网络的前向传递进行正则,可以在神经元上应用dropout。L. Wan等人介绍的DropConnect没有直接在神经元上应用dropout,而是应用在连接这些神经元的权重和偏置上。

因此,找到了与标准Dropout方法相同的机制。除了掩码(它的元素是遵循一个分布的随机变量)不是应用在某一层的神经元向量上,而是应用在连接该层与前一层的权重矩阵上。

对于测试阶段,可以使用与标准Dropout方法相同的逻辑。可以乘以出现的概率。但这并不是L. Wan等人提出的方法。他们提出了一个很有趣的随机方法,即使在测试阶段也是如此,他们采用了DropConnect的高斯近似。然后由从这个高斯表示中随机采样样本。会在Standout之后回到高斯近似。

Standout

L. J. Ba和B. Frey介绍的Standout是一个标准的Dropout方法,基于一个Bernoulli mask(我将根据它们遵循的分布来命名这些mask,这样会更简单)。不同之处在于,神经元被遗漏的概率p在这一层中并不恒定。根据权重的值,它是自适应的

这可以适用于任何g激活函数,甚至是一个单独的神经网络。类似地,对于Ws,可以是一个W的函数。然后在测试阶段,根据存在的可能性进行平衡。

这样不是很清楚,举个例子。在他们的论文中,他们表明在实践中,置信网络的权值可以近似为权值的仿射函数。例如,我取s的绝对值作为激活函数。

因此,可以看到,权重越大,神经元被丢弃的概率就越大。这有力地限制了某些神经元可能具有的高预测能力。

Gaussian Dropout

应用于神经网络的dropout方法在继续增长。所以,在讨论DNNs以外的其他东西之前,我想先谈谈一种dropout方法,它当然是最吸引人的。

举几个例子,Fast Dropout, 变分DropoutConcrete Dropout是从贝叶斯角度解释Dropout的方法。具体地说,没有使用伯努利mask,而是使用了一个mask,它的元素是遵循高斯分布的随机变量**(**正态分布)。我不会在这里演示大数定律,这不是重点。来直观地理解一下。

可以模拟一个伯努利mask,使用正态规律进行dropouts。但这有什么区别呢?什么都做,什么都不做。由于神经元的协同适应和/或预测能力,它不会改变这些方法与过拟合的相关性。但是,与之前的方法相比,它改变了训练阶段所需的执行时间。

逻辑上,通过在每次迭代中丢弃带有dropout的神经元,那些在迭代中丢弃的神经元在反向传播期间不会被更新。它们并不存在。所以训练阶段被“放慢”了。另一方面,通过使用

Gaussian  Dropout方法,在每次迭代和每个训练样本中,所有的神经元都暴露出来。这就避免了减速。

在数学上,有一个高斯mask的乘法(例如以1为中心的伯努利定律的标准差p(1-p))。通过在每次迭代中保持所有的神经元都是活跃的,从而随机地对其预测能力进行加权,从而模拟了dropout。这种方法的另一个实际优势集中在测试阶段,与没有dropout的模型相比,不需要进行任何修改。

Pooling Dropout

本文的“难”理解部分结束了。剩下的更直觉的部分可以给更好的性能

图像和特征图的问题是像素非常依赖于它们的邻居。简单地说,在一张猫的图片上,如果你取一个与它的外表相对应的像素,那么所有邻近的像素都将与同样的外表相对应。两者几乎没有区别。

所以理解了标准Dropout方法的限制。甚至可以说它是低效的,它带来的唯一改变就是额外的计算时间。如果随机丢弃图像上的像素,那么几乎没有信息被删除。丢弃的像素几乎与它们的邻居相同。防止过拟合的性能很差。

为什么不利用CNNs中经常使用的的合适的层。例如最大池化层。最大池化层是一个过滤器,通过一个图片或(特征图)选择重叠区域的最大激活。

Max-Pooling Dropout是H. Wu和X. Gu提出的一种用于CNNs的Dropout方法。它在执行池化操作之前,直接将伯努利mask应用到最大池化层的内核上。直观地说,这允许对具有高激活的pooling结果最小化。这是一个限制某些神经元的高预测能力的很好的观点。在测试阶段,你可以根据出现的概率来确定前面方法的权重。

以最大池化层为例,但同样可以对其他池化层进行操作。例如,对于平均池化层,可以在训练阶段以同样的方式应用一个dropout。然后在测试阶段,没有变化,因为它已经是一个加权平均值了。

Spatial Dropout

对于CNNs,可以利用池化层。但是也可以更聪明地遵循J. Tompson等人提出的Spatial Dropout方法。他们提出用经典的dropout方法来解决这个问题,因为相邻像素高度相关。

可以不去随机应用一个dropout在像素上,可以考虑把dropout应用在每个特征图上。如果以的猫为例,那么这就像从图像中移除红色通道并强迫它去总结图像中的蓝色和绿色通道。然后在下一次迭代中随机放置其他特征图。

我不知道如何用数学正确地书写,使它易于理解。但是如果你理解了前面的方法,你就不会有任何问题。在训练阶段,对每个feature map应用Bernoulli mask,其丢弃概率为p。然后在测试阶段,没有dropout,只有一个概率为1-p的加权。

Cutout

让进一步了解的方法,以克服相邻像素高度相关的事实。不是对每个特征图应用伯努利mask,可以在不同的区域中应用。这就是T. DeVries和G. W. Taylor提出的Cutout方法。

最后以的猫图像为例:该方法可以通过对图像的隐藏区域进行泛化从而限制过拟合。最后看到的是猫的头丢弃掉的画面。这迫使CNN了解到可以描述猫的不太明显的属性。

同样,在本节中没有数学。这种方法很大程度上依赖于的想象力:正方形、长方形、圆形,在所有的特征图上,一次在一个特征图上,或者可能在几个特征图上……这取决于你。

Max-Drop

最后,为了结束关于CNNs的这一节,我必须指出,很明显,几个方法可以进行组合。当知道了不同的方法时,这就是使强大的原因:可以同时利用他们的好处。这是S. Park和N. Kwak提出的Max-Drop方法。

这种方法在某种程度上是化dropout和高斯dropout的混合。dropout是在最大池化层上执行的,但使用的是贝叶斯方法

在他们的论文中,他们表明这种方法给出的结果与 Spatial Dropout一样有效。除此之外,在每次迭代中,所有的神经元都保持活跃,这限制了训练阶段的减速。这些结果都是用µ = 0.02和σ² = 0.05的数据得到的。

RNNDrop

已经看到了一些DNNs和CNNs的dropout的方法。一些研究还试图找出哪些方法对递归神经网络是有效的。它们通常依赖于LSTMs,所以我将以RNNs为例。它可以推广到其他的RNNs。

问题很简单:在RNN上应用dropout是危险的。RNN的目的是长期保存事件的记忆。但传统的dropout方法效率不高,因为它们会产生噪音,阻止这些模型长期保存记忆。下面这些方法可以长期保存记忆

T. Moon等人提出的RNNDrop是最简单的方法。一个伯努利mask只应用于隐藏的单元格状态。但是这个掩码从一个序列到另一个序列保持不变。这称为dropout的逐序列采样。它只是意味着在每个迭代中创建一个随机掩码。然后从一个序列到另一个序列,这个掩码保持不变。所以被丢弃的元素一直被丢弃而留下来的元素一直留着。所有的序列都是这样。

循环Dropout

S. Semeniuta等人提出的循环Dropout是一个有趣的变体。单元格状态保持不变。dropout只应用于更新单元格状态的部分。所以在每次迭代中,伯努利的mask使一些元素不再对长期记忆有贡献。但是记忆并没有改变。

变分RNN dropout

最后,简单而有效的,由Y. Gal和Z. Ghahramani介绍的RNN Dropout是在internal gates前的基于序列的Dropout的应用。这将导致LSTM在不同的点进行dropout。

打开的思路

还有很多不同的dropout方法,但将在这里停下来。我发现非常有趣的是,Dropout方法不仅仅是正则化的方法

Dropout方法也可以提供一个模型不确定性的指标。让我解释一下。对于相同的输入,经历了dropout的模型在每次迭代中会有一个不同的架构。这将导致输出中的方差。如果网络是相当广义的,并且协同适应是有限的,那么预测是在整个模型中分布的。这将导致在每次迭代中使用相同的输入时输出的方差降低。研究这个方差可以给出一个可以分配给模型的置信度的概念。这可以从Y. Gal和Z. Ghahramani的方法中看出。

最后,直观地,通过随机应用dropouts,可以看到给定神经元对预测是否有效。根据这个观察结果,可以通过减少参数的数量来压缩模型,同时最大限度地降低性能的损耗。K. Neklyudov等人提出了利用变分dropout来剪枝DNNs和CNNs的方法。