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

news2024/9/22 21:32:03

文章目录

  • 1、ReLU 函数(隐藏层中是一个常用的默认选择)
    • 1.1 优点
    • 1.2 缺点
  • 2、sigmoid 函数
    • 2.1 优点
    • 2.2 缺点
  • 3、Tanh 函数
    • 3.1 优点
    • 3.2 缺点
  • 4、softmax 函数(多分类任务最后一层都会使用)
  • 5、Leaky ReLU 函数
    • 5.1 优点
    • 5.2 缺点
  • 6、PReLU 函数
  • 7、ELU 函数
  • 搭建神经网络,应该如何选择激活函数?
  • 总结

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.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()

生成图像如下:

在这里插入图片描述

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()

生成图像如下:
在这里插入图片描述
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()

生成图像如下:

在这里插入图片描述

5、Leaky ReLU 函数

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

代码:

import numpy as np
import matplotlib.pyplot as plt

# 定义 Leaky ReLU 函数
def leaky_relu(x, alpha=0.01):
    return np.maximum(alpha * x, x)

# 生成一些输入值
x_values = np.linspace(-5, 5, 200)

# 计算对应的 Leaky ReLU 输出值
y_values = leaky_relu(x_values)

# 绘制 Leaky ReLU 函数的图像
plt.plot(x_values, y_values, label='Leaky ReLU Function')
plt.title('Leaky 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()

生成图像如下:
在这里插入图片描述

5.1 优点

  • Leaky ReLU 在负数输入上有一个小的斜率,可以避免神经元“死亡”问题。

5.2 缺点

  • 尽管 Leaky ReLU 解决了某些问题,但并非总是最佳选择。在某些情况下,其他激活函数,如 Parametric ReLU 或者 Exponential Linear Unit (ELU),可能表现更好。

6、PReLU 函数

参数整流线性单元(Parametric Rectified linear unit,PReLU),用来解决 ReLU 带来的神经元坏死的问题。公式如下:
在这里插入图片描述
其中,其中 α 不是固定的超参数,通常初始化为一个小的正数,通过反向传播学习。它在输入小于零时允许一个小的斜率,而不是将其置零。
代码:

import numpy as np
import matplotlib.pyplot as plt

# 定义 PReLU 函数
def prelu(x, alpha=0.01):
    return np.where(x > 0, x, alpha * x)

# 生成一些输入值
x_values = np.linspace(-5, 5, 200)

# 计算 PReLU 函数的输出值
y_values = prelu(x_values)

# 绘制 PReLU 函数的图像
plt.plot(x_values, y_values, label='PReLU Function')
plt.title('PReLU 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()

生成图像如下:
在这里插入图片描述

区别:Leaky ReLU 和 PReLU 在解决激活函数中的问题(如死亡神经元)上有一些相似之处,但 PReLU 提供了更多的灵活性。

7、ELU 函数

指数线性单元(ELU):具有 ReLU 的优势,没有 Dead ReLU 问题,输出均值接近0,实际上 PReLU 和 Leaky ReLU 都有这一优点。有负数饱和区域,从而对噪声有一些鲁棒性。可以看做是介于 ReLU 和 Leaky ReLU 之间的一个函数。当然,这个函数也需要计算 exp,从而计算量上更大一些。公式如下:
在这里插入图片描述

代码:

import numpy as np
import matplotlib.pyplot as plt

# 定义 ELU 函数
def elu(x, alpha=1.0):
    return np.where(x > 0, x, alpha * (np.exp(x) - 1))

# 生成一些输入值
x_values = np.linspace(-5, 5, 200)

# 计算 ELU 函数的输出值
y_values = elu(x_values)

# 绘制 ELU 函数的图像
plt.plot(x_values, y_values, label='ELU Function')
plt.title('ELU 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()

生成图像如下:
在这里插入图片描述

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

  • 如果搭建的神经网络的层数不多,优先考虑 sigmoid、tanh、relu 函数,这些都是可以的,如果搭建的网络层数较多,选择不当会造成梯度消失的问题,此时一般不宜选择sigmoid、tanh激活函数,最好选择 relu 激活函数。
  • 在二分类问题中,网络的最后一层适合使用sigmoid激活函数;而多分类任务中,网络的最后一层使用softmax激活函数。

总结

ReLU(Rectified Linear Unit):
优势: 计算简单,且在许多情况下表现良好。它将负数部分置为零,有助于网络稀疏性,有利于反向传播。
注意事项: 对于一些极端情况,可能存在“死神经元”问题,即某些神经元在训练过程中永远不会被激活,导致无法更新权重。

Sigmoid 函数:
优势: 将输出限制在 (0, 1) 范围内,适用于二元分类问题。
注意事项: 容易发生梯度消失的问题,尤其是在深层网络中,导致梯度较小的权重无法有效地更新。

Tanh 函数:
优势: 类似于 Sigmoid,但输出范围在 (-1, 1)。对于中心化的数据,Tanh 可能更适合。
注意事项: 仍然存在梯度消失的问题。

Softmax 函数:
优势: 用于多类别分类问题,将输出转化为概率分布。
注意事项: 对于二元分类问题,通常使用 Sigmoid 而不是 Softmax。

Leaky ReLU:
优势: 在 ReLU 的基础上解决了死神经元问题,允许小于零的斜率。
注意事项: 仍然可能存在一些负数输出。

Parametric ReLU (PReLU):
优势: 允许负数部分有可学习的参数。
注意事项: 需要更多的计算资源。

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

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

相关文章

KDE 项目发布了 KDE Gear 23.08.3

导读KDE 项目发布了 KDE Gear 23.08.3,作为最新的 KDE Gear 23.08 开源集合的第三次维护更新,该集合包含了用于 KDE Plasma 桌面环境和其他平台的 KDE 应用程序。 KDE Gear 23.08.3 是在 KDE Gear 23.08.2 大约一个月之后发布的,包含了更多对…

Maven中常用命令以及idea中使用maven指南

文章目录 Maven 常用命令compiletestcleanpackageinstallMaven 指令的生命周期maven 的概念模型 idea 开发maven 项目idea 的maven 配置idea 中创建一个maven 的web 工程在pom.xml 文件添加坐标坐标的来源方式依赖范围编写servlet maven 工程运行调试 Maven 常用命令 compile …

阿里云高效计划学生和老师免费代金券申请认证方法

阿里云高校计划学生和教师均可参与,完成学生认证和教师验证后学生可以免费领取300元无门槛代金券和3折优惠折扣,适用于云服务器等全量公共云产品,订单原价金额封顶5000元/年,阿里云百科aliyunbaike.com分享阿里云高校计划入口及学…

掌握技术访谈:CNN、Seq2Seq、Faster R-CNN 和 PPO — 揭开卓越编码和创新之路

一、说明 本文 揭开CNN、Seq2Seq、Faster R-CNN 和 PPO — 编码和创新之路。对于此类编程的短小示例,用于开发时临时参考。 二、数据准备 问题陈述:在本次挑战中,您将深入计算机视觉世界并使用卷积神经网络 (CNN) 解决图像分类任务。您将使用…

Figma最全面的新手指南,从基础到高级,一网打尽

1 Figma界面介绍 Figma基础界面与传统设计软件没有太大区别,有Sketch使用经验的用户几乎可以无缝连接到Figma。 立即体验 免费的在线Figma汉化版即时设计是一款支持在线协作的专业级 UI 设计工具,支持 Sketch、Figma、XD 格式导入,海量优质设…

4.2V升多串LED驱动升压6V9V12V恒流点灯

4.2V升多串LED驱动升压6V9V12V恒流点灯 探索WT7012,这款引领潮流的升压转换器,其强大功能将彻底改变您的LED驱动格局。可以轻松驾驭多达7串白光LED,展现出无与伦比的驱动能力。 无论是单节锂电池还是多节锂电池供电产品,宽电压3…

Centos8上部署MySQL主从备份

虚拟机环境如下: Node1192.168.1.110Centos8 Node2192.168.1.111Centos8 1.在Node1和Node2上安装数据库; yum install -y mysql* 2.关闭防火墙服务,关闭开启自启; systemctl stop firewalld systemctl disable firewall…

人工智能中的文本分类:技术突破与实战指导

在本文中,我们全面探讨了文本分类技术的发展历程、基本原理、关键技术、深度学习的应用,以及从RNN到Transformer的技术演进。文章详细介绍了各种模型的原理和实战应用,旨在提供对文本分类技术深入理解的全面视角。 关注TechLead,分…

使用内网穿透工具实现远程访问本地部署的Odoo企业管理系统

文章目录 前言1. 下载安装Odoo:2. 实现公网访问Odoo本地系统:3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件,是一个一站式全功能ERP及电商平台。 开源性质:Odoo是一个开源的ERP软件,这意味着企…

【高性能计算】CUDA,OpenCL,FPGA 加速,MPI

OpenCL OpenCL(Open Computing Language)是一种跨平台的GPU加速技术,由Khronos Group开发。OpenCL允许开发人员在不同的硬件平台上编写并行计算应用程序。 OpenCL使用C语言的子集来编写应用程序,并提供了一组API,可以…

一文带你快速了解Python史上最快Web框架

文章目录 1. 写在前面2. Sanic框架简介2.1 背景2.2 特征与优势 3. Sanic框架实战3.1. 安装Sanic3.2. Demo案例编写 【作者主页】:吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&a…

C#中的var究竟是强类型还是弱类型?

前言 在C#中,var关键字是用来声明变量类型的,它是C# 3.0推出的新特征,它允许编译器根据初始化表达式推断变量类型,有点跟javascript类似,而javascript中的var是弱类型。它让C#变量声明更加简洁,但也导致了…

2023年中国合成云母行业现状及市场格局分析[图]

合成云母是一种通过化工原料经高温熔融冷却析晶而制得的单斜晶系矿物,属于典型的层状硅酸盐,许多性能都优于天然云母,如合成云母的耐温高达1200℃以上,而天然白云母在550℃下就会开始分解,金云母则在800℃开始分解。除…

SpringBoot Admin

前言 Spring Boot Admin 是一个管理和监控 Spring Boot 应用程序的开源项目,它提供了一个简洁的 Web 界面来监控 Spring Boot 应用程序的状态和各种运行时指标。Spring Boot Admin 可以帮助开发者快速了解应用程序的状态,并快速定位错误或性能问题。下面…

kettle spoon连接MySQL8.0数据库报错解决方法

kettle 连接 mysql 8.0报错,显示无法连接到数据库服务 错误连接数据库 [11] : org.pentaho.di.core.exception.KettleDatabaseException: Error occurred while trying to connect to the databaseError connecting to database: (using class org.gjt.mm.mysql.D…

vue实现聊天栏定位到最底部(超简单、可直接复制使用)

原理 通过watch监听聊天内容的加载,一旦加载完成或者数据更新触发vue的数据监听时,就重新修改【滚动滑钮到滚动条顶部的距离滚动条的高度】,从而实现定位到底部的效果。 实现 1、布局 新建一个div(聊天框,如下&…

Mysql 8.0主从复制模式安装(兼容Mysql 5.7)

Mysql V8.0.35安装 官网地址:MySQL :: Download MySQL Community Server 下载【Mysql 8.0.35】压缩包 解压压缩包,仅保留6个安装文件即可 mysql-community-client-8.0.31-1.el7.x86_64.rpm mysql-community-client-plugins-8.0.31-1.el7.x86_64.rpm my…

对中国控制会议论文模板的拙略模仿

由于控制会议的latex模板年久失修,不适用于Texlive,因此我自己做了一个模板,这个Latex模板修改自自动化学报的模板,尽可能还原控制会议的模板要求,但是有些部分因为时间原因未完全还原,使用者可以根据自身需…

python网络通信之基础知识填坑

文章目录 版权声明网络通信要素IP地址ifconfig和ping命令ifconfig (Interface Configuration)ping 端口和端口号的介绍端口号的分类socket介绍TCPTCP简介TCP的特点 UDPUDP简介UDP特点 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明&#…

不是说人工智能是风口吗,那为什么工作还那么难找?

最近确实有很多媒体、机构渲染人工智能可以拿高薪,这在行业内也是事实,但前提是你有足够的竞争力,真的懂人工智能。 首先,人工智能岗位技能要求高,人工智能是一个涵盖了多个学科领域的综合性学科,包括数学、…