sigmoid、Dice、ReLu激活函数简单介绍

----摘自chatgpt的回答

sigmoid函数

sigmoid函数是一种常用的神经网络激活函数,也称为Logistic函数。sigmoid函数的数学表达式如下:

f ( x ) = 1 1 + e − x f(x) = \frac{1}{1+e^{-x}} f(x)=1+ex1

其中, x x x表示输入, f ( x ) f(x) f(x)表示输出。sigmoid函数的输出在 ( 0 , 1 ) (0,1) (0,1)之间,具有单调性和可导性。
sigmoid函数的优点:具有平滑的S形曲线,能够将输入映射到 ( 0 , 1 ) (0,1) (0,1)之间的概率值,常用于二分类问题的输出层。此外,sigmoid函数的导数在 x = 0 x=0 x=0处取得最大值 1 4 \frac{1}{4} 41,能够有效地加速神经网络的训练速度。
但是,sigmoid函数也存在一些问题:

  • 首先,当输入 x x x较大或较小时,sigmoid函数的输出会接近于0或1,造成梯度消失问题,从而影响模型的性能。

  • 其次,sigmoid函数的输出不是以0为中心的,会导致梯度更新时的偏移问题,从而影响模型的收敛速度。

    因此,在实际应用中,人们通常使用其他的激活函数,如Relu、Leaky Relu、ELU等,这些激活函数能够更好地解决神经网络中的梯度消失和过拟合问题,具有更好的性能和稳定性。

Dice激活函数

Dice激活函数是一种用于神经网络的非线性激活函数,由阿里巴巴提出。Dice激活函数主要用于解决梯度消失和过拟合问题,能够有效地提高模型的鲁棒性和泛化能力。Dice激活函数的数学表达式如下:

D i c e ( x ) = 2 1 + e − β x − 1 \mathrm{Dice}(x) = \frac{2}{1+e^{-\beta x}} - 1 Dice(x)=1+eβx21

其中, x x x表示输入, β \beta β表示一个可学习的参数,通常初始化为0。Dice激活函数的输出值在 [ − 1 , 1 ] [-1,1] [1,1]之间,具有单调性和可导性。
Dice激活函数的特点是:将sigmoid函数进行了平移和缩放,使其更加平滑,同时保留了sigmoid函数的单调性和可导性。Dice激活函数的另一个重要特点是引入了Dropout机制,用于随机丢弃一部分神经元,从而减少模型的过拟合风险。具体来说,Dice激活函数在每个batch中,都会随机生成一个掩码向量,用于控制哪些神经元需要被保留,哪些神经元需要被丢弃。这种Dropout机制能够有效地提高模型的鲁棒性和泛化能力,从而使得模型更加健壮。
总之,Dice激活函数是一种比较新颖的非线性激活函数,能够有效地解决神经网络中的梯度消失和过拟合问题,具有良好的性能和可解释性。

class Dice(nn.Module):
    """
    :Description: 激活函数,改造后的prelu
    :param epsilon: 介绍某个类全局变量的功能
    :type epsilon: string //指定该变量的类型
    """
    def __init__(self, epsilon=1e-3):
        """
        :param epsilon: dice中的超参
        """
        super(Dice, self).__init__()
        self.epsilon = epsilon
        self.alpha = nn.Parameter(torch.randn(1))

    def forward(self, x: torch.Tensor):
        """
        :param x: 输入数据
        :return: dice后的结果
        """
        # x: N * num_neurons
        avg = x.mean(dim=1)  # N
        avg = avg.unsqueeze(dim=1)  # N * 1
        var = torch.pow(x - avg, 2) + self.epsilon  # N * num_neurons
        var = var.sum(dim=1).unsqueeze(dim=1)  # N * 1

        ps = (x - avg) / torch.sqrt(var)  # N * 1

        ps = nn.Sigmoid()(ps)  # N * 1
        return ps * x + (1 - ps) * self.alpha * x

Relu激活函数

Relu(Rectified Linear Unit)激活函数是一种常用的神经网络激活函数,用于解决神经网络中的非线性问题。Relu激活函数的数学表达式如下:

f ( x ) = max ⁡ ( 0 , x ) f(x) = \max(0, x) f(x)=max(0,x)

其中, x x x表示输入, f ( x ) f(x) f(x)表示输出。当 x > 0 x>0 x>0时, f ( x ) = x f(x)=x f(x)=x;当 x < 0 x<0 x<0时, f ( x ) = 0 f(x)=0 f(x)=0。Relu激活函数的输出在 [ 0 , + ∞ ) [0,+\infty) [0,+)之间,具有单调性和可导性。
Relu激活函数的主要优点:是计算速度快、具有稀疏性和非线性性。与sigmoid、tanh等激活函数相比,Relu激活函数的导数在 x < 0 x<0 x<0时为0,在 x > 0 x>0 x>0时为1,不会出现梯度消失的问题,能够有效地加速神经网络的训练速度。此外,Relu激活函数的输出值在 x < 0 x<0 x<0时为0,具有稀疏性,能够有效地减少网络中的冗余信息,从而提高模型的泛化能力。
但是,Relu激活函数也存在一些问题

  • 首先,当 x < 0 x<0 x<0时,Relu激活函数的导数为0,会出现“死亡神经元”的问题,即某些神经元永远无法被激活,从而影响模型的性能。

  • 其次,当 x x x较大时,Relu激活函数的导数也会变得很大,从而可能导致梯度爆炸的问题。
    因此,为了克服Relu激活函数的缺陷,人们提出了一系列改进版本的Relu激活函数,如Leaky Relu、PRelu、ELU等,这些改进版本的Relu激活函数能够更好地解决神经网络中的梯度消失和过拟合问题,具有更好的性能和稳定性。

