深度学习—激活函数详解(Sigmoid、tanh、ReLU、ReLU6及变体P-R-Leaky、ELU、SELU、Swish、Mish、Maxout、hard-sigmoid、hard-swish)

article/2025/9/21 18:39:03

非线性激活函数详解

  • 饱和激活函数
    • Sigmoid函数
    • tanh函数
    • hard-Sigmoid函数
  • 非饱和激活函数
    • Relu(修正线性单元):
    • Relu6(抑制其最大值):
    • ELU(指数线性单元)
    • SELU
    • Leaky-Relu / R-Relu
    • P-Relu(参数化修正线性单元)
    • R-Relu(随机纠正线性单元)
    • Swish
    • hard-Swish
    • Mish
    • Maxout
    • 关于激活函数统一说明
  • 参考链接


因为深度学习模型中其它的层都是线性的函数拟合,即便是用很深的网络去拟合,其还是避免不了线性的特性,无法进行非线性建模,而加入非线性激活函数单元,当线性函数的输出层经过非线性激活单元的时候,其输出呈现一种非线性的变化,这样经过多层的拟合,就可以完成对输入的非线性建模操作。同时还可以起到一种特征组合的作用。

好的激活函数的特征一般应当是平滑的,而且对于负值有较好的处理。


关于本文中的图形绘制请参考我这篇博客:最全面:python绘制Sigmoid、Tanh、Swish、ELU、SELU、ReLU、ReLU6、Leaky ReLU、Mish、hard-Sigmoid、hard-Swish等激活函数(有源码)


饱和激活函数

  • 主要是Sigmoidtanh函数,又加上了hard-Sigmoid函数

Sigmoid函数

 啊

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

观察Sigmoid函数曲线,可以知道其输出分布在【0,1】区间,而且在输入值较大和较小的情况,其输出值变化都会比较小,仅仅当输入值接近为0时,它们才对输入强烈敏感。Sigmod单元的广泛饱和性会使得基于梯度的学习变得非常困难。因为这个原因,现在已经不鼓励将它们作为前馈网络的隐藏单元。

观察Simod导数曲线,呈现一个类似高斯分布的驼峰装,其取值范围在【0,0.25】之间,而我们初始化后的网络权值通常小于1,因此当层数增多时,小于0的值不断相乘,最后就会导致梯度消失的情况出现。而梯度爆炸则是当权值过大,导致其导数大于1,大于1的数不断相乘,发生梯度爆炸。
同时Sigmoid还有其他缺点,如输出不是以0为中心,而是0.5,这样在求解权重的梯度时,梯度总是正或负的,指数计算耗时。

总之不推荐使用sigmoid饱和激活函数。


tanh函数

公式:
在这里插入图片描述
不过sigmoid和tanh在RNN(LSTM、注意力机制等)结构上有所应用,作为门控或者概率值。

这里关于tanh为什么比simoid收敛快有一个比较好的说法,引用了以下说法:

梯度消失问题程度
tanh′(x)=1−tanh(x)2∈(0,1)tanh′⁡(x)=1−tanh⁡(x)2∈(0,1)
sigmoid: s′(x)=s(x)×(1−s(x))∈(0,1/4)sigmoid: s′(x)=s(x)×(1−s(x))∈(0,1/4)
可以看出tanh(x)的梯度消失问题比sigmoid要轻.梯度如果过早消失,收敛速度较慢.
以零为中心的影响
如果当前参数(w0,w1)的最佳优化方向是(+d0, -d1),则根据反向传播计算公式,我们希望 x0 和 x1 符号相反。但是如果上一级神经元采用 Sigmoid 函数作为激活函数,sigmoid不以0为中心,输出值恒为正,那么我们无法进行最快的参数更新,而是走 Z 字形逼近最优解。

在这里插入图片描述


hard-Sigmoid函数

公式:
在这里插入图片描述
解释:当 x < -2.5输出0,当 x > 2.5时,输出1,当 -2.5 < x & x < 2.5时,输出为 (2x+5) / 10,线性函数。
那么其导数,当 x < -2.5输出0,当 x > 2.5时,输出0,当 -2.5 < x & x < 2.5时,输出为 1 / 5

