激活函数对比与选择
概述
激活函数为神经网络引入非线性,让模型能够学习复杂的模式。Transformer中的前馈网络(FFN)对激活函数的选择非常敏感,不同激活函数对模型效果和训练稳定性影响很大。从原始Transformer到现在的大模型,激活函数也在不断演进,ReLU → GELU → Swish → SwiGLU,效果越来越好。
FFN 结构回顾
标准Transformer的FFN结构:
FFN(x)=(xW1+b1)→σ→(xW1+b1)W2+b2
其中σ就是激活函数。
使用GLU(Gated Linear Unit)变体的FFN结构:
GLU(x)=(xW1+b1)⊗σ(xV1+c1)
FFNGLU(x)=GLU(x)W2+b2
也就是分成两个分支,一个分支过激活,一个分支直接过线性,然后点乘,增加了一个门控机制。
主流激活函数详解
1. ReLU
公式:
ReLU(x)=max(0,x)
特点:
- 简单,计算快,梯度不容易消失
- 小于零直接截断,会导致神经元坏死
- 早期Transformer使用,现在大模型基本不用了
2. GELU(Gaussian Error Linear Unit)
公式:
GELU(x)=xΦ(x)
其中Φ(x)是标准正态分布的累积分布函数,可以用ReLU近似:
GELU(x)≈0.5x(1+tanh[π2(x+0.044715x3)])
特点:
- 平滑的ReLU,不是硬截断,而是概率性随机丢弃
- 在零点附近可导,梯度更稳定
- 比ReLU效果更好,BERT、GPT都用GELU
- 计算比ReLU稍慢一点,现在硬件优化好了可以接受
3. Swish/SiLU
公式:
Swish(x)=x⋅σ(x)=1+e−xx
σ是sigmoid函数。Swish当β=1时也叫SiLU(Sigmoid Linear Unit)。
特点:
- 平滑,无上界有下界,自门控
- 比GELU更简单,计算更快,效果差不多
- 在很多任务上表现比GELU略好一点
4. SwiGLU
SwiGLU是结合了Swish和GLU门控的变体:
公式:
SwiGLU(x,W,V,b,c)=Swish(xW+b)⊗(xV+c)
特点:
- GLU增加了一个线性门分支,模型可以更好地控制信息流
- 相比原来的非门控版本,效果提升明显
- 为了保持参数量差不多,会把中间维度乘2/3(因为多了一个矩阵,所以每个矩阵维度减小一点)
- LLaMA等现代大模型都普遍使用SwiGLU
GLU 结构对比
普通FFN:
- 一个线性层 → 激活 → 一个线性层
- 参数:
d_model × 4d + 4d × d_model = 8 d_model²
GLU FFN(以SwiGLU为例):
- 两个线性层得到两个分支,点乘 → 输出线性层
- 为了总参数差不多,中间维度从
4d 变成 (2/3) × 4d ≈ 2.667d
- 参数:
d_model × (8d/3) + (8d/3) × d_model ≈ 5.33 d_model²,比原来的8d²少一点
各种GLU组合:
| GLU变体 | 激活函数 | 公式 |
|---|
| ReGLU | ReLU | ReLU(xW) ⊙ xV |
| GeGLU | GELU | GELU(xW) ⊙ xV |
| SwiGLU | Swish | Swish(xW) ⊙ xV |
论文实验表明SwiGLU效果最好,现在成为主流。
各大模型激活函数使用情况
| 模型 | 激活函数 | FFN中间维度(d=4096) |
|---|
| BERT | GELU | 4d = 16384 |
| GPT2 | GELU | 4d = 16384 |
| LLaMA-1/2 | SwiGLU | 2/3 × 4d = 11008 → 对齐到128倍数是 11008 |
| ChatGLM2 | SwiGLU(MQA) | 13696 |
| Falcon | SwiGLU | - |
各激活函数对比总结
| 激活函数 | 非线性 | 平滑性 | 计算量 | 大模型效果 | 代表模型 |
|---|
| ReLU | 硬截断 | 不平滑(零点不可导) | 最小 | 一般 | 早期Transformer |
| GELU | 平滑随机 | 处处可导 | 中等 | 好 | BERT, GPT-1/2 |
| Swish/SiLU | 自门控 | 处处可导 | 略小于GELU | 很好 | 很多新模型 |
| SwiGLU | 门控+Swish | 处处可导 | 比单分支稍大 | 最好 | LLaMA, ChatGLM2, Falcon |
为什么大模型偏好 GELU/SwiGLU?
- 平滑性:GELU/SwiGLU都是平滑函数,梯度处处存在,训练更稳定,不容易出现神经元坏死问题
- 门控机制:SwiGLU通过门控让模型动态控制信息流,重要信息通过,不重要信息过滤,表达能力更强
- 实践验证:在大规模预训练中,SwiGLU稳定比ReLU、GELU效果好,困惑度更低,下游任务表现更好
- 硬件友好:虽然比ReLU复杂一点,但现代硬件对这些指数、tanh操作都有较好优化,实际计算开销增加不大
面试常见问题
1. ReLU 有什么优缺点?
回答要点:
- 优点:计算简单,梯度在正区间是常数,不容易梯度消失,训练快
- 缺点:负区间直接置零,会导致神经元坏死,参数更新不了;零点不可导;不是平滑函数
2. GELU 和 ReLU 有什么区别?为什么GELU更好?
回答要点:
- ReLU是硬截断,小于0直接置零;GELU是平滑的随机正则化,是概率性加权
- GELU处处可导,梯度更稳定,不会有神经元坏死问题
- 在深层网络和大规模数据上,GELU比ReLU效果更好,现在大模型基本都用GELU或其变体
3. SwiGLU是什么,为什么效果好?
回答要点:
- SwiGLU结合了Swish激活和GLU门控机制,把输入分成两个分支,一个过Swish激活,一个线性变换,然后点乘
- 门控机制让模型可以动态控制信息流,过滤不重要信息,保留重要信息
- 相比原来单分支激活,表达能力更强,在大规模预训练中稳定提升效果
- 现代大模型如LLaMA都采用SwiGLU
4. GLU结构为什么要把中间维度乘以2/3?
回答要点:
- GLU比原来多了一个线性投影矩阵,如果保持原来维度,总参数量会增加很多
- 为了和原来非GLU版本保持差不多的参数量,把中间维度乘以2/3
- 参数量差不多的情况下,GLU效果更好,所以这样做
5. 激活函数选择的一般原则?
回答要点:
- 小模型/训练快:ReLU足够,简单
- 中大型NLP模型:GELU效果稳定
- 最新大模型:SwiGLU,效果最好,参数量效率更高
- 要看硬件支持,如果硬件优化不好,就选简单的