2017年,Transformer论文发表时,作者选择了一个看似平淡无奇的组件作为前馈神经网络(FFN)的激活函数:ReLU。这个在2011年被重新发现的函数,因其计算简单、梯度稳定而成为深度学习的标配。然而,到了2023年,几乎所有新发布的大语言模型——LLaMA、PaLM、Mistral——都在FFN层抛弃了ReLU,转而采用一个名字拗口的组合:SwiGLU。

这不是跟风。Google在2020年发表的论文《GLU Variants Improve Transformer》用一组清晰的实验数据证明了这一点:在相同参数量和计算量的前提下,SwiGLU在预训练困惑度上比ReLU降低了约2.7%,在多个下游任务上的表现也更为出色。问题来了:为什么一个简单的激活函数替换能带来如此显著的提升?答案藏在十五年的技术演进之中。

ReLU的统治与困境

要理解SwiGLU的价值,必须先回到ReLU统治的时代。

ReLU的定义极其简单:

$$\text{ReLU}(x) = \max(0, x)$$

这个函数在正区间保持线性,在负区间直接截断为零。它的优势显而易见:计算代价极低(仅需一次比较),梯度在正区间恒为1(解决了sigmoid时代的梯度消失问题)。从AlexNet开始,ReLU几乎统治了所有深度神经网络的激活层。

但ReLU有两个致命缺陷,随着网络深度的增加愈发明显。

第一个问题是神经元死亡(Dying ReLU)。当一个神经元的输入在训练过程中持续为负时,ReLU的输出恒为零,梯度也恒为零。这意味着该神经元的权重永远无法更新——它"死"了。在深层网络中,一旦大量神经元死亡,模型的容量就会永久性受损。这不是理论风险:研究发现,在某些网络中,超过40%的神经元可能处于死亡状态。

第二个问题是非平滑性。ReLU在$x=0$处不可导,这是一个硬边界。虽然数学上可以用次梯度来处理,但这种不连续性会影响优化过程的稳定性。当输入恰好落在零附近时,微小的扰动可能导致输出的剧烈跳变。

更深层的哲学问题是:ReLU的决策机制过于"刚硬"。它根据输入的符号(正或负)做出硬性的门控决策——正信号全部通过,负信号全部阻断。这种二元决策忽略了输入的幅度信息。一个大幅度的负值和一个微小的负值,在ReLU眼里没有区别,都会被截断为零。

GELU:用概率重新定义门控

2016年,Dan Hendrycks和Kevin Gimpel提出了GELU(Gaussian Error Linear Unit),试图从根本上重新思考激活函数的设计哲学。

GELU的核心思想是:与其用一个硬性的符号判断来门控输入,不如用一个概率来加权。具体来说,GELU假设输入$x$服从标准正态分布,然后用该输入的累积分布函数值$\Phi(x)$作为权重:

$$\text{GELU}(x) = x \cdot \Phi(x) = x \cdot P(X \leq x)$$

其中$\Phi(x)$是标准正态分布的累积分布函数。这个公式有深刻的直觉含义:$\Phi(x)$表示一个随机变量小于或等于$x$的概率。当$x$很大时,$\Phi(x)$接近1,信号几乎完全通过;当$x$很小时,$\Phi(x)$接近0,信号被抑制;在$x=0$附近,$\Phi(x) \approx 0.5$,信号被部分保留。

GELU与Dropout的深层联系是理解其设计哲学的关键。Dropout是一种随机正则化技术:在训练时,以概率$p$随机将神经元置零。GELU可以看作是一种"确定性"的Dropout:它根据输入的大小来决定保留多少信息,而不是随机决定。这种设计将正则化和激活统一在同一个函数中。

从数学角度看,GELU是平滑的——它在所有点都可导。这与ReLU形成鲜明对比:

$$\text{GELU}'(x) = \Phi(x) + x \cdot \phi(x)$$

其中$\phi(x)$是标准正态分布的概率密度函数。这个导数在任何点都存在且连续,为优化过程提供了更平滑的梯度景观。

