1-激活函数
1. 激活函数的定义与作用
神经网络的核心运算是线性组合:设输入向量
如果网络中仅有线性操作,
即仍然是一个线性映射——多层线性网络在表达能力上与单层线性网络等价,这就是线性退化问题。
激活函数(activation function)
正是非线性
2. 常见激活函数
2.1 Sigmoid
数学表达式
一阶导数
利用
记
性质
| 性质 | 值 |
|---|---|
| 值域 | |
| 饱和区间(导数趋于 0) | |
| 非零中心(zero-centered) | 否(输出始终为正) |
| 梯度消失风险 | 严重,尤其在深层网络中 |
对梯度传播的影响
Sigmoid 的导数最大值为
此外,Sigmoid 输出恒正(0.5~1),导致反向传播时上一层收到的梯度信号始终同号,权重更新方向呈” zig-zag “现象,收敛速度慢。
2.2 Tanh(双曲正切)
数学表达式
一阶导数
记
性质
| 性质 | 值 |
|---|---|
| 值域 | |
| 饱和区间 | |
| 非零中心 | 是(输出均值为 0) |
| 梯度消失风险 | 存在,但比 Sigmoid 轻(导数最大值为 1 而非 0.25) |
对梯度传播的影响
Tanh 的导数最大值为 1(vs Sigmoid 的 0.25),因此梯度消失问题有所缓解,但仍会在深层网络中累积。由于 Tanh 输出以 0 为中心,反向传播时正负梯度信号均可到达,权重更新的方向更合理。Tanh 曾是 RNN 架构中的标配激活函数。
2.3 ReLU(Rectified Linear Unit)
数学表达式
一阶导数
注意:ReLU 在
性质
| 性质 | 值 |
|---|---|
| 值域 | |
| 非饱和区间 | |
| 饱和区间 | |
| 稀疏性 | 强制将负值输出为 0,产生结构化稀疏 |
| 计算成本 | 极低(仅一次比较运算) |
对梯度传播的影响
在正区间,ReLU 的梯度恒为 1,不存在梯度压缩问题,因此深层网络首选 ReLU 系列。然而,在负区间,梯度严格为 0 导致对应神经元永久”死去”——这就是 Dying ReLU 问题。设想一个神经元在训练初期由于初始化偏置过大或梯度更新偏向负值,其输出始终为负,此后无论输入如何变化,其梯度始终为 0,权重再也无法更新。
2.4 Leaky ReLU
数学表达式
其中
一阶导数
性质
| 性质 | 值 |
|---|---|
| 负区间梯度 | |
| 死神经元风险 | 大幅降低,但无法完全消除 |
| 参数 | 固定(LeakyReLU)或可学习(PReLU) |
对梯度传播的影响
负区间保留了微弱梯度
2.5 ELU(Exponential Linear Unit)
数学表达式
其中
一阶导数
性质
| 性质 | 值 |
|---|---|
| 负区间行为 | 平滑趋近于 |
| 负区间梯度 | |
| 计算成本 | 涉及指数运算,高于 ReLU / LeakyReLU |
| 自归零倾向 |
对梯度传播的影响
ELU 在负区间的输出饱和于
2.6 GELU(Gaussian Error Linear Unit)
数学表达式
其中
-
高精度近似(Transformer 标配):
-
低精度近似(在某些推理场景使用):
一阶导数
对
其中
性质
| 性质 | 值 |
|---|---|
| 值域 | 近似 |
| 非线性特性 | 类似 ReLU + 概率加权软门控 |
| 计算成本 | 涉及误差函数(erf)或双曲正切,高于 ReLU |
| 主导场景 | NLP(Transformer 系列)、视觉 backbone(如 ViT) |
对梯度传播的影响
GELU 的导数
2.7 Swish
数学表达式
其中
一阶导数
性质
| 性质 | 值 |
|---|---|
| 自门控特性 | 输入 |
| 超参数 | 控制门控平滑度; |
| 计算成本 | 与 Sigmoid 同量级 |
| 特点 | 导数可以大于 1(不饱和且可能放大梯度) |
对梯度传播的影响
Swish 的导数包含
2.8 SiLU(Sigmoid Linear Unit)
即
GELU 与 SiLU 在
3. 反向传播中激活函数梯度的链式法则
设第
第 1 步:传播到激活输入
其中
第 2 步:传播到权重
第 3 步:继续反向传播
由此递推至上一层。
从以上推导可以看出:激活函数梯度
4. 深层网络中 ReLU 系列更常见的原因
深层网络训练面临的核心困难是梯度消失与梯度爆炸的交织。以 Sigmoid 为例:
ReLU 的优势来自其非饱和特性:
- 正区间梯度恒为 1,不存在梯度压缩,信号可无损传递至任意深度的网络。
- 分段线性的稀疏结构使 GPU/加速器的矩阵运算高度优化(ReLU 可通过掩码操作实现,无需逐点非线性函数求值)。
- 死神经元问题可通过 LeakyReLU / PReLU / ELU 等变体缓解。
经验上常见(empirical common practice)的配置是:隐藏层优先选用 ReLU / LeakyReLU / GELU;具体偏好依任务而异——CV 任务中 ReLU 仍为主流(配合 BatchNorm 使用),NLP(Transformer 架构)则以 GELU 为标配。
5. 输出层激活函数与任务匹配
5.1 二分类(Binary Classification)
激活函数: Sigmoid
输出解释:
损失函数: 二元交叉熵(Binary Cross-Entropy, BCE)
为何不用其他激活: 若使用线性输出,则损失函数退化为均方误差,二分类场景下概率校准效果差;若使用 Softmax(Sigmoid 导数形式),则逻辑过重。
5.2 多分类(Multi-class Classification)
激活函数: Softmax
数学表达式:
其中
输出解释: 输出向量
损失函数: 分类交叉熵(Categorical Cross-Entropy)
梯度推导(关键步骤):
Softmax 的反向传播梯度较为复杂。设
其中
即预测概率与真实标签的残差直接作为反向传播的梯度——这一简洁形式是多分类任务中 Softmax + 交叉熵组合被广泛采用的核心原因。
5.3 回归(Regression)
激活函数: 无激活函数(线性输出)或特定非线性激活(如 Sigmoid 用于有界回归)。
损失函数: MSE(Mean Squared Error)或 MAE(Mean Absolute Error)。
要点: 回归任务的输出层不应施加任何非线性压缩,否则输出范围受限。若目标值
5.4 多标签分类(Multi-label Classification)
激活函数: Sigmoid(独立作用)
关键区别于多分类: 多标签问题中每个标签独立存在,不存在互斥假设,因此不适用 Softmax(Softmax 强制输出和为 1,引入标签间的竞争关系)。正确做法是对
损失函数: 多标签二元交叉熵(Multi-label Binary Cross-Entropy)
6. 工程实践
6.1 如何根据任务选择激活函数
| 任务类型 | 隐藏层推荐 | 输出层 | 说明 |
|---|---|---|---|
| 浅层 CNN(≤ 5 层) | ReLU / LeakyReLU | 取决于任务 | BatchNorm 配合使用 |
| 深层 CNN / ResNet | ReLU(residual支路中) | 取决于任务 | Skip connection 缓解梯度消失 |
| Vision Transformer (ViT) | GELU | 取决于任务 | GELU 是 ViT 标配 |
| NLP Transformer (BERT, GPT) | GELU | Linear(无激活)或 Softmax | GELU 是 Transformer 标配 |
| YOLO 等目标检测 | LeakyReLU / ReLU | Sigmoid(置信度)/ Softmax(分类) | 检测头输出需理解任务 |
| 生成模型(GAN, VAE) | ReLU / LeakyReLU / ELU | 取决于生成目标范围 | 注意输出层激活与损失函数匹配 |
| 回归(有界) | ReLU / Tanh | Sigmoid(若需约束至 (0,1))或 Linear | 优先保证输出范围覆盖目标 |
| 回归(无界) | ReLU / GELU | Linear | 无需约束 |
6.2 初始化、学习率、归一化与激活函数的耦合关系
初始化
激活函数的非线性特性决定了合适的初始化策略:
- ReLU / LeakyReLU 系列:推荐 He Initialization(Kaiming Initialization),即
。推导依据是 ReLU 在负区间置零后方差收缩, 倍因子补偿了后半周期权重分布的缩减。 - Sigmoid / Tanh:推荐 Xavier Initialization(Glorot Initialization),即
或 。理由是 Sigmoid/Tanh 的导数在 和 区间与输入方差匹配,过大初始化会导致饱和。 - GELU / Swish:经验上常见(empirical common practice)仍使用 Xavier 或 Normal初始化,部分研究使用截断正态分布。
错误的初始化会使网络在训练初期即陷入饱和区间,导致梯度消失。
学习率
- ReLU 对学习率相对鲁棒,因为梯度不压缩,但大学习率仍可能导致梯度爆炸(尤其配合大的 batch size)。
- Sigmoid / Tanh 需更小的学习率(通常为 ReLU 的 1/10 ~ 1/5),因为饱和区间的梯度衰减会使参数更新缓慢。
- GELU / Swish:门控机制使得梯度量级可能大于 1,建议配合 学习率 warmup(如 Transformer 训练常用的 linear warmup + cosine decay)。
归一化(BatchNorm / LayerNorm / RMSNorm)
归一化层与激活函数的耦合是神经网络正则化与激活耦合的核心议题:
- BatchNorm:在激活函数之前应用(
→ BatchNorm( ) → )。这一顺序使得 BatchNorm 的输出分布稳定在激活函数的非饱和区间。 - LayerNorm / RMSNorm:通常在激活函数之后应用或之前均可(Transformer 中 LayerNorm 在残差之后、全连接层之前),但对 GELU 而言,若 LayerNorm 在前则可稳定输入分布,减少门控信号的波动。
- 重要经验(empirical common practice):ResNet 中 BatchNorm → ReLU 是标准顺序(BN-ReLU order),而 Transformer 中 GELU 通常在 LayerNorm 之后。顺序差异源于架构中归一化层的位置(残差连接 vs 密集层)。
6.3 常见问题与解决方案
问题 1:死 ReLU(Dying ReLU)
成因: 神经元输出在负区间被置零且梯度为 0,权重无法更新。
诊断方法: 观察训练过程中激活为 0 的神经元比例;若超过 50%~70% 且持续不下降,则存在死 ReLU 问题。
解决方案:
| 方法 | 说明 |
|---|---|
| LeakyReLU / PReLU | 负区间保留 |
| ELU | 平滑负区间,输出趋近 |
| 减小学习率 | 避免初始阶段大步长更新导致大负值输出 |
| 调整初始化 | 偏置初始化为小正值(如 0.01),避免初始阶段负输出 |
| 使用 BatchNorm | BatchNorm 的可学习缩放偏置可自动调整层输出分布 |
问题 2:饱和梯度(Saturation Gradient)
成因: 当
诊断方法: 观察激活值分布——若大部分激活值集中在饱和区间(接近
解决方案:
- 使用 ReLU / LeakyReLU 代替 Sigmoid / Tanh(深层网络首选)。
- 若必须使用 Tanh(如 RNN),配合 残差连接(skip connection)以维持梯度流。
- 使用 LSTM / GRU 等带门控机制的 RNN 单元,内部记忆单元设计缓解梯度消失。
- 配合 BatchNorm 以稳定输入分布。
问题 3:数值不稳定(Numerical Instability)
具体表现为:
- 上溢(Overflow):
在 过大时超出浮点表示范围( )。 - 下溢(Underflow):
在 过大时趋近 0,导致除 0 或 。
Sigmoid 数值安全实现:
实际框架(PyTorch / TensorFlow)的 Sigmoid 实现均采用此分段逻辑。
Softmax 数值安全实现:
直接计算
其中
GELU / Swish 的数值实现: 框架通常调用 scipy.special.erf 或其近似;精度要求高的场景使用高精度近似公式。
本章小结
- 激活函数是神经网络非线性表达能力的根本来源。没有非线性,多层线性网络退化为单层线性网络。
- 激活函数的一阶导数
决定了反向传播中梯度的传递效率:Sigmoid/Tanh 存在饱和区间导致梯度消失;ReLU 在正区间梯度恒为 1,是深层网络的首选。 - 链式法则清晰表明:激活函数的导数通过逐元素乘法直接影响梯度流,是深层网络训练的核心瓶颈。
- 输出层激活函数必须与任务匹配——二分类用 Sigmoid,多分类用 Softmax,多标签用独立 Sigmoid,回归用线性输出。
- 工程中的三大耦合关系:初始化依赖激活函数的饱和特性(He 配 ReLU,Xavier 配 Sigmoid/Tanh);学习率需根据激活饱和程度调整;归一化层的位置(BN-ReLU vs LN-GELU)影响激活分布与梯度流。
- 常见工程问题(死 ReLU、饱和梯度、数值不稳定)均有成熟解决方案:变体激活函数、残差连接、安全数值实现。
训练时选择激活函数的实用建议清单
-
默认选择:深层网络隐藏层优先用 ReLU,简单架构(≤ 5 层)完全够用。
-
深层 / Transformer 架构:用 GELU;NLP 和 Vision Transformer 的经验标准。
-
防止死 ReLU:用 LeakyReLU(固定
)或 PReLU( 可学习);若有显存和计算余量,直接用 ELU。 -
RNN 架构:优先用 Tanh(LSTM/GRU 内部已使用);Tanh 的输出以 0 为中心,适合时间序列的梯度流。
-
生成模型(GAN / VAE):生成器输出层依据目标范围选择激活;隐藏层用 ReLU / LeakyReLU。
-
输出层不纠结:
- 二分类 → Sigmoid
- 多分类 → Softmax
- 多标签 → 独立 Sigmoid
- 回归 → Linear(无激活)
-
配合 BatchNorm 使用:BatchNorm 在激活前时,激活函数可使用更强非线性的变体(如原始 ReLU 而非 LeakyReLU);BatchNorm 的均值方差归一化能自动将输入推入非饱和区间。
-
学习率适配:Sigmoid/Tanh 网络用较小学习率(相对 ReLU 的 1/5 ~ 1/10);GELU/Swish 建议配合 warmup。
-
数值安全:框架已处理 Sigmoid/Softmax 的数值问题;但若自行实现,务必用 max-reducing trick 处理 Softmax,用分段函数处理 Sigmoid。
-
不要过度设计:在绝大多数 CV 任务中,ReLU + BatchNorm 的组合足够稳定高效;过早切换到 GELU/Swish 在小数据集上可能引入过拟合风险。