09abb-SwiGLU激活函数

SwiGLU激活函数 🚀

本文档深入讲解 SwiGLU 激活函数的核心原理,涵盖从 GLU 到 Swish 再到 SwiGLU 的演进历程、数学公式解析、门控机制工作原理、与传统激活函数的对比分析、在 LLaMA 等主流大模型中的应用,以及参数量设计原理。帮助读者深入理解 SwiGLU 为何成为现代大语言模型的标准选择 🎯

章节阅读路线图 🗺️

  1. 激活函数演进 → 从 GLU 到 Swish 再到 SwiGLU 的发展历程
  2. 核心公式解析 → SwiGLU 的数学表达与门控机制原理
  3. 与传统激活函数对比 → SwiGLU 相比 ReLU/GELU 的优势分析
  4. 参数量设计原理 → 为什么隐藏维度要设为 2/3
  5. 在大模型中的应用 → LLaMA、PaLM 等主流模型的实践
  6. 总结 → 回顾核心要点

1. 激活函数演进 📈

本章讲解从 GLU 到 SwiGLU 的技术演进历程

1.1 GLU:门控线性单元

SwiGLU 的核心思想源于门控机制。在循环神经网络(如 LSTM、GRU)中,门控机制被证明是处理序列信息的利器。GLU(Gated Linear Unit)将这一思想成功迁移到了前馈网络中。

GLU 的基本公式为:
GLU(x)=(xW+b)⊗σ(xV+c)\text{GLU}(x) = (xW + b) \otimes \sigma(xV + c) GLU(x)=(xW+b)⊗σ(xV+c)

其中:

  • ⊗\otimes ⊗ 表示逐元素相乘(Hadamard 积)
  • σ\sigma σ 是 Sigmoid 函数
  • W,V,b,cW, V, b, c W,V,b,c 是可学习的参数

门控机制的工作原理

输入 xx x 经过两个独立的线性变换:

  1. 数据路径 xW+bxW + b xW+b 携带原始信息
  2. 门控路径 xV+cxV + c xV+c 经过 Sigmoid 产生 0,10, 1 0,1 区间的"门"

两个路径逐元素相乘,实现对信息流的动态控制

  • 门接近 1 → 信息几乎完全通过
  • 门接近 0 → 信息被强烈抑制
  • 门在中间值 → 信息被缩放

💡 提示:你可以将 Sigmoid 的输出理解为一系列"开关"或"阀门"。这种动态调节能力是固定阈值的 ReLU 所不具备的。

GLU 的关键特性是,它不是单纯的激活函数,而是一个包含可学习参数的小型神经网络层,表达能力远超 ReLU、GELU 等无参数激活函数。


参考资料:

1.2 Swish:平滑的自门控激活

Swish 函数是 SwiGLU 的另一半灵感来源,公式为:
Swish(x)=x⋅σ(βx)\text{Swish}(x) = x \cdot \sigma(\beta x) Swish(x)=x⋅σ(βx)

β=1\beta = 1 β=1 时,它也被称为 SiLU(Sigmoid Linear Unit)。

Swish 的核心优势

  1. 平滑可导:与 ReLU 在零点不可导(存在尖锐拐点)不同,Swish 是处处平滑可导的,让梯度下降更稳定
  2. 非单调性:在负值区域,输出会先下降到小的负值再趋近于 0,有助于捕捉更复杂的模式
  3. 自门控特性 σ(βx)\sigma(\beta x) σ(βx) 根据输入 xx x 自身的大小决定让多少 xx x 通过

Swish vs ReLU 对比

特性 ReLU Swish
公式 max⁡(0,x)\max(0, x) max(0,x) x⋅σ(x)x \cdot \sigma(x) x⋅σ(x)
可导性 零点不可导 处处平滑可导
单调性 单调递增 非单调
负值处理 完全抑制(输出 0) 允许小的负值通过
梯度消失 易出现"死神经元" 梯度更稳定

参考资料:

1.3 SwiGLU:强强联合

SwiGLU 的诞生顺理成章:用 Swish 函数替换 GLU 公式中的 Sigmoid 门控函数

公式变为:
SwiGLU(x,W,V,b,c)=Swish(xW+b)⊗(xV+c)\text{SwiGLU}(x, W, V, b, c) = \text{Swish}(xW + b) \otimes (xV + c) SwiGLU(x,W,V,b,c)=Swish(xW+b)⊗(xV+c)

这个简单的替换带来了显著的性能提升。在论文《GLU Variants Improve Transformer》中,作者 Noam Shazeer 系统比较了多种 GLU 变体:

变体 门控函数 公式
GLU Sigmoid σ(xV)⊗(xW)\sigma(xV) \otimes (xW) σ(xV)⊗(xW)
ReGLU ReLU ReLU(xV)⊗(xW)\text{ReLU}(xV) \otimes (xW) ReLU(xV)⊗(xW)
GEGLU GELU GELU(xV)⊗(xW)\text{GELU}(xV) \otimes (xW) GELU(xV)⊗(xW)
SwiGLU Swish Swish(xV)⊗(xW)\text{Swish}(xV) \otimes (xW) Swish(xV)⊗(xW)

