深度学习常见概念解释(三)——激活函数定义,作用与种类(附公式,求导,图像和代码)

news2024/9/22 8:23:55

激活函数

  • 前言
  • 作用
  • 激活函数种类
    • 1. ReLU (Rectified Linear Unit)
    • 2. Leaky ReLU
    • 3. ELU (Exponential Linear Unit)
    • 4. Sigmoid
    • 5. Tanh
    • 6. Swish
  • 结论

前言

在深度学习中,激活函数是神经网络中的一个关键组件,起着引入非线性因素的作用,从而增加神经网络的表达能力和拟合复杂函数的能力。在神经网络中,每个神经元接收来自上一层神经元的输入,并对这些输入进行加权求和,然后将结果输入到激活函数中。激活函数对加权求和的结果进行变换,输出给下一层神经元。通过激活函数,神经网络可以学习和表示数据中的非线性关系,使得其在处理图像、语音、自然语言等复杂任务时表现出色。本文将详细介绍激活函数的定义、作用及其种类,并通过具体例子和代码实现展示每种激活函数的性质和导数。

作用

  1. 引入非线性:激活函数引入了非线性因素,使得神经网络可以学习和表示非线性关系。如果没有激活函数,多层神经网络就变成了单一的线性变换,无法拟合复杂的数据分布和模式。

  2. 实现分段线性变换:一些激活函数(如ReLU)可以实现分段线性变换,使得神经网络能够学习到不同区间内的不同线性关系,提高了网络的灵活性和表达能力。

  3. 去除数据的线性相关性:激活函数可以打破输入数据的线性相关性,使得神经网络可以学习到更复杂的特征和模式,提高了网络的泛化能力。

  4. 限制输出范围:某些激活函数(如Sigmoid和Tanh)可以将神经元的输出限制在一个特定的范围内(如0到1或-1到1),有助于控制神经元输出的幅度。

总的来说,激活函数在神经网络中扮演着非常重要的角色,通过引入非线性,增强了网络的表达能力,使得神经网络可以更好地拟合复杂的数据分布和模式。

激活函数种类

目前深度学习中常用的激活函数有以下几种:

1. ReLU (Rectified Linear Unit)