由于累积分布函数$\Phi(x)$涉及到误差函数(erf)的计算,GELU的直接计算代价较高。论文提出了一个高效的近似:

$$\text{GELU}(x) \approx 0.5x \left(1 + \tanh\left[\sqrt{\frac{2}{\pi}}(x + 0.044715x^3)\right]\right)$$

这个近似在精度损失极小的前提下,将计算复杂度大大降低。正是这个近似版本,被后来的BERT、GPT-2、GPT-3所采用,成为Transformer编码器模型的标配激活函数。

Swish:自动搜索的意外发现

2017年,Google Brain团队采用了一种不同寻常的方法来寻找更好的激活函数:自动搜索

在论文《Searching for Activation Functions》中,Ramachandran等人使用强化学习在一个预定义的搜索空间中探索激活函数的组合。搜索空间包含了各种一元和二元运算(如sigmoid、tanh、加、乘等),目标是找到在验证集上表现最好的组合。

搜索结果令人惊讶:表现最好的函数是一个极其简单的组合:

$$\text{Swish}(x) = x \cdot \sigma(x)$$

其中$\sigma(x) = \frac{1}{1+e^{-x}}$是sigmoid函数。后来,这个函数被更精确地定义为:

$$\text{Swish}_\beta(x) = x \cdot \sigma(\beta x)$$

其中$\beta$是一个可学习的参数(或固定为1)。

有趣的是,这个函数实际上在GELU论文中已经被提及过——被称为SiLU(Sigmoid Linear Unit)。Hendrycks和Gimpel在2016年的论文中就指出,可以用sigmoid函数$\sigma(x)$来近似标准正态分布的累积分布函数$\Phi(x)$,从而得到一个与GELU类似的激活函数。但当时这个函数并没有引起太多关注。

Swish有几个值得关注的数学性质:

非单调性:与ReLU、GELU不同,Swish在负区间有一个小的"下凹"。当$x \to -\infty$时,Swish趋近于0;但在某个负值区间,它会输出微小的负值。这种非单调性允许函数在负区间产生更丰富的表达能力。

自门控特性:Swish可以写作$\text{Swish}(x) = x \cdot \sigma(x)$,其中sigmoid部分$\sigma(x)$充当一个"软门":它根据输入的大小动态调整"开关程度",而不是像ReLU那样做硬性的0/1决策。

平滑性:Swish在所有点都可导,导数为:

$$\text{Swish}'(x) = \sigma(x) + x \cdot \sigma(x)(1 - \sigma(x))$$

这个导数在任何点都存在,为优化过程提供了稳定的梯度。

实验表明,Swish在深层网络中的表现优于ReLU,尤其是在超过40层的网络中优势更加明显。这与其平滑性和自门控特性密切相关。

GLU:从LSTM借来的门控智慧

SwiGLU的另一个关键组件是GLU(Gated Linear Unit),它源自一个完全不同的领域:语言模型中的卷积网络。

2016年,Yann Dauphin等人在论文《Language Modeling with Gated Convolutional Networks》中提出了GLU,目的是为卷积语言模型引入类似LSTM的门控机制。GLU的核心思想是:将输入分成两路,一路经过sigmoid激活作为"门",另一路保持线性变换作为"值",最后将两者逐元素相乘:

$$\text{GLU}(x, W, V) = \sigma(xW) \otimes (xV)$$

其中$W$和$V$是两个独立的权重矩阵,$\otimes$表示逐元素乘法(Hadamard积)。

这个设计直接借鉴了LSTM的输出门和遗忘门机制。在LSTM中,门控的作用是选择性传递信息:sigmoid函数输出一个0到1之间的值,决定多少信息可以通过。GLU将这个机制简化并引入到前馈网络中。

GLU的关键洞察是:门控机制允许网络动态地调整信息流,而不是像传统激活函数那样对所有输入应用相同的非线性变换。这种"内容相关的门控"为模型提供了更强的表达能力。

GLU在语言建模任务上取得了当时的最佳结果,但更重要的是,它为后来的激活函数设计提供了一个新的范式:门控激活

