概念界定
激活函数是在神经网络中引入非线性的函数。没有非线性激活,多层线性层最终仍可以合并为一个线性变换,模型表达能力会严重受限。
背景与问题
Transformer 中的 Attention 负责混合 token 间信息,MLP/FFN 则负责对每个 token 的表示进行非线性变换。激活函数是 MLP 能够表达复杂模式的关键。
结构与机制
常见激活函数包括 ReLU、Sigmoid、GELU、SiLU / Swish 和 SwiGLU。为了避免符号悬空,这里先给出相关基础函数。
Sigmoid
Sigmoid 把实数压缩到 (0, 1) 区间:
sigmoid(x) = 1 / (1 + exp(-x))它的特点是:
x很大时,sigmoid(x)接近 1。x很小时,sigmoid(x)接近 0。- 在门控结构中,它常用来控制信息通过比例。
ReLU
ReLU 是最简单常见的分段线性激活:
ReLU(x) = max(0, x)也就是:
ReLU(x) = x, if x > 0
ReLU(x) = 0, if x <= 0它计算简单,但负半轴梯度为 0,可能出现部分神经元长期不更新的问题。
GELU
GELU 的全称是 Gaussian Error Linear Unit。它可以写作:
GELU(x) = x · Φ(x)其中 Φ(x) 是标准正态分布 N(0, 1) 的累积分布函数:
Φ(x) = P(Z <= x), Z ~ N(0, 1)展开为积分形式:
Φ(x) = ∫_{-∞}^{x} (1 / sqrt(2π)) exp(-t^2 / 2) dt实际实现中常用近似公式:
GELU(x) ≈ 0.5x · (1 + tanh(sqrt(2/π) · (x + 0.044715x^3)))也有实现使用 sigmoid 近似:
GELU(x) ≈ x · sigmoid(1.702x)直观上,GELU 不是像 ReLU 那样硬截断负数,而是根据输入大小给它一个平滑的通过概率。
SiLU / Swish
SiLU,也常称为 Swish,定义为:
SiLU(x) = x · sigmoid(x)代入 sigmoid 可写成:
SiLU(x) = x / (1 + exp(-x))它是平滑激活函数。和 ReLU 相比,SiLU 在负半轴不会直接变成 0,而是保留较小的负值输出。
GLU 与 SwiGLU
GLU 的全称是 Gated Linear Unit,核心思想是用一个 gate 控制另一条 value 分支的信息通过:
GLU(a, b) = a ⊙ sigmoid(b)其中 ⊙ 表示逐元素乘法。
SwiGLU 是把 gate 分支中的 sigmoid 换成 SiLU / Swish 的变体,现代 LLM 中常见写法是:
SwiGLU(x) = SiLU(xW_gate) ⊙ (xW_up)然后再经过降维投影:
FFN(x) = W_down( SiLU(xW_gate) ⊙ (xW_up) )这里 xW_gate 产生门控分支,xW_up 产生内容分支,逐元素相乘后表示“哪些信息允许通过”。
直观解释
激活函数像一个非线性开关或门控机制。它让模型不仅能做线性组合,还能根据输入大小选择性放大、抑制或过滤信息。
基本性质
- ReLU 简单高效,但负半轴梯度为 0。
- Sigmoid 输出在
(0, 1),适合作为门控,但在极大或极小输入处容易梯度饱和。 - GELU 在 BERT、GPT 等模型中常见,过渡更平滑,可以看作对输入进行概率式软门控。
- SiLU / Swish 是平滑激活,负半轴也保留连续输出。
- SwiGLU 将激活和门控结合,在 LLaMA 等现代大模型中常见。
- 激活函数会影响训练稳定性、表达能力、梯度传播和计算成本。
示例
Transformer FFN 的经典结构:
FFN(x) = W_down activation(W_up x)SwiGLU 风格结构:
FFN(x) = W_down( SiLU(W_gate x) ⊙ W_up x )SwiGLU 通过 gate 控制哪些信息通过 MLP。
常见误解
- 误解:激活函数只是让数值变得非负。
- 正确理解:只有 ReLU 这类函数有明显截断效果;GELU、SiLU、SwiGLU 更强调平滑变换和门控。
- 误解:Transformer 主要靠 Attention,MLP 和激活不重要。
- 正确理解:MLP 通常贡献大量参数和计算,对模型能力非常关键。
- 误解:所有激活函数可以随意替换。
- 正确理解:激活函数与初始化、归一化、学习率和模型结构都有耦合。