• 深度学习常见激活函数:ReLU,sigmoid,Tanh,softmax,Leaky ReLU,PReLU,ELU,Maxout整理集合,场景应用


    1、ReLU 函数

    整流线性单元(Rectified linear unit,ReLU) 是现代神经网络中最常用的激活函数,大多数前馈神经网络默认使用的激活函数,它提供了一种非常简单的非线性变换。给定元素 x,ReLU 函数被定义为该元素与 0 的最大值。ReLU函数定义如下:
    在这里插入图片描述
    代码:

    import numpy as np
    import matplotlib.pyplot as plt
    
    # 定义ReLU函数
    def relu(x):
        return np.maximum(0, x)
    
    # 生成一些输入值,这里可以设置成其他的数值
    x_values = np.linspace(-5, 5, 100)
    
    # 计算对应的ReLU输出值
    y_values = relu(x_values)
    
    # 绘制ReLU函数的图像
    plt.plot(x_values, y_values, label='ReLU Function')
    plt.title('ReLU Activation Function')
    plt.xlabel('Input')
    plt.ylabel('Output')
    plt.axhline(0, color='black',linewidth=0.5)
    plt.axvline(0, color='black',linewidth=0.5)
    plt.grid(color = 'gray', linestyle = '--', linewidth = 0.5)
    plt.legend()
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    生成图像如下:

    在这里插入图片描述

    1.1 优点

    • x > 0 区域上,不会出现梯度饱和、梯度消失的问题,梯度永远是常量;
    • 它在训练神经网络时能够加速收敛,并且计算相对简单;
    • 计算复杂度低,不需要进行指数运算,只要一个阈值就可以得到激活值。

    1.2 缺点

    • 容易出现 神经元坏死现象(dead relu problem),最直观的结果就是,输入到 relu 函数中的值如果存在负数,则最终经过 relu 之后变成 0,极端情况下是输入relu的所有值全都是负数,则relu activated之后的结果均为0。
      在这里插入图片描述
      产生这种现象的两个原因:参数初始化不合理;learning rate 太高导致在训练过程中参数更新太大。

    2、sigmoid 函数

    sigmoid 函数又称 Logistic 函数,用于隐层神经元输出,它将范围 (-inf,inf) 中的任意输入压缩到区间 (0,1) 中的某个值,可以用来做二分类。sigmoid 函数定义如下:
    在这里插入图片描述
    代码:

    # -*-coding:utf-8-*-
    import numpy as np
    import matplotlib.pyplot as plt
    
    # 定义Sigmoid函数
    def sigmoid(x):
        return 1 / (1 + np.exp(-x))
    
    # 生成一些输入值
    x_values = np.linspace(-7, 7, 200)
    
    # 计算对应的Sigmoid输出值
    y_values = sigmoid(x_values)
    
    # 绘制Sigmoid函数的图像
    plt.plot(x_values, y_values, label='Sigmoid Function')
    plt.title('Sigmoid Activation Function')
    plt.xlabel('Input')
    plt.ylabel('Output')
    plt.axhline(0, color='black',linewidth=0.5)
    plt.axvline(0, color='black',linewidth=0.5)
    plt.grid(color = 'gray', linestyle = '--', linewidth = 0.5)
    plt.legend()
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    生成图像如下:

    在这里插入图片描述

    2.1 优点

    • sigmoid 函数的输出在 (0,1) 之间,输出范围有限,优化稳定,可以用作输出层;
    • 它是个连续函数,便于求导。

    2.2 缺点

    • sigmoid 函数在变量取绝对值非常大的正值或负值时会出现饱和现象,意味着函数会变得很平,并且对输入的微小改变会变得不敏感。在反向传播时,当梯度接近于0,权重基本不会更新,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练。
    • 计算复杂度高,因为 sigmoid 函数是指数形式。

    3、Tanh 函数

    Tanh 函数也称为双曲正切函数,取值范围为 (-1,1)。Tanh函数定义如下:
    在这里插入图片描述
    它的导数是:
    在这里插入图片描述
    代码:

    import numpy as np
    import matplotlib.pyplot as plt
    
    # 定义 tanh 函数
    def tanh(x):
        return np.tanh(x)
    
    # 定义 tanh 函数的导数
    def tanh_derivative(x):
        return 1 - np.tanh(x)**2
    
    # 生成一些输入值
    x_values = np.linspace(-5, 5, 200)
    
    # 计算 tanh 函数的输出值和导数值
    y_tanh = tanh(x_values)
    y_derivative = tanh_derivative(x_values)
    
    # 绘制 tanh 函数及其导数在同一坐标轴中的图像
    plt.plot(x_values, y_tanh, label='tanh Function')
    plt.plot(x_values, y_derivative, label='tanh Derivative')
    plt.title('tanh Function and its Derivative')
    plt.xlabel('Input')
    plt.ylabel('Output / Derivative')
    plt.axhline(0, color='black', linewidth=0.5)
    plt.axvline(0, color='black', linewidth=0.5)
    plt.grid(color='gray', linestyle='--', linewidth=0.5)
    plt.legend()
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    生成图像如下:
    在这里插入图片描述
    Tanh函数图像及导数图像如上,当输入接近 0 时,Tanh 函数的导数接近最大值 1。可理解为 sigmoid 函数的变形,输入在任一方向上远离 0 点,导数越接近 0。
    在这里插入图片描述

    3.1 优点

    • 与 sigmoid 函数相同;

    3.2 缺点

    • Tanh 仍然存在梯度饱和与 exp 计算复杂的问题。

    4、softmax 函数(多数场景都使用)

    使用 sigmoid 激活函数可以处理二分类任务,而在处理多分类问题的时,就需要使用 softmax 函数。它将一个实数向量(通常称为 logits)转换为概率分布。

    输出规则: 将输入向量中的每个元素转换为一个位于 (0, 1) 之间的值,使得所有元素的和等于 1。这种转换后的好处是向量可以解释为一个概率分布,其中每个元素表示对应类别的概率。softmax 函数公式如下:
    在这里插入图片描述
    代码:

    import numpy as np
    import matplotlib.pyplot as plt
    
    # 定义 Softmax 函数
    def softmax(x):
        exp_x = np.exp(x)
        return exp_x / np.sum(exp_x, axis=-1, keepdims=True)
    
    # 生成一些输入值
    x_values = np.linspace(-5, 5, 200)
    
    # 计算对应的 Softmax 输出值
    y_values = softmax(x_values)
    
    # 绘制 Softmax 函数的图像
    plt.plot(x_values, y_values)
    plt.title('Softmax Function')
    plt.xlabel('Input')
    plt.ylabel('Output Probability')
    plt.axhline(0, color='black', linewidth=0.5)
    plt.axvline(0, color='black', linewidth=0.5)
    plt.grid(color='gray', linestyle='--', linewidth=0.5)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    生成图像如下:

    在这里插入图片描述

    5、Leaky ReLU 函数

    渗漏整流线性单元(Leaky ReLU),为了彻底避免 dead ReLU 现象。用一个类似 0.01 的小值来初始化神经元,从而使得 ReLU 在负数区域更偏向于激活而不是死掉。这里的斜率都是确定的,当然,这里的参数是可以调整的。

    在搭建神经网络的时候,应该如何选择激活函数?

  • 相关阅读:
    react中类组件的相关问题及优化
    代理和多级代理
    golang validator 包的使用指北
    gitlab操作
    linux NC命令的本质
    172.mybatisPlus的实际应用
    关于STM32的启动,boot0和boot1的取值说明
    mmcv和openCV两个库imcrop()和imresize()方法的对应【基础分析】
    6_1 系统安全分析与设计
    vscode连接服务器步骤
  • 原文地址:https://blog.csdn.net/JJxiao520/article/details/134546921