Leaky Relu激活函数

Leaky Relu(Leaky Rectified Linear Unit)是一种改进版本的Relu激活函数,用于解决Relu激活函数“死亡神经元”的问题。与Relu激活函数 f ( x ) = max ⁡ ( 0 , x ) f(x)=\max(0,x) f(x)=max(0,x)不同,Leaky Relu激活函数的数学表达式如下:

f ( x ) = { x , x > 0 a x , x ≤ 0 f(x) = \begin{cases} x, & x > 0 \\ ax, & x \leq 0 \end{cases} f(x)={x,ax,x>0x0

其中x 表示输入, 表示输入, 表示输入,a表示一个小的正数,通常取0.01。Leaky Relu激活函数的输出在 ( − ∞ , + ∞ ) (-\infty,+\infty) (,+)之间,具有单调性和可导性。
相比于Relu激活函数,Leaky Relu激活函数在 x < 0 x<0 x<0时的导数不为0,从而避免了“死亡神经元”的问题,能够更好地解决神经网络中的梯度消失问题。此外,Leaky Relu激活函数的输出值在 x < 0 x<0 x<0时也不为0,能够保留更多的信息,从而提高模型的泛化能力。
除了Leaky Relu之外,还有一些其他的改进版本的Relu激活函数,如Parametric Relu(PRelu)、Exponential Linear Unit(ELU)等,这些激活函数也能够更好地解决神经网络中的梯度消失和过拟合问题,具有更好的性能和稳定性。

PRelu

Parametric Relu(PRelu)是一种改进版本的Relu激活函数,与Leaky Relu激活函数不同的是,PRelu激活函数在 x < 0 x<0 x<0时会引入一个可学习的参数,从而更加灵活地调整激活函数的输出。PRelu激活函数的数学表达式如下:

f ( x ) = { x , x > 0 a x , x ≤ 0 f(x) = \begin{cases} x, & x > 0 \\ ax, & x \leq 0 \end{cases} f(x)={x,ax,x>0x0

其中 x表示输入 a a a表示一个可学习的参数。
与Leaky Relu激活函数相比,PRelu激活函数在 x < 0 x<0 x<0时引入了一个可学习的参数,能够更加灵活地调整激活函数的输出,从而提高模型的性能和泛化能力。此外,PRelu激活函数在 x < 0 x<0 x<0时的导数也不为0,避免了“死亡神经元”的问题。
在实际应用中,PRelu激活函数常常用于卷积神经网络(CNN)中,能够更好地提高模型的性能和稳定性。

Exponential Linear Unit(ELU)

Exponential Linear Unit(ELU)是一种改进版本的激活函数,可以在一定程度上解决神经网络中的梯度消失和过拟合问题。ELU激活函数的数学表达式如下:

f ( x ) = { x , x > 0 α ( e x − 1 ) , x ≤ 0 f(x) = \begin{cases} x, & x > 0 \\ \alpha(e^x-1), & x \leq 0 \end{cases} f(x)={x,α(ex1),x>0x0

其中 x表示输入,alpha是一个可选的超参数,通常取1。
与Relu激活函数不同的是,ELU激活函数在x<0时不是线性的,而是指数级的,能够更好地处理负数部分,从而避免了“死亡神经元”的问题,提高了模型的稳定性和泛化能力。此外,ELU激活函数在 x < 0 x<0 x<0时的导数也不为0,能够更好地传递梯度,进一步缓解了梯度消失问题。
虽然ELU激活函数具有很好的性能和稳定性,但是计算复杂度较高,特别是在 x < 0 x<0 x<0时需要进行指数运算,相比于Relu激活函数而言计算速度较慢。

怎么选取激活函数?

在神经网络中,不同的激活函数适用于不同的场景,没有哪一种激活函数是绝对好的,需要根据具体的应用场景来选择合适的激活函数。下面简单总结一下几种常用的激活函数的特点和适用场景:

  1. Relu激活函数
    Relu激活函数简单有效,能够快速收敛,特别适用于深度神经网络。但是,Relu激活函数在 x < 0 x<0 x<0时输出为0,会导致一些神经元“死亡”,影响模型的性能和泛化能力。
  2. Leaky Relu激活函数
    Leaky Relu激活函数在 x < 0 x<0 x<0时引入了一个可学习的参数,能够更好地解决神经元“死亡”的问题,提高模型的泛化能力。但是,Leaky Relu激活函数仍然存在 x < 0 x<0 x<0时输出较小的问题,可能会影响模型的性能。
  3. PRelu激活函数
    PRelu激活函数在 x < 0 x<0 x<0时引入了一个可学习的参数,能够更加灵活地调整激活函数的输出,从而提高模型的性能和泛化能力。但是,PRelu激活函数的计算复杂度较高,需要学习参数,容易过拟合。
  4. ELU激活函数
    ELU激活函数在 x < 0 x<0 x<0时不是线性的,而是指数级的,能够更好地处理负数部分,避免了“死亡神经元”的问题,提高了模型的稳定性和泛化能力。但是,ELU激活函数的计算复杂度较高,需要进行指数运算,相比于Relu激活函数而言计算速度较慢。

综上所述,选择哪种激活函数应该根据具体的应用场景来选择,需要综合考虑模型的性能、泛化能力、计算速度等多个因素。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值