语言模型常用的激活函数(Sigmoid ,GeLU ,SwiGLU,GLU,SiLU,Swish)
文章目录
- 1. Sigmoid 函数
- ✅ 数学表达式:
- 📌 特性:
- 📈 应用场景:
- ⚠️ 缺点:
- 2. GeLU(Gaussian Error Linear Unit)
- ✅ 数学表达式:
- 📌 特性:
- 📈 应用场景:
- 🧠 与 Sigmoid 的关系:
- 3. GLU(Gated Linear Unit)
- ✅ 数学表达式:
- 📌 特性:
- 📈 应用场景:
- ⚠️ 实现细节:
- 4. SwiGLU(Sigmoid-weighted Gated Linear Unit)
- ✅ 数学表达式:
- 📌 特性:
- 📈 应用场景:
- 🧠 与 GLU 的关系:
- 5. SiLU(Sigmoid Linear Unit) / Swish
- ✅ 数学表达式:
- 📌 特性:
- 📈 应用场景:
- ⚠️ 扩展形式:
- 6. GLU 与 SwiGLU 的对比
- 7. 总结对比表
- 8. 代码实现示例(PyTorch)
- 9. 关键区别总结
以下是 Sigmoid、GeLU、SwiGLU、GLU、SiLU 和 Swish 这些激活函数的详细讲解,包括它们的数学表达式、特性、应用场景及与其他函数的关系。
1. Sigmoid 函数
✅ 数学表达式:
Sigmoid(x)=σ(x)=11+e−x\text{Sigmoid}(x) = \sigma(x) = \frac{1}{1 + e^{-x}} Sigmoid(x)=σ(x)=1+e−x1
📌 特性:
- 输出范围:(0,1)(0, 1)(0,1),适合二分类问题的概率输出。
- 平滑性:连续可导,但梯度在输入较大或较小时接近于 0(导致梯度消失问题)。
- 单调性:严格单调递增。
📈 应用场景:
- 早期神经网络的激活函数(如逻辑回归、RNN)。
- 二分类问题的输出层(如逻辑回归)。
⚠️ 缺点:
- 梯度消失问题严重(尤其在深度网络中)。
- 输出非零中心化,影响训练效率。
2. GeLU(Gaussian Error Linear Unit)
✅ 数学表达式:
GeLU(x)=x⋅Φ(x)\text{GeLU}(x) = x \cdot \Phi(x) GeLU(x)=x⋅Φ(x)
其中 Φ(x)\Phi(x)Φ(x) 是标准正态分布的累积分布函数(CDF):
Φ(x)=12(1+erf(x2))\Phi(x) = \frac{1}{2} \left(1 + \text{erf}\left(\frac{x}{\sqrt{2}}\right)\right) Φ(x)=21(1+erf(2x))
近似公式(用于高效计算):
GeLU(x)≈0.5x(1+tanh[2π(x+0.044715x3)])\text{GeLU}(x) \approx 0.5x\left(1 + \tanh\left[\sqrt{\frac{2}{\pi}}(x + 0.044715x^3)\right]\right) GeLU(x)≈0.5x(1+tanh[π2(x+0.044715x3)])
📌 特性:
- 概率性“软开关”:输入值越大,输出越接近 xxx;输入值越小(负),输出越接近 0。
- 平滑性:处处可导,梯度稳定。
- 非单调性:在负区间有非零输出,缓解梯度消失问题。
📈 应用场景:
- Transformer 模型(如 BERT、GPT)。
- 需要平滑激活且保留部分负值信息的任务。
🧠 与 Sigmoid 的关系:
- GeLU 可视为 Sigmoid 的加权版本,权重由输入值的高斯分布概率决定。
3. GLU(Gated Linear Unit)
✅ 数学表达式:
GLU(x)=(W1x+b1)⊗σ(W2x+b2)\text{GLU}(x) = (W_1 x + b_1) \otimes \sigma(W_2 x + b_2) GLU(x)=(W1x+b1)⊗σ(W2x+b2)
其中 ⊗\otimes⊗ 表示逐元素乘法,σ\sigmaσ 是 Sigmoid 函数。
📌 特性:
- 门控机制:将输入分为两部分,一部分作为内容,另一部分通过 Sigmoid 生成门控信号。
- 非线性:通过门控机制引入非线性,增强模型表达能力。
- 自适应性:根据输入动态调整信息流。
📈 应用场景:
- 自然语言处理(如文本分类、机器翻译)。
- Transformer 的 Feed-Forward 层(部分模型使用 GLU 替代传统 FFN)。
⚠️ 实现细节:
- 输入维度需为偶数(需分两半)。
- 例如,若输入为 x∈R2nx \in \mathbb{R}^{2n}x∈R2n,则前 nnn 维作为内容,后 nnn 维通过 Sigmoid 生成门控信号。
4. SwiGLU(Sigmoid-weighted Gated Linear Unit)
✅ 数学表达式:
SwiGLU(x)=SiLU(W1x+b1)⊗(W2x+b2)\text{SwiGLU}(x) = \text{SiLU}(W_1 x + b_1) \otimes (W_2 x + b_2) SwiGLU(x)=SiLU(W1x+b1)⊗(W2x+b2)
其中:
- SiLU(x)=x⋅σ(x)\text{SiLU}(x) = x \cdot \sigma(x)SiLU(x)=x⋅σ(x)(即 Swish 函数)。
- ⊗\otimes⊗ 表示逐元素乘法。
📌 特性:
- 结合 SiLU 和 GLU:SiLU 提供平滑性,GLU 提供门控机制。
- 增强非线性:比传统 GLU 更灵活,能捕捉更复杂的数据模式。
- 计算高效:在现代 LLM 中(如 T5、Mistral)广泛应用。
📈 应用场景:
- 大型语言模型(如 T5、PaLM、Mistral)。
- 需要高效且灵活的门控机制的任务。
🧠 与 GLU 的关系:
- SwiGLU 是 GLU 的改进版本,用 SiLU 替代了传统线性激活。
5. SiLU(Sigmoid Linear Unit) / Swish
✅ 数学表达式:
SiLU(x)=x⋅σ(x)=x1+e−x\text{SiLU}(x) = x \cdot \sigma(x) = \frac{x}{1 + e^{-x}} SiLU(x)=x⋅σ(x)=1+e−xx
- Swish 是 SiLU 的别名,由 Google 提出。
📌 特性:
- 平滑性:处处可导,梯度稳定。
- 非单调性:允许负值部分传递信息,缓解梯度消失。
- 自正则化:实验表明其具有一定的正则化效果。
📈 应用场景:
- 深度神经网络(如 CNN、Transformer)。
- Google 的 Swish 激活函数(在 ImageNet 等任务中表现优于 ReLU)。
⚠️ 扩展形式:
Swish(x)=x⋅σ(βx)\text{Swish}(x) = x \cdot \sigma(\beta x) Swish(x)=x⋅σ(βx)
其中 β\betaβ 是可学习参数(如 β=1\beta=1β=1 时退化为 SiLU)。
6. GLU 与 SwiGLU 的对比
特性 | GLU | SwiGLU |
---|---|---|
公式 | a⊗σ(b)a \otimes \sigma(b)a⊗σ(b) | SiLU(a)⊗b\text{SiLU}(a) \otimes bSiLU(a)⊗b |
激活函数 | Sigmoid | SiLU (Swish) |
平滑性 | 一般 | 更平滑 |
非线性能力 | 中等 | 更强 |
应用场景 | 传统 NLP、Transformer FFN | 大型语言模型(如 Mistral) |
7. 总结对比表
函数 | 表达式 | 特性 | 应用场景 |
---|---|---|---|
Sigmoid | 11+e−x\frac{1}{1 + e^{-x}}1+e−x1 | 平滑,梯度消失,单调 | 二分类输出层 |
GeLU | x⋅Φ(x)x \cdot \Phi(x)x⋅Φ(x) | 概率性软开关,平滑,非单调 | Transformer 模型 |
GLU | (W1x)⊗σ(W2x)(W_1 x) \otimes \sigma(W_2 x)(W1x)⊗σ(W2x) | 门控机制,非线性 | NLP、Transformer FFN |
SwiGLU | SiLU(W1x)⊗(W2x)\text{SiLU}(W_1 x) \otimes (W_2 x)SiLU(W1x)⊗(W2x) | 结合 SiLU 和 GLU,更灵活 | 大型语言模型(如 T5、Mistral) |
SiLU/Swish | x⋅σ(x)x \cdot \sigma(x)x⋅σ(x) | 平滑,非单调,自正则化 | 深度神经网络,ImageNet |
8. 代码实现示例(PyTorch)
import torch
import torch.nn as nn
import torch.nn.functional as F# Sigmoid
sigmoid = nn.Sigmoid()# GeLU (exact)
gelu_exact = nn.GELU()# GeLU (approximate)
def gelu_approx(x):return 0.5 * x * (1 + torch.tanh(torch.sqrt(torch.tensor(2.0 / torch.pi)) * (x + 0.044715 * x**3)))# GLU
class GLU(nn.Module):def __init__(self, dim):super().__init__()self.dim = dimself.W1 = nn.Linear(dim, dim)self.W2 = nn.Linear(dim, dim)def forward(self, x):a = self.W1(x)b = self.W2(x)return a * torch.sigmoid(b)# SwiGLU
class SwiGLU(nn.Module):def __init__(self, dim):super().__init__()self.W1 = nn.Linear(dim, dim)self.W2 = nn.Linear(dim, dim)def forward(self, x):a = self.W1(x)b = self.W2(x)return F.silu(a) * b
9. 关键区别总结
- Sigmoid vs GeLU:GeLU 是概率性软开关,Sigmoid 是硬阈值。
- GLU vs SwiGLU:SwiGLU 用 SiLU 替代了 GLU 的线性激活,增强非线性。
- SiLU vs Swish:两者是同一函数,SiLU 是正式名称,Swish 是 Google 提出的别名。