实验发现,SwiGLU 在多种语言建模和机器翻译任务上 consistently 表现最佳

为什么 Swish 是最好的门控?

虽然没有确切的"第一性原理"解释,但业界普遍认为:

  • Swish 的平滑性非单调性与门控机制结合后,能产生更丰富、更灵活的非线性变换
  • 提升了模型对复杂数据分布的拟合能力
  • 梯度信号更稳定,训练更高效

参考资料:


2. 核心公式解析 🧮

本章详细拆解 SwiGLU 的数学表达与工作机制

2.1 完整数学公式

SwiGLU 的完整公式(包含偏置项)为:
SwiGLU(x)=(xW1+b1)⊙Swish(xW2+b2)\text{SwiGLU}(x) = (xW_1 + b_1) \odot \text{Swish}(xW_2 + b_2) SwiGLU(x)=(xW1+b1)⊙Swish(xW2+b2)

其中:

  • xx x 是输入向量
  • W1,W2 W_1, W_2 W1,W2 是两个线性变换的权重矩阵
  • b1,b2 b_1, b_2 b1,b2 是对应的偏置向量
  • ⊙\odot ⊙ 表示逐元素相乘
  • Swish(z)=z⋅σ(z)\text{Swish}(z) = z \cdot \sigma(z) Swish(z)=z⋅σ(z), σ\sigma σ 是 Sigmoid 函数

2.2 门控机制工作原理

SwiGLU 的计算可以拆解为四个步骤:

步骤 1:数据路径变换
data=xW1+b1 \text{data} = xW_1 + b_1 data=xW1+b1

  • 输入 xx x 经过线性变换,携带原始信息
  • 这部分负责特征的提取和转换

步骤 2:门控路径变换
gate_pre=xW2+b2 \text{gate\_pre} = xW_2 + b_2 gate_pre=xW2+b2

  • 输入 xx x 经过另一个独立的线性变换
  • 准备生成动态门控信号

步骤 3:应用 Swish 激活
gate=Swish(gate_pre)=gate_pre⋅σ(gate_pre)\text{gate} = \text{Swish}(\text{gate\_pre}) = \text{gate\_pre} \cdot \sigma(\text{gate\_pre}) gate=Swish(gate_pre)=gate_pre⋅σ(gate_pre)

  • 对门控路径应用 Swish 激活函数
  • 产生动态门控信号,值域为 (−∞,∞)(-\infty, \infty) (−∞,∞)
  • 门控信号根据输入内容自适应调整

步骤 4:逐元素相乘
output=data⊙gate\text{output} = \text{data} \odot \text{gate} 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)

  1. 输入经过线性变换升维
  2. 所有维度经过相同的 激活函数处理
    • ReLU:大于 0 的保留,小于 0 的丢弃
    • GELU:根据概率分布缩放,但规则固定
  3. 再经过线性变换降维

本质:对所有特征一视同仁,像是"一刀切"的过滤器

SwiGLU 的信息处理方式

  1. 输入分成两条路径
  2. 门控路径:学习每个维度的"开关"
  3. 数据路径:携带原始信息
  4. 两者相乘,实现逐维度的动态调节

本质:动态信息路由器,每个维度有独立的"调节阀"

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 d_{\text{model}} \rightarrow d_{\text{ffn}} dmodel→dffn
  • 矩阵 2(降维): dffn→dmodel d_{\text{ffn}} \rightarrow d_{\text{model}} dffn→dmodel

参数量计算:
ParamsTraditional=dmodel×dffn+dffn×dmodel=2×dmodel×dffn \text{Params}{\text{Traditional}} = d{\text{model}} \times d_{\text{ffn}} + d_{\text{ffn}} \times d_{\text{model}} = 2 \times d_{\text{model}} \times d_{\text{ffn}} ParamsTraditional=dmodel×dffn+dffn×dmodel=2×dmodel×dffn

SwiGLU 的参数量

SwiGLU 有 3 个线性变换矩阵:

  • 矩阵 1(门控路径): dmodel→hidden_dim d_{\text{model}} \rightarrow \text{hidden\_dim} dmodel→hidden_dim
  • 矩阵 2(数据路径): dmodel→hidden_dim d_{\text{model}} \rightarrow \text{hidden\_dim} dmodel→hidden_dim
  • 矩阵 3(输出投影): hidden_dim→dmodel \text{hidden\dim} \rightarrow d{\text{model}} hidden_dim→dmodel

参数量计算:
ParamsSwiGLU=3×dmodel×hidden_dim \text{Params}{\text{SwiGLU}} = 3 \times d{\text{model}} \times \text{hidden\_dim} ParamsSwiGLU=3×dmodel×hidden_dim

为了保持参数量一致
2×dmodel×dffn=3×dmodel×hidden_dim 2 \times d_{\text{model}} \times d_{\text{ffn}} = 3 \times d_{\text{model}} \times \text{hidden\_dim} 2×dmodel×dffn=3×dmodel×hidden_dim

