IT 论文精读 · PAPER 30
Srivastava, Hinton, Krizhevsky, Sutskever & Salakhutdinov · University of Toronto · JMLR 2014
2014 年,多伦多大学 Hinton 的团队把一个像恶作剧的做法写成了正式论文:训练神经网络时,每一步都随机让一部分神经元「请假」——临时当它们不存在。这个只有几行代码的招数叫 Dropout(随机失活),它治的是深度学习最常见的病:模型把训练题背下来了,一换新题就露馅。2012 年点燃这轮 AI 热潮的 AlexNet,用的就是它。
神经网络的参数动辄百万上千万,训练数据却总是有限。参数一多,它就能把训练集里只属于这批数据的巧合也记住——「猫图右下角都有块草地」,换成没见过的图便原形毕露。这叫过拟合。
最灵的解药是「三个臭皮匠」:训练好几个模型、预测时投票,各自的偶然错误互相抵消。问题是太贵——训练几十个大网络要几十倍算力,上线后每张图还得跑几十遍。
Dropout 的做法朴素到有点粗暴:训练的每一步,随机挑出大约一半的神经元,连同它们的所有连线一起临时抹掉,让剩下那个「缺胳膊少腿」的网络照常学这一步;下一步重新抽签,请假的换成另一批。
第一,它拆散了小圈子。一个神经元若总能指望隔壁那位替它兜底,它学的本事就只在「隔壁在场」时管用;一群神经元抱团互补,换到新数据上很脆。随机请假之后没人知道身边还剩谁,每个神经元只好学一身自己也站得住的本事。论文的比方很妙:与其组一个五十人的大阴谋(一环出错全盘皆输),不如组十个五人小分队。
第二,它把「三个臭皮匠」变便宜了。每次抽签得到的都是一个不同的残缺网络,几十万步下来等于练过了海量个网络——而它们共用同一套权重,只花了训练一个网络的钱。
上线时不能再抽签——同一张图问两遍答案不一样可不行。办法朴素得让人发笑:让所有神经元都到场,但把每个人的发言音量按当初的出勤率调小。训练时平均只有一半人在场,现在人齐了,每人说轻一点,总音量才对得上。神奇的是,这一次普通计算的效果,就非常接近让那海量个残缺网络挨个投票。
代价说一句:每一步都在跟随机噪声较劲,训练到同样水平大约要多花两三倍的时间。
Dropout 让「把网络造大」不再等于「更容易背题」,成了 2012–2016 年深度学习的标配零件,今天 Transformer 里也还留着它的位置。它还开创了一整条思路:往训练里故意加噪声,逼模型学出更结实的东西。
训练时随机让一半神经元请假,逼每个神经元学出不依赖特定同伴的本事,同时等于用一套权重训练了海量个残缺网络;测试时让所有人到场、音量按出勤率调小,一次前向就近似拿到它们的集体投票。
想看掩码怎么算、为什么乘以 p、以及各数据集上的实验数字? → 切到精读版
Dropout 在训练时随机「丢弃」神经元(输出置零),使每一步都在训练一个不同的瘦网络(thinned network);这既打断了神经元之间的共适应(co-adaptation),又等价于用一套共享权重同时训练指数多个网络。测试时不再随机,把权重乘以留存概率 p 做一次普通前向,就近似了全体瘦网络的集成平均。它是深度学习时代第一个通用而便宜的正则化手段。
作者是 Nitish Srivastava、Geoffrey Hinton、Alex Krizhevsky、Ilya Sutskever、Ruslan Salakhutdinov,来自多伦多大学,2014 年发在 JMLR;前身是同组 2012 年的 arXiv 短文《Improving neural networks by preventing co-adaptation of feature detectors》。同一批人同年做出的 AlexNet 在全连接层用了 dropout,把它推成事实标准。它上承「用集成对抗过拟合」的经典思路,下启 DropConnect、随机深度(stochastic depth)、Monte Carlo dropout 等一整条「以噪声做正则」的支线。
深度网络的表达力来自海量参数,而标注数据永远不够多。参数一多,网络就能把训练集里只属于这批样本的采样噪声也拟合掉,泛化随之崩塌。权重衰减、提前停止、数据增强都有效,但有限。
理论上最漂亮的解法是贝叶斯模型平均——按后验概率给所有可能的参数设定加权平均,可它在神经网络上完全算不动。退而求其次是集成:训练一堆结构或初始化不同的网络再投票,几乎稳赚,但训练、调参、推理成本全都乘以模型个数,在 2012 年的算力下基本不可行。
论文还点出一个更微妙的病根:共适应(co-adaptation)。反向传播只求整体损失下降,不阻止某个隐藏单元把错误交给别人修补;于是一群单元演化成彼此纠缠的整体——某个特征只有在另外几个特定特征也出现时才有意义,在训练集上很有效、一换数据就失灵。真正想要的,是每个单元自己就是个有用的特征探测器。
训练时,对每个训练样本(实现上是每个小批量)都重新掷一次骰子:每个单元以概率 p 保留、以 1−p 丢弃。丢弃意味着输出置零、进出它的所有连线在这一步统统失效;剩下的残缺结构就是一个瘦网络,正常前向反向一次、更新它自己那部分权重。
写成式子只有一行:给某层输出 y 逐元素乘一个 0/1 掩码 r,ỹ = r ⊙ y,r 的每一位独立服从伯努利分布(取 1 的概率为 p);然后照常 z = w·ỹ + b 送进下一层。白话说:这一步这个单元当不存在,话不传出去、错也不回传给它。
经验取值:隐藏层 p = 0.5(留一半)在很宽的任务范围内接近最优;输入层保守得多,通常留 p ≈ 0.8——输入本身就是信息源,丢太多等于直接删数据。
随机丢弃直接掐死了共适应:一个单元无法再指望某个特定伙伴一定在场,只能学出「在众多随机搭档组合下都有用」的特征——也就是自己就站得住的特征。论文给了两个漂亮的比方:其一,与其组织一个五十人的大阴谋(任一环节出错则全盘皆输),不如组十个五人小分队;其二是有性生殖——基因必须能与随机抽到的另一半基因组配合,这逼出的是可混搭的能力而非精细耦合的复合体。作者的隐藏层可视化也印证了这点:不加 dropout 时单元学出杂乱模式,加了之后学出清晰的边缘与笔画。
换个角度:n 个单元有 2ⁿ 种「留 / 丢」组合,也就是 2ⁿ 个可能的瘦网络。训练等于在这个巨大的网络家族里随机采样、逐个训练——关键是它们共享同一套权重:某条边的参数被所有包含它的瘦网络共同使用、共同更新。于是我们用一个网络的训练成本,得到了一族同时被训练出来的模型。
这就是「集成太贵」难题的绕行方案:既然分别训练几十个网络太奢侈,就让指数多个网络挤在一套权重里长大。它们当然高度相关、每个也只被采样到极少次,所以这只是近似的集成——但实践上极其有效。
集成的正确用法是让所有成员投票再平均,但这里成员有 2ⁿ 个。论文的权重缩放(weight scaling)规则简单得出奇:测试时保留所有单元,但把每个单元的出边权重乘以 p,然后做一次普通前向。
为什么是乘 p?训练时某个单元平均只有 p 的时间在场,下一层收到的期望输入是「权重 × 输出 × p」;测试时它总在场,若不缩放,下一层收到的信号会整体大约 1/p 倍,把网络推到从未训练过的数值区间。乘上 p,就把测试时的输入期望拉回训练水平。
它有多准?对只有一层 softmax 的情形,这个规则精确等于全体瘦网络预测的(归一化)几何平均;对多层非线性网络只是近似,但论文用蒙特卡洛实验验证过:真去采样 k 个瘦网络分别预测再平均,误差随 k 增大而下降,而权重缩放这一次前向,效果就相当于采样几十个网络去平均——这是 dropout 能落地的关键。
Dropout 不是单独起效的。论文给的配方是:max-norm 约束(把每个单元入向权重向量的长度硬性限制在上限 c 内,超了等比缩回)配上较大的学习率 + 高动量——dropout 的噪声让梯度很吵,需要大步长与动量把噪声平掉;而大步长容易让权重发散,max-norm 恰好给了硬性天花板。
论文还给了一个变体:高斯 dropout——不乘 0/1 掩码,而乘一个均值为 1 的高斯随机数,效果相当甚至更好,说明关键不在「丢弃」这个动作本身,而在往激活值上注入均值不变的乘性噪声。作者还从线性回归的特例指出,dropout 在那里可归约为一种按特征自适应缩放的 L2 正则,为「它到底算哪种正则化」提供了可解析的锚点。
论文的说服力来自跨领域的一致提升:同一个招数在视觉、语音、文本、生物数据上都稳定有效。
另外两组对照很有信息量。数据量:数据极少时(如只用几百张 MNIST)dropout 帮不上忙甚至有害——本来就欠拟合,再加噪声更糟;适中时收益最大,极大时收益又缩小。保留概率:隐藏层的 p 在 0.4–0.8 之间都不错,太小欠拟合、太接近 1 则噪声不足。
Dropout 改变了「网络该做多大」的算法。在它之前,加宽加深意味着更容易过拟合,容量被泛化能力卡着脖子;在它之后,先把网络造大、再用 dropout 压住过拟合成了标准操作,直接助推了 2012–2016 那一波「越做越大」。
更深远的是它确立的思想模板:训练时注入随机噪声,就能得到近似模型平均的正则化效果。DropConnect(丢连接而非丢单元)、随机深度(随机跳过整个残差块)、DropPath 都是它的直系后代。Gal 与 Ghahramani 更进一步,把 dropout 解释为对深度高斯过程的近似贝叶斯推断,于是测试时也开着 dropout 多跑几遍(Monte Carlo dropout)就能廉价估计模型的不确定性,至今仍是最常用的不确定性估计手段之一。今天的 Transformer 里,注意力权重、前馈层与残差输出上依然挂着 dropout。
p 这个要调的超参数。① 一句话:训练时随机把单元连同其连线丢弃、每步得到一个不同的瘦网络;测试时不丢弃、把权重乘以留存概率 p 做一次前向。
② 痛点:大网络参数多、数据有限必然过拟合;解药「集成」训练与推理都贵得离谱,贝叶斯模型平均则完全算不动。
③ 病根:共适应——单元抱团互补,特征只在特定同伴在场时才有意义,一换数据就失灵。
④ 机制:给该层输出乘一个伯努利 0/1 掩码 ỹ = r ⊙ y;隐藏层通常留 p=0.5,输入层留 p≈0.8。
⑤ 两层直觉:谁也不能指望特定伙伴在场,每个单元被迫学出自己就站得住的特征(十个五人小分队 > 一个五十人大阴谋);同时 n 个单元对应 2ⁿ 个共享权重的瘦网络,用一个网络的成本近似拿到集成。
⑥ 测试时乘 p:把下一层的输入期望拉回训练水平;对单层 softmax 精确等于几何平均,深层网络里约等于采样几十个瘦网络求平均。
⑦ 结果:MNIST 约 1.60% → 1.25%(最好约 1.05%);CIFAR-10 14.98% → 12.61%;SVHN 约 3.95% → 2.55%;TIMIT 约 23.4% → 21.8%;配方还包括 max-norm + 大学习率 + 高动量。
⑧ 影响与局限:确立「注入噪声 ≈ 廉价集成」的模板,催生 DropConnect、随机深度、MC dropout;但训练慢 2–3 倍、卷积网络里大体被 BN 取代(叠用还有方差偏移)、不宜直接用于循环连接、数据太少或极多时都失效。