Appearance
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_gate、ffn_up、ffn_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)