Leaky ReLU
Leaky ReLU 会以较小的斜率(通常为 0.01)传递负输入,使梯度持续流动,并避免神经元陷入 ReLU 死亡问题。
Leaky ReLU(带泄漏的线性整流单元)是一种激活函数:输入为正时,它原样返回输入;输入为负时,它会乘以一个较小的固定斜率,例如 0.01。它是对标准 ReLU 的改进;标准 ReLU 对所有负输入都输出零,而 Leaky ReLU 让负值仍产生较小的输出,更重要的是,能在反向传播期间产生非零梯度。Andrew Maas、Awni Hannun 和 Andrew Ng 在 2013 年一项关于语音识别声学模型中整流激活函数的研究里介绍了该函数,并使用了 0.01 的斜率。它用于需要保持梯度流动的深度学习模型,从生成对抗网络判别器到较早期 YOLO 的目标检测器,以及运行分段线性激活量化模型的神经处理单元。
Leaky ReLU 的工作原理#
当 x > 0 和 x ≤ 0 分别满足 f(x) = x 和 f(x) = αx 时,Leaky ReLU 会计算相应的值;其中负斜率 α 是一个介于 0 和 1 之间的固定超参数。对于正输入,它的导数为 1;对于负输入,导数为 α,因此每个输入都会将一部分梯度传回生成它的权重。不同来源和框架使用的常见斜率有所不同:PyTorch 的 nn.LeakyReLU默认值为 0.01,TensorFlow 的 tf.nn.leaky_relu 默认值为 0.2,而 Keras 的 LeakyReLU 层默认值为 0.3。下面的代码将负输入分别传入 ReLU 和 Leaky ReLU,并计算各自的梯度:
import torch
from torch import nn
# Negative pre-activations, the inputs a ReLU unit turns into zeros
x = torch.tensor([-3.0, -1.0, -0.5], requires_grad=True)
for activation in (nn.ReLU(), nn.LeakyReLU(negative_slope=0.01)):
y = activation(x)
y.sum().backward() # gradient that flows back toward the weights
print(f"{activation}: output {y.detach().numpy()}, gradient {x.grad.numpy()}")
x.grad = None程序会打印 ReLU(): output [0. 0. 0.], gradient [0. 0. 0.] 和 LeakyReLU(negative_slope=0.01): output [-0.03 -0.01 -0.005], gradient [0.01 0.01 0.01]。ReLU 不会将梯度从这些输入传回,因此梯度下降无法改变生成这些输入的权重;Leaky ReLU 则会传回上游梯度的 1%。
ReLU 神经元死亡问题#
当 ReLU 神经元的权重和偏置发生偏移,以至于它对训练数据中的所有输入都产生负的预激活值时,该神经元就会死亡。此时,它的输出始终为零,梯度也始终为零,输入权重再也不会更新,因此该神经元会从神经网络中永久失效。较高的学习率或较大的负偏置更新会增加这种情况发生的可能性。Leaky ReLU 会在负值区域保留一个较小的梯度,因此偏移到负值区域的神经元仍有机会恢复:
ReLU 神经元死亡问题不同于梯度消失问题;后者指梯度在经过许多使用饱和函数的层(例如 sigmoid 或 tanh)时逐渐变小。
Leaky ReLU 与相关激活函数的比较#
- ReLU:对负输入输出精确的零值,因此激活结果稀疏、计算成本低,但神经元可能死亡。Leaky ReLU 则放弃了精确稀疏性,以换取处处存在的梯度。
- 参数化 ReLU(PReLU):训练期间学习负斜率(通常每个通道一个值),而非将其固定。Kaiming He 及其同事将斜率初始化为 0.25,这也是 PyTorch 的
nn.PReLU默认值。 - SiLU 和 GELU:这两种平滑曲线在负输入时会略微低于零,并且在零点处没有尖角。SiLU 是现代 YOLO 模型的默认激活函数,GELU 则常见于 Transformer。两者每个值都需要进行一次指数运算,而 Leaky ReLU 只需比较和乘法。
Leaky ReLU 的应用场景#
- DCGAN 判别器:DCGAN 架构在每个判别器层中都使用了斜率为 0.2 的 Leaky ReLU,因此即使判别器拒绝某张图像,生成器仍能获得有用的梯度;许多后续 GAN 也沿用了这一选择。
- 早期 YOLO 检测器:原始 YOLO 在除最后一层外的所有层中都使用了斜率为 0.1 的 Leaky ReLU,YOLOv2 和 YOLOv3 也如此;YOLOv5 一直使用它,直到 2021 年 1 月发布的 v4.0 版本将其替换为 SiLU。
- 图注意力网络:这类图神经网络使用斜率为 0.2 的 Leaky ReLU,为每个节点应该关注多少邻居节点进行评分。
- 边缘 AI 加速器:运行量化模型的整数神经处理单元可以将分段线性激活融合到前面的卷积中。AMD 的 Xilinx DPU 会对 ReLU 和 Leaky ReLU 执行此操作,但会在主机 CPU 上运行 sigmoid,因此也会在主机上运行 SiLU。
Ultralytics YOLO 模型 YAML 文件接受一个 activation 键,可替换所有标准卷积块中的默认 SiLU,因此可以使用 activation: nn.LeakyReLU(0.1015625) 训练 YOLO26,使其匹配 DPU 固定的斜率 26/256。










