CELU

  • 连续可微指数线性单元:CELU(Continuously Differentiable Exponential Linear Unit),是一种连续可导的激活函数,结合了 ELUReLU 的特点,旨在解决 ELU 在某些情况下的梯度问题。

函数+导函数

  • CELU函数
    C E L U ( x ) = { x x ≥ 0 α ( e x α − 1 ) x < 0 \rm CELU(x) = \left\{ \begin{array}{} x \quad x \ge 0 \\ \alpha(e^{\frac{x}{\alpha}} - 1) \quad x < 0 \end{array} \right. CELU(x)={xx0α(eαx1)x<0
  • CELU函数导数
    d d x C E L U ( x ) = { 1 x ≥ 0 e x α x < 0 \frac{d}{dx} \rm CELU(x) = \left\{ \begin{array}{} 1 \quad x \ge 0 \\ e^{\frac{x}{\alpha}} \quad x < 0 \end{array} \right. dxdCELU(x)={1x0eαxx<0
    其中, α \alpha α 是一个非负参数,用于控制 x < 0 x<0 x<0时曲线的平滑度。当 α = 0 \alpha=0 α=0时,CELU函数退化为ReLU函数。对于 x < 0 x<0 x<0的部分,CELU使用指数函数来确保梯度不会消失,有助于加速训练过程中的梯度流动。


函数和导函数图像

  • 画图

    下面的是 α = 1 \alpha = 1 α=1

    import numpy as np
    from matplotlib import pyplot as plt
    
    # 定义 CELU 函数
    def celu(x, alpha=1.0):
        return np.where(x > 0, x, alpha * (np.exp(x / alpha) - 1))
    
    # 定义 CELU 的导数
    def celu_derivative(x, alpha=1.0):
        return np.where(x > 0, 1, np.exp(x / alpha))
    
    # 生成数据
    x = np.linspace(-3, 3, 1000)
    alpha = 1.0  # 可以调整 alpha 的值
    y = celu(x, alpha)
    y1 = celu_derivative(x, alpha)
    
    # 绘制图形
    plt.figure(figsize=(12, 8))
    ax = plt.gca()
    plt.plot(x, y, label=f'CELU (α={alpha})')
    plt.plot(x, y1, label='Derivative')
    plt.title(f'CELU (α={alpha}) and Derivative')
    
    # 设置上边和右边无边框
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    
    # 设置 x 坐标刻度数字或名称的位置
    ax.xaxis.set_ticks_position('bottom')
    
    # 设置边框位置
    ax.spines['bottom'].set_position(('data', 0))
    ax.yaxis.set_ticks_position('left')
    ax.spines['left'].set_position(('data', 0))
    
    plt.legend(loc=2)
    plt.show()
    

    CELU


优缺点

  • CELU 的优点

    1. 连续可导:CELU函数在整个定义域上都是连续可导的,这使得它在优化过程中更加稳定。
    2. 缓解梯度消失问题:CELU在负输入时引入非零梯度,有助于缓解梯度消失问题。
    3. 平滑过渡:CELU函数在零点处是平滑的,避免了ReLU在零点处的不连续性。
    4. 灵活性:CELU可以表示ReLU作为其特例,当α趋近于0时,CELU趋近于ReLU。
    5. 加速收敛:在某些情况下,CELU能够比ReLU更快地收敛。
  • CELU 的缺点

    1. 计算复杂度高:CELU的指数运算比ReLU更复杂,计算成本更高。
    2. 参数敏感:CELU的性能对α参数的选择较为敏感,不同的α值可能会显著影响模型的性能。
    3. 可能的过拟合风险:在某些情况下,CELU可能会导致模型过拟合,尤其是在数据集较小或模型复杂度较高时。
    4. 训练时间增加:由于计算复杂度的增加,CELU可能会导致训练时间变长。

pytorch中的CELU函数

  • 代码

    import torch
    
    # 定义 CELU 函数
    f = torch.nn.CELU()  # PyTorch 提供的 CELU 激活函数模块
    x = torch.randn(2)   # 生成一个随机张量作为输入
    
    celu_x = f(x)        # 应用 CELU 函数
    
    print(f"x: \n{x}")
    print(f"celu_x:\n{celu_x}")
    
    """输出"""
    x: 
    tensor([-0.8057, -0.8352])
    celu_x:
    tensor([-0.5532, -0.5662])
    

tensorflow 中的CELU函数

  • 代码

    python: 3.10.9

    tensorflow: 2.18.0

    import tensorflow as tf
    
    # 创建 CELU 激活函数
    celu = tf.keras.activations.celu
    
    # 生成随机输入
    # x = tf.random.normal([2])
    x = [-0.8057, -0.8352]
    
    # 应用 CELU 激活函数
    celu_x = celu(x)
    
    print(f"x: \n{x}")
    print(f"celu_x:\n{celu_x}")
    
    """输出"""
    x: 
    [-0.8057, -0.8352]
    celu_x:
    [-0.5532249 -0.5662123]
    

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