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

文章目录

  • 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):
优势: 允许负数部分有可学习的参数。
注意事项: 需要更多的计算资源。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023.11.22 -数据仓库的概念和发展

目录 https://blog.csdn.net/m0_49956154/article/details/134320307?spm1001.2014.3001.5501 1经典传统数仓架构 2离线大数据数仓架构 3数据仓库三层 数据运营层,源数据层(ODS)(Operational Data Store) 数据仓库层&#…

【深度学习】不用Conda在PP飞桨Al Studio三个步骤安装永久PyTorch环境

在 PaddlePaddle AI Studio 中使用 Python 虚拟环境安装 PyTorch 免责声明 在阅读和实践本文提供的内容之前,请注意以下免责声明: 侵权问题: 本文提供的信息仅供学习参考,不用做任何商业用途,如造成侵权,请私信我&am…

基于SSM的济南旅游网站设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

数字逻辑电路基础-时序逻辑电路之锁存器

文章目录 一、锁存器简介二、verilog源码三、综合及仿真结果 一、锁存器简介 本文介绍数字逻辑电路中一种常用的基础时序逻辑电路-锁存,顾名思义,它的功能就是将输入在控制信号有效时透明传输到输出端,当控制信号无效时,输出值保…

微信小程序蓝牙连接 uniApp蓝牙连接设备

蓝牙列表期待效果 代码 <template><view class"bluetooth-list"><view class"align-items option" style"justify-content: space-between;" v-for"item in bluetoothList" :key"item.deviceId"><vie…

万字解析设计模式之组合模式、亨元模式

一、组合模式 1.1概述 组合模式是一种结构型设计模式&#xff0c;它允许将对象组合成树形结构&#xff0c;以表示“部分-整体”的层次结构。组合模式使得客户端可以一致地对待单个对象和对象组合&#xff0c;从而将复杂的层次结构展现为一个统一的树形结构。 在组合模式中&…

Audition 2024 24.0.0.46(音频剪辑)

Audition 2024是一款非常棒的音频编辑和混合软件&#xff0c;提供了广泛的工具和功能&#xff0c;用于创建、编辑、混合和设计音效。这款软件旨在加速音频和视频制作工作流程&#xff0c;提供具有原始音效的高质量混音。其界面构成清晰&#xff0c;操作简便&#xff0c;适合专业…

【python】python旅游网数据抓取分析(源码+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

开发上门送桶装水小程序要考虑哪些业务场景

上门送水业务已经有很长一段时间了&#xff0c;但是最开始都是给用户发名片、贴小广告&#xff0c;然后客户电话订水&#xff0c;水站工作人员再上门去送&#xff0c;这种人工记单和派单效率并不高&#xff0c;并且电话沟通中也比较容易出现偏差&#xff0c;那么根据这个情况就…

【Docker】从零开始:6.配置镜像加速器

【Docker】从零开始&#xff1a;5.配置镜像加速器 什么是镜像加速器&#xff1f;为什么要配置docker镜像加速器?常见的Docker镜像加速器有哪些&#xff1f;如何申请Docker镜像加速器如何配置Docker镜像加速器 什么是镜像加速器&#xff1f; 镜像加速器是一个位于Docker Hub之…

UDP中connect的作用

udpclientNoConnect.c里边的内容如下&#xff1a; #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<arpa/inet.h> #include<sys/socket.h> #include <errno.h> #include <syslog.h…

七、通过libfdk_aac编解码器实现aac音频和pcm的编解码

前言 测试环境&#xff1a; ffmpeg的4.3.2自行编译版本windows环境qt5.12 AAC编码是MP3格式的后继产品&#xff0c;通常在相同的比特率下可以获得比MP3更高的声音质量&#xff0c;是iPhone、iPod、iPad、iTunes的标准音频格式。 AAC相较于MP3的改进包含&#xff1a; 更多的采…

在AWS VPC中运行Nagios检查时指定自定义DNS解析器的选项

在AWS VPC中运行Nagios检查&#xff0c;并希望能够指定自定义DNS解析器来处理请求。我想使用Python requests库来实现这个目标。 根据问题描述&#xff0c;您想在AWS VPC中运行Nagios检查&#xff0c;并希望使用Python的requests库来指定自定义DNS解析器。 要解决这个问题&…

[开源]Web端的P2P文件传输工具,简单安全高效的P2P文件传输服务

一、开源项目简介 小鹿快传 - 在线P2P文件传输工具 小鹿快传是一款Web端的P2P文件传输工具&#xff0c;使用了WebRTC技术实现P2P连接和文件传输。 二、开源协议 使用MIT开源协议 三、界面展示 产品截图 四、功能概述 简单安全高效的P2P文件传输服务 小鹿快传是一款Web端…

php文件上传例子

目录结构&#xff1a; index.html代码&#xff1a; <!DOCTYPE html> <html><head><title>文件上传</title><meta charset"utf-8"></head><body><form action"./up.php" method"post" encty…

python趣味编程-5分钟实现一个太空大战游戏(含源码、步骤讲解)

飞机战争游戏系统项目是使用Python编程语言开发的,是一个简单的桌面应用程序。 Python 中的飞机战争游戏使用pygame导入和随机导入。 Pygame 是一组跨平台的 Python 模块,专为编写视频游戏而设计。它包括设计用于 Python 编程语言的计算机图形和声音库。

Django(九、cookie与session)

文章目录 一、cookie与session的介绍HTTP四大特性 cookiesession Django操作cookie三板斧基于cookie的登录功能 一、cookie与session的介绍 在讲之前我们先来回忆一下HTTP的四大特性 HTTP四大特性 1.基于请求响应 2.基于TIC、IP作用于应用层上的协议 3.无状态 保存…

Navmesh 寻路

用cocos2dx引擎简单实现了一下navmesh的多边形划分&#xff0c;然后基于划分多边形的a*寻路。以及路径拐点优化算法 用cocos主要是方便使用一些渲染接口和定时器。重点是实现的原理。 首先画了一个带有孔洞的多边形 //多边形的顶点数据Vec2(100, 100),Vec2(300, 200),Vec2(50…

P4 C++ 条件与分支(if)

前言 今天我们来看看条件语句&#xff0c;换句话说&#xff0c;也就是 if 语句、if else 和 else if 等等这写语句。 我知道大家基本上已经非常了解 if 语句和所有 C 中的分支语句&#xff0c;但我还是鼓励你们继续看完这一讲&#xff0c;这里可能包含一些新东西。我们还会深入…

【精选】Ajax技术知识点合集

Ajax技术详解 Ajax简介 Ajax 即“Asynchronous Javascript And XML”&#xff08;异步 JavaScript 和 XML&#xff09;&#xff0c;是指一种创建 交互式、快速动态应用的网页开发技术&#xff0c;无需重新加载整个网页的情况下&#xff0c;能够更新页面局 部数据的技术。通过在…