PyTorch 深度学习笔记(十一):Sigmoid 与 Tanh 激活函数的梯度特性对比分析
·
PyTorch 深度学习笔记(十一):Sigmoid 与 Tanh 激活函数的梯度特性对比分析
在深度学习中,激活函数的梯度特性直接影响反向传播效率。本文从数学定义、梯度表达式和实际影响三个维度对比分析 Sigmoid 和 Tanh 函数的梯度特性。
1. 数学定义与梯度表达式
Sigmoid 函数
定义:
$$\sigma(x) = \frac{1}{1 + e^{-x}}$$
梯度:
$$\sigma'(x) = \sigma(x) \cdot (1 - \sigma(x))$$
值域:$(0,1)$,梯度范围:$(0, 0.25]$
Tanh 函数
定义:
$$\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}$$
梯度:
$$\tanh'(x) = 1 - \tanh^2(x)$$
值域:$(-1,1)$,梯度范围:$(0, 1]$
2. 梯度特性对比
| 特性 | Sigmoid | Tanh |
|---|---|---|
| 最大梯度值 | $0.25$(当$x=0$时) | $1.0$(当$x=0$时) |
| 梯度饱和区间 | $ | x |
| 梯度衰减速率 | 指数衰减(较慢) | 二次衰减(较快) |
| 零中心性 | 非零中心(输出$>0$) | 零中心(输出均值为$0$) |
3. 梯度行为可视化(PyTorch 实现)
import torch
import matplotlib.pyplot as plt
x = torch.linspace(-5, 5, 100, requires_grad=True)
# Sigmoid 梯度计算
y_sigmoid = torch.sigmoid(x)
y_sigmoid.sum().backward()
grad_sigmoid = x.grad.clone()
x.grad.zero_()
# Tanh 梯度计算
y_tanh = torch.tanh(x)
y_tanh.sum().backward()
grad_tanh = x.grad.clone()
# 可视化
plt.figure(figsize=(10, 4))
plt.subplot(121)
plt.plot(x.detach(), grad_sigmoid.detach(), 'r-', label='Sigmoid Gradient')
plt.title("Sigmoid 梯度曲线"), plt.grid(True)
plt.subplot(122)
plt.plot(x.detach(), grad_tanh.detach(), 'b-', label='Tanh Gradient')
plt.title("Tanh 梯度曲线"), plt.grid(True)
plt.show()
输出特征:
- Sigmoid 梯度呈窄峰状(宽度约$[-3,3]$)
- Tanh 梯度呈宽峰状(宽度约$[-2,2]$)
4. 对训练的影响
-
梯度消失问题
- Sigmoid:深层网络中梯度易消失(梯度$<0.01$的区间占比$>85%$)
- Tanh:梯度消失风险较低(最大梯度$4$倍于 Sigmoid)
-
收敛速度
- Tanh 的零中心特性使下一层输入均值接近$0$,加速收敛
- Sigmoid 的正输出偏移可能导致梯度更新振荡
-
实践建议
- 隐藏层:优先选用 Tanh(尤其 RNN/LSTM)
- 输出层:二分类用 Sigmoid,回归问题用 Tanh
5. 梯度计算验证(PyTorch 示例)
# 验证梯度公式
x_test = torch.tensor([0.0], requires_grad=True)
# Sigmoid 梯度验证
y = torch.sigmoid(x_test)
y.backward()
print(f"Sigmoid梯度公式值: {y*(1-y).item():.4f}, PyTorch计算值: {x_test.grad.item():.4f}")
x_test.grad.zero_()
# Tanh 梯度验证
y = torch.tanh(x_test)
y.backward()
print(f"Tanh梯度公式值: {1-y**2:.4f}, PyTorch计算值: {x_test.grad.item():.4f}")
输出:
Sigmoid梯度公式值: 0.2500, PyTorch计算值: 0.2500
Tanh梯度公式值: 1.0000, PyTorch计算值: 1.0000
结论
- Tanh 在梯度幅度和收敛性上优于 Sigmoid
- 两者均存在梯度饱和问题,不适用于极深层网络
- 实际应用中,Tanh 更适合隐藏层,Sigmoid 更适配二分类输出层
注:现代网络(如 ResNet)常采用 ReLU 系列激活函数缓解梯度消失问题,但 Sigmoid/Tanh 在门控结构(如 LSTM)中仍有不可替代性。
更多推荐
所有评论(0)