前言
随着发展,深度神经网络的结构越来越复杂,学习能力也相应提高。我们当然会觉得神经网络的学习能力越强越好,这样才能解决一些棘手问题。但对于有限的训练数据,由于强大的学习能力,神经网络会把训练集中的特征照单全收(尽管其中有些特征包含着噪音,或有些特征仅在训练集中出现),完美地拟合训练数据。
由于训练集或多或少会存在一些噪音,而且无法保证训练集能够准确反映样本的真实分布,所以在训练集上的过分拟合会造成神经网络泛化能力的不足,在测试集上表现远不如其在训练集上的表现,而我们往往更关注模型在测试集或现实场景下的表现。为了缓解这个问题,就需要采取一些正则化措施(regularization),在保证模型足够强大的同时避免模型过拟合(over-fitting)。
本系列博客将介绍一些常用的正则化方法:dropout、label smoothing、layer norm、early stopping 等。这篇博客主要描述 dropout。
Dropout
由论文 Dropout: A Simple Way to Prevent Neural Networks from Overfitting\text{Dropout: A Simple Way to Prevent Neural Networks from Overfitting}Dropout: A Simple Way to Prevent Neural Networks from Overfitting 提出。其核心思想是:在训练阶段,随机地使一些神经元失效,以防止神经元之间过度地相互适应。因为,如果神经元之间相互适应程度过高,那么这神经元就无法独自发挥作用。
背景
模型组合(Model combination)几乎总是可以提升机器学习的性能,并具有很好的正则化效用。但是训练多个具有不同结构的模型不仅费时费力,而且对训练数据量需求也较大,就算最后训练完成,在测试阶段使用组合模型也不是可行的,因为组合模型往往需要较多时间完成计算,而模型的快速反应在测试或应用阶段都是很重要的。
Dropout 就是针对上述问题而提出的,既要保留模型组合的优点,也要达到正则化效果。
概念
如上图,Dropout 在训练阶段,会按照指定的概率随机地使一些神经元失效,所以,对于不同(批次)的训练样本,其所面对的网络都是不一样的,都只是完整网络的一部分,可形象地称为是“瘦网络”。进而可将一个具有 n 个神经单元的网络看作是 2n2^n2n 个可能的“瘦网络”的一个集合,不过,这些“瘦网络”参数共享,故参数总数不变,仍是 O(n2)O(n^2)O(n2) 或更少。
也就是说,在训练过程中,对于每个(批次)训练样本,Dropout 都会随机选取其中的一个“瘦网络”(2n2^n2n 个中的一个)进行训练。所以对于有限训练数据集,每个“瘦网络”能被选中得到训练的次数很少(还有可能从未被选中),对应的参数更新次数也少,但由于这些“瘦网络”的参数是共享(存在重叠)的,所以完整网络的所有参数还是可以得到充分优化的。
在测试阶段,则不使用 Dropout,如上图,而将完整网络的参数进行缩放,缩放比例为训练阶段设置的神经元的保留概率 ppp,以确保任何隐藏神经元在训练阶段使用 dropout 情况下的期望输出值(expected output)会与测试阶段的实际输出值相等。通过这种做法,就可将 2n2^n2n 个“瘦网络”组合成单个完整的神经网络。可以看出 Dropout 的优点:以一种非常巧妙的方法实现组合模型的效果,而且在测试阶段所需的计算时间相对而言也较少。
动机(motivation)
原论文中提到,Dropout 的动机来源于一个有关性在生物进化中的作用的理论。为了缩小篇幅,这里不细说,建议读者阅读论文,我觉得挺有意思的。
大致意思就是:在有性繁殖中,一组基因能够与另一个随机的基因组协同的能力会使得该组基因更为顽强(robust),由于一个基因无法长久地依赖某个基因组(总有在繁殖中被分离的情况),它们必须形成对自己有用以及能与其他少量的基因合作的能力。相似的,在经 Dropout 训练的神经网络中每个神经元都必须学习如何与随机的一组神经元相互合作,这会使得每个隐藏神经元更加的 robust,更倾向于独自形成有用的特征而不依赖于其他的神经元,但位于同一隐藏层的不同神经元仍会学习发挥相互不同的作用。
模型描述
考虑一个具有 L 个隐藏层的神经网络,zlz^{l}zl 为第 lll 个隐藏层的的输入向量,y(l)y^{(l)}y(l) 为第 lll 个隐藏层的输出向量(y(0)=xy^{(0)}=xy(0)=x 为模型输入),W(l)W^{(l)}W(l) 和 b(l)\mathbf{b}^{(l)}b(l) 为第 lll 个隐藏层的权重和偏置。则一个标准的神经网络的前向传递操作可描述为:
zi(l+1)=wi(l+1)yl+bi(l+1),yi(l+1)=f(zi(l+1))\begin{aligned} z^{(l+1)}_i &= w^{(l+1)}_iy^l + b^{(l+1)}_i, \\ y^{(l+1)}_i &= f(z^{(l+1)}_i) \end{aligned} zi(l+1)?yi(l+1)??=wi(l+1)?yl+bi(l+1)?,=f(zi(l+1)?)?
fff 为激活函数。使用 Dropout 时,前向传递操作变为:
rj(l)?Bernoulli(p)y~(l)=r(l)?y(l)zi(l+1)=wi(l+1)y~(l)+bi(l+1),yi(l+1)=f(zi(l+1))\begin{aligned} r^{(l)}_j &\sim \text{Bernoulli}(p)\\ \tilde{y}^{(l)} &= r^{(l)} * y^{(l)} \\ z^{(l+1)}_i &= w^{(l+1)}_i\tilde{y}^{(l)} + b^{(l+1)}_i, \\ y^{(l+1)}_i &= f(z^{(l+1)}_i) \end{aligned} rj(l)?y~?(l)zi(l+1)?yi(l+1)???Bernoulli(p)=r(l)?y(l)=wi(l+1)?y~?(l)+bi(l+1)?,=f(zi(l+1)?)?
对于任意一个隐藏层 lll,r(l)\mathbf{r}^{(l)}r(l) 是一个由独立的服从伯努利分布(0-1分布)的变量组成的向量,各变量等于 1 的概率为 ppp.
在测试阶段,不使用 Dropout, 但权重需被缩放为:Wtext(l)=pW(l)W^{(l)}_{text} = pW^{(l)}Wtext(l)?=pW(l)
结语
本文详细描述了 Dropout,介绍了 Dropout 的提出背景、基本概念、设计动机以及实现的一般方法。论文中还有提到,虽然仅使用 Dropout 这一种正则化方法也可明显提高模型性能,但与其他正则化(max-norm regularization,large decaying learning rates,high momentum)一同使用的话效果会更好。
这里仅是介绍相关概念,对于更多相关信息,读者可以阅读原始论文。
参考源
- Dropout: A Simple Way to Prevent Neural Networks from Overfitting\text{Dropout: A Simple Way to Prevent Neural Networks from Overfitting}Dropout: A Simple Way to Prevent Neural Networks from Overfitting