激活函数-ReLU-LeakyReLU

对激活函数:

  • ReLU
  • Leaky ReLU

进行定义介,包括公式定义、代码实现和优缺点,以及适用场景。

1 ReLU

公式:

$$
ReLU(x)=x^{+}=max(0,x)=\frac{x+|x|}{2}
$$
ReLU

✅优点

  • 计算简单:没有复杂的函数操作,计算速度快。
  • 缓解梯度消失:相比 sigmoid/tanh,ReLU 在正区间的梯度恒为 1,有利于反向传播。
  • 稀疏激活:当输入为负时输出为 0,有助于模型的稀疏性与鲁棒性。

⚠️ 缺点:死亡ReLU问题(Dying ReLU)

ReLU的导数:
![grad of ReLU](grad of ReLU.png)

当输入始终小于 0 时,ReLU 输出恒为 0,对应神经元在训练过程中就“死了”,不再更新权重

2 Leaky ReLU

为了缓解“死亡 ReLU”问题,Leaky ReLU 提出了一种小改动:

$$
\text{Leaky ReLU}(x) =
\begin{cases}
x & \text{if } x \geq 0 \
\alpha x & \text{if } x < 0
\end{cases}
$$

其中 $\alpha$ 是一个很小的常数,通常取值如 0.01。
斜率系数是在训练之前确定的,即在训练期间不会学习。这种类型的激活函数在我们可能遭受稀疏梯度的任务中很受欢迎,例如训练生成对抗网络

✅ 优点

  • 解决死亡问题:负值区域有一个小斜率,不会完全丢失梯度。
  • 提升模型鲁棒性:在某些任务中可以提高模型性能。

⚠️ 缺点

  • 仍然不是零均值输出,可能导致一定的偏移。
  • 引入了超参数 $\alpha$,需要手动设定或调参。

代码以及可视化

Pytorch

1
2
3
4
import torch.nn as nn

relu = nn.ReLU()
leaky_relu = nn.LeakyReLU(negative_slope=0.01)

可视化和对比

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-10, 10, 1000)
relu = np.maximum(0, x)
leaky_relu = np.where(x > 0, x, 0.01 * x)

plt.plot(x, relu, label="ReLU")
plt.plot(x, leaky_relu, label="Leaky ReLU")
plt.axhline(0, color='gray', linestyle='--', linewidth=0.5)
plt.legend()
plt.title("ReLU vs Leaky ReLU")
plt.grid(True)
plt.show()

ReLUvsLeakyReLU

4 总结与选择建议

特性 ReLU(Rectified Linear Unit) Leaky ReLU
数学表达式 f(x) = max(0, x) f(x) = x (x > 0), αx (x ≤ 0), α 通常为 0.01
非线性
是否允许负值通过 否,负值直接输出 0 是,负值被缩放(αx)
是否容易导致神经元失活 是(“神经元死亡” 问题) 否,可以缓解该问题
计算效率 高(非常简单) 略低(多一个乘法)
使用的超参数 需要选择或设定泄漏因子 α
常见使用场景 通用神经网络中默认的激活函数 在出现大量死神经元或训练不稳定时尝试使用
激活函数 推荐使用情况 理由说明
ReLU ✅ 默认优先选择(尤其是简单网络) 计算开销小,效果好,已被大量实验证明有效,是深度网络的标准激活函数。
Leaky ReLU ⚠️ ReLU 出现大量“神经元死亡”时 引入负数区域的非零梯度,有助于避免神经元在训练中“死掉”,提升梯度流动性和收敛稳定性
  • 如果你 初次搭建神经网络模型,建议从 ReLU 开始。
  • 如果你在训练中发现 loss 不下降、部分神经元长期输出为 0,可以尝试切换到 Leaky ReLU。
  • 在一些 对梯度传播更敏感的任务或深层网络中,Leaky ReLU 更能保障梯度不为 0。

为什么不直接一开始就用Leaky ReLU呢?

  1. ReLU更简单,而且计算代价更低。Leaky ReLU中的斜率参数在大规模模型中影响性能。
  2. α作为超参数,在不同任务或数据分布时适合各敏感值,需要调参。
作者

Zhou

发布于

2025-04-12

更新于

2025-04-12

许可协议

评论

+ + +