hard-Sigmoid函数时Sigmoid激活函数的分段线性近似。从公示和曲线上来看,其更易计算,因此会提高训练的效率,不过同时会导致一个问题:就是首次派生值为零可能会导致神经元died或者过慢的学习率。

  • Sigmoid函数和hard-Sigmoid函数对比图:

在这里插入图片描述

在这里插入图片描述


非饱和激活函数

  • Sigmod和tanh都是饱和激活函数,即两者在输入值较大或较小的时候对输入值不再那么敏感。
    而以Relu及其变体为代表的一类非饱和激活函数在防止梯度消失方面具有无可比拟的优势,现如今基本很少在网络中使用Sigmod等饱和激活函数。

Relu(修正线性单元):

将所有的负值置为0,而其余的值不变。
缺点:一个很大的梯度流过一个Relu神经元,更新过梯度后,那么这个神经元对大部分数据都没有激活作用了,因此梯度就是0。会造成神经元的死亡。
在这里插入图片描述
在这里插入图片描述


Relu6(抑制其最大值):

  • 公式:

在这里插入图片描述
即当 x > 6时,其导数也为0。

  • 目的:

主要是为了在移动端float16的低精度的时候,也能有很好的数值分辨率,如果对ReLu的输出值不加限制,那么输出范围就是0到正无穷,而低精度的float16无法精确描述其数值,带来精度损失。

  • ReLU和ReLU6图表对比:

在这里插入图片描述

在这里插入图片描述


ELU(指数线性单元)

其将激活函数的平均值接近零,从而加快学习的速度。同时,还可以通过正值的标识来避免梯度消失的问题。根据一些研究,ELU的分类 精确度要高于Relu。

  • 融合了sigmoid和ReLU,左侧具有软饱和性,右侧无饱和性。

  • 右侧线性部分使得ELU能够缓解梯度消失,而左侧软饱能够让ELU对输入变化或噪声更鲁棒。

  • ELU的输出均值接近于零,所以收敛速度更快。

  • 在 ImageNet上,不加 Batch Normalization 30 层以上的 ReLU
    网络会无法收敛,PReLU网络在MSRA的Fan-in (caffe )初始化下会发散,而 ELU
    网络在Fan-in/Fan-out下都能收敛。

在这里插入图片描述
在这里插入图片描述


SELU

就是给ELU乘上一个系数,该系数大于1。
在这篇paper Self-Normalizing Neural Networks中,作者提到,SELU可以使得输入在经过一定层数之后变为固定的分布。
以前的ReLU、P-ReLU、ELU等激活函数都是在负半轴坡度平缓,这样在激活的方差过大时可以让梯度减小,防止了梯度爆炸,但是在正半轴其梯度简答的设置为了1。而SELU的正半轴大于1,在方差过小的时候可以让它增大,但是同时防止了梯度消失。这样激活函数就有了一个不动点,网络深了之后每一层的输出都是均值为0,方差为1.

在这里插入图片描述
在这里插入图片描述


Leaky-Relu / R-Relu

Leaky ReLU和ReLU不同的是,ReLU是将所有的负值设为零,而Leaky ReLU是给所有负值赋予一个非零斜率,即用一个负值部分除以大于1的数。(公式中a是大于1的一个常数)

在这里插入图片描述

在这里插入图片描述


P-Relu(参数化修正线性单元)

可以看作是Leaky ReLU的一个变体,不同的是,P-ReLU中的负值部分的斜率是根据数据来定的,即a的值并不是一个常数。

R-Relu(随机纠正线性单元)

R-ReLU也是Leaky ReLU的一个变体,只不过在这里负值部分的斜率在训练的时候是随机的,即在一个范围内随机抽取a的值,不过这个值在测试环节会固定下来。


Swish

paper : Searching for Activation Functions
beta是个常数或者可以训练的参数。其具有无上界有下界、平滑、非单调的特性。其在模型效果上优于ReLU。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

当β = 0时,Swish变为线性函数f(x)=x2f(x)=x2.
β → ∞, σ(x)=(1+exp(−x))−1σ(x)=(1+exp⁡(−x))−1为0或1. Swish变为ReLU: f(x)=2max(0,x)
所以Swish函数可以看做是介于线性函数与ReLU函数之间的平滑函数.


