Skip to content

Swish-Gated Linear Unit——MoE 专家和 FFN 使用的激活函数,用门控机制混合两个线性变换。

为什么需要 SwiGLU

传统 FFN 使用 ReLU 激活:output = ReLU(x × W1) × W2。ReLU 的问题是:所有负值直接归零,信息完全丢失。SwiGLU 用门控机制替代 ReLU,允许负值区域也有梯度流动。

核心原理

ReLU:    output = max(0, x × W_gate) × W_up
SwiGLU:  output = (SiLU(x × W_gate) ⊙ (x × W_up)) × W_down
                        ↑ 门控信号         ↑ 信息流        ↑ 投影回原维度

SiLU(x) = x × σ(x)  (Sigmoid Linear Unit, 也叫 Swish)
⊙ = element-wise 乘法(门控)

SwiGLU 需要三个权重矩阵(gate、up、down),比 ReLU-FFN 的两个多一个,但效果更好。现代 LLM(LLaMA、DeepSeek、Mistral)几乎全部使用 SwiGLU。

在 ds4.c 中的实现

每个 MoE 专家有三个权重矩阵(ffn_gateffn_upffn_down),共享专家同理:

c
// 专家前向(伪代码)
gate = matvec(x, ffn_gate);   // 门控投影
up   = matvec(x, ffn_up);     // 上投影
hidden = silu(gate) * up;     // 门控混合
output = matvec(hidden, ffn_down);  // 下投影回原维度

相关概念

  • moe — 每个 MoE 专家内部使用 SwiGLU 激活
  • quantization — 专家的 SwiGLU 权重使用激进量化(~2 bit)

详见 Part 3 — MoE 混合专家