4、 Leaky ReLU 函数
4.1 公式
Leaky ReLU函数的公式:
f
(
x
)
=
{
x
,
x
>
=
0
λ
x
,
x
<
0
,
λ
∈
(
0
,
1
)
f(x) =\begin{cases} x&,x>=0 \\ \lambda x&,x<0,\lambda \in(0,1) \end{cases}
f(x)={xλx,x>=0,x<0,λ∈(0,1)
Leakly ReLU函数的导函数:
f ′ ( x ) = { 1 , x > = 0 λ , x < 0 , λ ∈ ( 0 , 1 ) f'(x) = \begin{cases} 1&,x>=0 \\ \lambda &,x<0,\lambda \in(0,1) \end{cases} f′(x)={1λ,x>=0,x<0,λ∈(0,1)
4.2 对应的图像
4.3 生成对应的图像代码
import numpy as np
import matplotlib.pyplot as plt
# 定义LeakyReLU函数
def leaky_relu(x, alpha=0.01):
return np.where(x >= 0, x, alpha * x)
# 定义LeakyReLU的导数函数
def leaky_relu_derivative(x, alpha=0.01):
return np.where(x >= 0, 1, alpha)
# 生成x值的范围
x = np.linspace(-10, 10, 100)
# 计算LeakyReLU函数值
y_leaky_relu = leaky_relu(x)
# 计算LeakyReLU导数值
y_leaky_relu_derivative = leaky_relu_derivative(x)
# 绘制LeakyReLU函数图像
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.plot(x, y_leaky_relu, label='LeakyReLU')
plt.title('LeakyReLU Function')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
# 绘制LeakyReLU导数图像
plt.subplot(1, 2, 2)
plt.plot(x, y_leaky_relu_derivative, label='LeakyReLU Derivative')
plt.title('LeakyReLU Derivative')
plt.xlabel('x')
plt.ylabel('dy/dx')
plt.legend()
# 显示图像
plt.tight_layout()
plt.show()
4.4 优点与不足
Leaky ReLU函数(ReLU的改进):
1、与ReLU函数相比,把x的非常小的线性分量给予负输入(0.01x)来调整负值的零梯度问题;有助于扩大 ReLU 函数的范围,通常𝜆λ的值为 0.01 左右;函数范围是负无穷到正无穷。
2、LeakyRelu激活函数通过在负半轴添加一个小的正斜率(使得负轴的信息不会全部丢失)来解决ReLU激活函数的“死区”问题,该斜率参数𝜆λ是手动设置的超参数,一般设置为0.01。通过这种方式,LeakyRelu激活函数可以确保模型训练过程中神经元的权重在输入小于0的情况下依然会得到更新。
3、不会出
4.5 Leaky ReLU 函数
在PyTorch中,torch.leaky_relu 函数是用于实现 Leaky ReLU 激活函数的。Leaky ReLU 是一种改进的 ReLU(Rectified Linear Unit)函数,它允许小的非零梯度当输入值为负时。这有助于解决ReLU在负值区域的神经元“死亡”问题。
torch.leaky_relu 的基本使用如下:
import torch
# 创建一个张量
x = torch.tensor([-5.0, -3.0, 0.0, 2.0, 5.0])
# 应用 Leaky ReLU 函数
y = torch.leaky_relu(x, negative_slope=0.01)
print(y)
这里,negative_slope 参数控制负值区域的斜率。默认值是 0.01,这意味着当输入值小于零时,输出将是输入值乘以 0.01。对于非负输入值,Leaky ReLU 的行为类似于普通的 ReLU 函数,即输出就是输入值本身。
如果你想要在一个神经网络模型中使用 Leaky ReLU,你可以在定义模型时将其作为激活函数使用,例如:
import torch.nn as nn
class MyModel(nn.Module):
def __init__(self):
super(MyModel, self).__init__()
self.fc1 = nn.Linear(10, 50)
self.leaky_relu = nn.LeakyReLU(negative_slope=0.01)
self.fc2 = nn.Linear(50, 1)
def forward(self, x):
x = self.fc1(x)
x = self.leaky_relu(x)
x = self.fc2(x)
return x
model = MyModel()
在这个例子中,nn.LeakyReLU 被用作 MyModel 模型中的一个层,它将应用于全连接层 self.fc1 的输出。在模型的前向传播过程中,数据会首先通过全连接层,然后经过 Leaky ReLU 激活函数,最后再通过另一个全连接层。