三个激活函数模块:GELU、SELU 和 RELU

三个激活函数模块:GELUSELURELU。这些模块的实现都遵循类似的结构,并通过 forward 方法实现它们的计算逻辑。下面逐步分析每个模块的实现和作用。

1. GELU (Gaussian Error Linear Unit)

class GELU(nn.Module):
    def forward(self, x):
        x, gates = x.chunk(2, dim = -1)
        return x * F.gelu(gates)
  • GELU 是一种常见的激活函数,通常用于深度神经网络中,尤其是在一些Transformer模型(如BERT)中被广泛使用。GELU 是基于高斯分布的激活函数,具有平滑的非线性特性。
  • x.chunk(2, dim=-1)
    • 这里,x.chunk(2, dim=-1) 将输入 x 沿着最后一个维度(即特征维度)拆分成两个部分:xgatesdim=-1 指的是对最后一个维度进行拆分,拆分成两个相等的部分。
    • xgates 的形状将是原始输入的一半。假设输入 x 的形状为 [batch_size, features],则 xgates 的形状将是 [batch_size, features // 2]
  • F.gelu(gates)
    • F.gelu(gates) 应用的是 GELU 激活函数。GELU 函数的公式是:
      GELU ( z ) ≈ 0.5 ⋅ z ( 1 + tanh ⁡ ( 2 π ( z + 0.044715 z 3 ) ) ) \text{GELU}(z) \approx 0.5 \cdot z \left( 1 + \tanh \left( \sqrt{\frac{2}{\pi}} \left( z + 0.044715 z^3 \right) \right) \right) GELU(z)0.5z(1+tanh(π2 (z+0.044715z3)))
      它通常用于替代 ReLU 激活函数,具有更平滑的曲线和更好的表现。
  • return x * F.gelu(gates)
    • 最终输出是将 xF.gelu(gates) 的结果逐元素相乘。这种操作是对输入特征的一个加权处理,其中 gates 控制了输入特征的激活程度。xgates 被拆分后,通过 gates 激活函数产生的值来“调制” x 的值。

2. SELU (Scaled Exponential Linear Unit)

selu源于论文Self-Normalizing Neural Networks作者为 Sepp Hochreiter。
selu其实就是ELU乘lambda,论文中给出了lambda和alpha的值
lambda = 1.0507
alpha = 1.67326

class SELU(nn.Module):
    def forward(self, x):
        x, gates = x.chunk(2, dim = -1)
        return x * F.selu(gates)
  • SELU 是一种自归一化激活函数,它是基于 ELU(Exponential Linear Unit)提出的。SELU 激活函数具有特别的性质,在某些情况下能够自动归一化神经网络的输出,从而加速训练并提高模型的性能。
  • x.chunk(2, dim=-1)
    • GELU 模块相似,x.chunk(2, dim=-1) 将输入 x 沿着最后一个维度拆分成两部分:xgates
  • F.selu(gates)
    • F.selu(gates) 应用的是 SELU 激活函数。SELU 函数的定义如下:
      SELU ( x ) = λ ( { x if  x > 0 α ( e x − 1 ) if  x ≤ 0 ) \text{SELU}(x) = \lambda \left( \begin{cases} x & \text{if } x > 0 \\ \alpha (e^x - 1) & \text{if } x \leq 0 \end{cases} \right) SELU(x)=λ({xα(ex1)if x>0if x0)
      其中,λα 是常数,通常选择 λ = 1.0507α = 1.6733。SELU 具有自归一化的性质,能够在某些条件下让神经网络的激活值保持均值为零,方差为 1,从而有助于加速训练过程。
  • return x * F.selu(gates)
    • 通过 gates 的 SELU 激活函数输出对 x 进行加权,类似于 GELU 中的加权过程。

3. RELU (Rectified Linear Unit)

class RELU(nn.Module):
    def forward(self, x):
        x, gates = x.chunk(2, dim = -1)
        return x * F.relu(gates)
  • RELU 是一种广泛使用的激活函数,它将所有负值置为零,保留正值。RELU 具有简单且高效的计算特性,能够有效缓解梯度消失问题。
  • x.chunk(2, dim=-1)
    • 和前面的模块一样,x.chunk(2, dim=-1) 将输入 x 沿着最后一个维度拆分成两个部分:xgates
  • F.relu(gates)
    • F.relu(gates)gates 应用 ReLU 激活函数,ReLU 的计算公式是:
      ReLU ( x ) = max ⁡ ( 0 , x ) \text{ReLU}(x) = \max(0, x) ReLU(x)=max(0,x)
      这将把所有负值置为零,保留正值。
  • return x * F.relu(gates)
    • 最终输出是将 xF.relu(gates) 的结果逐元素相乘。这意味着 gates 经过 ReLU 激活后,会根据 gates 的激活程度来调整 x 的值。

总结

这三个类都定义了自定义的激活函数,它们有以下共同特点:

  1. 输入拆分:每个类的 forward 方法都通过 x.chunk(2, dim=-1) 将输入 x 沿着最后一个维度拆分成两部分,xgates。然后使用 gates 部分经过激活函数的处理,最终通过逐元素相乘的方式与 x 结合。

  2. 不同的激活函数

    • GELU 使用高斯误差线性单元(Gaussian Error Linear Unit)。
    • SELU 使用自归一化的指数线性单元(Scaled Exponential Linear Unit)。
    • RELU 使用常见的修正线性单元(Rectified Linear Unit)。
  3. 逐元素乘法:这些激活函数通过将 x 和激活后的 gates 部分逐元素相乘来进行加权。

使用场景

这种设计的一个潜在目的可能是让模型在不同的“门”(gates)控制下根据不同的激活函数对 x 进行加权操作。这种设计可能在某些应用场景中会有所帮助,尤其是在复杂的神经网络模型中,可以通过不同类型的激活函数来灵活控制特征的激活方式。

这种结构不太常见,通常可以用于实验性模型或者模型中需要灵活切换不同类型激活函数的情况。

RELU激活函数是一种常用的非线性激活函数,其全称为Rectified Linear Unit。它的推导公式如下: f(x) = max(0, x) 其中,x为输入值,f(x)为输出值。如果x大于0,则输出为x本身;如果x小于等于0,则输出为0。 RELU激活函数的优点包括: 1. 计算简单:RELU函数只需判断输入值是否大于0,计算速度快。 2. 解决梯度消失问题:相比于sigmoidtanh等函数,RELU函数在正区间上的导数恒为1,不会导致梯度消失问题。 3. 降低计算复杂度:在深度神经网络中,RELU函数能够将一部分神经元的输出直接置为0,从而减少了参数的数量模型的计算复杂度。 RELU激活函数的缺点包括: 1. 神经元死亡问题:当输入值小于等于0时,RELU函数的导数为0,这意味着该神经元对梯度的贡献为0,从而可能导致该神经元无法更新权重。 2. 输出不是zero-centered:由于RELU函数在负区间上输出为0,因此其输出值不是zero-centered,可能对某些优化算法造成不利影响。 3. 容易出现神经元过度激活:当学习率较大时,使用RELU激活函数可能导致部分神经元过度激活,使得网络无法收敛。 GELU激活函数是一种近似高斯误差线性单元(Gaussian Error Linear Unit)的激活函数,其推导公式如下: f(x) = 0.5 * x * (1 + tanh(sqrt(2/pi) * (x + 0.044715 * x^3))) 其中,x为输入值,f(x)为输出值。 GELU激活函数的优点包括: 1. 近似高斯:GELU函数在接近零的区间上表现出类似于高斯分布的形状,有助于模型更好地适应连续变量。 2. 具有平滑的导数:GELU函数的导数在整个实数域上都存在,且连续平滑,有助于提高梯度的稳定性。 GELU激活函数的缺点包括: 1. 计算复杂度较高:相比于RELU函数,GELU函数的计算复杂度较高,这可能会增加训练推理的时间成本。 2. 参数调节困难:GELU函数中的参数需要进行调节,如果参数选择不合适,可能会影响模型的性能。 总体来说,RELU激活函数在实际应用中被广泛使用,并具有较好的性能。而GELU激活函数的优势在于它更接近高斯分布,但在计算复杂度参数调节上存在一些挑战。选择使用哪种激活函数要根据具体的任务需求实验结果来决定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值