SwiGLU:完美的组合

2020年,Noam Shazeer在论文《GLU Variants Improve Transformer》中系统性地探索了GLU的各种变体,提出了SwiGLU——一个将Swish和GLU巧妙结合的激活函数。

SwiGLU的FFN层定义如下:

$$\text{FFN}_{\text{SwiGLU}}(x, W, V, W_2) = (\text{Swish}_1(xW) \otimes xV)W_2$$

与标准的ReLU FFN相比:

$$\text{FFN}_{\text{ReLU}}(x, W_1, W_2) = \text{ReLU}(xW_1)W_2$$

SwiGLU FFN有三个关键的架构变化:

  1. 三个权重矩阵代替两个:SwiGLU需要$W$、$V$、$W_2$三个矩阵,而标准FFN只需要$W_1$和$W_2$两个矩阵。

  2. 门控机制:$\text{Swish}(xW)$部分作为门,$xV$部分作为值,两者逐元素相乘。

  3. 平滑的非线性:用Swish代替了sigmoid作为门控激活函数。

论文对比了多种GLU变体在T5模型上的表现:

FFN类型 预训练困惑度
FFN_ReLU(基线) 1.677
FFN_GELU 1.679
FFN_Swish 1.683
FFN_GLU 1.663
FFN_GEGLU 1.633
FFN_SwiGLU 1.636

结果显示,GEGLU和SwiGLU的表现最佳,将困惑度从1.677降低到约1.635。在多个下游任务(GLUE、SuperGLUE、SQuAD)上,GLU变体也普遍优于传统的ReLU和GELU。

参数量的权衡:隐藏层的2/3法则

SwiGLU的一个常见误解是:引入第三个权重矩阵会增加参数量。实际上,现代大模型通过调整隐藏层维度来保持参数量不变。

标准Transformer FFN的隐藏层维度通常设置为$d_{ff} = 4 \times d_{model}$。例如,当$d_{model} = 768$时,$d_{ff} = 3072$。标准FFN的参数量为:

$$\text{Params}_{\text{ReLU}} = d_{model} \times d_{ff} + d_{ff} \times d_{model} = 2 \times d_{model} \times d_{ff}$$

对于SwiGLU,由于有三个矩阵($W$, $V$, $W_2$),如果保持相同的$d_{ff}$,参数量会增加50%:

$$\text{Params}_{\text{SwiGLU}} = d_{model} \times d_{ff} + d_{model} \times d_{ff} + d_{ff} \times d_{model} = 3 \times d_{model} \times d_{ff}$$

为了保持参数量相等,需要将$d_{ff}$调整为原来的$\frac{2}{3}$:

$$d_{ff}^{\text{SwiGLU}} = \frac{2}{3} \times d_{ff}^{\text{ReLU}}$$

这样:

$$\text{Params}_{\text{SwiGLU}} = 3 \times d_{model} \times \frac{2}{3}d_{ff} = 2 \times d_{model} \times d_{ff}$$

这正是LLaMA的做法:当$d_{model} = 4096$时,标准FFN的$d_{ff}$应为16384,但LLaMA使用$d_{ff} = \lfloor \frac{2}{3} \times 4 \times 4096 \rfloor = 10922$(具体实现中取$\frac{2}{3} \times 11008$等略有不同的值)。

这个调整揭示了一个重要的设计原则:在相同参数预算下,SwiGLU通过门控机制和更细粒度的非线性,实现了比ReLU更强的表达能力

大模型的选择:GELU vs SwiGLU的分野

观察当前主流大语言模型的激活函数选择,可以发现一个有趣的分野:

GELU阵营:GPT-2、GPT-3、BERT、RoBERTa、Claude早期版本

SwiGLU阵营:LLaMA(全部版本)、PaLM、Mistral、Gemma、GPT-NeoX、Falcon

这个分野并非偶然。它反映了模型设计哲学的演进:

