常用激活函数

article/2025/9/27 6:52:16

文章目录

  • 前言
  • 为什么需要激活函数
  • 什么样的函数可以做激活函数
  • 什么样的函数是好的激活函数
  • 常用激活函数
    • sigmoid
    • tanh
    • ReLU
    • Leaky ReLU
    • Randomized Leaky ReLU
    • Maxout
  • 参考文章

前言

今天这篇文章对一些常用激活函数做一下总结吧。在神经网络中激活函数还是很重要的,并且熟悉激活函数对理解别的问题也是很有帮助的。

为什么需要激活函数

从数学上看,神经网络是一个多层复合函数。引入激活函数是为了保证神经网络的非线性。因为线性函数无论怎样复合结果还是线性的,所以对激活函数最基本的要求是非线性的
假设神经网络的输入是n维向量x,输出是m维向量y,它实现了如下向量到向量的映射:
R n → R m R^n \rightarrow R^m RnRm
我们将这个函数记为
y = h ( x ) y = h(x) y=h(x)
神经网络第l层的变换写成矩阵和向量形式为:
u ( l ) = W ( l ) x ( l − 1 ) + b ( l ) x ( l ) = f ( u ( l ) ) \begin{aligned} & u^{(l)} = W^{(l)}x^{(l-1)} + b^{(l)} \\ & x^{(l)} = f(u^{(l)}) \end{aligned} u(l)=W(l)x(l1)+b(l)x(l)=f(u(l))
其中W是权重矩阵,b是偏置向量,u是临时结果,x是神经网络每一层的输入或输出。激活函数分别作用于向量u的每一个分量,产生一个向量输出x。在正向传播阶段,反复用上面的公式进行计算,最后得到网络的输出。对于一个3层的网络,整个映射可以写成:
h ( x ) = f ( W ( 3 ) f ( W ( 2 ) ( f ( W ( 1 ) x + b ( 1 ) ) + b ( 2 ) ) + b ( 3 ) ) h(x) = f(W^{(3)}f(W^{(2)}(f(W^{(1)}x + b^{(1)}) + b^{(2)}) + b^{(3)}) h(x)=f(W(3)f(W(2)(f(W(1)x+b(1))+b(2))+b(3))
这是一个3层的复合函数。从这里可以清晰的看到,如果没有激活函数,整个函数将是一个线性函数:
W ( 3 ) ( W ( 2 ) ( W ( 1 ) x + b ( 1 ) ) + b ( 2 ) ) + b ( 3 ) W^{(3)}(W^{(2)}(W^{(1)}x + b^{(1)}) + b^{(2)}) + b^{(3)} W(3)(W(2)(W(1)x+b(1))+b(2))+b(3)

什么样的函数可以做激活函数

前面已经说过,为保证非线性,激活函数必须为非线性函数,但仅仅具有非线性是不够的。神经网络在本质上是一个复合函数,这会让我们思考一个问题:这个函数的建模能力有多强?即它能模拟什么样的目标函数?已经证明,只要激活函数选择得当,神经元个数足够多,使用3层即包含一个隐含层的神经网络就可以实现对任何一个从输入向量到输出向量的连续映射函数的逼近,这个结论称为万能逼近(universal approximation)定理。万能定理对激活函数的要求是必须非常数、有界、单调递增并且连续
当然,仅仅满足万能逼近定理的要求也是不够的。神经网络的训练一般采用反向传播算法和梯度下降法。反向传播算法从复合函数求导的链式法则导出,因为神经网络是一个多层的复合函数。在反向传播时,误差项的计算公式为:
δ ( l ) = ( W ( l + 1 ) ) T δ ( l + 1 ) ⊙ f ′ ( u ( l ) ) \delta^{(l)} = (W^{(l+1)})^T \delta^{(l+1)} \odot f'(u^{(l)}) δ(l)=(W(l+1))Tδ(l+1)f(u(l))
由于使用梯度下降法需要计算损失函数对参数的梯度值,这个梯度值根据上面的误差项计算,而误差项的计算又涉及到计算激活函数的导数,因此激活函数必须是可导的。实际应用时并不要求它在定义域内处处可导,只要是几乎处处可导即可。

什么样的函数是好的激活函数

反向传播算法计算误差项时每一层都要乘以本层激活函数的导数。如果激活函数导数的绝对值小于1,多次连乘之后误差项很快会衰减到接近于0,参数的梯度值由误差项计算得到,从而导致前面层的权重梯度接近于0,参数没有得到有效更新,这称为梯度消失问题。与之相反的是梯度爆炸问题,如果激活函数的导数的绝对值大于1,多次乘积之后权重值会趋向于非常大的数,这称为梯度爆炸。
理论分析和实验结果都证明,随着网络层数的增加,反向传播的作用越来越小,网络更加难以训练和收敛。
这就引入了激活函数饱和性的概念。如果一个激活函数满足:
lim ⁡ x → + ∞ f ′ ( x ) = 0 \lim_{x \to + \infty} f'(x) = 0 x+limf(x)=0
即在正半轴函数的导数趋于0,则称该函数为右饱和。类似的如果满足:
lim ⁡ x → − ∞ f ′ ( x ) = 0 \lim_{x \to - \infty} f'(x) = 0 xlimf(x)=0
即在负半轴函数的导数趋于0,则称该函数左饱和。如果一个激活函数既满足左饱和又满足右饱和,称之为饱和。如果存在常数c,当 x > c x>c x>c时有:
f ′ ( x ) = 0 f'(x) = 0 f(x)=0
则称函数右硬饱和;当 x &lt; c x&lt;c x<c时有:
f ′ ( x ) = 0 f&#x27;(x) = 0 f(x)=0
则称函数左硬饱和。既满足左硬饱和又满足右硬饱和的激活函数为硬饱和函数。饱和性和梯度消失问题密切相关。在反向传播过程中,误差项在每一层都要乘以激活函数导数值,一旦x的值落入饱和区间,多次乘积之后会导致梯度越来越小,从而出现梯度消失问题。
所以,非饱和函数相比饱和函数来说更能成为好的激活函数。

常用激活函数

sigmoid

sigmoid函数的表达式为:
σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1+e^{-x}} σ(x)=1+ex1
其函数图像如下图所示:
sigmoid.png
sigmoid的值域为(0,1)。其导数为:
σ ′ ( x ) = σ ( x ) ( 1 − σ ( x ) ) \sigma&#x27;(x) = \sigma(x)(1 - \sigma(x)) σ(x)=σ(x)(1σ(x))
优点

  • 求导容易,利用其本身函数值即可。

缺点

  • 函数具有软饱和性,容易产生梯度消失问题。
  • 输出不以0为中心,如果数据输入神经元是正的,那么会导致计算的梯度也始终为正。
  • e − x e^{-x} ex计算耗时。

tanh

tanh函数的表达式为:
t a n h ( x ) = e x − e − x e x + e − x = 2 σ ( 2 x ) − 1 tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} = 2 \sigma(2x) - 1 tanh(x)=ex+exexex=2σ(2x)1
其函数图像如下图所示:
tanh.png
tanh的值域为(-1, 1)。其导数为:
t a n h ′ ( x ) = 1 − ( t a n h ( x ) ) 2 tanh&#x27;(x) = 1 - (tanh(x))^2 tanh(x)=1(tanh(x))2
优点

  • 输出以0为中心。
  • 比sigmoid函数训练时收敛更快。

缺点

  • 仍然是饱和函数,没有解决梯度消失问题。

ReLU

ReLU函数的表达式为:
R e L U ( x ) = m a x ( 0 , x ) ReLU(x) = max(0, x) ReLU(x)=max(0,x)
其函数图像如下图所示:
ReLU.png
其导数为:
R e L U ′ ( x ) = s i g n ( x ) = { 1 , x &gt; 0 , 0 , x &lt; 0 ReLU&#x27;(x) = sign(x) = \begin{cases} 1, &amp; x &gt; 0,\\ 0, &amp; x &lt;0 \end{cases} ReLU(x)=sign(x)={1,0,x>0,x<0
需要注意的是,ReLU在原点处不可导。
优点

  • 解决了部分梯度消失问题
  • 训练收敛速度相比tanh更快

缺点

  • 当x<0时,出现梯度消失问题。此时相当于神经元死亡。

对于神经元死亡问题,我们简单解释一下。
假设现有损失函数为交叉熵损失函数, y y y为实际值, y ^ \hat y y^为预测值,那么其计算公式为:
L ( y , y ^ ) = − ( y l o g ( y ^ ) + ( 1 − y ) l o g ( 1 − y ^ ) ) L(y, \hat y) = -(ylog(\hat y) + (1 - y)log(1-\hat y)) L(y,y^)=(ylog(y^)+(1y)log(1y^))
如果正例为1,负例为0,那么当 y ^ = y \hat y = y y^=y时,损失函数值为0;当 y ^ = 0 \hat y = 0 y^=0 y = 1 y = 1 y=1时,损失函数值为无穷大;当 y ^ = 1 \hat y = 1 y^=1 y = 0 y = 0 y=0时,损失函数值为无穷大。
假设神经网络某层的计算公式为:
y = R e L U ( W T X + b ) y = ReLU(W^T X + b) y=ReLU(WTX+b)
如果学习率设置的比较大,且此时的实际值为负例,训练结果为使模型往实际值拟合,那么权重W就会突然变得很小,使 W T X + b W^T X + b WTX+b为负,再经过ReLU,那么输出就为0。但反向传播到此处就会碰到问题,因为此时梯度为0,从而无法更新参数值,也就相当于神经元死亡了。
对于这种问题的解决办法一般是设置一个比较小的学习率,或者使用L2正则化以及使用Momentum、RMS、Adam等其他梯度下降方式。

Leaky ReLU

Leaky ReLU函数的表达式:
f ( x ) = { x , x &gt; 0 , α x , x ≤ 0 f(x) = \begin{cases} x, &amp; x &gt; 0, \\ \alpha x, &amp; x \le 0 \end{cases} f(x)={x,αx,x>0,x0
式中 α \alpha α是一个很小的正数,比如0.01。
其函数图像如下图所示:
LeakyReLU.png
其导数为:
f ′ ( x ) = { 1 , x &gt; 0 , α , x ≤ 0 f&#x27;(x) = \begin{cases} 1, &amp; x&gt;0, \\ \alpha, &amp; x \le 0 \end{cases} f(x)={1,α,x>0,x0
优点

  • 解决了ReLU神经元死掉的问题。

比Leaky ReLU更进一步的是PReLU,它与Leaky ReLU的区别是,其计算公式中的 α \alpha α不是预先定义好的,而是被当做参数去训练。

Randomized Leaky ReLU

Randomized Leaky ReLU中的 α \alpha α在训练阶段是从高斯分布 U ( l , u ) U(l, u) U(l,u)中随机取出来的,然后在测试过程中进行纠正。
其表达式为:
y j i = { x j i , x j i ≥ 0 , α j i x j i , x j i &lt; 0 where  α j i ∼ U ( l , u ) , l &lt; u and  l , u ∈ [ 0 , 1 ) y_{ji} = \begin{cases} x_{ji}, &amp; x_{ji} \ge 0, \\ \alpha_{ji}x_{ji}, &amp; x_{ji} &lt; 0 \end{cases} \\ \text{where }\alpha_{ji} \sim U(l, u), l &lt; u \text{ and } l, u \in [0, 1) yji={xji,αjixji,xji0,xji<0where αjiU(l,u),l<u and l,u[0,1)
其函数图像如下图所示:
rlReLU.png

Maxout

Maxout函数表达式如下:
f i ( x ) = m a x j ∈ [ 1 , k ] z i j f_i(x) = max_{j \in [1, k]} z_{ij} fi(x)=maxj[1,k]zij
假设w是2维的,那么有:
f ( x ) = m a x ( w 1 T X + b 1 , w 2 T X + b 2 ) f(x) = max({w_1}^TX+b_1, {w_2}^TX+b_2) f(x)=max(w1TX+b1,w2TX+b2)
ReLu和Leaky ReLU都是它的变形(比如, w 1 , b 1 = 0 w_1, b_1 = 0 w1,b1=0的时候,就是ReLU )。
Maxout的拟合能力是非常强的,它可以拟合任意的凸函数,最直观的解释就是任意的凸函数都可以由分段线性函数以任意精度拟合,前提是“隐隐含层”的神经元个数可以任意多。
因为Maxout可以拟合任意凸函数,所以其没有固定的函数图像,下图是其一些拟合示例:
maxout.png
优点

  • 计算简单。
  • 解决了梯度消失问题,且不会产生死亡神经元。
  • 训练收敛速度快。

缺点

  • 每个神经元的参数加倍,导致参数数量激增。

其实还有很多其他的激活函数,限于篇幅这里就不一一分析了。

参考文章

理解神经网络的激活函数
【神经网络】激活函数面面观
常用激活函数的比较
为什么Relu会导致死亡节点
Maxout激活函数原理及实现


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

相关文章

激活函数

深度学习中的激活函数导引 我爱机器学习(52ml.net) 2016年8月29日 0 作者&#xff1a;程程 链接&#xff1a;https://zhuanlan.zhihu.com/p/22142013 来源&#xff1a;知乎 著作权归作者所有&#xff0c;已联系作者获得转载许可。 深度学习大讲堂致力于推送人工智能&#xff0c…

详解激活函数

文章目录 0️⃣前言1️⃣Sigmoid2️⃣tanh3️⃣Relu4️⃣Leaky Relu5️⃣Softmax6️⃣总结 0️⃣前言 用了这么久的激活函数&#xff0c;抽空总结一下吧&#xff0c;不然总是忘记&#xff0c;这里介绍常用到的sigmoid&#xff0c;tanh&#xff0c;relu&#xff0c;leaky relu&…

常用激活函数(激励函数)理解与总结

引言 学习神经网络的时候我们总是听到激活函数这个词&#xff0c;而且很多资料都会提到常用的激活函数&#xff0c;比如Sigmoid函数、tanh函数、Relu函数。那么我们就来详细了解下激活函数方方面面的知识。本文的内容包括几个部分&#xff1a; 什么是激活函数&#xff1f;激活…

常用激活函数总结(深度学习)

前言   学习神经网络的时候我们总是听到激活函数这个词&#xff0c;而且很多资料都会提到常用的激活函数&#xff0c;比如Sigmoid函数、tanh函数、Relu函数。在经过一段时间学习后&#xff0c;决定记录个人学习笔记。 一、激活函数 1.激活函数定义&#xff1f;   在神经网…

【概念梳理】激活函数

一、引言 常用的激活函数如下&#xff1a; 1、Sigmoid函数 2、Tanh函数 3、ReLU函数 4、ELU函数 5、PReLU函数 6、Leaky ReLU函数 7、Maxout函数 8、Mish函数 二、激活函数的定义 多层神经网络中&#xff0c;上层节点的输出和下层节点的输入之间具有一个函数关系&#xff0c;…

一文搞懂激活函数

目录 1、什么是激活函数 2、激活函数的用途&#xff08;为什么需要激活函数&#xff09;&#xff1f; 3、常见的激活函数介绍 3.1 Sigmoid函数 3.2 tanh函数 3.3.RelU函数 3.4 Leaky ReLU函数 和 PReLU 函数 --- ReLU 变体的提出 3.5 ELU (Exponential Linear Units) 函…

激活函数(Relu,sigmoid,Tanh,softmax)详解

目录 1 激活函数的定义 2 激活函数在深度学习中的作用 3 选取合适的激活函数对于神经网络有什么样的重要意义 4 常用激活函数 4.1 Relu 激活函数 4.2 sigmoid 激活函数 4.3 Tanh激活函数 4.4 softmax 激活函数 1 激活函数的定义 激活函数&#xff08;Activation Funct…

激活函数(Activation Function)

目录 1 激活函数的概念和作用 1.1 激活函数的概念 1.2 激活函数的作用 1.3 通俗的理解一下激活函数(图文结合) 1.3.1 无激活函数的神经网络 1.3.2 带激活函数的神经网络 2 神经网络梯度消失与梯度爆炸 2.1 简介梯度消失与梯度爆炸 2.2 梯度不稳定问题 2.3 产生梯度消…

常用的激活函数合集(详细版)

目录 一、定义以及作用 二、常用激活函数解析 1、Sigmoid函数 1.1 公式 1.2 对应的图像 1.3 优点与不足之处 1.4 对应pytorch的代码 2、Tanh函数 2.1 公式 2.2 对应的图像 2.3 优点与不足之处 2.4 对应pytorch的代码 3、ReLU 3.1 公式 3.2 对应的图像 3.3 优点与不…

优化算法——FTRL

ctr预测中&#xff0c;单个样本由向量x表示&#xff0c;w是模型参数&#xff0c;预测样本x被点击的概率psigmoid(w * x)&#xff0c;sigmoid(x) 1/(1exp(x))。样本label为{0, 1}表示是否被点击。模型损失函数为交叉熵损失&#xff1a; L -ylog - (1-y)log(1-p)&#xff0c;梯…

【深度学习】优化算法-Ftrl

脑图 代码实现 DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSEVersion 2, December 2004Copyright (C) 2004 Sam Hocevar <samhocevar.net>Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is all…

谷歌13年提出来的类似于lr的算法 - ftrl论文翻译(七)

论文链接&#xff1a;https://static.googleusercontent.com/media/research.google.com/zh-CN//pubs/archive/41159.pdf 概要 预测广告点击率&#xff08;CTR&#xff09;是一个巨大的规模学习问题&#xff0c;是在线广告业数十亿美元的核心问题。 我们从最近的实验中选择出…

FTRL 算法

本文会尝试总结FTRL的发展由来&#xff0c;总结从LR -> SGD -> TG -> FOBOS -> RDA -> FTRL 的发展历程。本文的主要目录如下&#xff1a; 一、 反思魏则西事件。 二、 LR模型 三、 SGD算法 四、 TG算法 五、 FOBOS算法 六、 RDA算法 七、 FTRL算法 注&…

排序模型进阶-FMFTRL

日萌社 人工智能AI&#xff1a;Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战&#xff08;不定时更新&#xff09; 5.8 排序模型进阶-FM&FTRL 学习目标 目标 无应用 无 5.8.1 问题 在实际项目的时候&#xff0c;经常会遇到训练数据非常大导致一些算法实际…

以我视角深入理解FTRL模型原理

以我视角深入理解FTRL模型原理 FTRL算法是吸取了FOBOS算法和RDA算法的优点而衍生而来的算法。 1.FOBOS算法 小结&#xff1a; 2. RDA算法 RDA也叫正则对偶平均算法&#xff0c;特征权重更新如下&#xff1a; 小结&#xff1a; 3.FTRL算法原理 从loss function的形式来看&am…

FTRL实战之LR+FTRL(代码采用的稠密数据)

理解要点&#xff1a;主要是梯度更新的方法使用了FTRL。即更改了梯度的update函数。 相关参考&#xff1a;https://github.com/wan501278191/OnlineLearning_BasicAlgorithm/blob/master/FTRL.py FTRL&#xff08;Follow The Regularized Leader&#xff09;是一种优化…

DL基本知识(七)FTRL优化器

契机 最近工作方向为缩减模型规模&#xff0c;切入点为L1正则化&#xff0c;选择该切入点的理由如下&#xff0c; 众所周知&#xff0c;L1正则化能令权重矩阵更稀疏。在推荐系统中特征多为embedding&#xff0c;权重矩阵稀疏意味着一些embedding_weight为0&#xff0c;模型部…

FTRL算法详解

一、算法原理 二、算法逻辑 三、个人理解 从loss function的形式来看&#xff1a;FTRL就是将RDA-L1的“梯度累加”思想应用在FOBOS-L1上&#xff0c;并施加一个L2正则项。【PS&#xff1a;paper上是没有加L2正则项的】这样达到的效果是&#xff1a; 累积加和限定了新的迭代结果…

FTRL算法理解

本文主要是对FTRL算法来源、原理、应用的总结和自己的思考。 解决的问题 1、训练数据层面&#xff1a;数据量大、特征规模大 2、常用的LR和FM这类模型的参数学习&#xff0c;传统的学习算法是batch learning算法&#xff0c;无法有效地处理大规模的数据集&#xff0c;也无法…

ftrl 流式更新 java_深入理解FTRL

FTRL算法是吸取了FOBOS算法和RDA算法的两者优点形成的Online Learning算法。读懂这篇文章&#xff0c;你需要理解LR、SGD、L1正则。 FOBOS算法 前向后向切分(FOBOS&#xff0c;Forward Backward Splitting)是 John Duchi 和 Yoran Singer 提出的。在该算法中&#xff0c;权重的…