神经网络常用激活函数详解

🎀个人主页: https://zhangxiaoshu.blog.csdn.net
📢欢迎大家:关注🔍+点赞👍+评论📝+收藏⭐️,如有错误敬请指正!
💕未来很长,值得我们全力奔赴更美好的生活!

前言

神经网络的激活函数是在每个神经元的输出上应用的非线性函数。激活函数的引入是为了给神经网络引入非线性特性,从而增强网络的表达能力,使其能够学习和表示更为复杂的关系。这篇文章主要介绍一些常见的神经网络激活函数,包括sigmoid、tanh、ReLU、Leoky ReLU、ReLU6和Softmax。


文章目录

  • 前言
  • 一 、sigmoid
    • 1.表达式及其图像:
    • 2. Sigmoid激活函数的优缺点:
    • 3. 使用场景:
    • 4. PyTorch代码:
  • 二、tanh
    • 1. 表达式以及图像:
    • 2. Tanh激活函数的优缺点:
    • 3. 使用场景:
    • 4. PyTorch代码:
  • 三、ReLU
    • 1.表达式及其图像:
    • 2. ReLU激活函数的优缺点:
    • 3. 使用场景:
    • 4. PyTorch代码:
  • 四、Leoky ReLU
    • 1.表达式及其图像:
    • 2. Leoky ReLU激活函数的优缺点:
    • 3. 使用场景:
    • 4. PyTorch代码:
  • 五、ReLU6
    • 1.表达式及其图像:
    • 2. ReLU6激活函数的优缺点:
    • 3. 使用场景:
    • 4. PyTorch代码:
  • 六、Softmax
    • 1.表达式及其图像:
    • 2. Softmax激活函数的优缺点:
    • 3. 使用场景:
    • 4. PyTorch代码:
  • 总结


一 、sigmoid

1.表达式及其图像:

Sigmoid激活函数是一种常用的非线性激活函数,通常用于神经网络的输出层,特别是在二分类问题中。其主要特点是将输入值映射到一个在 (0, 1) 范围内的输出,其数学表达式为:
σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1}{1+e^{-x}} σ(x)=1+ex1

其中, e e e 是自然对数的底。函数的图像呈 S 形曲线,中心点在 x = 0 x=0 x=0 处,输出值在 x x x接近正无穷和负无穷时分别趋近于 1 和 0。

图像如下所示:
在这里插入图片描述

2. Sigmoid激活函数的优缺点:

优点:

  • 输出范围在 (0, 1): Sigmoid函数的输出范围在 (0, 1) 之间,可以被解释为概率值,特别适用于二分类问题,如判断一个样本属于某一类的概率。
  • 平滑性: Sigmoid函数是光滑的、可导的函数,这在梯度下降等优化算法中很有用。

缺点:

  • 梯度消失问题:Sigmoid函数在输入非常大或非常小的情况下,导数接近于零,可能导致梯度消失问题。在深度网络中,这可能影响训练的稳定性和速度。
  • 输出非零均值: Sigmoid的输出均值接近于 0.5,这会导致下一层神经元得到的输入主要是正值,可能影响权重的更新效率。
  • 计算复杂度:Sigmoid函数的计算涉及到指数运算,相对于一些计算简单的激活函数(如ReLU),计算复杂度较高。

3. 使用场景:

  • 二分类问题: Sigmoid通常用于二分类问题的输出层,输出可以解释为样本属于某一类别的概率。

  • 概率表示: 当需要将神经网络的输出解释为概率值时,Sigmoid是一个合适的选择。

  • 输出范围限制: 在需要将输出限制在 (0, 1) 范围内的情况下,如图像生成等任务,Sigmoid可以确保输出在指定范围内。

尽管Sigmoid在过去被广泛使用,但由于其存在的梯度消失问题和其他缺点,近年来在深度学习中,一些其他激活函数如ReLU及其变体更受青睐。选择激活函数通常取决于具体的任务和网络结构。

4. PyTorch代码:

import torch
import torch.nn.functional as Fx = torch.randn(5, 5)
sigmoid_output = torch.sigmoid(x)

二、tanh

1. 表达式以及图像:

Tanh(双曲正切)激活函数是一种常用的非线性激活函数,其输出范围在 (-1, 1) 之间。其数学表达式为:

t a n h ( x ) = e x − e − x e x + e − x tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}} tanh(x)=ex+exexex

Tanh函数在形状上类似于Sigmoid函数,但其输出范围更广,从 -1 到 1,均值接近于 0。与Sigmoid相比,Tanh对输入的响应更强烈,可以更好地处理具有负值的输入。

图像如下所示:
在这里插入图片描述

2. Tanh激活函数的优缺点:

优点:

  • 归一化输出: Tanh的输出范围在(-1, 1)之间,相比于Sigmoid的(0, 1),输出更接近于零均值,有助于减小梯度消失问题,提高模型的训练稳定性。

  • 激活强度较大: Tanh对输入的响应相对更强烈,这有助于模型学习更复杂的特征和表示,使其在某些任务上比Sigmoid更有效。

  • 零中心化: Tanh的输出均值接近零,有助于减小下一层神经元接收到的输入的均值,有助于提高网络的拟合能力。

缺点:

  • 梯度消失问题: 虽然相对于Sigmoid,Tanh缓解了梯度消失问题,但仍然可能在深度网络中存在。对于极端值的输入,Tanh函数的导数仍然会趋近于零。

  • 计算复杂度: Tanh函数的计算同样涉及到指数运算,相对于一些计算简单的激活函数(如ReLU)而言,计算复杂度较高。

3. 使用场景:

  • 中间层的激活函数: Tanh通常在神经网络的中间层中使用,特别是在循环神经网络(RNN)等结构中,有助于处理具有正负值的输入。

  • 具有零均值要求的场景: 当输入数据有零均值要求时,Tanh激活函数可能更适用,因为它的输出均值接近零。

  • 二分类问题: 在二分类问题中,Tanh可以用作输出层的激活函数,尤其是当输出需要在 (-1, 1) 范围内表示时。

总体而言,Tanh激活函数在某些场景下可以取代Sigmoid,并且相对于Sigmoid来说,具有更广的输出范围和更强的响应能力。然而,使用时需要注意梯度消失问题以及计算复杂度。在深度学习中,ReLU及其变体目前是更为常见的选择之一。

4. PyTorch代码:

import torch
import torch.nn.functional as Fx = torch.randn(5, 5)
tanh_output = torch.tanh(x)

三、ReLU

1.表达式及其图像:

ReLU(Rectified Linear Unit)是一种常用的非线性激活函数,其数学表达式为:
f ( x ) = m a x ( 0 , x ) f(x)=max(0,x) f(x)=max(0,x)
即,对于输入 x x x,如果 x x x 大于零,输出为 x x x;否则,输出为零。ReLU函数是一个简单而有效的激活函数,它在神经网络中被广泛使用。其特点是在正值区域上保持线性增长,同时在负值区域上输出为零。

图像如下所示:
在这里插入图片描述

2. ReLU激活函数的优缺点:

优点:

  • 计算简单: ReLU函数的计算非常简单,只需要一个阈值比较和取最大值的操作,相比于Sigmoid和tanh等函数的指数运算,计算速度更快。

  • 稀疏激活性: ReLU激活函数在正值区域上保持线性增长,有助于网络的稀疏激活性,即只有少数神经元被激活,使网络更加稀疏。

  • 解决梯度消失问题: 相比于Sigmoid和tanh等激活函数,ReLU在正值区域上没有梯度饱和问题,可以缓解梯度消失问题,有助于训练深度网络。

缺点:

  • 死亡神经元问题: 在训练过程中,某些神经元可能永远不会被激活,称为“死亡神经元”问题。如果某个神经元在训练过程中对于所有样本都是负的,那么该神经元的权重将永远不会被更新。

  • 不适合所有情况: 对于一些数据分布特殊的任务,ReLU可能表现不佳。例如,在处理负值较多的数据时,可能导致大量神经元死亡。

