LeakyReLU
- LeakyReLU: Leaky Rectified Linear Unit
函数+导函数
-
LeakyReLU
函数
L e a k y R e L U = { x x > = 0 p x x < 0 p ∈ ( 0 , 1 ) \rm Leaky{ReLU} = \left\{ \begin{array}{} x \quad x>=0 \\ px \quad x<0 \end{array} \right. \quad p \in (0,1) LeakyReLU={xx>=0pxx<0p∈(0,1) -
LeakyReLU
函数导数
d d x L e a k y R e L U = { 1 x ≥ 1 p x < 0 p ∈ ( 0 , 1 ) \frac{d}{dx} \rm LeakyReLU = \left\{ \begin{array}{} 1 \quad x \ge1 \\ p \quad x < 0 \end{array} \right. \quad p \in (0,1) dxdLeakyReLU={1x≥1px<0p∈(0,1)
它和 ReLU 函数的不同之处在于,当 x 小于零时,LeakyReLU 函数的导数值并不为 0,而 是常数𝑝,p 一般设置为某较小的数值,如 0.01 或 0.02
函数和导函数图像
-
画图
下面是的 p = 0.5 p=0.5 p=0.5 时候的情况,请注意,p 一般设置为较小值。
import numpy as np from matplotlib import pyplot as plt # 定义 PReLU 函数 def prelu(x, alpha=0.25): return np.where(x < 0, alpha * x, x) # 定义 PReLU 的导数 def prelu_derivative(x, alpha=0.25): d = np.where(x < 0, alpha, 1) return d # 生成数据 x = np.linspace(-2, 2, 1000) alpha = 0.5 # 可以调整 alpha 的值 y = prelu(x, alpha) y1 = prelu_derivative(x, alpha) # 绘制图形 plt.figure(figsize=(12, 8)) ax = plt.gca() plt.plot(x, y, label='PReLU') plt.plot(x, y1, label='Derivative') plt.title(f'PReLU (alpha={alpha}) and Partial Derivative') # 设置上边和右边无边框 ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') # 设置 x 坐标刻度数字或名称的位置 ax.xaxis.set_ticks_position('bottom') # 设置边框位置 ax.spines['bottom'].set_position(('data', 0)) ax.yaxis.set_ticks_position('left') ax.spines['left'].set_position(('data', 0)) plt.legend(loc=2) plt.show()
LeakyReLU 函数有效的克服了 ReLU 函数的缺陷,使用也比较广泛。
优缺点
-
Leaky Relu 的优点(相对 ReLU的改进)
- 与 ReLU 函数相比,Leaky ReLU 通过在负半轴引入一个小的线性分量(如 0.01x)来调整负值的梯度问题;这有助于扩大 ReLU 函数的范围,通常斜率 p 的值为 0.01 左右;函数范围是负无穷到正无穷。
- Leaky ReLU 激活函数通过在负半轴添加一个小的正斜率(如 0.01),使得负轴的信息不会全部丢失。通过这种方式,Leaky ReLU 激活函数可以确保模型训练过程中神经元的权重在输入小于 0 的情况下依然会得到更新。
- 不会出现 Dead ReLU 问题,但关于输入函数 f(x)的部分仍然容易出现梯度爆炸的情况,因此必要时可以搭配 Sigmoid 或 Tanh 使用。
-
Leaky Relu 的缺点
- 经典(以及广泛使用的)ReLU 激活函数的变体,带泄露修正线性单元(Leaky ReLU)的输出对负值输入有很小的坡度。由于导数总是不为零,这能减少静默神经元的出现,允许基于梯度的学习(虽然会很慢)。
- 从理论上讲,Leaky ReLU 具有 ReLU 的所有优点,而且 Dead ReLU 不会有任何问题,但在实际应用中,尚未完全证明 Leaky ReLU 总是比 ReLU 更好。
pytorchLeakyReLU_100">pytorch中的LeakyReLU函数
-
代码
import torch x = torch.randn(2) f = torch.nn.LeakyReLU(negative_slope=0.1) # negative_slope是个常数,即负值部分的斜率 leakyRelu_x = f(x) print(f"x: \n{x}") print(f"leakyRelu_x:\n{leakyRelu_x}") """输出""" x: tensor([-1.7098, 0.3351]) leakyRelu_x: tensor([-0.1710, 0.3351])
为了便于演示,这里的
p
设置成了0.1
,即代码中的negative_slope
,我们可以看到输出,当x小于0 的时候,leakyRelu_x的结果被乘以0.1。
tensorflow 中的LeakyReLU函数
-
代码
python: 3.10.9
tensorflow: 2.18.0
import tensorflow as tf alpha = 0.1 # 定义 LeakyReLU 函数,alpha 是负值部分的斜率 f = lambda x: tf.nn.leaky_relu(x, alpha=alpha) x = tf.random.normal([2]) leaky_relu_x = f(x) print(f"x: \n{x}") print(f"leaky_relu_x:\n{leaky_relu_x}") """输出""" x: [-0.733668 0.06844683] leaky_relu_x: [-0.07336681 0.06844683]
同上,这里的
p
设置成了0.1
,即代码中的alpha
,我们可以看到输出,当x小于0 的时候,leakyRelu_x的结果被乘以0.1。