1. SwiGLU 起源:从 ReLU 到 GLU 再到 SwiGLU 的演进之路

说起激活函数,很多人第一反应就是 ReLU。确实,ReLU 简单粗暴,效果也不错。但我在实际项目中慢慢发现,它并不是万能的。尤其是做 Transformer 这类大模型时,激活函数的选择直接影响到模型能不能收敛、能跑多快。

今天我们就从 ReLU 开始,一步步聊到 GLU,再到 SwiGLU。这条演进路线,说白了就是人类对「非线性变换」这件事不断加深理解的过程。

1.1 ReLU:简单但不够完美

ReLU 的公式很简单:f(x) = max(0, x)。正数保留,负数直接干掉。

好处很明显:计算快、梯度不饱和、收敛快。但问题也很突出——神经元死亡。你想想看,一旦某个神经元输出一直是负数,它的梯度就永远是 0,再也学不动了。

核心痛点:ReLU 对负值区域「一刀切」,信息丢失严重。尤其在深层网络中,这种丢失会被逐层放大。

我在做早期的 NLP 模型时,就吃过这个亏。一个文本分类任务,用 ReLU 怎么调都差一口气。换成 Leaky ReLU 稍微好点,但也没质的飞跃。后来我才意识到,问题出在「门控机制」上——ReLU 家族本质上只是在做标量的硬门控,太粗糙了。

1.2 GLU:引入门控思想

GLU(Gated Linear Unit)是 2016 年由 Dauphin 等人提出的。它的核心思想是:用另一个线性变换来控制信息的通过量

公式长这样:

GLU(x) = (x * W + b) ⊗ σ(x * V + c)

其中 ⊗ 是逐元素乘法,σ 是 sigmoid 函数。前半部分是常规线性变换,后半部分是一个「门」——决定让多少信息通过。

这跟 ReLU 有什么本质区别?

  • ReLU 是硬门控:要么全过(正数),要么全关(负数)
  • GLU 是软门控:通过 sigmoid 输出 0~1 之间的值,信息可以「部分通过」

说白了,GLU 给了模型一个更精细的控制能力。我在做机器翻译任务时试过 GLU,效果确实比 ReLU 好一截。但问题也来了——GLU 的参数是 ReLU 的两倍,计算量上去了。

小技巧:如果你在资源受限的场景下用 GLU,可以考虑减少隐藏层维度来平衡参数量。我一般会砍掉 30% 左右的维度,效果损失不大,但速度能快不少。

1.3 Swish:Google 的意外发现

2017 年,Google 的 Ramachandran 等人用自动搜索找到了 Swish 激活函数:f(x) = x * σ(x)

这个函数很有意思。它跟 ReLU 有点像,但负值区域不是完全归零,而是有一个平滑的「下凹」曲线。这意味着什么?

  • 负值区域仍然有梯度,神经元不会死
  • 非单调性让模型有更丰富的表达能力
  • 平滑性有助于优化过程的稳定性

我记得第一次在图像分类任务上试 Swish,效果确实惊艳。同样的网络结构,换掉 ReLU 能涨 1-2 个点。但 Swish 也有个问题——计算 sigmoid 比 ReLU 慢不少。

1.4 SwiGLU:融合与进化

终于到主角了。SwiGLU 是 2020 年由 Google 在 PaLM 论文中提出的。它把 GLU 的门控思想和 Swish 的平滑特性结合在了一起。

公式:

SwiGLU(x) = (x * W + b) ⊗ Swish(x * V + c)

跟 GLU 相比,就是把 sigmoid 换成了 Swish。就这么一个改动,效果却提升明显。

为什么会这样?我个人理解是:

  1. Swish 的非单调性让门控信号更丰富,不是简单的 0~1 线性缩放
  2. 负值区域的保留让梯度流动更顺畅,训练更稳定
  3. 平滑性让优化过程不容易陷入局部最优

关键发现:在 Transformer 的 FFN 层中,SwiGLU 比 ReLU 能提升约 0.5-1.0 个 BLEU 点(机器翻译任务)。这在当年是大幅提升。

我曾经在一个对话生成任务上对比过各种激活函数。同样的模型结构,SwiGLU 的收敛速度比 ReLU 快了将近 30%,最终指标也高出不少。嗯,这里要注意——SwiGLU 的参数量是 ReLU 的两倍,所以实际使用时需要调整模型维度。

1.5 演进路线图

下面这张图展示了从 ReLU 到 SwiGLU 的演进脉络:

激活函数演进路线图 ReLU 2010 硬门控 GLU 2016 软门控 Swish 2017 平滑门控 SwiGLU 2020 门控+平滑 特性 ReLU GLU Swish SwiGLU 负值处理 ✗ 归零 ✓ 软控制 ✓ 保留 ✓ 保留 梯度流动 ✗ 易死亡 ✓ 良好 ✓ 优秀 ✓ 优秀

1.6 为什么 SwiGLU 在 Transformer 中表现更好?

Transformer 的 FFN 层本质上在做两件事:特征变换信息筛选。ReLU 只能做前者,而且做得比较粗糙。GLU 能做后者,但门控信号不够丰富。

SwiGLU 把两者结合了:

  • 线性变换负责特征映射
  • Swish 门控负责精细调节信息流
  • 两者协同,让 FFN 层有了更强的表达能力

避坑指南:我曾经在训练一个 1.5B 参数的模型时,直接拿 SwiGLU 替换 ReLU,结果显存爆了。后来才发现,SwiGLU 的 FFN 层中间维度通常是 8/3 * d_model(而不是 ReLU 的 4 * d_model)。这个细节很多人会忽略。

另外,SwiGLU 对学习率也比较敏感。我建议初始学习率设为 ReLU 版本的 0.7-0.8 倍,配合 warmup 策略,训练会更稳定。

1.7 小结

从 ReLU 到 SwiGLU,这条演进路线的核心逻辑其实就一句话:从硬门控到软门控,从标量控制到向量控制,从简单截断到平滑调节

每个阶段的改进都不是凭空而来的。ReLU 解决了梯度消失,GLU 引入了门控机制,Swish 提供了平滑性,SwiGLU 把它们融合在一起。说白了,这就是工程优化的典型思路——把已有的好东西组合起来,往往能产生 1+1>2 的效果。

下一节我们会深入 SwiGLU 的数学原理和代码实现。到时候我会手把手带你写一个可用的 SwiGLU 层,并对比它在不同任务上的表现。


公众号:蓝海资料掘金营,微信 deep3321