hard-Swish

paper: Searching for MobileNetV3

  • 公式:

在这里插入图片描述
在论文中,作者提到,虽然这种Swish非线性提高了精度,但是在嵌入式环境中,他的成本是非零的,因为在移动设备上计算sigmoid函数代价要大得多。

因此作者使用hard-Swishhard-Sigmoid替换了ReLU6SE-block中的Sigmoid层,但是只是在网络的后半段才将ReLU6替换为h-Swish,因为作者发现Swish函数只有在更深的网络层使用才能体现其优势。

首先是肯定了Swish的重要性,然后指出在量化模式下,Sigmoid函数比ReLU6的计算代价大的多,所以才有了这个ReLU6版本的h-Swish

  • Swishhard-Swish图表对比:

加粗样式

在这里插入图片描述
关于hard-Swish的梯度图我不确定有没有画错,如果有错误还请指正,谢谢。


Mish

Mish: A Self Regularized Non-Monotonic Neural Activation Function
这篇应该是笔者写时关于激活函数改进的最新一篇文章。

相比Swish有0.494%的提升,相比ReLU有1.671%的提升。

在这里插入图片描述
关于公式及其导数推导如下图所示:
在这里插入图片描述
Mish和Swish中参数=1的曲线对比:(第一张是原始函数,第二张是导数)
在这里插入图片描述
在这里插入图片描述
为什么Mish表现的更好:

以上无边界(即正值可以达到任何高度)避免了由于封顶而导致的饱和。理论上对负值的轻微允许允许更好的梯度流,而不是像ReLU中那样的硬零边界。

最后,可能也是最重要的,目前的想法是,平滑的激活函数允许更好的信息深入神经网络,从而得到更好的准确性和泛化。

要区别可能是Mish函数在曲线上几乎所有点上的平滑度

Maxout

paper:Maxout Networks
与常规的激活函数不同,Maxout是一个可以学习的分段线性函数。
其可以看做是在深度学习网络中加入了一层激活函数层,包含一个参数k,这一层相比ReLU,Sigmoid等,其在于增加了k个神经元,然后输出激活值最大的值。
其需要学习的参数就是k个神经元中的权值和偏置,这就相当于常规的激活函数一层,而Maxout是两层,而且参数个数增加了K倍。
其可以有效的原理是,任何ReLU及其变体等激活函数都可以看成分段的线性函数,而Maxout加入的一层神经元正是一个可以学习参数的分段线性函数。
优点:其拟合能力很强,理论上可以拟合任意的凸函数;
具有ReLU的所有优点,线性和非饱和性;
同时没有ReLU的一些缺点,如神经元的死亡;
缺点:导致整体参数的激增。

下图非自制:
在这里插入图片描述


关于激活函数统一说明

ELU在正半轴取输入x奸情了梯度弥散情况(正半轴导数处处为1),而这一点特性,基本上除了swish其他非饱和激活函数都具有这个特性。而只有ReLU在负半轴的输出没有复制,所以ReLU的输出均值一定是大于0的,而当激活值的均值非0时,会对下一层造成以bias,也就是下一层的激活单元会出现bias shift现象,通过不断的层数叠加,bias shift会变得非常大。而ELU可以让激活函数的输出均值尽可能接近0,类似于BN操作,但是计算复杂度更低。而且虽然Leaky ReLU和PReLU等都有负值,但是它们不保证在不激活的状态对噪声鲁棒,这里的不激活指的是负半轴。而ELU在输入取较小值时具有软饱和的特性,提升了对噪声的鲁棒性。Swish和ELU都是可以取负值,同时在负半轴具有软饱和的性能,提高了对噪声的鲁棒性,SELU效果比ELU效果还要更好。
在这里插入图片描述


参考链接

ELU激活函数的提出
激活函数(ReLU, Swish, Maxout)
激活函数ReLU、Leaky ReLU、PReLU和RReLU


2019.10.30.
希望能帮到你。点赞是对我最大的认可。谢谢。



http://chatgpt.dhexx.cn/article/qf5lxmpN.shtml

相关文章

激活函数详解(ReLU/Leaky ReLU/ELU/SELU/Swish/Maxout/Sigmoid/tanh)

