激活函数导数完整推导
分类: 神经网络基础 · 难度: 基础 · 关联讲座: L03
激活函数导数完整推导
激活函数是神经网络非线性能力的来源,而它们的导数则是反向传播能否正常工作的关键。本文完整推导 sigmoid、tanh、ReLU 和 GELU 四种主流激活函数的导数,并通过数值计算揭示梯度饱和与死区问题——这些性质直接决定了深度网络的可训练性。
📐 激活函数导数完整推导
反向传播需要激活函数的导数,以下逐一推导:
1. Sigmoid 导数
设 σ(z)=1+e−z1=(1+e−z)−1,用链式法则:
σ′(z)=−(1+e−z)−2⋅(−e−z)=(1+e−z)2e−z
注意 e−z=σ(z)1−1=σ(z)1−σ(z),代入:
σ′(z)=1+e−z1⋅1+e−ze−z=σ(z)⋅(1−σ(z))
意义:sigmoid 的导数可以用自身表达,计算极为高效(前向已算出 σ(z),反向直接用)。
2. tanh 导数
设 tanh(z)=ez+e−zez−e−z,商法则:
tanh′(z)=(ez+e−z)2(ez+e−z)(ez+e−z)−(ez−e−z)(ez−e−z)
分子 =(ez+e−z)2−(ez−e−z)2=4(平方差展开),故:
tanh′(z)=(ez+e−z)24=1−tanh2(z)
同样,导数可由自身表达(与 cosh−2(z) 等价,但后者更难直接使用)。
3. ReLU 导数
ReLU(z)=max(z,0)={z0z>0z≤0
ReLU′(z)=1[z>0]={10z>0z≤0
z=0 处次梯度(subgradient)通常取 0 或 0.5,实践中影响可忽略。
4. GELU 近似导数
GELU 严格形式:GELU(x)=x⋅Φ(x)(Φ 为标准正态 CDF),导数需数值计算。常用近似:
GELU(x)≈x⋅σ(1.702x)
dxdGELU(x)≈σ(1.702x)+1.702x⋅σ(1.702x)(1−σ(1.702x))
🔢 数值计算示例
对输入 z∈{−2,−0.5,0,0.5,2},计算各激活函数输出:
| z | σ(z) | tanh(z) | ReLU(z) | σ′(z) | tanh′(z) | ReLU′(z) |
|---|
| -2.0 | 0.119 | -0.964 | 0.000 | 0.105 | 0.071 | 0 |
| -0.5 | 0.378 | -0.462 | 0.000 | 0.235 | 0.786 | 0 |
| 0.0 | 0.500 | 0.000 | 0.000 | 0.250 | 1.000 | 0 |
| 0.5 | 0.622 | 0.462 | 0.500 | 0.235 | 0.786 | 1 |
| 2.0 | 0.881 | 0.964 | 2.000 | 0.105 | 0.071 | 1 |
关键观察:
- sigmoid 和 tanh 在 ∣z∣ 较大时导数趋近于 0(梯度饱和)
- ReLU 正区导数恒为 1(无饱和),负区恒为 0(死区)
- tanh 在 z=0 处导数最大(= 1),梯度传播最顺畅
💡 为什么 ReLU 训练快?
sigmoid/tanh 的导数在 ∣z∣>2 时已经很小(sigmoid 在 z=2 时导数仅 0.105),深层网络中梯度连乘后趋近于零,即梯度消失问题。
ReLU 在正区导数恒为 1,梯度可以无损地流过任意多层,深层网络得以有效训练。这是 ReLU 在 2010 年代席卷深度学习的核心原因。
⚠️ 常见误区
- 误区:ReLU 没有梯度消失问题 → 正确:ReLU 消除了饱和区梯度消失,但存在 Dead ReLU 问题:若某神经元在训练过程中始终接收负输入,梯度永远为 0,权重永远不更新,该神经元”死亡”且无法恢复。学习率过大容易触发。
- 误区:tanh 的导数是 cosh2(z)1 → 正确:cosh2(z)1=1−tanh2(z) 两者数学等价,但 1−tanh2(z) 在反向传播中可直接用已算出的 tanh(z) 值,更高效。
- 误区:GELU 只比 ReLU 稍好一点 → 正确:GELU 在 Transformer(BERT、GPT)中的表现远优于 ReLU,现代 LLM 几乎全用 SwiGLU/GELU 变体,这是架构设计上的重要选择。