一、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参数用来定义α的值。