第3章:神经网络核心
激活函数详解
1. 激活函数的作用
- 非线性变换:引入非线性因素,使神经网络能够拟合复杂函数(否则多层网络会退化为线性变换)
- 决定神经元输出:将加权输入映射到特定输出范围(如[0,1]或[-1,1])
- 反向传播梯度流动:通过导数影响权重更新过程
2. 常见激活函数对比
| 函数名称 | 公式 | 输出范围 | 特点 | 适用场景 |
|---|---|---|---|---|
| Sigmoid | σ(x)=1/(1+e⁻ˣ) | (0,1) | 平滑渐变,易饱和导致梯度消失 | 二分类输出层 |
| Tanh | tanh(x)=(eˣ-e⁻ˣ)/(eˣ+e⁻ˣ) | (-1,1) | 零中心化,梯度消失问题仍存在 | RNN隐藏层 |
| ReLU | max(0,x) | [0,+∞) | 计算高效,缓解梯度消失,但存在"神经元死亡"问题 | CNN/深度网络隐藏层 |
| Leaky ReLU | max(αx,x) (α≈0.01) | (-∞,+∞) | 解决ReLU死亡问题,保留负值信息 | 需要避免神经元死亡的场景 |
| Swish | x·σ(βx) | (-∞,+∞) | 平滑非单调,自门控特性 | 替代ReLU的实验性选择 |
3. 选择激活函数的实践建议
- 隐藏层:优先尝试ReLU及其变种(Leaky ReLU, PReLU),尤其适合深度网络
- RNN/LSTM:Tanh常作为门控单元的基础函数
- 输出层:
- 二分类:Sigmoid
- 多分类:Softmax
- 回归问题:线性激活(无变换)
4. 高级主题
4.1 梯度问题分析
- 梯度消失:Sigmoid/Tanh在输入极大/极小时梯度接近0
- 梯度爆炸:ReLU系列在正区间梯度恒为1,可能引发链式梯度膨胀
4.2 参数化激活函数
- PReLU:可学习斜率的Leaky ReLU,形式为max(αx,x)其中α可训练
- SELU:自归一化网络的缩放指数线性单元,具有自动归一化特性
5. 代码示例(PyTorch实现)
import torch.nn as nn
# 网络层定义示例
model = nn.Sequential(
nn.Linear(784, 256),
nn.ReLU(), # 隐藏层激活
nn.Linear(256, 10),
nn.Softmax(dim=1) # 多分类输出
)
# 自定义Swish激活
class Swish(nn.Module):
def forward(self, x):
return x * torch.sigmoid(x)
6. 最新研究趋势
- 搜索最优激活函数:通过NAS技术自动发现新型激活函数(如Google的Swish)
- 动态激活函数:根据输入数据自适应调整函数形态
- 注意机制融合:将注意力权重与激活函数结合(如ACON激活函数)
关键记忆点:ReLU及其变种是现代深度网络的主流选择,但需根据具体任务特性进行验证。激活函数的选择会显著影响模型收敛速度和最终性能。
该内容包含理论解释、实践指导和前沿进展,可通过添加更多可视化图表(如函数曲线对比图)进一步增强理解效果。