GeLU 和 ReLU 的训练差异:为什么大模型都从 ReLU 换成了 GeLU 家族?

我第一次扒 BERT 源码的时候,在 Transformer 的前馈层里看到一个陌生的激活函数:GELU。当时我愣住了——2017 年那篇 Transformer 论文里,用的明明是 ReLU,怎么到了 BERT 就悄悄换了?

AI technology illustration

后来我自己训练小模型时对比了一下,发现这个替换的影响远超我的想象。这篇文章想讲清楚:GELU 和 ReLU 在训练中到底差在哪,以及为什么今天的大模型几乎全都投奔了 GELU 家族。

ReLU 的功劳和它留下的坑

ReLU 在 2012 年靠着 AlexNet 走进主流视野。它对正数求导为 1,解决了 sigmoid 在深层网络中梯度消失的问题,而且计算廉价:一个 max(0, x) 就完事。

但这个粗暴的截断有一个代价——负半轴的梯度永远是 0。如果一个神经元的输出长期落在负半轴,它的梯度就一直是 0,权重再也不更新。这就是所谓的 dying ReLU。

视觉任务中,卷积核很多,死掉几个神经元通常不影响大局。但 Transformer 不一样。它的 FFN 层参数量通常占到模型总参数的三分之二左右,如果这层里出现大规模的神经元死亡,模型相当于丢失了大量记忆槽位,预训练的收敛曲线会变得非常难堪。

所以 ReLU 不是一个错误的激活函数,而是一个在深层 Transformer 场景下有点危险的激活函数。

GELU:把硬裁剪改成软门控

2016 年,Hendrycks 和 Gimpel 在论文中提出了 GELU。定义长得不能再简单:

GELU(x) = x · Φ(x)

这里的 Φ(x) 是标准正态分布的累积分布函数。看形状的话,GELU 和 ReLU 很像,但在负数部分不是一刀切到 0,而是留下了一个小尾巴:x 越负,输出越接近 0,但永远不是 0。

关键在这里:GELU 的负半轴照样有非零梯度。这意味着神经元一旦进入负区间,并没有死掉,还留着微弱的更新通道。训练后期即使某个神经元长期为负,它依然有机会被拉回活跃状态。

训练差异:关键在梯度,而不是形状

把两者放在一起对比,差异会更清楚:

维度 ReLU GELU
负数输出 0 接近 0 的小负数
负数梯度 0 非零且连续
神经元死亡风险
是否光滑 非光滑(在 0 处不可导) 光滑函数
正则化效果 近似伯努利正则化
计算成本 极低 需要 erf 或 tanh 近似

大模型训练通常用 Adam 或 AdamW,这些优化器对梯度的一阶矩和二阶矩都有估计。如果某个参数梯度长期为 0,优化器会认为这个方向不重要,对应的动量会衰减到零。在长达数十万步的预训练里,一点微小的梯度差异,会被优化器的动量机制放大。

另外,GELU 是光滑函数,ReLU 在 x=0 处不可导。虽然实践中可以用次梯度糊弄过去,但在深层网络的高度非凸空间中,光滑性对一阶优化方法更友好。你可以把它理解成:光滑的激活函数让 loss 曲面少了一些尖锐的棱角,优化器不容易卡在某个坏点

从 GELU 到 SwiGLU:一个家族的形成

GELU 之后,研究者并没有停下。2020 年,Shazeer 在GLU Variants Improve Transformer中系统对比了多种门控线性单元,提出了 SwiGLU、GeGLU 等变体。

简单说,SwiGLU 是这样计算的:

SwiGLU(x) = Swish(xW) ⊙ (xV)

它把输入投影成两份,一份经过 Swish 激活形成门,另一份直接通过,两者做逐元素乘。门控机制让 FFN 层学会按需打开或关闭信息通路,表达能力比直接做非线性映射更强。

无论是 Swish 还是 GELU,它们的曲线都非常相似,同属于平滑的 S 形激活家族。所以当我们说 GELU 家族,其实是在说一组用软门控替代硬截断的激活函数。

BERT 和 GPT 很早就把 GELU 放进了 Transformer 的 FFN 层,见BERT 论文PaLMLLaMA 则更激进,直接用了 SwiGLU。大模型时代,ReLU 在 FFN 层几乎不再是默认选项。

大模型为什么集体倒戈?

我觉得原因可以归结为四个字:优化收益

  • 梯度更稳定:GELU 的非零负半轴极大降低了 dying neuron 的概率;
  • 隐式正则化:GELU 的随机 mask 解释给模型带来额外泛化能力;
  • 更强的表示:SwiGLU 的门控机制让 FFN 层有了自适应路由能力,同样参数量下效果更好;
  • 大规模验证:从 BERT 到 GPT,再到 PaLM、LLaMA,GELU 家族是经历了十亿级参数训练检验的选择。

我自己的观点是:激活函数在大模型里的角色,已经从非线性来源变成了优化器的一部分。ReLU 在早期视觉模型里像个粗暴但好用的开关;而 GELU 家族更像一个可微的阀门,它让梯度更容易在深层网络中流动。

GELU 家族有代价吗?当然有。

GELU 不是免费的。它需要计算正态分布的 CDF,实际实现常用 tanh 近似:

GELU(x) ≈ 0.5x * (1 + tanh(√(2/π) * (x + 0.044715x³)))

这比 max(0, x) 贵不少。SwiGLU 则额外多了一个权重矩阵,参数量和激活内存都会增加。

所以 ReLU 并没有被完全淘汰。在推理延迟敏感、显存紧张的场景,比如端侧部署或超大规模稀疏推理,ReLU 依然有它的位置。因为它的计算几乎为零成本,而且稀疏激活能配合剪枝和量化。

常见误区:关于 GELU 的三个问题

GELU = Swish 吗?

不一样,但非常相似。Swish 是 x·sigmoid(x),GELU 是 x·Φ(x)。在标准正态分布假设下,这两条曲线的形状几乎重合。实际代码里,很多实现会用 x·sigmoid(1.702x) 来近似 GELU,所以你很难在运行时区分它们。

GELU 比 ReLU 收敛更快吗?

单步训练速度未必更快,但总步数通常更少。原因是 GELU 的梯度在负半轴依然有信息流动,优化器能根据这些梯度做更平滑的调整。对语言建模来说,收敛速度的差异在深层 FFN 上尤其明显。

为什么不用 Leaky ReLU 或 ELU?

Leaky ReLU 虽然也解决了死亡问题,但它没有 GELU 那种概率解释和正则化特性。ELU 也平滑,但计算涉及指数,效率一般。GELU 的特别之处在于它把 dropout 的思想融合进了激活函数,这在大规模预训练里是实打实的收益。

我的判断

如果你现在就准备训练一个新的 Transformer,我建议别用 ReLU 做默认选择。先从 GELU 开始,如果显存允许,换成 SwiGLU。

激活函数只是整个训练系统的一环,但它决定了梯度的道路质量。GELU 家族的崛起,不是因为哪一篇论文拍板说必须用它,而是因为在大规模训练的实际战场上,它比 ReLU 更容易让 loss 曲线听话地往下走。

说到底,大模型选择 GELU 家族,是因为在稳定性、表现力和计算成本之间,它给出了当前最好的平衡点。

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

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

相关推荐