解得:
hidden_dim=23dffn \text{hidden\dim} = \frac{2}{3} d{\text{ffn}} hidden_dim=32dffn

4.2 实际数值验证

假设 dmodel=4096 d_{\text{model}} = 4096 dmodel=4096,标准 FFN 的 dffn=16384 d_{\text{ffn}} = 16384 dffn=16384:

传统 FFN

  • 参数量: 2×4096×16384=134,217,7282 \times 4096 \times 16384 = 134,217,728 2×4096×16384=134,217,728

SwiGLU

  • hidden_dim: int(2×16384/3)=10922\text{int}(2 \times 16384 / 3) = 10922 int(2×16384/3)=10922
  • 参数量: 3×4096×10922=134,156,2883 \times 4096 \times 10922 = 134,156,288 3×4096×10922=134,156,288
  • 差异:仅 61,440 个参数(0.046%)

💡 工程提示 :当 dffn d_{\text{ffn}} dffn 很大时,2/3 规则能几乎完美地保持参数量一致。实际工程中,会找到能被 8 或 16 整除的 hidden_dim 值来提升硬件利用率。

4.3 如果不调整维度会怎样?

如果直接将 SwiGLU 的 hidden_dim 设为 dffn d_{\text{ffn}} dffn(不调整):

  • 参数量会变成: 3×dmodel×dffn 3 \times d_{\text{model}} \times d_{\text{ffn}} 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 d_{\text{model}} dmodel dffn d_{\text{ffn}} 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

关键观察

  1. LLaMA 实际使用的 dffn d_{\text{ffn}} dffn 不是标准的 4 倍 dmodel d_{\text{model}} dmodel,而是经过精细调优的值
  2. hidden_dim 严格按照 2/3 规则计算
  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)x \cdot \sigma(x) x⋅σ(x),处处可导
SwiGLU 用 Swish 替换 GLU 中的 Sigmoid,结合两者优势

6.2 关键公式

SwiGLU(x)=(xW1+b1)⊙Swish(xW2+b2)\text{SwiGLU}(x) = (xW_1 + b_1) \odot \text{Swish}(xW_2 + b_2) SwiGLU(x)=(xW1+b1)⊙Swish(xW2+b2)

计算流程:

  1. 门控路径 x→x \rightarrow x→ 线性变换 →\rightarrow → Swish 激活
  2. 数据路径 x→x \rightarrow x→ 线性变换
  3. 逐元素相乘:门控 × 数据
  4. 输出投影:映射回原始维度

6.3 为什么 SwiGLU 成为标准?

🔴 关键理解

  1. 更强大的表达能力

    • 动态门控机制可以学习更复杂的非线性变换
    • 可以学习二次函数,表达能力远超简单激活函数
  2. 更稳定的训练

    • Swish 的平滑性避免"死神经元"问题
    • 梯度信号更丰富,训练更高效
  3. 大规模验证

    • PaLM、LLaMA、Mistral 等主流模型都在使用
    • 在翻译、语言建模等任务上 consistently 表现最佳
  4. 性价比极高

    • 参数量几乎不变(2/3 规则)
    • 性能显著提升(困惑度降低 3-4%)

6.4 设计要点总结

设计决策 原因 结果
使用 Swish 而非 Sigmoid 更平滑、非单调 梯度更稳定
隐藏维度设为 2/3 保持参数量一致 公平对比
三个线性变换 门控 + 数据 + 投影 动态信息路由
不使用偏置 减少参数量 效率更高

💡 核心洞察 :SwiGLU 的成功在于将门控机制平滑激活巧妙结合,让前馈网络从"静态变换器"升级为"动态信息路由器"。这不是简单的激活函数替换,而是前馈层设计理念的根本转变。


最后更新时间:2026-06-01

相关推荐
用户521872455651 小时前
spring ai alibaba之项目搭建
人工智能
TickDB1 小时前
智谱GLM-4 接金融数据:工具描述多写三个字,模型少犯一类错
人工智能·python·websocket·行情数据 api·行情 api
她的男孩1 小时前
从自然语言到数据大屏:Forge Report Studio 的 AI 生成链路
人工智能·后端·架构
测试_AI_一辰1 小时前
AI模型评测不只看准确率-CV与Agent评测指标体系梳理
人工智能·机器学习·计算机视觉
sugar__salt1 小时前
Prompt工程实战指南:规范设计、LLM接口封装与避坑技巧
人工智能·python·prompt
QiLinkOS1 小时前
【用呼吸重构创造价值关系——QiLink生态】
c语言·数据结构·c++·人工智能·单片机·嵌入式硬件·算法
cxr8281 小时前
高分子复合材料AI逆向设计合成(PCARPS)流程研究
人工智能·智能体
weixin_468466852 小时前
图像处理特征提取新手实战指南
图像处理·人工智能·算法·ai·机器视觉·特征提取
我爱cope2 小时前
【Agent智能体13 | 工具使用-什么是工具?】
人工智能·语言模型·职场和发展