TL;DR 主要观点
- 死神经元会悄无声息地浪费基础模型的计算资源并降低有效模型容量。
- 通过简单的激活频率可视化,可以使神经元健康状况变得可衡量。
- 通过更换激活函数或实施**“突触剥离”**技术,可以让死神经元“起死回生”。
- 通过定期审计和设置告警来主动监控神经元健康,对于基础模型训练的成功至关重要。
在神经网络中,有些神经元最终会对所有输入都输出接近零的激活值。这些所谓的“死神经元”会降低模型容量,因为这些参数被白白浪费了;同时,由于减少了学习到的特征的多样性,它们也会削弱模型的泛化能力。
虽然这种现象并不新鲜,但随着大型基础模型的出现,它变得愈发重要。本文将探讨其原因及其带来的影响。我们还将回顾检测和可视化死神经元的方法,以及预防和修复死神经元的技术。
死神经元的影响
最近关于基础模型中死神经元的研究显示了一些有趣但令人担忧的结果。某机构研究人员的一篇2020年论文表明,在BERT和XLNet模型中,85%的神经元对于执行其任务是冗余的。某机构研究人员在2023年的一项更新研究中,检视了参数从1.25亿到660亿不等的OPT系列大语言模型,发现在某些层中,超过70%的神经元是死的。
从计算角度来看,基础模型中如此高比例的死神经元令人担忧。在一个1亿参数的CNN中丢失一些神经元是效率低下,但在一个数十亿参数的LLM中看到70-85%的神经元死亡,则意味着在训练和推理阶段都浪费了大量的GPU时数。可以说,这些死神经元构成了一种隐藏形式的“计算税”。
撇开计算效率不谈,死神经元也很可能会阻碍模型的性能。由于大量神经元未被使用,模型的有效尺寸远小于其名义尺寸。因此,学习的特征变少,导致模型日益依赖记忆数据,从而损害了泛化能力。
模型中存在大量死神经元的另一个后果是,它学习了更纠缠的数据表示。考虑一下离散的特征检测器,或者那些能可靠地对数据中某些可解释模式激活的神经元。想象一个神经元,每当它在视觉模型中看到垂直边缘时就会被激活,或者一个神经元在大语言模型中遇到HTML标签时强烈激活。这类神经元在模型中非常有价值,因为它们使表示更加解耦:表示的每个维度更清晰地对应于一个特定的变化因素。
如果大部分神经元是死的,我们就失去了本可以分配给这些专门检测器的“槽位”。模型仍然需要编码相同数量的信息,但工作神经元却更少了。结果,剩余的神经元会为各种模式激活(例如,一个神经元可能同时对数字、大写字母和日期做出响应)。这降低了模型学习干净、专门化表示的能力,可能会影响下游任务的性能。
最后,也许不足为奇的是,死神经元会浪费内存。它们无缘无故地占据大量空间,使得加载、微调和部署大型基础模型变得更加困难。
在我们继续讨论如何检测和修复死神经元之前,让我们先澄清一个重要的区别:死神经元与梯度消失。虽然这是两种不同的现象,但它们密切相关。梯度消失在训练期间有效地阻止了权重更新,这会将神经元“冻结”在不活动状态。反之,一旦一个神经元永久死亡,它就不会对下游的梯度流有任何贡献。因此,防止梯度消失是对抗死神经元的策略之一,我们将在后文讨论。
激活值分布可视化
你的基础模型是否遭受死神经元之苦?一种便捷的发现方法是通过可视化。我们可以绘制激活值直方图和热力图,以及模型不同层中死神经元的百分比,以了解问题的严重程度。
在本节中,我们将使用某机构的一个GPT-2版本作为示例来检验这些可视化策略。我们使用这个相对较小的模型是为了计算效率。请注意,在这样的一个小模型中,我们可能看不到像GPT-5那样更大、更新的模型中那么高比例的死神经元。不过,我们讨论的技术也直接适用于更大的模型。
💡 您可以在该机构仪表板上交互式地探索所有图表。生成这些图表的代码可在某代码仓库获取。
我采样了一些WikiText-2数据集中的数据,并将其通过某机构提供的Tiny GPT-2模型。对于模型处理的每批令牌,我从不同层的Transformer块收集了一组不同的激活值:
mlp_pre:应用激活函数前的激活值。mlp_post:应用激活函数后的激活值。attn_out:自注意力块的输出。
我将这些激活值展平并聚合,以提取以下指标:
- 激活频率:神经元激活值超过一个任意设定的阈值(0.001)的输入所占的比例。
- 激活直方图:激活值的分布。
- 死神经元比率:激活频率低于上述相同阈值的神经元百分比。
激活频率
首先,我们来看一下激活频率。
这六个面板显示了模型两个层(索引0的第一层和索引5的第六层,按行排列)对于 mlp_pre、mlp_post 和 attn_out(按列排列)的激活频率。
横轴显示连续的神经元,按其激活频率排序。颜色标记了激活相应神经元的输入占比。蓝色神经元基本上从不激活,而完全黄色的神经元则对每个令牌都激活。
请注意,mlp_pre 和 attn_out 的颜色图例仅覆盖非常高的值,都在99%以上,意味着这些神经元非常活跃。然而,mlp_post 的输出看起来则完全不同。它们的色阶覆盖了更广的动态范围:一些神经元几乎持续激活(接近黄色),但也有一大群神经元处于低端,激活非常罕见(低至20%)。这种不均匀的分布是意料之中的,因为在非线性激活(GELU,稍后会详细介绍)之后,许多神经元大多数时候都被推到接近零的值。
从这些热力图中得出的关键结论是,“死亡”或未充分利用的神经元主要出现在非线性之后 (mlp_post)。这正是我们所期望的,因为激活值在此处被门控。相比之下,预激活和注意力投影显示出高活跃度。这是我们的基础模型期望的模式。
激活直方图
现在让我们把注意力转向激活值的分布。
这三个图表显示出非常不同的模式。在激活之前 (mlp_pre),分布大致呈中心接近零的高斯分布。这是一个健康的形态;这意味着输入分布在负值和正值之间,允许激活函数“决定”关闭哪些神经元。如果这个分布严重偏移(远离零),非线性可能会饱和,导致更多的死神经元。幸运的是,我们的GPT-2并非如此。
mlp_post 的直方图在零处显示出一个强烈的尖峰,并带有一条长长的右尾。这表明大多数激活输出都接近于零。那些太接近零的神经元实际上已经死亡,这与我们从热力图分析中得到的见解相符。一小部分输入产生大的正激活值。这些神经元在罕见但重要的上下文中选择性激活。
自注意力输出 (attn_out) 在零附近的尖锐峰值表明注意力输出是稀疏的:许多令牌从头中接收到的信号很少。偶尔出现的较大值和较小值反映了当模型关注关键令牌时的强注意力权重。这种稀疏性与注意力应有的行为一致:大多数查询忽略大多数键,但少数连接占主导地位。
死神经元比率
现在让我们检视一下死神经元的比率,以折线图的形式可视化。 此图表上的Y轴表示死亡的神经元百分比,而X轴对应六个模型层,索引从0到5。
这种可视化证实了我们从热力图分析中的发现。总体而言,死比率非常低。即使在 mlp_post 中,99.9% 的神经元至少在部分令牌上有所作为。这是极其健康的。在更大的基础模型中,我们很可能会看到更高的死比率。
掌握了发现死神经元的可视化工具后,让我们讨论一些预防它们的方法。下一节将介绍激活函数的选择,再下一节的主题是激活不活跃的神经元。
替代激活函数
如前所述,如果网络中的梯度变得太小,它们往往会“消失”,将周围的神经元推入不活动状态。因此,确保梯度不消失可以防止神经元死亡。实现这一点的一种方法是正确选择激活函数。
常见激活函数
那些预训练或微调基础模型的人可以自由选择网络中使用的激活函数。这种选择通常构成了计算速度和激活函数防止神经元死亡能力之间的权衡。 基础模型中常用的激活函数图:ReLU, Leaky ReLU, ELU, GELU, 和 Swish。
ReLU 计算速度最快。然而,它也很容易产生死神经元,因为它对任何负输入都输出零。如果网络的权重最终使得ReLU的输入持续为负,那么整个由ReLU激活的神经元就会持续产生零。这是ReLU很少被用作基线以外的选项的主要原因。
Leaky ReLU 为负值添加了一个小但非零的斜率,降低了神经元死亡的可能性。指数线性单元 (ELU) 具有另一个期望的特性。就像Leaky ReLU一样,它对负输入具有非零梯度。与Leaky ReLU不同的是,ELU在零附近是平滑的,加速了训练收敛。缺点是ELU的计算速度相对较慢。
另外一些受ELU启发的激活函数声称对其进行了改进。高斯误差线性单元 (GELU) 根据其值对输入进行加权,而不是简单地通过符号进行阈值处理,这已被发现可以带来更好的模型性能。Swish (在PyTorch中也称为SiLU) 在形状上与GELU相似,但它是经过专门设计和评估的,可以用作任何神经网络中ReLU的直接替代品。
快速的文献检索揭示了更多最先进的激活函数,如SELU或Mish。自然会出现一个问题:在容易发生神经元死亡的大型基础模型中,如何选择?
如何为基础模型选择激活函数
训练深度神经网络是一项深刻的实验性工作。深度学习中超参数调优的典型方法是在超参数空间上进行随机或贝叶斯搜索,并选择能带来最佳结果的组合。
虽然训练基础模型所需的大量资源使得探索庞大的超参数空间变得不可行,但我们仍然可以应用类似的方法来为基础模型选择激活函数,同时优化神经元的活跃度。
基础模型团队如何规划和预算他们的训练运行?
训练基础模型所需的基础设施规模和能量取决于其大小和架构。反过来,特定的硬件也会限制模型大小和架构,其中GPU内存是关键限制因素。此外,更大的模型通常需要更多的训练数据,导致更长的训练时间。 基础模型团队通常通过预先定义一个计算预算来解决这个“先有鸡还是先有蛋”的问题。根据经验法则,大约五分之一的预算可用于主要的训练运行,其余部分则用于实验和测试运行。 主要运行,即全尺寸训练模型,通常持续数周。同时,基础模型团队会在侧边启动一些短暂的、使用较小模型变体的实验运行。团队利用这些实验运行来探索新的架构、超参数或训练计划。他们密切监控有希望的早期信号,一旦发现指标出现有益的变化,就会将这些发现整合到主要的训练运行中。
在某机构发布的《2025年基础模型训练报告》中,可以了解更多关于团队如何实施这种迭代方法以及其他主题的信息。
给定一个我们想要训练的模型,我们可以迭代地替换其架构中的激活函数,并为每个函数比较死神经元的比率,就像我们之前使用简单的折线图所做的那样。考虑下面的可视化,您也可以在该机构项目中以交互模式查看。我使用了这个Python脚本来切换激活函数,收集死神经元比率,并将它们记录到某平台。
我们再次查看Tiny GPT-2中的死神经元比率,显示在纵轴上。每条线对应上述激活函数之一。横轴对应后续的模型层。请注意,与我们之前看到的类似图表相比,此处将神经元视为“死亡”的阈值略有降低,以便更突出地显示不同激活函数之间的差异。
比较结果揭示了显著差异:
- 毫不意外,ReLU 和 Leaky ReLU 始终显示出最高的死神经元比率,证实了它们倾向于永久静默神经元的特性。
- GELU 在各层中保持着低得多的死比率,这反映了为什么它已成为现代Transformer中流行的默认选择。
- 在我们的实验中,Swish 和 ELU 往往效果最好,死神经元比率接近零。
这类实验使权衡变得具体:虽然原始的Tiny GPT-2架构使用GELU激活函数,但就死神经元而言,这个选择似乎不是最优的。将激活函数切换到Swish,会导致网络中被静默的部分更少。
在实践中,这意味着我们不必猜测:通过在试点运行中记录不同激活函数的死神经元比率,我们可以定量比较每个选项导致的“神经元死亡”程度,然后选择效果最好的激活函数。
激活不活跃的神经元
到目前为止,我们已经讨论了如何检测和预防神经元死亡现象。现在让我们看看一旦神经元死亡,如何将它们“复活”。
实现这一目标的一个有趣方法是所谓的“突触剥离”,这是某机构研究人员在某论文中介绍的一种方法。
正如我们之前所见,死神经元产生于其权重进入这样一种状态:没有合理的输入能产生非零输出。由于在这种状态下梯度也为零,这些神经元无法通过正常的反向传播恢复,从而有效地降低了模型的容量。
“突触剥离”方法引入了一个受生物学启发的巧妙解决方案。在神经科学中,“突触剥离”描述了一个过程:免疫细胞扫描大脑,检测功能失调的突触并将其移除,以便神经元能够恢复并重新连接。该论文的作者为深度学习提出了类似的机制。关键思路如下:
- 检测死神经元:在每个训练周期后,查看验证集上的激活输出。如果一个神经元在整个数据集上的总激活值为零,则认为它是死的。
- 剪除负权重:对于每个死神经元,移除一部分其最负的传入权重。这会将神经元的权重分布向正值方向移动。
- 恢复训练:随着有问题的“突触”被剥离,先前死亡的神经元重新获得激活的能力并重新进入优化过程。训练继续进行,每个周期后重复此循环。
突触剥离过程图: 左:每个训练周期后,检测死神经元(标记为红色)。中:与死神经元相关的问题连接被剪除。右:同样的死神经元现在变得活跃(标记为绿色),训练继续。| 图片来源
正如作者观察到的,矛盾的是,以这种方式移除参数可以增加有效的模型容量。死神经元本来就不对计算做贡献,因此剪除那些将它们锁定在静默状态的连接,给了它们一个重新变得有用的机会。
在视觉Transformer和MLP上的实验中,“突触剥离”将有效模型容量提高了多达30%,改善了泛化能力,并减小了模型尺寸。这种方法的一个重要好处是它易于实现,并且可以插入任何现有的训练循环中。
这对基础模型训练意味着什么?
通过一系列小规模实验,我们探讨了基础模型中死神经元的现象:它们是什么,为什么重要,以及如何检测和缓解它们。我们讨论了死神经元不仅浪费计算和内存,还会悄无声息地降低有效模型容量。
通过简单的可视化技术,如激活热力图、直方图和死神经元比率,我们可以让问题变得可见。在此基础上,我们比较了激活函数,看哪些更容易导致神经元死亡,并研究了“突触剥离”作为一种实用的方法来复活那些本会永久不活动的神经元。
我们讨论的一个重要结论是,在构建和评估基础模型时,神经元健康应成为标准工具包的一部分。以下是一些将此集成到工作流中的具体步骤:
- 在训练期间定期进行神经元活跃度审计。就像跟踪损失曲线或学习率一样,记录每层的死神经元比率。这能让你及早了解模型的部分区域是否正在关闭。
- 设置自动告警。例如,如果任何一层中超过某个百分比的神经元死亡,就触发警告。这使您能够进行干预,例如调整激活函数或应用“突触剥离”等技术。
- 跨实验基准测试神经元健康度。在测试新的模型变体时,将死神经元比率与准确性指标一起跟踪。这使得“神经元活跃度”成为比较设计选择的一等指标,而不仅仅是事后想法。
训练和部署基础模型成本高昂。让神经元健康变得可衡量、可操作,是从每一GPU小时中获得更多价值的一种方式,同时还能提高模型的鲁棒性和泛化能力。FINISHED