GPT系列的路径:OpenAI从GPT-2开始就选择了GELU,并在GPT-3、GPT-4中延续使用。GELU的平滑性和与Dropout的概率联系,使其成为追求训练稳定性的首选。对于大规模预训练来说,训练稳定性往往比微小的性能提升更重要。

开源社区的转向:2020年GLU论文发表后,开源社区迅速采纳了SwiGLU。LLaMA作为开源大模型的标杆,其架构选择对整个生态系统产生了深远影响。后来的Mistral、Gemma等模型都遵循了LLaMA的架构范式。

性能 vs 稳定的权衡:SwiGLU在困惑度指标上略优于GELU(根据GLU论文,提升约2.4%),但它引入了更多的架构复杂度(三个矩阵、门控机制)。对于追求极致性能的场景(如竞赛、基准测试),SwiGLU是更好的选择;对于强调训练稳定性和简洁性的场景,GELU仍然是一个可靠的选择。

Sebastian Raschka在2025年的分析中指出了一个关键点:最新的gpt-oss系列模型已经从GELU转向了SwiGLU。这表明OpenAI内部也在重新评估激活函数的选择。SwiGLU的门控机制为模型提供了更强的动态表达能力,这在处理复杂推理任务时尤为重要。

为什么门控如此有效?

SwiGLU的成功引发了一个更深层次的问题:为什么门控机制如此有效?

选择性信息传递:门控允许网络根据输入内容动态决定保留多少信息。这与注意力机制有相似的哲学——不是所有信息都同等重要,应该有选择地处理。在FFN层,门控机制为每个神经元提供了一个"内容相关的开关",而不是像ReLU那样对负值一刀切。

梯度流的优化:门控机制改善了梯度流。在GLU中,梯度可以通过两条路径回传:门路径和值路径。即使门的梯度很小,值的梯度仍然可以有效地传播。这种冗余性为优化过程提供了更多的灵活性。

表达能力的提升:逐元素乘法是一种双线性运算,它允许模型捕捉输入的不同方面之间的交互。这与单一线性变换加激活函数相比,提供了更丰富的函数空间。

与Transformer架构的协同:Transformer的核心是注意力机制,它本身就是一种门控机制(通过softmax权重对value进行加权)。SwiGLU在FFN层引入门控,使得整个模型的两个核心组件(注意力和FFN)都采用了类似的"选择性处理"哲学。

计算代价的考量

SwiGLU并非没有代价。相比ReLU,它有以下几个计算开销:

矩阵乘法次数:SwiGLU需要三次矩阵乘法($xW$, $xV$, 以及最后的$W_2$投影),而标准FFN只需要两次。虽然隐藏层维度被压缩到$\frac{2}{3}$,但总计算量仍然略有增加。

激活函数复杂度:Swish涉及sigmoid计算,比ReLU的单次比较要昂贵。在实际实现中,这通常被优化为近似的快速版本。

内存带宽压力:三个权重矩阵意味着更高的内存访问量。在GPU上,这可能导致更高的显存带宽占用。

然而,这些开销通常被认为是可接受的。在LLM推理中,主要瓶颈通常是注意力计算的$O(n^2)$复杂度或KV Cache的内存占用,FFN层的计算开销相对可控。SwiGLU带来的性能提升足以弥补这些额外的计算成本。

选择指南:没有银弹

尽管SwiGLU在LLM领域占据主导地位,但它并非在所有场景下都是最佳选择:

计算机视觉:CNN仍然广泛使用ReLU及其变体(LeakyReLU、PReLU)。ReLU的稀疏激活特性对于视觉任务可能是有益的——它天然地产生稀疏特征图。

小型模型:对于参数量小于1亿的小型模型,ReLU的计算效率优势可能更重要。SwiGLU的参数效率优势在大模型上更明显。

训练稳定性优先:如果训练稳定性是最重要的考量(例如,资源有限、难以调参),GELU可能是更保守的选择。它的平滑性和简单性降低了训练出问题的风险。

推理延迟敏感:在对推理延迟极度敏感的场景(如实时语音处理),ReLU的最小计算开销可能更合适。

