
从 Sigmoid 到 SwiGLU:理解 Transformer 中的激活函数
Transformer 中的前馈网络(Feed-Forward Network,简称 FFN)看起来很简单:先做线性变换,再经过激活函数,最后做一次线性变换。但激活函数的选择,会直接影响网络的表达能力、梯度传播和训练效率。
一、FFN 的基本结构
标准 FFN 可以看作一个两层多层感知机(MLP)。设输入为行向量 x,计算过程为:
其中:
- 升维矩阵将输入投影到更高维的隐藏空间。
- z 是激活前的向量,φ 是逐元素应用的非线性激活函数。
- a 是激活后的向量,降维矩阵将其映射回模型维度。
如果没有非线性激活函数,两次线性变换仍然可以合并为一次线性变换。激活函数使网络能够学习更复杂的非线性关系。
二、Sigmoid:平滑可导,但容易出现梯度消失
早期感知机使用阶跃函数,根据输入是否超过阈值输出 0 或 1。但阶跃函数在阈值处不可导,其他位置的导数又为零,不适合直接用常规反向传播训练。
Sigmoid 提供了一个平滑替代:
它将输入压缩到 (0,1),但存在两个主要问题。
1. 输出不以零为中心
考虑某个输出神经元:
设损失函数为 L,则:
由于 Sigmoid 的输出始终为正,对于同一个样本、同一个输出神经元的这些权重,梯度符号由共同的上游梯度决定。
这会限制单次更新的方向,在某些情况下使优化路径出现低效的来回摆动。
需要注意,这不意味着整个网络的所有参数梯度都同号;对多个样本累积梯度后,也不一定保持这一性质。
2. 饱和导致梯度消失
Sigmoid 的导数为:
其最大值只有 0.25。当输入的绝对值较大时,导数会接近零。例如:
反向传播需要连续乘上各层的局部导数。如果多层都处于饱和区域,梯度就可能迅速衰减,导致前面层的参数难以得到有效更新。
三、Tanh:改善输出中心,仍然存在饱和
双曲正切函数定义为:
它与 Sigmoid 的关系是:
Tanh 的输出范围为 (-1,1),同时允许正值和负值,因此改善了 Sigmoid 输出不以零为中心的问题。
它的导数为:
在零附近,Tanh 的梯度较大;但输入非常大或非常小时,仍然会进入饱和区域,因此没有根本解决梯度消失。
四、ReLU:正半轴梯度稳定,但神经元可能“死亡”
ReLU,即修正线性单元:
它的特点非常直接:
- 输入为正时,输出等于输入,导数为 1。
- 输入为负时,输出为 0,导数为 0。
- 计算简单,不需要指数运算。
正半轴不饱和,使 ReLU 有助于缓解深层网络中的梯度消失问题。
不过,ReLU 的输出仍然非负,不能说它解决了 Sigmoid 的输出非零中心问题。零输出只会让部分梯度变为零,并不会让非零梯度自然拥有不同符号。
Dying ReLU:神经元死亡
如果某个神经元对所有训练样本的输入都为负,它的输出就始终为零,经过该激活函数传回的梯度也为零。这会使它难以继续学习,称为“神经元死亡”。
在实际网络中,其他层的变化仍可能改变该神经元的输入,因此“死亡”也不一定意味着永远无法恢复。
五、Leaky ReLU 与 PReLU:给负半轴保留梯度
Leaky ReLU 为负输入引入一个较小的斜率:
其中 α 通常取较小的正数,例如 0.01。这样,即使输入为负,梯度仍然能够传播,从而缓解神经元死亡问题。
PReLU(参数化 ReLU)进一步将 α 设为可学习参数,让模型通过训练决定负半轴应保留多少信号。
PReLU 提高了灵活性,但是否优于其他激活函数,取决于具体任务和网络结构。
六、从“激活”到“内容与门控”
一种统一的理解方式,是把激活函数拆成两部分:
内容提供原始信号,门控决定信号保留多少。例如,ReLU 可以理解为:
PReLU 则将负半轴的门控值改为 α。
这些门控采用硬切换。对应的激活函数虽然连续,但通常在零点存在导数不连续的问题。将硬门控替换为平滑函数,就得到了 Swish、SiLU 和 GELU 等激活函数。
1. Swish / SiLU:使用 Sigmoid 门控
SiLU 的定义为:
更一般的 Swish 为:
当 β=1 时,两者相同。
SiLU 平滑可导,并允许部分负值通过,避免了在零点进行硬截断。但它在非常负的区域中,梯度仍然可能很小。
2. GELU:使用高斯分布的累积分布函数门控
GELU 的定义为:
其中 Φ(z) 是标准正态分布的累积分布函数。
它也可以解释为一种随机门控的期望:若信号以 Φ(z) 的概率被保留,那么期望输出就是 zΦ(z)。这里的保留概率依赖输入,与固定概率的普通 Dropout 有区别。
GELU 被用于 BERT 和部分 GPT 系列模型。实际实现既可以使用基于误差函数的计算,也可以采用下面的 Tanh 近似:
具体使用哪一种方式,取决于框架和配置。
七、GLU:让内容和门控分别学习
SiLU 和 GELU 中,内容与门控都来自同一个数值 z。
可以进一步推广:让内容和门控分别由输入的不同线性变换产生。
其中 ⊙ 表示逐元素相乘。这种结构让模型分别学习:
- 提取什么内容。
- 根据哪些输入特征控制内容的通过。
根据门控函数的选择,可以得到不同变体。下面省略偏置,用独立的内容投影 v 和门控投影 u 表示:
| 变体 | 隐藏层计算 |
|---|---|
| GLU | v ⊙ σ(u) |
| ReGLU | v ⊙ ReLU(u) |
| GEGLU | v ⊙ GELU(u) |
| SwiGLU | v ⊙ SiLU(u) |
现代语言模型中,部分架构会省略这些偏置,但这属于架构选择,并不是门控结构的必要条件。
加上输出投影后,SwiGLU FFN 的形式为:
SwiGLU 已广泛用于现代大语言模型。
八、为什么 GLU 结构通常要缩小隐藏层?
设模型维度为 d,标准 FFN 的隐藏维度为 kd,忽略偏置。
标准 FFN 有两个矩阵,参数量为:
GLU 结构有内容、门控和输出三个矩阵。若隐藏维度为 h,参数量为:
要保持两者参数量相同,需要:
因此:
当标准 FFN 使用常见的四倍扩展,即 k=4 时:
所以,参数量相近的 SwiGLU FFN,隐藏维度往往约为模型维度的 2.67 倍。实际实现通常还会调整为方便硬件计算的整数倍。
九、Squared ReLU:更简单的替代方案
Squared ReLU 的定义为:
它可以看成两个共享输入的 ReLU 分支相乘:
相应的 FFN 可以写成:
它结构简单、无需额外的门控参数,并能产生零激活。不过,需要区分几个细节:
- 它不具备 SwiGLU 中两条独立投影分支的全部表达能力。
- 平方会缩小 0
1 的值,并不会将所有较小的正值完全置零。 - 激活稀疏不一定自动带来推理加速,还需要计算内核和硬件支持。
- 某些研究中它表现出竞争力,但不能据此认定它在所有任务中都优于 SwiGLU。
激活函数的发展,体现了几个持续的设计目标:改善梯度传播、避免过度饱和、保留有用信号,以及让网络更灵活地学习门控。最终选择哪一种,还需要同时考虑模型效果、参数预算和实际运行效率。