3. 使用场景:

  • 深度神经网络: ReLU在深度神经网络中广泛应用,特别是在卷积神经网络(CNN)和循环神经网络(RNN)等结构中,因为它有助于解决梯度消失问题。

  • 计算资源受限的环境: 由于ReLU的计算简单,适用于资源受限的环境,例如移动设备、嵌入式系统等。

  • 稀疏激活性要求: 当稀疏激活性是一个设计考虑因素时,ReLU是一个合适的选择,因为它更容易使网络保持稀疏性。

总体而言,ReLU是深度学习中常用的激活函数之一,尤其在解决梯度消失问题和提高计算效率方面表现优越。然而,需要注意一些可能出现的问题,如死亡神经元问题。在实际应用中,有时会采用ReLU的变体(如Leaky ReLU等)以缓解一些潜在问题。

4. PyTorch代码:

import torch
import torch.nn.functional as Fx = torch.randn(5, 5)
relu_output = F.relu(x)

四、Leoky ReLU

1.表达式及其图像:

Leaky ReLU是对标准ReLU激活函数的一种改进,旨在解决ReLU中可能出现的“死亡神经元”问题。Leaky ReLU允许在负值区域有一个小的斜率,而不是直接输出零。其数学表达式为:
f ( x ) = { x , if  x > 0 α x , if  x ≤ 0 f(x)=\left\{\begin{array}{ll} x, & \text { if } x>0 \\ \alpha x, & \text { if } x \leq 0 \end{array}\right. f(x)={x,αx, if x>0 if x0

其中, α \alpha α是一个小的正数,通常很小,比如 0.01。Leaky ReLU保留了负值区域,这有助于避免某些神经元在训练中变得“死亡”。

图像如下所示:

在这里插入图片描述

2. Leoky ReLU激活函数的优缺点:

优点:

  • 避免死亡神经元问题: Leaky ReLU允许在负值区域有一个小的斜率,这有助于保持负值区域的梯度,避免神经元在训练过程中变得“死亡”。

  • 简单计算: 与ReLU相比,Leaky ReLU的计算仍然相对简单,只需添加一个额外的斜率。

  • 稀疏激活性: Leaky ReLU保持了一定的稀疏激活性,即仍然有神经元保持非零输出。

缺点:

  • 不一定适用于所有情况: 尽管Leaky ReLU解决了死亡神经元问题,但它并不一定在所有任务中都表现得比标准ReLU更好。在某些数据分布下,Leaky ReLU可能仍然存在一些问题。

  • 选择斜率的问题: 选择 α \alpha α的值通常是一个超参数,需要进行调优。选择不当可能导致一些问题,过小的 α \alpha α可能无法解决死亡神经元问题,而过大的 α \alpha α可能导致Leaky ReLU失去ReLU的优势。

3. 使用场景:

  • 深度神经网络: Leaky ReLU在深度神经网络中被广泛应用,尤其是在解决死亡神经元问题方面。

  • 需要稀疏激活性: 当需要保持一定的稀疏激活性时,Leaky ReLU可以是一个合适的选择。

  • 不确定数据分布: 在处理不同数据分布的任务时,Leaky ReLU可能是一个更健壮的激活函数选择,相对于ReLU在某些情况下可能表现得更好。

总体而言,Leaky ReLU是对标准ReLU的一种改进,通过引入一个小的负斜率解决了死亡神经元问题。在实际应用中,可以根据具体任务和数据分布选择合适的激活函数。

4. PyTorch代码:

import torch
import torch.nn.functional as Fx = torch.randn(5, 5)
leaky_relu_output = F.leaky_relu(x, negative_slope=0.01)  # 可根据需求调整负斜率

五、ReLU6

1.表达式及其图像:

ReLU6(Rectified Linear Unit 6)是对ReLU的一种变体,它在正值区域上仍然保持线性增长,但在负值区域上截断,并将负值限制在零以下。其数学表达式为:

f ( x ) = m i n ( m a x ( 0 , x ) , 6 ) f(x)=min(max(0,x),6) f(x)=min(max(0,x),6)

即,对于输入 x x x,如果 x x x大于零,输出为 x x x;如果 x x x 小于等于零,输出为零;如果 x x x大于6,输出为6。ReLU6的主要特点是在负值区域上的截断,将负值限制在零以下,并且在正值区域上允许线性增长,最大值限制为6。

图像如下所示:

在这里插入图片描述

2. ReLU6激活函数的优缺点:

优点:

  • 抑制过大的激活值: 通过将激活值限制在6以下,ReLU6有助于抑制激活值的过大增长,使得网络的表示范围更受控制,尤其是在计算资源受限的环境中使用低精度的时候也能有很好的数值分辨率(低精度的Float 16 / INT 8无法很好地精确大范围的数值)

  • 计算简单: 类似于ReLU,ReLU6的计算仍然相对简单,只需要比较和取最小值和最大值的操作。

缺点:

  • 不适用于所有场景: ReLU6在一些任务和数据分布上可能表现不佳。对于一些特定的任务,可能有更适合的激活函数选择。

3. 使用场景:

  • 限制激活值范围: 当需要限制激活值的范围,避免过大的激活值对网络造成负面影响时,ReLU6可以作为一种选择。

  • 计算资源受限的环境: 由于ReLU6的计算仍然相对简单,适用于计算资源受限的环境,例如移动设备、嵌入式系统等。

  • 对输入范围有要求的任务: 当输入数据有特定的范围要求时,ReLU6可以用来限制输出在一个固定的范围内。

总体而言,ReLU6是对ReLU的一种变体,主要通过将激活值限制在6以下来抑制激活值的过大增长。在实际应用中,选择激活函数通常要根据具体的任务和网络结构进行调整。

4. PyTorch代码:

import torch
import torch.nn.functional as Fx = torch.randn(5, 5)
relu6_output = F.relu6(x)

六、Softmax

1.表达式及其图像:

Softmax激活函数是一种常用于多分类问题的激活函数。它接受一个实数向量作为输入,并将其转换成一个概率分布。Softmax函数的数学表达式为:

S o f t m a x ( z ) i = e z i ∑ j = 1 K e z j Softmax(z)_i=\frac{e^{z_{i} }}{ {\textstyle \sum_{j=1}^{K}} e^{z_{j} }} Softmax(z)i=j=1Kezjezi

其中, z z z是输入向量的元素, K K K是类别的总数。Softmax函数对输入向量进行指数运算,然后进行归一化,使得输出的各个元素表示对应类别的概率,且概率之和为1。

图像如下所示:

在这里插入图片描述

2. Softmax激活函数的优缺点:

优点:

  • 概率表示: Softmax将输入映射为概率分布,适用于多分类问题,输出的各个元素可以解释为对应类别的概率。

  • 可导性: Softmax是可导的,这使得在使用梯度下降等优化算法进行训练时更容易处理。

缺点:

  • 对输入敏感: Softmax对输入的敏感性较高,当输入中存在较大的值时,指数运算可能导致数值溢出(数值过大)或数值不稳定的问题。

  • 类别之间相关性: Softmax假设各个类别是独立的,可能无法很好地处理类别之间的相关性。

  • 标签不平衡: 在处理标签不平衡的情况下,Softmax可能导致模型更加关注样本较多的类别,而对样本较少的类别学习不足。

3. 使用场景:

  • 多分类问题: Softmax主要用于解决多分类问题,其中需要将输入映射为各个类别的概率分布。

  • 输出层激活函数: Softmax通常作为神经网络输出层的激活函数,特别适用于需要将网络输出解释为概率分布的场景。

  • 需要概率表示的任务: 当任务需要模型输出概率表示时,例如图像分类、语音识别等,Softmax是一个常用的选择。

总体而言,Softmax激活函数在多分类问题中表现出色,提供了一种将神经网络输出转换为概率分布的方式。然而,在一些特殊情况下,可能需要注意其对输入的敏感性以及类别之间的相关性问题。

4. PyTorch代码:

import torch
import torch.nn.functional as Fx = torch.randn(5, 5)
softmax_output = F.softmax(x, dim=1)

总结

在深度学习中,激活函数的选择对模型的性能和训练过程至关重要。以下是以上6种激活函数的简单总结及其使用建议:

Sigmoid激活函数:输出范围在 (0, 1),适用于二分类问题,但容易导致梯度消失问题。适用于二分类问题的输出层,不建议在隐藏层使用,可以考虑其他更有效的激活函数。
Tanh激活函数: 输出范围在 (-1, 1),零中心化,相对缓解了梯度消失问题。适用于隐藏层,特别是需要输出在 (-1, 1) 范围的任务。
ReLU激活函数:简单计算,解决了梯度消失问题,但可能导致死亡神经元问题。在隐藏层中广泛使用,特别适用于深度神经网络和计算资源受限的环境。
Leaky ReLU激活函数: 解决了死亡神经元问题,保持了稀疏激活性。用于隐藏层,尤其是在ReLU表现不佳时可以考虑使用,需要保持稀疏激活性的任务。
Softmax激活函数: 输出表示概率分布,适用于多分类问题。用于多分类问题的输出层,将网络输出映射为概率分布,例如图像分类、语音识别等。
ReLU6激活函数:对激活值进行限制,抑制过大的激活值。用于需要限制激活值范围的任务,例如计算资源受限的环境。

  • 隐藏层,通常首选ReLU及其变体,如Leaky ReLU,因为它们计算简单且在实践中表现良好。
  • 对于二分类问题,Sigmoid仍然是一个合适的选择,但要注意梯度消失问题。
  • 对于需要输出概率分布的多分类问题,Softmax是一个自然的选择。
  • 根据任务和实验结果,可以进行激活函数的调整和尝试,选择最适合特定情况的激活函数。

参考和图片来源:

小wu学cv:常用的激活函数合集(详细版)

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

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

相关文章

【科技素养】蓝桥杯STEMA 科技素养组模拟练习试卷2

单选题 1、两袋中分别有同样多的硬糖和酥糖,现将第一袋中的20块酥糖放到第二袋中,第二袋中的硬糖和酥糖相同,接着又将第二袋中的20块硬糖放到第一袋中,则第一袋中的硬糖是酥糖的4倍,问原来一袋中有(&#…

基于STM32的电子时钟(论文+源码)

1. 系统设计 电子时钟是一种广泛使用的工具,其可以帮助人们准确掌握时间,本课题基于STM32的电子时钟系统的设计,在功能上设计如下: 具有电子时钟的基本功能,显示年月日,时分秒等基本信息;可以…

电脑盘符错乱,C盘变成D盘怎么办?

在一些特殊情况下,磁盘盘符会出现错乱,C盘可能会变成D盘。那么,这该怎么办呢?下面我们就来了解一下。 通过磁盘管理更改盘符 磁盘管理是Windows自带的工具,它位于“计算机管理”的控制台中。管理硬盘及其所包含的卷或…

梨花声音研修院,严肃与刚毅是音色核心

在为军旅剧提供配音服务时,配音员需捕捉并展现军事场合的严肃气氛、军人的刚毅品质以及他们对职责的忠诚。军旅剧往往围绕着军人的日常生活、战场经历、战友之情以及对祖国的热爱等主题展开,所以配音需能传递这些情感和价值。以下是进行军旅剧配音的一些…

倍福控制器搭建IgH环境

最近收到了倍福CX5230控制器,控制器上自带EBUS总线扩展的IO,使用的是CCAT网卡,在控制器上安装preempt-rt Linux系统,再安装IgH。 IgH正常识别到了扩展的IO模块。 运行控制程序,可以正常控制IO输出。

Qt应用开发(进阶篇)——线程 QThread

一、前言 QThread类继承于QObject基类,是Qt经典基础工具类,QThread类提供了一种独立于平台的方式来管理线程,让开发者能够快速的完成多线程的创建和使用。 正常情况下,一个PC程序使用到多线程的概率是非常高的,在不同方…

bclinux aarch64 ceph 14.2.10 云主机 4节点 fio

ceph -s 由于是基于底层分布式存储的云主机,数据仅供参考 本地云盘性能 direct1 1M读取 IOPS134, BW134MiB/s [rootceph-client rbd]# cd / [rootceph-client /]# fio -filenamefio.bin -direct1 -iodepth 128 -thread -rwread -ioenginelibaio -bs1M -size10G -n…

Java继承和多态

文章目录 继承成员继承构造方法super和this的区别代码块构造顺序 限定修饰符final继承和组合 多态向上转型重写动态绑定重写注意事项 向下转型多态优点注意 继承 成员继承 class Animal{public String name;public int age;public int a10;public void doSomething(){System.…

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 大约一个月之后发布的,包含了更多对…

系列五、为什么不用线程id作为ThreadLocalMap的key

一、为什么不用线程id作为ThreadLocalMap的key 1.1、案例代码 /*** Author : 一叶浮萍归大海* Date: 2023/11/21 11:50* Description: 需求:* 如果当前线程是线程1,那么设置书名和作者分别为 三国演义 罗贯中* 如果…

“高校评分”走红网络,虎扑:若造谣抹黑,学校可联系平台处理

哎呀,最近虎扑APP的全国高校评分可是火遍了网络啊!那些机智的评语,哦哟,都成了新的“网络爆款梗”!有毕业生说嘛,这评分都是看学生自己的经历和感受,有好评当然就有差评啦。但关键是&#xff0c…

Django 入门学习总结3

1、创建数据库 打开mysite/settings.py文件,可以看到我们使用Python中已包含的默认的数据库SQLite,也可以使用其他的数据库,如Oracle、Mysql等。里面也包含时区、语言等设置信息。 在使用数据库和表之前,输入下面的命令&#xf…

HT5169 单声道D类音频功放 I2S输入

HT5169是一款内置BOOST升压模块的D类音频功率放大器。内置的BOOST升压模块可通过外置电阻调节升压值,即使是锂电池供电,在升压至7.5V,2Ω负载条件下则能连续输出 11W功率。其支持外部设置调节BOOST输出电压。 HT5169是一颗单声道D类音频功放&…

Android使用Kotlin利用Gson解析多层嵌套Json数据

文章目录 1、依赖2、解析 1、依赖 build.gradle(app)中加入 dependencies { implementation com.google.code.gson:gson:2.8.9 }2、解析 假设这是要解析Json数据 var responseStr "{"code": 200,"message": "操作成功","data&quo…

A____Z____RECOVER____DATA勒索恢复---惜分飞

有客户MySQL数据库被黑,业务库中表被删除,并创建A____Z____RECOVER____DATA库,里面有一张readme表,内容为: mysql> select * from readme \G; *************************** 1. row *************************** zh_content: 请尽快与我们取得联系,否则我们将会公…

第28期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大型语言模型(LLM)等安全领域应用的知识。在这里,您可以…

【linux】进行间通信——共享内存+消息队列+信号量

共享内存消息队列信号量 1.共享内存1.1共享内存的原理1.2共享内存的概念1.3接口的认识1.4实操comm.hppservice.cc (写)clint.cc (读) 1.5共享内存的总结1.6共享内存的内核结构 2.消息队列2.1原理2.2接口 3.信号量3.1信号量是什么3…

如何开发干洗店用的小程序

洗护行业现在都开始往线上的方向发展了,越来越多的干洗店都推出了上门取送服务,那么就需要开发一个干洗店专用的小程序去作为用户和商家的桥梁,这样的小程序该如何开发呢? 一、功能设计:根据干洗店的业务需求和小程序的…

算法-二叉树-简单-二叉树的直径、将有序数组转换成二叉搜索树

记录一下算法题的学习9 二叉树的直径 题目:给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。两节点之间路径的 长度 由它们之间边数表示 读完题目&…

2014年3月24日 Go生态洞察:Go地鼠的故事

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…