ReLU函数将所有负值都设为零,保持正值不变。优点是计算简单且有效,但可能导致神经元输出稀疏性,且在负值区域不具备梯度。

  • 公式
    ReLU ( x ) = max ⁡ ( 0 , x ) \text{ReLU}(x) = \max(0, x) ReLU(x)=max(0,x)
  • 激活函数图像
    在这里插入图片描述
  • 导数公式
    ReLU ′ ( x ) = { 1 , if  x > 0 0 , if  x ≤ 0 \text{ReLU}'(x) = \begin{cases} 1, & \text{if } x > 0 \\ 0, & \text{if } x \leq 0 \end{cases} ReLU(x)={1,0,if x>0if x0ReLU 函数在不同区间上的导数是不一样的。
  • 求导后的图像
    在这里插入图片描述
  • 特点
    计算简单且有效,但可能导致神经元输出稀疏性,且在负值区域不具备梯度。
  • Python 代码实现图像
    import numpy as np
    import matplotlib.pyplot as plt
    
    # 定义输入范围
    x = np.linspace(-10, 10, 400)
    
    # 计算 ReLU 激活函数值
    y = np.maximum(0, x)
    
    # 绘制 ReLU 激活函数图像
    plt.plot(x, y, label="ReLU")
    plt.title("ReLU Activation Function")
    plt.xlabel("x")
    plt.ylabel("ReLU(x)")
    plt.legend()
    plt.grid(True)
    plt.show()
    
    # 计算 ReLU 激活函数的导数值
    y_prime = np.where(x > 0, 1, 0)
    
    # 绘制 ReLU 激活函数导数图像
    plt.plot(x, y_prime, label="ReLU Derivative")
    plt.title("Derivative of ReLU Activation Function")
    plt.xlabel("x")
    plt.ylabel("ReLU'(x)")
    plt.legend()
    plt.grid(True)
    plt.show()
    

2. Leaky ReLU

为了解决ReLU在负值区域没有梯度的问题,Leaky ReLU引入了一个小的斜率(通常很小,如0.01)以保证负值区域也有梯度。

  • 公式
    f ( x ) = { x , if  x > 0 a x , otherwise f(x) = \begin{cases} x, & \text{if } x > 0 \\ ax, & \text{otherwise} \end{cases} f(x)={x,ax,if x>0otherwise
    其中 a 是一个小的正数(例如 0.01),用于控制负值区域的斜率。
  • 激活函数图像在这里插入图片描述- 求导公式
    f ′ ( x ) = { 1 if  x ≥ 0 α if  x < 0 f'(x) = \begin{cases} 1 & \text{if } x \geq 0 \\ \alpha & \text{if } x < 0 \end{cases} f(x)={1αif x0if x<0
  • 求导后的图像
    在这里插入图片描述
  • Python 代码实现图像
    import matplotlib.pyplot as plt
    import numpy as np
    
    def leaky_relu(x, alpha=0.01):
        return np.where(x >= 0, x, alpha * x)
    
    x = np.linspace(-10, 10, 400)
    y = leaky_relu(x)
    
    plt.plot(x, y, label="Leaky ReLU")
    plt.title("Leaky ReLU Activation Function")
    plt.xlabel("x")
    plt.ylabel("f(x)")
    plt.legend()
    plt.grid()
    plt.show()
    
    def leaky_relu_derivative(x, alpha=0.01):
        return np.where(x >= 0, 1, alpha)
    
    dy = leaky_relu_derivative(x)
    
    plt.plot(x, dy, label="Leaky ReLU Derivative")
    plt.title("Leaky ReLU Derivative")
    plt.xlabel("x")
    plt.ylabel("f'(x)")
    plt.legend()
    plt.grid()
    plt.show()
    

3. ELU (Exponential Linear Unit)

ELU在负值区域引入了一个指数增长的梯度,以解决ReLU存在的梯度稀疏性问题。

  • 公式
    ELU ( x ) = { x if  x ≥ 0 α ( e x − 1 ) if  x < 0 \text{ELU}(x) = \begin{cases} x & \text{if } x \geq 0 \\ \alpha (e^x - 1) & \text{if } x < 0 \end{cases} ELU(x)={xα(ex1)if x0if x<0
    其中, α \alpha α 是一个超参数,通常为正数,控制负半轴的饱和程度。这个激活函数在 x ≥ 0 x \geq 0 x0 时表现为线性,在 x < 0 x < 0 x<0 时表现为指数形式,具有较好的性质,如避免了 ReLU 激活函数在负数区域的“死亡”问题。

  • 激活函数图像:
    在这里插入图片描述

  • 求导公式
    ELU 激活函数的导数可以分别对 x ≥ 0 x \geq 0 x0 x < 0 x < 0 x<0 两个区域求导: ELU ′ ( x ) = { 1 if  x ≥ 0 α e x if  x < 0 \text{ELU}'(x) = \begin{cases} 1 & \text{if } x \geq 0 \\ \alpha e^x & \text{if } x < 0 \end{cases} ELU(x)={1αexif x0if x<0

  • 推导过程

    1. 对于 x ≥ 0 x \geq 0 x0:
      ELU ( x ) = x d d x ELU ( x ) = d d x x = 1 \text{ELU}(x) = x \\ \frac{d}{dx} \text{ELU}(x) = \frac{d}{dx} x = 1 ELU(x)=xdxdELU(x)=dxdx=1
    2. 对于 x < 0 x < 0 x<0:
      ELU ( x ) = α ( e x − 1 ) d d x ELU ( x ) = α d d x ( e x − 1 ) = α e x \text{ELU}(x) = \alpha (e^x - 1) \\ \frac{d}{dx} \text{ELU}(x) = \alpha \frac{d}{dx} (e^x - 1) = \alpha e^x ELU(x)=α(ex1)dxdELU(x)=αdxd(ex1)=αex
  • 求导后的图像:
    在这里插入图片描述

  • Python 代码实现图像

    import numpy as np
    import matplotlib.pyplot as plt
    
    def elu(x, alpha=1.0):
        return np.where(x >= 0, x, alpha * (np.exp(x) - 1))
    
    def elu_derivative(x, alpha=1.0):
        return np.where(x >= 0, 1, alpha * np.exp(x))
    
    # 创建输入数据
    x = np.linspace(-3, 3, 400)
    y = elu(x)
    y_prime = elu_derivative(x)
    
    # 创建图像
    plt.figure(figsize=(14, 6))
    
    # ELU函数图像
    plt.subplot(1, 2, 1)
    plt.plot(x, y, label='ELU')
    plt.title('ELU Activation Function')
    plt.xlabel('x')
    plt.ylabel('ELU(x)')
    plt.legend()
    plt.grid()
    
    # ELU导数图像
    plt.subplot(1, 2, 2)
    plt.plot(x, y_prime, label='ELU Derivative', color='red')
    plt.title('ELU Derivative Function')
    plt.xlabel('x')
    plt.ylabel("ELU'(x)")
    plt.legend()
    plt.grid()
    
    # 显示图像
    plt.tight_layout()
    plt.show()
    

4. Sigmoid

Sigmoid函数将输入压缩到0到1之间,在输出值接近饱和时梯度接近于零,容易造成梯度消失问题。

  • 公式
    σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+ex1
  • 激活函数图像
    在这里插入图片描述
  • 求导公式
    σ ′ ( x ) = σ ( x ) ⋅ ( 1 − σ ( x ) ) \sigma'(x) = \sigma(x) \cdot (1 - \sigma(x)) σ(x)=σ(x)(1σ(x))
    其中 σ ( x ) \sigma(x) σ(x) 是 Sigmoid 函数的值。
  • 求导后的图像
    在这里插入图片描述
  • Python 代码实现图像
    import numpy as np
    import matplotlib.pyplot as plt
    
    # Sigmoid函数
    def sigmoid(x):
        return 1 / (1 + np.exp(-x))
    
    # Sigmoid函数的导数
    def sigmoid_derivative(x):
        sx = sigmoid(x)
        return sx * (1 - sx)
    
    # 定义输入范围
    x = np.linspace(-10, 10, 400)
    
    # 计算Sigmoid函数值和导数值
    sigmoid_values = sigmoid(x)
    sigmoid_derivative_values = sigmoid_derivative(x)
    
    # 绘制Sigmoid函数图像
    plt.figure(figsize=(12, 6))
    
    plt.subplot(1, 2, 1)
    plt.plot(x, sigmoid_values, label='Sigmoid')
    plt.title('Sigmoid Function')
    plt.xlabel('x')
    plt.ylabel('σ(x)')
    plt.legend()
    
    # 绘制Sigmoid函数导数图像
    plt.subplot(1, 2, 2)
    plt.plot(x, sigmoid_derivative_values, label='Sigmoid Derivative', color='red')
    plt.title('Sigmoid Derivative Function')
    plt.xlabel('x')
    plt.ylabel('σ\'(x)')
    plt.legend()
    
    plt.tight_layout()
    plt.show()
    

5. Tanh

Tanh函数将输入压缩到-1到1之间,Tanh函数与Sigmoid函数类似,但输出均值为0,收敛速度比Sigmoid函数更快。

  • 公式
    Tanh ( x ) = e x − e − x e x + e − x \text{Tanh}(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} Tanh(x)=ex+exexex
  • 激活函数图像
    在这里插入图片描述
  • 求导公式
    Tanh ′ ( x ) = 1 − Tanh 2 ( x ) \text{Tanh}'(x) = 1 - \text{Tanh}^2(x) Tanh(x)=1Tanh2(x)
    这是因为:
    d d x ( e x − e − x e x + e − x ) = 1 − ( e x − e − x e x + e − x ) 2 \frac{d}{dx} \left( \frac{e^x - e^{-x}}{e^x + e^{-x}} \right) = 1 - \left( \frac{e^x - e^{-x}}{e^x + e^{-x}} \right)^2 dxd(ex+exexex)=1(ex+exexex)2
  • 求导后的图像在这里插入图片描述
  • Python 代码实现图像
    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 轴范围
    x = np.linspace(-10, 10, 400)
    
    # 计算 y 轴值
    y = tanh(x)
    y_derivative = tanh_derivative(x)
    
    # 绘制 Tanh 函数
    plt.figure(figsize=(12, 6))
    
    plt.subplot(1, 2, 1)
    plt.plot(x, y, label='Tanh(x)')
    plt.title('Tanh Activation Function')
    plt.xlabel('x')
    plt.ylabel('Tanh(x)')
    plt.legend()
    plt.grid(True)
    
    # 绘制 Tanh 函数的导数
    plt.subplot(1, 2, 2)
    plt.plot(x, y_derivative, label="Tanh'(x)", color='r')
    plt.title('Derivative of Tanh Function')
    plt.xlabel('x')
    plt.ylabel("Tanh'(x)")
    plt.legend()
    plt.grid(True)
    
    plt.tight_layout()
    plt.show()
    

6. Swish

Swish函数是一个新提出的激活函数,在ReLU的基础上引入了一个可学习的参数,通常表现比ReLU更好。

  • 公式
    Swish ( x ) = x ⋅ σ ( x ) \text{Swish}(x) = x \cdot \sigma(x) Swish(x)=xσ(x)
    其中, σ ( x ) \sigma(x) σ(x) 是 Sigmoid 函数。
  • 激活函数图像在这里插入图片描述
  • 求导公式
    d d x ( Swish ( x ) ) = Swish ( x ) + σ ( x ) ⋅ ( 1 − Swish ( x ) ) \frac{d}{dx}(\text{Swish}(x)) = \text{Swish}(x) + \sigma(x) \cdot (1 - \text{Swish}(x)) dxd(Swish(x))=Swish(x)+σ(x)(1Swish(x))
    其中, Swish ( x ) = x ⋅ σ ( x ) \text{Swish}(x) = x \cdot \sigma(x) Swish(x)=xσ(x) σ ( x ) \sigma(x) σ(x) 是 Sigmoid 函数。
  • 激活函数图像
    在这里插入图片描述
  • Python 代码实现图像
    import numpy as np
    import matplotlib.pyplot as plt
    
    # 定义 Sigmoid 函数
    def sigmoid(x):
        return 1 / (1 + np.exp(-x))
    
    # 定义 Swish 激活函数
    def swish(x):
        return x * sigmoid(x)
    
    # 定义 Swish 激活函数的导数
    def swish_derivative(x):
        sig = sigmoid(x)
        swish_value = swish(x)
        return swish_value + sig * (1 - swish_value)
    
    # 定义 x 范围
    x = np.linspace(-10, 10, 400)
    
    # 计算 Swish 函数值和导数值
    swish_values = swish(x)
    swish_derivative_values = swish_derivative(x)
    
    # 绘制 Swish 函数图像
    plt.figure(figsize=(12, 6))
    
    plt.subplot(1, 2, 1)
    plt.plot(x, swish_values, label='Swish(x)')
    plt.title('Swish Activation Function')
    plt.xlabel('x')
    plt.ylabel('Swish(x)')
    plt.legend()
    plt.grid(True)
    
    # 绘制 Swish 函数的导数图像
    plt.subplot(1, 2, 2)
    plt.plot(x, swish_derivative_values, label="Swish'(x)", color='r')
    plt.title('Derivative of Swish Activation Function')
    plt.xlabel('x')
    plt.ylabel("Swish'(x)")
    plt.legend()
    plt.grid(True)
    
    plt.tight_layout()
    plt.show()
    

结论

本文详细介绍了几种常用的激活函数,包括ReLU、Leaky ReLU、ELU、Sigmoid、Tanh和Swish。这些激活函数各有优劣,通过引入非线性,提高了神经网络的表达能力,使得其能够拟合复杂的数据分布和模式。理解和选择合适的激活函数对于设计高效的神经网络至关重要。通过具体的公式、导数和Python实现,我们可以更直观地理解每种激活函数的特点及其在不同情况下的表现。未来的研究可以继续探索新的激活函数,进一步提高深度学习模型的性能和效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1821242.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML+CSS 动态卡片

效果演示 实现了一个带有动态背景和图片放大效果的卡片展示。卡片的背景是由两种颜色交替组成的斜线条纹&#xff0c;同时背景会以一定速度循环滚动。当鼠标悬停在卡片上时&#xff0c;卡片的图片会放大&#xff0c;并且卡片的背景会变为彩色。 Code HTML <!DOCTYPE html&…

Windows defender bypass | 免杀

官方文档 在制作免杀的过程中,翻找 Windows 官方对 Windows Defender 的介绍,发现有这样一个目录:Configure Microsoft Defender Antivirus exclusions on Windows Server(在 Windows server 中配置defender排除项)。 https://docs.microsoft.com/en-us/microsoft-365/se…

【复旦邱锡鹏教授《神经网络与深度学习公开课》笔记】线性分类模型损失函数对比

本节均以二分类问题为例进行展开&#xff0c;统一定义类别标签 y ∈ { 1 , − 1 } y\in\{1,-1\} y∈{1,−1}&#xff0c;则分类正确时 y f ( x ; w ) > 0 yf(x;w)>0 yf(x;w)>0&#xff0c;且值越大越正确&#xff1b;错误时 y f ( x ; w ) < 0 yf(x;w)<0 yf(x;…

大数计算器(加减乘除)

#define _CRT_SECURE_NO_DEPRECATE 1#include<stdio.h> #include<string.h> #define N 200 #define jc_MAX 4000//输入 void input_digit(char s1[], char s2[]) {printf("请输入第一个数&#xff1a;");scanf("%s", s1);printf("请输入第…

郑州申请大气污染防治乙级资质,这些材料必不可少

在郑州申请大气污染防治乙级资质时&#xff0c;以下材料是必不可少的&#xff1a; 一、企业基础资料&#xff1a; 企业法人营业执照副本&#xff1a;需清晰&#xff0c;且在有效期内[1][2]。企业章程&#xff1a;提交企业章程的扫描件或复印件&#xff0c;以展示企业的组织结构…

基于机器学习和深度学习的轴承故障诊断方法(Python)

在工业早期&#xff0c;设备故障诊断通常由专家通过观察设备运行中的变量参数并结合自身知识进行诊断。但相比传统的机理分析方法&#xff0c;数据驱动的智能设备故障诊断更能充分提取数据中隐含的故障征兆、因果逻辑等关系。智能设备故障诊断的优势表现在其对海量、多源、高维…

【Python】已完美解决:ERROR: Could not find a version that satisfies the requirement re

文章目录 一、问题背景二、可能出错的原因三、错误代码示例四、正确代码示例&#xff08;结合实战场景&#xff09;五、注意事项 已解决&#xff1a;“ERROR: Could not find a version that satisfies the requirement re”的问题 一、问题背景 在使用Python的pip包管理器安…

codegeex2-6b-int4 部署

codegeex2-6b-int4 模型文件 CodeGeeX2 仓库文件地址 CodeGeeX2 推理教程 conda create -n codegeex2 python3.10 -y conda activate codegeex2 pip install -r requirements.txt -i https://pypi.mirrors.u…

2024中国翻译行业发展报告

来源&#xff1a;中国翻译协会 近期历史回顾&#xff1a; 2024国内工商业储能市场研究报告.pdf 2023幸福企业白皮书.pdf 2024年欧亚地区移动经济报告.pdf 内容供应链变革 2023人工智能与首席营销官&#xff08;CMO&#xff09; AI科技对PC产业的影响.pdf 金融业数据应用发展报…

成都晨持绪:抖音电商新手怎么做可信

在如今这个信息爆炸的时代&#xff0c;抖音作为新兴的电商平台&#xff0c;为许多创业者和商家提供了展示和销售产品的新渠道。然而&#xff0c;对于刚入行的新手来说&#xff0c;如何在抖音上建立起一个可信的电商身份&#xff0c;却是一个值得深思的问题。 要确保所售卖的产品…

短剧分销市场动态:机遇挑战双重解读

一、引言 近年来&#xff0c;随着互联网的快速发展和智能手机的普及&#xff0c;短视频和短剧逐渐成为人们日常娱乐的重要组成部分。短剧以其短小精悍、情节紧凑的特点&#xff0c;吸引了大量观众的关注和喜爱。而短剧分销市场则应运而生&#xff0c;为内容创作者和平台方提供了…

[数据集][目标检测]减速带检测数据集VOC+YOLO格式5400张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;5400 标注数量(xml文件个数)&#xff1a;5400 标注数量(txt文件个数)&#xff1a;5400 标注…

Linux 中 “ 磁盘、进程和内存 ” 的管理

在linux虚拟机中也有磁盘、进程、内存的存在。第一步了解一下磁盘 一、磁盘管理 &#xff08;1.1&#xff09;磁盘了解 track&#xff08; 磁道 &#xff09; &#xff1a;就是磁盘上的同心圆&#xff0c;从外向里&#xff0c;依次排序1号&#xff0c;2号磁盘........等等。…

ZnO电阻片在低电场区域的泄漏电流及其电阻的负温度系数

在低电场区域,流过ZnO非线性电阻的泄漏电流小于1mA.泄漏电流不仅与施加的电压幅值有关,而且与温度高低有关。图2.6表示温度对泄漏电流的影响,温度越高,电子在电场作用下定向的运动就越激烈,导致泄漏电流增大。因此温度升高将导致电阳值下降,即ZnO 电阻呈现负温度特性。 一般以…

Siemens-NXUG二次开发-创建平面(无界非关联)、固定基准面[Python UF][20240614]

Siemens-NXUG二次开发-创建平面&#xff08;无界非关联&#xff09;、固定基准面[Python UF][20240614] 1.python uf函数1.1 NXOpen.UF.Modeling.CreatePlane1.2 NXOpen.UF.ModlFeatures.CreateFixedDplane 2.示例代码2.1 pyuf_plane.py 3.运行结果3.1 内部模式3.1.1 NXOpen.UF…

期末复习5---PTA

以下是提交正确的代码&#xff1a; int max_len( char *s[], int n ) {int i;int max0;for(i1;i<n;i){if(strlen(s[i])>strlen(s[max]))maxi;}return strlen(s[max]); } 以下是我自己写的代码&#xff1a; 出现的问题是 &#xff1a;括号加的不对&#xff0c;需要细心…

湖仓一体全面开启实时化时代

摘要&#xff1a;本文整理自阿里云开源大数据平台负责人王峰&#xff08;莫问&#xff09;老师在5月16日 Streaming Lakehouse Meetup Online 上的分享&#xff0c;主要介绍在新一代湖仓架构上如何进行实时化大数据分析。内容主要分为以下五个部分&#xff1a; Data Lake Dat…

YOLOv8可视化界面,web网页端检测

YOLOv8可视化界面&#xff0c;web网页端检测。支持图片检测&#xff0c;视频检测&#xff0c;摄像头检测等&#xff0c;支持检测、分割等多种任务&#xff0c;实时显示检测画面。支持自定义数据集&#xff0c;计数&#xff0c;……

【教程】从0开始搭建大语言模型:构造GPT模型

从0开始搭建大语言模型&#xff1a;构造GPT模型 从0开始搭建大语言模型&#xff1a;构造GPT模型GPT模型Layer NormalizationGELU激活函数Feed Forward网络增强shortcut连接构造Transformer Block构造GPT模型使用GPT模型生成文本 从0开始搭建大语言模型&#xff1a;构造GPT模型 …

第104天: 权限提升-Linux 系统环境变量定时任务权限配置不当MDUT 自动化

目录 案例一&#xff1a;Linux-环境变量文件配合 SUID-本地 案例二&#xff1a;Linux-定时任务打包配合 SUID-本地 案例三&#xff1a;Linux-定时任务文件权限配置不当-WEB&本地 案例四&#xff1a;Linux-第三方软件 MYSQL 数据库提权-WEB&本地 隧道出网 手工提权…