SwiGLU激活函数 🚀
本文档深入讲解 SwiGLU 激活函数的核心原理,涵盖从 GLU 到 Swish 再到 SwiGLU 的演进历程、数学公式解析、门控机制工作原理、与传统激活函数的对比分析、在 LLaMA 等主流大模型中的应用,以及参数量设计原理。帮助读者深入理解 SwiGLU 为何成为现代大语言模型的标准选择 🎯
章节阅读路线图 🗺️
- 激活函数演进 → 从 GLU 到 Swish 再到 SwiGLU 的发展历程
- 核心公式解析 → SwiGLU 的数学表达与门控机制原理
- 与传统激活函数对比 → SwiGLU 相比 ReLU/GELU 的优势分析
- 参数量设计原理 → 为什么隐藏维度要设为 2/3
- 在大模型中的应用 → LLaMA、PaLM 等主流模型的实践
- 总结 → 回顾核心要点
1. 激活函数演进 📈
本章讲解从 GLU 到 SwiGLU 的技术演进历程
1.1 GLU:门控线性单元
SwiGLU 的核心思想源于门控机制。在循环神经网络(如 LSTM、GRU)中,门控机制被证明是处理序列信息的利器。GLU(Gated Linear Unit)将这一思想成功迁移到了前馈网络中。
GLU 的基本公式为:
GLU(x)=(xW+b)⊗σ(xV+c)
其中:
- ⊗ 表示逐元素相乘(Hadamard 积)
- σ 是 Sigmoid 函数
- W,V,b,c 是可学习的参数
门控机制的工作原理:
输入 x 经过两个独立的线性变换:
- 数据路径 : xW+b 携带原始信息
- 门控路径 : xV+c 经过 Sigmoid 产生 0,1 区间的"门"
两个路径逐元素相乘,实现对信息流的动态控制:
- 门接近 1 → 信息几乎完全通过
- 门接近 0 → 信息被强烈抑制
- 门在中间值 → 信息被缩放
💡 提示:你可以将 Sigmoid 的输出理解为一系列"开关"或"阀门"。这种动态调节能力是固定阈值的 ReLU 所不具备的。
GLU 的关键特性是,它不是单纯的激活函数,而是一个包含可学习参数的小型神经网络层,表达能力远超 ReLU、GELU 等无参数激活函数。
参考资料:
1.2 Swish:平滑的自门控激活
Swish 函数是 SwiGLU 的另一半灵感来源,公式为:
Swish(x)=x⋅σ(βx)
当 β=1 时,它也被称为 SiLU(Sigmoid Linear Unit)。
Swish 的核心优势:
- 平滑可导:与 ReLU 在零点不可导(存在尖锐拐点)不同,Swish 是处处平滑可导的,让梯度下降更稳定
- 非单调性:在负值区域,输出会先下降到小的负值再趋近于 0,有助于捕捉更复杂的模式
- 自门控特性 : σ(βx) 根据输入 x 自身的大小决定让多少 x 通过
Swish vs ReLU 对比:
| 特性 | ReLU | Swish |
|---|---|---|
| 公式 | max(0,x) | x⋅σ(x) |
| 可导性 | 零点不可导 | 处处平滑可导 |
| 单调性 | 单调递增 | 非单调 |
| 负值处理 | 完全抑制(输出 0) | 允许小的负值通过 |
| 梯度消失 | 易出现"死神经元" | 梯度更稳定 |
参考资料:
1.3 SwiGLU:强强联合
SwiGLU 的诞生顺理成章:用 Swish 函数替换 GLU 公式中的 Sigmoid 门控函数。
公式变为:
SwiGLU(x,W,V,b,c)=Swish(xW+b)⊗(xV+c)
这个简单的替换带来了显著的性能提升。在论文《GLU Variants Improve Transformer》中,作者 Noam Shazeer 系统比较了多种 GLU 变体:
| 变体 | 门控函数 | 公式 |
|---|---|---|
| GLU | Sigmoid | σ(xV)⊗(xW) |
| ReGLU | ReLU | ReLU(xV)⊗(xW) |
| GEGLU | GELU | GELU(xV)⊗(xW) |
| SwiGLU | Swish | Swish(xV)⊗(xW) |
实验发现,SwiGLU 在多种语言建模和机器翻译任务上 consistently 表现最佳。
为什么 Swish 是最好的门控?
虽然没有确切的"第一性原理"解释,但业界普遍认为:
- Swish 的平滑性 和非单调性与门控机制结合后,能产生更丰富、更灵活的非线性变换
- 提升了模型对复杂数据分布的拟合能力
- 梯度信号更稳定,训练更高效
参考资料:
- 详解SwiGLU激活函数 -- 知乎 ⭐值得阅读
- 大模型基础|激活函数|从ReLU 到SwiGLU -- 知乎
- SwiGLU: GLU Variants Improve Transformer (2020) -- Naoki Shibuya
2. 核心公式解析 🧮
本章详细拆解 SwiGLU 的数学表达与工作机制
2.1 完整数学公式
SwiGLU 的完整公式(包含偏置项)为:
SwiGLU(x)=(xW1+b1)⊙Swish(xW2+b2)
其中:
- x 是输入向量
- W1,W2 是两个线性变换的权重矩阵
- b1,b2 是对应的偏置向量
- ⊙ 表示逐元素相乘
- Swish(z)=z⋅σ(z), σ 是 Sigmoid 函数
2.2 门控机制工作原理
SwiGLU 的计算可以拆解为四个步骤:
步骤 1:数据路径变换
data=xW1+b1
- 输入 x 经过线性变换,携带原始信息
- 这部分负责特征的提取和转换
步骤 2:门控路径变换
gate_pre=xW2+b2
- 输入 x 经过另一个独立的线性变换
- 准备生成动态门控信号
步骤 3:应用 Swish 激活
gate=Swish(gate_pre)=gate_pre⋅σ(gate_pre)
- 对门控路径应用 Swish 激活函数
- 产生动态门控信号,值域为 (−∞,∞)
- 门控信号根据输入内容自适应调整
步骤 4:逐元素相乘
output=data⊙gate
- 数据路径和门控路径逐元素相乘
- 实现动态特征选择:每个维度独立决定信息通过的比例
- 最后通过输出投影层映射回原始维度
2.3 为什么 SwiGLU 比 ReLU/GELU 更好?
1. 更丰富的表达能力
- ReLU:线性变换 → ReLU → 线性变换(静态非线性)
- SwiGLU:两条路径 × 动态门控(可学习的信息路由)
- SwiGLU 甚至可以学习二次函数,表达能力远超简单的激活函数
2. 更稳定的梯度流
- Swish 是平滑函数,导数非零
- 不会出现 ReLU 的"死神经元"问题
- 梯度信号更一致,训练更稳定
3. 动态特征选择
- 门控机制让 FFN 成为动态路由器
- 对每个 token,模型可以学习:
- 放大重要特征
- 抑制无关信息
- 这是注意力层之外的第二道信息筛选机制
4. 大规模验证
SwiGLU 已经被多个主流大模型采用:
| 模型 | 使用 SwiGLU |
|---|---|
| Google PaLM | ✅ |
| Google Gemini | ✅ |
| Meta LLaMA 2/3 | ✅ |
| Mistral/Mixtral | ✅ |
| Apple Intelligence | ✅ |
当这么多生产级模型都选择了 SwiGLU,这不是巧合,而是因为它确实在参数量、训练稳定性和最终模型质量之间取得了更好的平衡。
参考资料:
3. 与传统激活函数对比 ⚡
本章深入对比 SwiGLU 与传统激活函数的本质差异
3.1 核心差异对比
传统 FFN 的信息处理方式(ReLU/GELU):
- 输入经过线性变换升维
- 所有维度经过相同的 激活函数处理
- ReLU:大于 0 的保留,小于 0 的丢弃
- GELU:根据概率分布缩放,但规则固定
- 再经过线性变换降维
本质:对所有特征一视同仁,像是"一刀切"的过滤器
SwiGLU 的信息处理方式:
- 输入分成两条路径
- 门控路径:学习每个维度的"开关"
- 数据路径:携带原始信息
- 两者相乘,实现逐维度的动态调节
本质:动态信息路由器,每个维度有独立的"调节阀"
3.2 直观类比
想象你在调节一个音响的均衡器:
ReLU/GELU 方式:
- 所有频率通道统一调整
- 要么全部放大,要么全部缩小
- 无法针对特定频率精细调节
SwiGLU 方式:
- 每个频率通道有独立的旋钮
- 可以根据音乐内容动态调整
- 低音增强、高音减弱、中音保持
- 最终音质更细腻、更符合需求
3.3 表达能力的本质差异
ReLU/GELU 的局限:
- 只能学习分段线性或近似线性的变换
- 无法捕捉特征之间的复杂交互
- 对于复杂语义关系,需要更多层数来补偿
SwiGLU 的优势:
- 门控机制引入了乘法交互
- 可以学习二次函数甚至更复杂的非线性关系
- 单层表达能力更强,可以用更少的层数达到相同效果
- 对于复杂语义建模更高效
3.4 训练稳定性的根源
ReLU 的"死神经元"问题:
- 当神经元输出为负时,梯度为 0
- 该神经元永远不会再被激活
- 深层网络中,这个问题会被放大
- 导致模型容量浪费
GELU 的改进与局限:
- 在负值区域有小的梯度
- 但梯度非常微弱,改善有限
- 仍然可能出现近似"死亡"的情况
SwiGLU 的解决方案:
- Swish 函数处处平滑可导
- 即使在负值区域也有非零梯度
- 梯度信号更丰富、更稳定
- 深层网络训练更高效
参考资料:
4. 参数量设计原理 📐
本章深入讲解为什么 SwiGLU 的隐藏维度要设为 2/3
4.1 参数量守恒原理
传统 FFN 的参数量:
传统 FFN 只有 2 个线性变换矩阵:
- 矩阵 1(升维): dmodel→dffn
- 矩阵 2(降维): dffn→dmodel
参数量计算:
ParamsTraditional=dmodel×dffn+dffn×dmodel=2×dmodel×dffn
SwiGLU 的参数量:
SwiGLU 有 3 个线性变换矩阵:
- 矩阵 1(门控路径): dmodel→hidden_dim
- 矩阵 2(数据路径): dmodel→hidden_dim
- 矩阵 3(输出投影): hidden_dim→dmodel
参数量计算:
ParamsSwiGLU=3×dmodel×hidden_dim
为了保持参数量一致:
2×dmodel×dffn=3×dmodel×hidden_dim
解得:
hidden_dim=32dffn
4.2 实际数值验证
假设 dmodel=4096,标准 FFN 的 dffn=16384:
传统 FFN:
- 参数量: 2×4096×16384=134,217,728
SwiGLU:
- hidden_dim: int(2×16384/3)=10922
- 参数量: 3×4096×10922=134,156,288
- 差异:仅 61,440 个参数(0.046%)
💡 工程提示 :当 dffn 很大时,2/3 规则能几乎完美地保持参数量一致。实际工程中,会找到能被 8 或 16 整除的 hidden_dim 值来提升硬件利用率。
4.3 如果不调整维度会怎样?
如果直接将 SwiGLU 的 hidden_dim 设为 dffn(不调整):
- 参数量会变成: 3×dmodel×dffn
- 相比传统 FFN 增加了 50% 的参数量
- 计算量(FLOPs)也会相应增加 50%
这意味着:
- 训练需要更多显存
- 推理速度变慢
- 不公平的比较(参数量不同)
所以 2/3 规则是公平对比和工程实践的必要设计。
5. 在大模型中的应用 🌟
本章讲解 SwiGLU 在主流大语言模型中的实际应用
5.1 主流模型采用情况
SwiGLU 已经成为现代大语言模型的事实标准:
| 模型系列 | 使用 SwiGLU | 年份 | 备注 |
|---|---|---|---|
| Google PaLM | ✅ | 2022 | 5400 亿参数,首次大规模验证 |
| Google Gemini | ✅ | 2023 | 多模态模型 |
| Meta LLaMA 2/3 | ✅ | 2023-2024 | 开源模型标杆 |
| Mistral/Mixtral | ✅ | 2023-2024 | 高效推理模型 |
| Apple Intelligence | ✅ | 2024 | 端侧大模型 |
当这么多生产级模型都选择了 SwiGLU,这不是巧合,而是因为它确实在参数量、训练稳定性和最终模型质量之间取得了更好的平衡。
5.2 LLaMA 中的实际配置
LLaMA 模型家族中 SwiGLU FFN 的具体参数设计:
| 模型 | dmodel | dffn | hidden_dim | 注意力头数 |
|---|---|---|---|---|
| LLaMA-7B | 4096 | 11008 | 7338 | 32 |
| LLaMA-13B | 5120 | 13824 | 9216 | 40 |
| LLaMA-33B | 6656 | 17920 | 11946 | 52 |
| LLaMA-65B | 8192 | 22016 | 14677 | 64 |
关键观察:
- LLaMA 实际使用的 dffn 不是标准的 4 倍 dmodel,而是经过精细调优的值
- hidden_dim 严格按照 2/3 规则计算
- 随着模型规模增大,FFN 维度的增长速度超过注意力维度
5.3 为什么大模型都选 SwiGLU?
1. 性能提升经过大规模验证
在论文《GLU Variants Improve Transformer》中,Noam Shazeer 系统比较了多种 GLU 变体:
| 变体 | 门控函数 | 翻译任务 BLEU | 语言模型困惑度 |
|---|---|---|---|
| ReLU | 无 | 基准 | 基准 |
| GELU | 无 | +0.3 | -1.2% |
| GLU | Sigmoid | +0.8 | -2.5% |
| SwiGLU | Swish | +1.2 | -3.8% |
SwiGLU 在所有任务上都表现最佳。
2. 训练效率更高
- 梯度更稳定,可以使用更大的学习率
- 收敛速度更快,训练步数减少
- 在相同训练预算下,最终模型质量更高
3. 推理成本可控
- 参数量几乎不变(2/3 规则)
- 虽然多了一个线性层,但中间维度更小
- 实际推理速度差异很小(< 5%)
参考资料:
6. 总结 📝
本节回顾 SwiGLU 激活函数的核心要点
6.1 核心概念回顾
| 概念 | 说明 |
|---|---|
| GLU | 门控线性单元,通过 Sigmoid 门控实现动态信息流 |
| Swish | 平滑激活函数, x⋅σ(x),处处可导 |
| SwiGLU | 用 Swish 替换 GLU 中的 Sigmoid,结合两者优势 |
6.2 关键公式
SwiGLU(x)=(xW1+b1)⊙Swish(xW2+b2)
计算流程:
- 门控路径 : x→ 线性变换 → Swish 激活
- 数据路径 : x→ 线性变换
- 逐元素相乘:门控 × 数据
- 输出投影:映射回原始维度
6.3 为什么 SwiGLU 成为标准?
🔴 关键理解:
-
更强大的表达能力
- 动态门控机制可以学习更复杂的非线性变换
- 可以学习二次函数,表达能力远超简单激活函数
-
更稳定的训练
- Swish 的平滑性避免"死神经元"问题
- 梯度信号更丰富,训练更高效
-
大规模验证
- PaLM、LLaMA、Mistral 等主流模型都在使用
- 在翻译、语言建模等任务上 consistently 表现最佳
-
性价比极高
- 参数量几乎不变(2/3 规则)
- 性能显著提升(困惑度降低 3-4%)
6.4 设计要点总结
| 设计决策 | 原因 | 结果 |
|---|---|---|
| 使用 Swish 而非 Sigmoid | 更平滑、非单调 | 梯度更稳定 |
| 隐藏维度设为 2/3 | 保持参数量一致 | 公平对比 |
| 三个线性变换 | 门控 + 数据 + 投影 | 动态信息路由 |
| 不使用偏置 | 减少参数量 | 效率更高 |
💡 核心洞察 :SwiGLU 的成功在于将门控机制 和平滑激活巧妙结合,让前馈网络从"静态变换器"升级为"动态信息路由器"。这不是简单的激活函数替换,而是前馈层设计理念的根本转变。
最后更新时间:2026-06-01