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

news2024/11/16 7:36:58

文章目录

  • 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/1243061.html

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

相关文章

【JavaEE初阶】 JavaScript相应的WebAPI

文章目录 🌲WebAPI 背景知识🚩什么是 WebAPI🚩什么是 API 🎍DOM 基本概念🚩什么是 DOM🚩DOM 树 🍀获取元素🚩querySelector🚩querySelectorAll 🎄事件初识&am…

WordPress用sql命令批量删除所有文章

有时我们需要将一个网站搬迁到另一个服务器。我们只想保留网站的模板样式,而不需要文章内容。一般情况下我们可以在后台删除已发表的文章,但如果有很多文章,我们则需要一次删除所有文章。 WordPress如何批量删除所有文章 进入网站空间后台&a…

chrome F12 performance 性能分析

本文主要是介绍chrome F12 performance 性能分析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧! 页面加载速度慢,到底是多少秒,瓶颈在哪里? 前端性能工具Chrome performance…

学生心目中的好老师

在教育的世界里,一个好老师可以改变一个学生的人生轨迹。他们不仅传授知识,更是引导学生发现自己的潜力,激发他们对未来的憧憬。那么,如何成为一名学生心目中的好老师呢? 拥有一颗热爱教育的心。深深的热爱着教育事业&…

TikTok美区本土店铺如何做好IP隔离?

为什么要进行IP隔离呢?因为我们无法在国内直接运营Shopee、TikTok、Lazada等平台的本土店,平台识别出店铺登录IP非本土IP,则容易导致店铺风控、被标记为伪本土店,影响店铺经营。 TikTok美区店铺的IP隔离方法和Shopee本土店一致&a…

数字人源码部署一定要找数字人源头工厂公司

今年入局数字人产业的公司都已经赚的盆满钵满,有很多播主还在叫嚣着数字人没用没用。可谓眼光短浅,典型的吃不到葡萄说葡萄说。没用的话,国内所有的互联网巨头为什么都在跑步进场呢。今天我们要讲的是数字人二级市场的产业,所谓二级市场就是中…

SWOT是什么意思?SWOT分析必备的10款软件,别说你还不知道!

在今天快速变化的商业环境中,保持竞争优势并做出明智的决策至关重要。无论你是经验丰富的高管、企业家还是专注的团队领导者,战略思维都是必不可少的。在这个过程中的一个重要工具是SWOT分析软件。 正确的SWOT分析工具可以决定商业战略是否能够创造有意…

Vue3-provide和inject

作用和场景:顶层组件向任意的底层组件传递数据和方法,实现跨层组件通信 跨层传递普通数据: 1.顶层组件通过provide函数提供数据 2.底层组件通过inject函数获取数据 既可以传递普通数据,也可以使用ref传递响应式数据&#xff08…

Docker Swarm总结+service创建和部署、overlay网络以及Raft算法(2/3)

博主介绍:Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 🍅文末获取源码下载地址🍅 👇🏻 精彩专栏推荐订阅👇🏻…

Postman接口测试工具完整教程

前言 作为软件开发过程中一个非常重要的环节,软件测试越来越成为软件开发商和用户关注的焦点。完善的测试是软件质量的保证,因此软件测试就成了一项重要而艰巨的工作。要做好这项工作当然也绝非易事。 第一部分:基础篇 postman:4.5.1 1.安…

某基金公司赵哥“逆袭”了!!!

赵哥,在上海一家基金公司做运维主管。 平时工作的首要任务,就是保障公司各项信息系统的安全运行。 万一系统运行中出现了一些重要问题,他还要负责进行调查、记录与汇报... 总之,责任很重,该说不说,搞不好…

虚拟机系列:windows 虚拟机相关功能、组件梳理

一. 简介 英文名称中文名称说明Container容器Guarded Host受保护的主机利用远程证明创建并运行受防护的虚拟机Hyper-V├Hyper-V Management ToolsHyper-V 管理工具包含 GUI 管理工具和 Power Shell 的 Hyper-V 模块└Hyper-V PlatformHyper-V 平台├Hyper-V HypervisorHyper-V …

[C++ 从入门到精通] 13.派生类、调用顺序、继承方式、函数遮蔽

📢博客主页:https://loewen.blog.csdn.net📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉📢现…

程序员进阶高管指南,看懂工资最少加5k

从象牙塔毕业跨入社会大染缸,很多人都跟我谈过他们的职业困惑,其中有一些刚刚毕业,有些人已经工作超过10年。基本上是围绕着怎样持续提升,怎样晋升为高级管理者。那么这篇文章,我就来谈一谈程序员到高管的跃升之路。 …

XC3320 离线式、无电感交流输入线性稳压器 可替代KP3310 固定5V输出电压

XC3320 是一款紧凑型无电感设计的离线式线性稳压器。XC3320 可获得 5V输出电压。XC3320 是一种简单可靠的获得偏置供电的离线式电源解决方案。XC3320 集成了 650V 功率 MOSFET,启动控制电路,VDD 电压控制电路,AC 交流信号同步检测电路,低压差稳压器等。该…

vue3实现验证码校验的功能

📓最近想实现使用vue3实现一个简易的前端验证码校验的功能,就花了点时间实现了,这只是一个简易版的,但是用在项目中是没有啥问题的,废话不多说,先来看下最终实现的效果。 📓现在让我们来一步一步…

micro_ros

原文链接Supported Hardware | micro-ROS Supported Hardware The main targets of micro-ROS are mid-range 32-bits microcontroller families. Usually, the minimum requirements for running micro-ROS in an embedded platform are memory constraints. Since memory u…

【Spring集成MyBatis】MyBatis的Dao层实现(基于配置,非注解开发)

文章目录 1. MyBatis的dao层实现(传统方式)——需要写接口及其实现类2. MyBatis的代理开发方式——仅需写接口 1. MyBatis的dao层实现(传统方式)——需要写接口及其实现类 传统方式就是在项目下边建立dao包,里面包含接口及其实现类,文件结构如下&#x…

【Spring Cloud实战】分布式系统控制与组件应用

在现代软件开发中,分布式系统已经成为一种常见的架构模式,被广泛应用于各种规模的企业和组织中。这种架构模式通过将应用程序拆分为独立的组件,并分布在不同的计算机节点上运行,使得系统能够应对高负载和大规模的数据处理需求&…

FPGA自学教程 03 设计一个以1秒频率闪烁的LED灯

双非硕士 研一下学期视觉转FPGA(在b站跟小梅哥视频) 长路漫漫,但希望前途光明 此篇文章开始省去建工程的操作,如果有不懂的同学可以看我之前的两篇文章。 1.新建文件名为:led_flash,等待右侧弹出Verilog代…