神经网络中使用激活函数来加入非线性因素&#xff0c;提高模型的表达能力。 ReLU(Rectified Linear Unit,修正线性单元) 形式如下: ReLU公式近似推导:: 下面解释上述公式中的softplus,Noisy ReLU. softplus函数与ReLU函数接近,但比较平滑, 同ReLU一样是单边抑制,有宽广的接受…

【卷积神经网络】12、激活函数 | Tanh / Sigmoid / ReLU / Leaky ReLU / ELU / SiLU / Mish

文章目录 一、Tanh二、Sigmoid三、ReLU四、Leaky ReLU五、ELU六、SiLU七、Mish 本文主要介绍卷积神经网络中常用的激活函数及其各自的优缺点 最简单的激活函数被称为线性激活&#xff0c;其中没有应用任何转换。 一个仅由线性激活函数组成的网络很容易训练&#xff0c;但不能学…

神经网络激活函数汇总(Sigmoid、tanh、ReLU、LeakyReLU、pReLU、ELU、maxout)

神经网络激活函数汇总&#xff08;Sigmoid、tanh、ReLU、LeakyReLU、pReLU、ELU、maxout&#xff09; 常规 sigmoid 和 tanh sigmoid 特点&#xff1a;可以解释&#xff0c;比如将0-1之间的取值解释成一个神经元的激活率&#xff08;firing rate&#xff09; 缺陷&#xff1…

神经网络激活函数优缺点和比较(sigmod,tanh,relu,softmax,leaky relu,ELU,SELU)

文章目录 前言一、sigmoid函数二、tanh函数三&#xff0c;ReLU函数四&#xff0c; Leaky ReLU五&#xff0c;ELU指数线性单元函数&SELU函数六&#xff0c;softmax函数 前言 理想的激活函数应该有的性质 非线性&#xff1a;这个条件是多层神经网络形成的基础&#xff0c;保…

常用激活函数:Sigmoid/Softmax/ELU/ReLU/LeakyReLU/Tanh...(Pytorch)

激活函数 一、Sigmoid1.介绍2.实例 二、Softmax1.介绍2.实例 三、ELU&#xff1a;指数线性单元函数1.介绍2.实例 四、ReLU&#xff1a;整流线性单元函数1.介绍2.实例 五、ReLU61.介绍2.实例 六、LeakyReLU1.介绍2.实例 七、Tanh&#xff1a;双曲正切函数1.介绍2.实例 一、Sigmo…

【深度学习】论文导读:ELU激活函数的提出(FAST AND ACCURATE DEEP NETWORK LEARNING BY EXPONENTIAL LINEAR UNITS (ELUS))

论文下载&#xff1a; FAST AND ACCURATE DEEP NETWORK LEARNING BY EXPONENTIAL LINEAR UNITS (ELUS)&#xff08;2016&#xff0c;Djork-Arne Clevert, Thomas Unterthiner & Sepp Hochreiter&#xff09; 一、简介 ELU的表达式&#xff1a; 四种激活函数&#xff0…

ReLU、LReLU、PReLU、CReLU、ELU、SELU

ReLULReLUPReLUCReLUELUSELUReLU tensorflow中:tf.nn.relu(features, name=None) LReLU (Leaky-ReLU) 其中 ai 是固定的。 i 表示不同的通道对应不同的

机器学习中的数学——激活函数(五):ELU函数

分类目录&#xff1a;《机器学习中的数学》总目录 相关文章&#xff1a; 激活函数&#xff1a;基础知识 激活函数&#xff08;一&#xff09;&#xff1a;Sigmoid函数 激活函数&#xff08;二&#xff09;&#xff1a;双曲正切函数&#xff08;Tanh函数&#xff09; 激活函…

npm的安装,卸载以及版本回退

我之前在电脑上安装了Node.js V15.12.0这个版本&#xff0c;它对应的npm版本为 7.6.3 后来因为npm install --registryhttps://registry.npm.taobao.org总是报错。 度娘说npm7.x的版本比npm6.x更严格。 因此我回退npm版本到6.X。 于是我重装了node V13.10.1&#xff0c;但是…

Linux安装与卸载nodejs/卸载npm

