注意力 Dropout vs 隐藏层 Dropout vs 残差 Dropout:不同位置效果大不同

我最早以为Dropout就是一个万能的正则化工具,放在哪里都一样。直到我在一个翻译模型上做实验:把注意力Dropout从0.1调到0.2,BLEU涨了1.3;把隐藏层Dropout从0.1调到0.2,BLEU反而掉了一截。同一个比率,不同的位置,效果完全相反。这让我意识到——Dropout的名字一样,但它在网络里扮演的角色完全取决于它站在哪。

AI technology illustration

要理解这句话,得先看清Transformer里到底有几个能放Dropout的地方。在原始Transformer论文中,作者在三个位置应用了Dropout:嵌入层之后、每个子层输出(即残差连接之前)、以及注意力softmax之后。后来BERT等实现进一步加入了FFN内部的Dropout。今天最常见的是注意力权重上的Dropout、前馈网络隐藏层上的Dropout、以及子层输出残差相加前的Dropout。它们都叫Dropout,但作用对象和后果完全不同。

注意力Dropout:给模型一点"不专注"的自由

注意力机制会为每个查询和所有键算出一个分数,经过softmax变成一堆和为1的权重。如果某些权重特别大,模型几乎只盯着那几个位置——这很危险,因为训练数据里可能存在偶然的共现模式,模型就会拿着这种局部规律当真理。

注意力Dropout就作用在这个权重矩阵上,训练时随即将部分权重置零。注意,这里不会重新归一化剩下的权重,而是让它们按比例放大。效果等同于在每个训练步,随机挑一些注意力连接"掐断",迫使模型不能把信息聚合完全押在少数几个token上,必须学会分散风险。这会让学到的注意力分布更平滑,也更鲁棒。在多头上,它还能鼓励不同头学习不同的关注模式,而不是大家一起盯着同一个词。

那么,为什么很少有人把Dropout加在softmax之前?因为那等同于给logits加噪声,所有位置的权重都会重新分配,破坏注意力分数的精确比较;而在softmax之后做Dropout,是强制让某些位置完全不参与,不会影响其他位置的相对大小——注意,由于不会重新归一化,实际上被保留的一小部分权重被放大了。这种"模糊化"恰恰是对抗过拟合需要的。

隐藏层Dropout:最传统的正则化,但作用域很窄

Transformer的前馈网络(FFN)包含两个线性层,中间是一个维度极高的激活层,通常是模型维度的4倍。以BERT-base为例,隐藏维度768,FFN中间维度3072,参数量占整个模型的三分之一以上。这个高维空间非常容易过拟合——模型完全可以在这里记住训练样本的特征组合。隐藏层Dropout就是在这个激活层上随机丢弃神经元,和经典Dropout没有本质区别。

它不改变注意力结构,只影响每个token的逐位置变换。所以它的效果比较"局部":提升了特征表示的独立性,减少神经元之间的协同适应。但它的影响范围局限于单层内部,不会改变信息在网络中流动的方式。也正是因为作用域窄,它往往可以安全地设得比其他两个位置大一些。

残差Dropout:在深度上做文章

再看残差连接之前的位置。Transformer的每个子层都是一个这样的结构:x + Dropout(SubLayer(x))。这里的Dropout作用在子层输出上,然后和恒等映射的值相加。这意味着,训练时残差分支的输出会被随机掩盖一部分,主路径受到的保护反而变多了。

这其实和Deep Networks with Stochastic Depth的思想一脉相承:随机跳过某些层,让网络在训练时更像一个浅网络。残差Dropout是它的"软"版本——不是整个分支归零,而是逐元素衰减。这样做的结果是,模型必须学会依赖恒等映射传递信息,不能把每层的变换都当成必需品。从优化角度看,恒等路径为梯度提供了一个干净的通道,能缓解深层网络的梯度消失。

但残差Dropout非常敏感。因为子层输出的每个维度都是前面所有信息和特征的混合,随便丢弃很容易破坏有用的语义。我见过有人把残差Dropout设成0.5,结果模型完全不收敛——这不是Dropout的错,是这个位置根本承受不了这么大的破坏。另外,残差Dropout和LayerNorm的相对位置也有讲究:通常Dropout在残差相加前,LayerNorm在相加后,这样随机噪声会被部分归一化掉;一旦Dropout率过大,LayerNorm对均值和方差的估计就会扭曲,训练自然震荡。

一张表看清三个Dropout的分工

位置 作用对象 主要目的 常见范围
注意力Dropout softmax后的注意力权重 防止注意力过度集中,提升泛化 0.1~0.3
隐藏层Dropout FFN中间激活 减少特征共适应,经典正则化 0.1~0.5
残差Dropout 子层输出向量 深度正则化,促进梯度流动 0.0~0.2

为什么残差Dropout通常要设得小?因为它的破坏是全局的。注意力Dropout只影响注意力矩阵,隐藏层Dropout只影响一个FFN,而残差Dropout作用于整个子层的输出——相当于你同时影响了这一层的所有信息。它更接近"随机深度"那种结构性正则化,力度必须拿捏好。

它们协同工作的秘密

你可以把这三种Dropout看成三个不同维度上的防线:注意力维度、特征维度、深度维度。注意力Dropout防止模型在token间过拟合,隐藏层Dropout防止神经元之间共适应,残差Dropout防止层与层之间形成过强依赖。三者重叠很少,所以可以叠加使用,这也是为什么BERT、GPT这些模型几乎每处都放了Dropout的原因。

我在训练一个长文本分类任务时,最初三个Dropout都设成0.1,表现一般。我把注意力Dropout调到0.2后,验证集F1提升明显;但把残差Dropout调到0.2后,loss曲线开始震荡。后来我才意识到,残差路径是训练的"大动脉",不能随便堵——这让我对"同一种技术在不同位置效果不同"有了真切的体验。调参这件事,不是改数字,而是要知道数字背后的物理意义。

失效边界:什么时候这些Dropout帮倒忙

需要注意的是,Dropout带来的不确定性在推理时会被补偿(缩放),但训练和推理的行为差异仍然存在。如果数据集非常大,Dropout的正则化效果会减弱,甚至拖慢收敛;如果模型很小,Dropout会降低有效容量,导致欠拟合。残差Dropout尤其不适合极深网络与超大学习率并存的场景——它会和LayerNorm的统计估计产生交互,让训练变得更不稳定。

所以怎么选?我的经验是,小数据集上优先调高注意力Dropout;中大型数据集上保持隐藏层Dropout在0.1~0.3;残差Dropout不要轻易超过0.2。记住,同一热度的Dropout,放在不同位置,效果天差地别。不要因为命名相同就一碗水端平。

原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/585.html

(0)
上一篇 1天前
下一篇 1天前

相关推荐