DeepSeek(以及 LLaMA、Mistral 等现代大模型)之所以选择 SwiGLU 作为前馈神经网络(FFN)的激活函数,是因为它在表达能力、训练稳定性和推理性能上,显著优于传统的 ReLU 或 GELU。

一、SwiGLU 是什么?名字怎么来的?

  • GLU = Gated Linear Unit(门控线性单元)
    → 引入一个“门”来控制信息是否通过。
  • Swish = 一种比 ReLU 更平滑的激活函数:
    Swish(x)=x⋅σ(x),其中 σ 是 sigmoid。
  • SwiGLU = 把 GLU 中的激活函数换成 Swish!

所以,SwiGLU = Swish + Gating(门控)。

二、SwiGLU 是怎么工作的?(通俗版)

想象你是一个内容审核员,要决定一条消息是否值得转发:

  1. 第一眼判断(Swish 分支):
    你快速扫一眼内容,觉得“好像还行”,但不确定,于是给出一个 0.7 的兴趣分(这个分数是平滑的,不是非黑即白)。

  2. 第二眼判断(门控分支):
    你再看一眼来源是否可信,给出一个 0.9 的可信度分。

  3. 最终决定:
    把两个分数相乘:0.7×0.9=0.63,作为最终转发强度。

这就是 SwiGLU 的核心思想:

不是简单地“开/关”,而是用两个信号相乘,做更精细的“加权通过”。

三、数学公式(技术版)

对于输入向量 x∈Rd,SwiGLU 定义为:

SwiGLU(x)=Swish(W1​x+b1​)⊗(W3​x+b3​)

然后通常还会接一个输出投影:

Output=W2​⋅SwiGLU(x)

其中:

  • W1​,W3​∈Rdff​×d:两个不同的线性变换;
  • Swish(z)=z⋅σ(z),σ(z)=1+e−z1​;
  • ⊗ 表示逐元素相乘(Hadamard product);
  • W2​ 把结果映射回原维度。

 注意:DeepSeek 和 LLaMA 通常不使用偏置项(bias=False),以减少参数并配合 RMSNorm。

四、为什么 SwiGLU 比 ReLU/GELU 更好?

特性 ReLU GELU SwiGLU
非线性能力 弱(硬截断) 中等(平滑) 强(门控+平滑)
梯度稳定性 有“死亡神经元”问题 较好 非常好(无硬截断)
表达能力 单一路径 单一路径 双路径交互(门控机制)
实测效果 基准 提升 显著提升(尤其在大模型中)

关键优势:

门控机制(Gating)

  • 允许模型动态调节每个特征的重要性;
  • 类似“注意力”,但作用在特征维度而非 token 维度。

平滑梯度

  • Swish 在负值区域也有小梯度,避免 ReLU 的“神经元死亡”问题;
  • 训练更稳定,收敛更快。

更强的表示能力

  • 实验证明:相同参数量下,SwiGLU 模型性能明显优于 ReLU/GELU;
  • 这就是为什么 LLaMA、DeepSeek、Mistral 等都采用它。

论文支持:
Google 在 2020 年的《GLU Variants Improve Transformer》中证明:GLU 变体(尤其是 SwiGLU)在语言建模任务上 consistently better。

五、DeepSeek 为什么特别适合用 SwiGLU?

  1. 参数效率高
    DeepSeek 70B 虽然参数多,但通过 MoE + SwiGLU,在激活参数少的情况下仍保持高性能。

  2. 与 RMSNorm 配合好
    DeepSeek 使用 RMSNorm(而非 LayerNorm),不使用 bias,而 SwiGLU 天然适合无 bias 设计。

  3. 推理速度与精度平衡
    SwiGLU 虽比 ReLU 稍慢,但在 A100/H100 等 GPU 上优化良好,且精度提升远大于计算开销。

六、举个代码例子(PyTorch)

1import torch
2import torch.nn as nn
3
4class SwiGLU(nn.Module):
5    def __init__(self, in_features, out_features, bias=False):
6        super().__init__()
7        self.w1 = nn.Linear(in_features, out_features, bias=bias)
8        self.w2 = nn.Linear(out_features, in_features, bias=bias)  # 输出投影
9        self.w3 = nn.Linear(in_features, out_features, bias=bias)
10
11    def forward(self, x):
12        swish = self.w1(x).sigmoid() * self.w1(x)  # Swish(W1x)
13        gate = self.w3(x)                          # W3x
14        return self.w2(swish * gate)               # 输出

在 DeepSeek 中,out_features 通常设为 int(2/3 * 4 * d_model),这是经验最优值(来自 LLaMA)。

 总结

DeepSeek 用 SwiGLU,是因为它像一个“智能阀门”:不仅能判断信息是否有用,还能精细调节用多少——这让大模型学得更快、记得更牢、答得更准。

它代表了现代大模型在激活函数设计上的重要进化:从“开关”到“调光旋钮”,再到“智能门控”。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