编译mediasoup, 需要先安装nodejs npm。但是我一不小心&#xff0c;安装了最新的14.x版本。结果老出问题&#xff1a; npm ERR! cb() never called!npm ERR! This is an error with npm itself. Please report this error at: npm ERR! <https://npm.community>npm …

npm 卸载及安装流程

1.卸载 1.将node的安装目录nodejs文件夹清空 2.查找.npmrc文件删除&#xff08;在用户文件夹下&#xff09; 2.安装 1.到node官网下载安装包 2.傻瓜式安装 3.完成后 node -v npm -v 查看是否安装成功&#xff0c;此时npm 并不是最新版 4.配置npm的全局模块的存放路径以及cac…

Node.js的卸载

Node.js的卸载 在控制面板-程序-程序和功能中卸载卸载后 到文件夹中进行进一步的删除检查环境变量中Path中有没有最后 重启一下 结束[随手记账单小程序 期待大家的反馈](https://mp.weixin.qq.com/s/RaFSpVov33bZDUn-aSXa1w) 在控制面板-程序-程序和功能中卸载 确保node.js没有…

npm的卸载与安装流程

安装&#xff08;npm 和node是一起的&#xff0c;安装成功node后就会自带npm&#xff09; 1、下载地址为&#xff1a;https://nodejs.org/en/ 2、检查是否安装成功&#xff1a;如果输出版本号&#xff0c;说明我们安装node环境成功 3、为了提高我们的效率&#xff0c;可以使用…

npm依赖、命令

NPM 的全称是 Node Package Manager&#xff0c;是随同 NodeJS 一起安装的包管理和分发工具&#xff0c;它可以很方便的让前端开发者下载、安装、上传以及管理已经安装的包。 1. npm 安装配置&#xff08;可选&#xff09; 现在安装的新版本的nodejs可以直接使用默认配置的即可…

npm——安装、卸载与更新

npm 官方文档&#xff1a;https://docs.npmjs.com/ 什么是npm npm&#xff08;“Node 包管理器”&#xff09;是 JavaScript 运行时 Node.js 的默认程序包管理器。 它也被称为“Ninja Pumpkin Mutants”&#xff0c;“Nonprofit Pizza Makers”&#xff0c;以及许多其他随机…

静态局部变量 普通全局变量 静态全局变量

1 计算机内部存储方面&#xff0c;在编译时&#xff0c;编译器会给它们分配地址&#xff0c;地址不会被回收。 2 静态局部变量 a 作用域是在于同局部变量。 b&#xff0c;地址不会回收&#xff0c;但是赋值同普通变量一样。 注意&#xff1a; 1 编译器在静态存储区内给静…

c语言局部变量 静态局部变量 全局变量与静态全局变量

基本概念&#xff1a; 作用域&#xff1a;起作用的区域&#xff0c;也就是可以工作的范围。 代码块&#xff1a;所谓代码块&#xff0c;就是用{}括起来的一段代码。 数据段&#xff1a;数据段存的是数&#xff0c;像全局变量就是存在数据段的 代码段&#xff1a;存的是程序代码…

什么是全局变量,局部变量,静态全局变量,静态局部变量

来源&#xff1a;公众号【编程珠玑】 作者&#xff1a;守望先生 前言 这些是编程语言中的基本概念&#xff0c;如果你还不是非常明确地清楚标题的问题&#xff0c;并且不知道作用域&#xff0c;链接属性&#xff0c;存储期等概念的具体含义&#xff0c;那么本文你不该错过。为了…

静态局部变量初始化

mask一下一直以来的一个误区 #include <stdio.h>void key(void) {static unsigned char key_up 1;printf("key_up %d \n", key_up);key_up 0;printf("key_up %d \n", key_up); }int main(void) {key();key();return 0; }原以为会每次调子函数时&…

C语言全局变量,局部变量,静态局部变量的区分

1.如果没有给全局变量和静态局部变量进行初始化赋值&#xff0c;全局变量与静态局部变量一样&#xff0c;默认值为数字0&#xff08;ASCII码为48&#xff09;&#xff1b; 2.非静态的局部变量没有初始化时&#xff0c;该变量的值是一个随机数&#xff0c;必须要赋值后才可以安…