选择决策树:
│
├─ 是否为大语言模型?
│   └─ 是 → SwiGLU(推荐)或 GELU
│
├─ 是否为计算机视觉任务?
│   └─ 是 → ReLU 或 LeakyReLU
│
├─ 模型参数量是否 < 100M?
│   └─ 是 → ReLU(效率优先)
│
├─ 推理延迟是否极度敏感?
│   └─ 是 → ReLU
│
└─ 其他情况 → GELU 或 SwiGLU

代码实现

SwiGLU的实现非常直接。以下是PyTorch风格的伪代码:

import torch
import torch.nn as nn
import torch.nn.functional as F

class SwiGLU(nn.Module):
    def __init__(self, d_model, d_ff=None):
        super().__init__()
        if d_ff is None:
            # 标准FFN使用 4 * d_model
            # SwiGLU为了保持参数量,使用 2/3 * 4 * d_model ≈ 2.67 * d_model
            d_ff = int(2/3 * 4 * d_model)
        
        self.w_gate = nn.Linear(d_model, d_ff, bias=False)
        self.w_up = nn.Linear(d_model, d_ff, bias=False)
        self.w_down = nn.Linear(d_ff, d_model, bias=False)
    
    def forward(self, x):
        # 门控路径:Swish激活
        gate = F.silu(self.w_gate(x))  # silu = Swish with β=1
        # 值路径:线性变换
        value = self.w_up(x)
        # 门控 + 下投影
        return self.w_down(gate * value)

关键实现细节:

  1. 无偏置:现代LLM通常省略FFN层的偏置项以简化实现和减少参数。

  2. SiLU代替Swish:PyTorch的F.silu函数实现了$\beta=1$的Swish,与SwiGLU论文中的定义一致。

  3. 维度调整:隐藏层维度取$\frac{2}{3} \times 4 \times d_{model}$,确保参数量与标准FFN相当。

演进并未终结

SwiGLU的故事并未结束。2025年,研究者们仍在探索更优的激活函数设计:

Masked GLU (MGLU):2025年提出的一种SwiGLU替代方案,通过掩码机制进一步优化门控行为。

动态激活函数:一些研究探索让激活函数本身成为可学习的模块,根据训练进度动态调整。

硬件感知设计:随着专用AI芯片的发展,激活函数的设计开始考虑硬件友好的实现,例如用查表法替代复杂的指数运算。

但无论如何,从ReLU到SwiGLU的演进告诉我们一个深刻的道理:神经网络中最基础的组件——激活函数——值得最细致的设计。一个看似微小的数学选择,可能对模型的表达能力、训练稳定性和最终性能产生深远影响。

SwiGLU的成功不是因为它引入了某种神奇的魔法,而是因为它正确地组合了两个被时间验证的思想:平滑的非线性(来自GELU/Swish)和选择性门控(来自GLU)。这种组合,让模型在保持计算效率的同时,获得了更强的表达能力。这或许就是深度学习中"站在巨人肩膀上"的最好诠释。


参考文献

  1. Shazeer, N. (2020). GLU Variants Improve Transformer. arXiv:2002.05202.
  2. Hendrycks, D., & Gimpel, K. (2016). Gaussian Error Linear Units (GELUs). arXiv:1606.08415.
  3. Ramachandran, P., Zoph, B., & Le, Q. V. (2017). Searching for Activation Functions. arXiv:1710.05941.
  4. Dauphin, Y. N., Fan, A., Auli, M., & Grangier, D. (2016). Language Modeling with Gated Convolutional Networks. arXiv:1612.08083.
  5. Vaswani, A., et al. (2017). Attention Is All You Need. NeurIPS.
  6. Touvron, H., et al. (2023). LLaMA: Open and Efficient Foundation Language Models. arXiv:2302.13971.
  7. Raschka, S. (2025). From GPT-2 to gpt-oss: Analyzing the Architectural Advances. ahead of AI.
  8. Glorot, X., Bordes, A., & Bengio, Y. (2011). Deep Sparse Rectifier Neural Networks. AISTATS.