激活函数在 Transformer 中的作用
Transformer 的前馈网络(FFN)通常是两层线性变换,中间夹一个激活函数:
FFN(x)=W2⋅Activation(W1x+b1)+b2 FFN(x) = W_2 \cdot Activation(W_1x + b_1) + b_2 FFN(x)=W2⋅Activation(W1x+b1)+b2
如果没有激活函数,两层线性变换叠加仍然是线性变换,模型无法拟合复杂函数。
激活函数的作用就是引入非线性,让网络具备强大的表示能力。
原始 Transformer 使用 ReLU,后来出现了 GeLU、GLU、GeGLU、SwiGLU 等变体。
ReLU 函数
定义
ReLU(x)=max(0,x) ReLU(x) = \max(0, x) ReLU(x)=max(0,x)
- 正数不变,负数变 0。
- 导数:x>0 时为 1,x<0 时为 0,x=0 处不可微(实践中用次梯度)。
数值例子
输入 x=1,−2,3,−4x = 1, -2, 3, -4x=1,−2,3,−4:
ReLU(x)=max(0,1),max(0,−2),max(0,3),max(0,−4)=1,0,3,0 ReLU(x) = \\max(0, 1), \\max(0, -2), \\max(0, 3), \\max(0, -4) = 1, 0, 3, 0 ReLU(x)=max(0,1),max(0,−2),max(0,3),max(0,−4)=1,0,3,0
优缺点
计算简单,梯度好,缓解梯度消失。
原点突变,不可微;负区间梯度为 0,可能导致神经元"死亡"。
GeLU 函数
定义
GeLU (Gaussian Error Linear Unit) :
GeLU(x)=x⋅Φ(x) GeLU(x) = x \cdot \Phi(x) GeLU(x)=x⋅Φ(x)
其中 Φ(x)\Phi(x)Φ(x) 是标准正态分布的累积分布函数:
Φ(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(2 x))
近似公式:
GeLU(x)≈0.5x(1+tanh(2π(x+0.044715x3))) GeLU(x) \approx 0.5x \left( 1 + \tanh \left( \sqrt{\frac{2}{\pi}} \left( x + 0.044715x^3 \right) \right) \right) GeLU(x)≈0.5x(1+tanh(π2 (x+0.044715x3)))
数值例子
取 x=1,−2,3x = 1, -2, 3x=1,−2,3。
标准正态 CDF 值:
- Φ(1)≈0.8413\Phi(1) \approx 0.8413Φ(1)≈0.8413
- Φ(−2)≈0.0228\Phi(-2) \approx 0.0228Φ(−2)≈0.0228
- Φ(3)≈0.9987\Phi(3) \approx 0.9987Φ(3)≈0.9987
因此:
GeLU(1)=1×0.8413=0.8413 GeLU(1) = 1 \times 0.8413 = 0.8413 GeLU(1)=1×0.8413=0.8413
GeLU(−2)=−2×0.0228=−0.0456 GeLU(-2) = -2 \times 0.0228 = -0.0456 GeLU(−2)=−2×0.0228=−0.0456
GeLU(3)=3×0.9987=2.9961 GeLU(3) = 3 \times 0.9987 = 2.9961 GeLU(3)=3×0.9987=2.9961
结果:
GeLU(x)=0.8413,−0.0456,2.9961 GeLU(x) = 0.8413, -0.0456, 2.9961 GeLU(x)=0.8413,−0.0456,2.9961
对比 ReLU:
ReLU(x)=1,0,3 ReLU(x) = 1, 0, 3 ReLU(x)=1,0,3
GeLU 在负区间有微小负值,原点附近平滑,可微性更好。
GPT 系列使用 GeLU。
门控线性单元(GLU)
定义
GLU (Gated Linear Unit) :
GLU(x)=(xW+b)⊗σ(xV+c) GLU(x) = (xW + b) \otimes \sigma(xV + c) GLU(x)=(xW+b)⊗σ(xV+c)
其中:
- W,VW, VW,V 是两个独立的线性变换矩阵;
- σ\sigmaσ 是 Sigmoid 函数,输出 0 到 1;
- ⊗\otimes⊗ 是逐元素相乘 (Hadamard 积)。
直观理解:一个通道提供"内容",另一个通道生成"门控开关",逐元素相乘决定信息通过多少。
数值例子
设输入 x=1,2x = 1, 2x=1,2,为简单取 W=V=IW = V = IW=V=I(单位阵),偏置为 0。
内容通道:
xW=1,2xW = 1, 2xW=1,2
门控通道:
xV=1,2 xV = 1, 2 xV=1,2
Sigmoid:
σ(1)≈0.7311,σ(2)≈0.8808 \sigma(1) \approx 0.7311, \quad \sigma(2) \approx 0.8808 σ(1)≈0.7311,σ(2)≈0.8808
逐元素相乘:
GLU(x)=1×0.7311,2×0.8808=0.7311,1.7616 GLU(x) = 1 \\times 0.7311, 2 \\times 0.8808 = 0.7311, 1.7616 GLU(x)=1×0.7311,2×0.8808=0.7311,1.7616
GeGLU(Gated GELU)
定义
GeGLU 用 GeLU 替代 Sigmoid 作为门控函数:
GeGLU(x)=GeLU(xW+b)⊗(xV+c) GeGLU(x) = GeLU(xW + b) \otimes (xV + c) GeGLU(x)=GeLU(xW+b)⊗(xV+c)
数值例子
仍取 x=1,2x = 1, 2x=1,2,W=V=IW = V = IW=V=I,偏置 0。
内容通道:
xV=1,2 xV = 1, 2 xV=1,2
门控通道:
xW=1,2 xW = 1, 2 xW=1,2
GeLU 值:
GeLU(1)≈0.8413,GeLU(2)≈1.9544 GeLU(1) \approx 0.8413, \quad GeLU(2) \approx 1.9544 GeLU(1)≈0.8413,GeLU(2)≈1.9544
逐元素相乘:
GeGLU(x)=0.8413×1,1.9544×2=0.8413,3.9088 GeGLU(x) = 0.8413 \\times 1, 1.9544 \\times 2 = 0.8413, 3.9088 GeGLU(x)=0.8413×1,1.9544×2=0.8413,3.9088
GeGLU 被 T5、Gemma 等模型采用。
SwiGLU(Swish GLU)
定义
SwiGLU 使用 Swish 函数作为门控:
Swish(x)=x⋅σ(x) Swish(x) = x \cdot \sigma(x) Swish(x)=x⋅σ(x)
SwiGLU(x)=Swish(xW+b)⊗(xV+c) SwiGLU(x) = Swish(xW + b) \otimes (xV + c) SwiGLU(x)=Swish(xW+b)⊗(xV+c)
数值例子
仍取 x=1,2x = 1, 2x=1,2,W=V=IW = V = IW=V=I。
内容通道:
xV=1,2 xV = 1, 2 xV=1,2
门控通道:
xW=1,2 xW = 1, 2 xW=1,2
Swish 值:
Swish(1)=1×0.7311=0.7311 Swish(1) = 1 \times 0.7311 = 0.7311 Swish(1)=1×0.7311=0.7311
Swish(2)=2×0.8808=1.7616 Swish(2) = 2 \times 0.8808 = 1.7616 Swish(2)=2×0.8808=1.7616
逐元素相乘:
SwiGLU(x)=0.7311×1,1.7616×2=0.7311,3.5232 SwiGLU(x) = 0.7311 \\times 1, 1.7616 \\times 2 = 0.7311, 3.5232 SwiGLU(x)=0.7311×1,1.7616×2=0.7311,3.5232
SwiGLU 是当前大多数模型(LLaMA、PaLM、OLMo 等)的首选。
门控单元有效吗?
Noam Shazeer 2020 年的论文评估了所有 GLU 变体,在 CoLA 和 SST-2 任务上:
| 模型 | CoLA | SST-2 |
|---|---|---|
| GLU | 84.20 | 84.12 |
| GeGLU | 84.36 | 84.67 |
| SwiGLU | 84.67 | 84.67 |
GLU 变体持续优于 ReLU/GeLU 基线,且统计显著。Narang 等人在 T5 类模型上也发现 GLU 变体损失更低。
但并非绝对必需:GPT-3 使用 GeLU,Nemotron 340B 使用平方 ReLU,Falcon 211B 使用 ReLU,都是高性能模型。
因此,SwiGLU/GeGLU 能带来持续提升,但不是唯一选择。
总结
| 激活函数 | 公式 | 数值例子 (x=1,2) | 特点 |
|---|---|---|---|
| ReLU | max(0, x) | 1, 2 | 简单,不可微 |
| GeLU | xΦ(x)x\Phi(x)xΦ(x) | 0.8413, 1.9544 | 平滑,GPT 系列 |
| GLU | (xW)⊗σ(xV)(xW) \otimes \sigma(xV)(xW)⊗σ(xV) | 0.7311, 1.7616 | 门控,动态稀疏 |
| GeGLU | GeLU(xW) ⊗ (xV) | 0.8413, 3.9088 | 梯度稳定,T5/Gemma |
| SwiGLU | Swish(xW) ⊗ (xV) | 0.7311, 3.5232 | 性能最优,LLaMA/PaLM |
一句话:激活函数为 FFN 引入非线性;ReLU 简单,GeLU 平滑,GLU 系列用门控动态调节信息流,GeGLU 和 SwiGLU 是当前主流,实验证明门控变体能持续提升性能,但并非绝对必需。