您的位置:

LeakyReLU激活函数

一、alpha参数

LeakyReLU(Leaky Rectified Linear Unit)是一种激活函数,相比ReLU在输入为负值时输出0,LeakyReLU在输入为负值时不再返回0,而是返回一个小的非零值α。这里的α被称为LeakyReLU的负斜率(negative slope)。选择合适的α是很重要的一步,通常在0.01或0.2左右即可。

class LeakyReLU(nn.Module):
    def __init__(self, alpha=0.01):
        super(LeakyReLU, self).__init__()
        self.alpha = alpha
        
    def forward(self, x):
        return F.leaky_relu(x, negative_slope=self.alpha)

二、LeakyReLU和ReLU的区别

ReLU激活函数在输入为正值时对输入进行保留,而在输入为负值时返回0。LeakyReLU在输入为负值时返回一个小的α而不是0。

ReLU简单而高效,并已成为最流行的激活函数之一。但在输入为负值时,ReLU的输出是恒定的,这导致了一些问题。如果输入的负值在训练过程中不被更新,那么它们将永远是负的。这被称为ReLU死亡问题。

LeakyReLU实际上解决了ReLU激活函数的问题。LeakyReLU在输入为负值时不再返回0,而是返回一个小的非零值α,这样输出仍然对输入负数产生响应。因此,LeakyReLU既具有ReLU的所有好处,也能避免ReLU的死亡问题。

三、LeakyReLU激活函数

LeakyReLU通过引入小的非零值α来重新定义负数区域,以便能够在激活函数中有一个小的斜率,并避免ReLU激活函数的死亡问题。下面是LeakyReLU激活函数的表达式:

LeakyReLU(x) = max(αx, x)

其中,x是输入,α是斜率。如果α=0,LeakyReLU将退化为ReLU。

import torch.nn.functional as F

def leaky_relu(x, alpha=0.01):
    return F.leaky_relu(x, negative_slope=alpha)

四、ReLU函数图像

下面是ReLU函数的图像展示,其中输入小于0的都变为了0。

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-10, 10, 0.1)
y = np.maximum(0, x)
plt.plot(x, y)
plt.title('ReLU activation function')
plt.show()

五、ReLU函数优缺点

优点:

1、ReLU激活函数的数学形式非常简单,只需要进行简单的数值比较即可,因此非常高效。

2、ReLU激活函数是典型的稀疏激活,大量的输入全都返回0,可以有效减小模型的存储和计算开销。

3、ReLU激活函数使得神经网络的训练更快速,收敛速度更快。

缺点:

1、ReLU函数在负值区间恒定输出为0,在神经元的负半轴范围内,梯度为0可能导致权重无法更新,从而在后续的训练过程中,这些神经元都无法被激活。

2、ReLU函数的输出不是规范化的,这意味着该函数的输出可以是任意大的值,如果不适当地训练神经网络,可能会导致神经元输出为NaN。

六、LeakyReLU函数实现

import torch.nn as nn
import torch.nn.functional as F

class LeakyNet(nn.Module):
    def __init__(self):
        super(LeakyNet, self).__init__()
        self.fc1 = nn.Linear(in_features=784, out_features=100)
        self.lrelu1 = nn.LeakyReLU(negative_slope=0.01)
        self.fc2 = nn.Linear(in_features=100, out_features=10)
        
    def forward(self, x):
        x = x.view(-1, 784)
        x = self.fc1(x)
        x = self.lrelu1(x)
        x = self.fc2(x)
        return F.log_softmax(x, dim=1)

以上是利用LeakyReLU函数实现的神经网络代码示例。其中,nn.LeakyReLU()函数用来定义LeakyReLU激活函数,negative_slope参数用来定义α的值。