Sigmoid,tanh,Relu,Leaky ReLu,ELU,GeLu 激活函数理解

Sigmoid,tanh,Relu,Leaky ReLu,ELU,GeLu 激活函数理解为什么需要激活函数 SigmoidtanhR GELUS 参考文献添加链接描述添加链接描述

1 神经网络为什么需要非线性激活函数?

2 Sigmoid

在这里插入图片描述 f ( x ) f(x) f(x)的导数数学表达式: f ( x ) ′ = f ( x ) ( 1 − f ( x ) ) f(x)^{‘}=f(x)(1-f(x)) f(x)=f(x)(1f(x))函数导数图形:
在这里插入图片描述
python实现如下:




import numpy as np def sigmoid(x,derivative=False): if derivative == True: return x * (1 - x) return 1 / (1+np.exp(-x)) 

2.1缺陷

2.1.1 梯度消失

我们知道 f ( x ) = s i g m o i d ( x ) f(x)=sigmoid(x) f(x)=sigmoid(x)其中 m a x f ( x ) ′ = 1 / 4 max f(x)^{‘}=1/4 maxf(x)=1/4,根据BP算法中的链式法则,当网络很深的时候,小于1的数(1/4)累乘会趋向于0,如下图所示:
在这里插入图片描述
我们令 θ u ( t ) \theta_u(t) θu(t)表示第 t t t层神经元 u u u的残差, f v ( x ) f_v(x) fv(x)表示为神经元v经过激活函数 f ( x ) f(x) f(x)的输出,则有如下公式:
∂ θ v ( t − q ) ∂ θ u ( t ) = { f v ′ ( n e t v ( t − 1 ) ) w u v i f   q = 1 f v ′ ( n e t v ( t − q ) ) ∑ l = 1 n ∂ θ l ( t − q + 1 ) ∂ θ ( t ) w l v e l s e \frac{\partial\theta_v(t-q)}{\partial\theta_u(t)}=\begin{cases} f^{‘}_v(net_v(t-1))w_{uv} \quad if \text{ }q=1 \\ f^{‘}_v(net_v(t-q))\sum_{l=1}^n\frac{\partial\theta_l(t-q+1)}{\partial\theta(t)}w_{lv} \quad else \end{cases} θu(t)θv(tq)={
fv(netv(t1))wuvif q=1fv(netv(tq))l=1nθ(t)θl(tq+1)wlvelse

∣ ∂ θ ( t − q ) ∂ θ ( t ) ∣ = ∣ ∏ m = 1 q W F ( N e t ( t − m ) ) ∣ ≤ ( ∣ W ∣ m a x N e t { ∣ F ′ ( N e t ) ∣ } ) q \begin{vmatrix} \frac{\partial\theta(t-q)}{\partial\theta(t)}\end{vmatrix}=\begin{vmatrix}\prod_{m=1}^qWF(Net(t-m))\end{vmatrix} \le (\begin{vmatrix}W\end{vmatrix}max_{Net}\{\begin{vmatrix}F^{‘}(Net)\end{vmatrix}\})^q θ(t)θ(tq)=m=1qWF(Net(tm))(WmaxNet{
F(Net)})q

其中 m a x f ′ = 1 / 4 maxf^{‘}=1/4 maxf=1/4;则当 ∣ W ∣ < 4 \begin{vmatrix}W\end{vmatrix} < 4 W<4时候,上式子将会是一个小于1的值的 q q q次乘方,则模型越往前传播,梯度会越来越小,甚至接近0,出现梯度消失现象,网络中的参数没法学习更新的情况。










2.2.2 Output非zero-centered

sigmoid函数,将输出值映射到 (0,1)之间,都是正数,没有负数,这导致网络的学习表达能力将会受到限制。

3 Tanh

python实现如下:

def tanh(x, derivative=False): if devivative == True: return (1 - (x  2)) return np.tanh(x) 

3.1 缺陷

修正了sigmoid函数输出非0为中心的问题,但是还是不能解决梯度消失的问题

4 ReLu

这里需要说明的一点是,ReLu是非线性函数,因为导数不是一个常数,虽然看着简单,但是ReLu函数是分段函数,组合可以逼近任意函数。
ReLu函数,时间和空间复杂度最低,也不需要更高的指数运算,而且能够缓解梯度消失问题。

4.1 缺陷

在这里插入图片描述
如上图所示,假设我们用平方和损失函数: E = 1 2 ∑ j = 1 M ( y j − t j ) 2 E = \frac {1}{2} \sum_{j=1}^{M}(y_j-t_j)^2 E=21j=1M(yjtj)2 其中 t = { t 1 , . . . , t m } t =\{t_1,…,t_m\} t={
t1,...,tm}
是一个M维度的向量,代表的是每个样本的真实label标签。 y j y_j yj是输出预测的第 j j j个输出label值。BP反向传播更新参数梯度如下公式:
step1 :计算神经元输出值的导数
∂ E ∂ y j = y j − t j \frac {\partial E} {\partial y_j} = y_j-t_j yjE=yjtj
step2: 计算神经元输入值的导数(通常称为“残差”)
∂ E ∂ u j = ∂ E ∂ y j . ∂ y j ∂ u j = ( y j − t j ) . f ( x ) ′ = ( y j − t j ) . y j ( 1 − y j ) = e j \frac {\partial E}{\partial u_j}=\frac {\partial E} {\partial y_j}. \frac {\partial y_j} {\partial u_j}=(y_j-t_j).f(x)^{‘}=(y_j-t_j).y_j(1-y_j)= e_j ujE=yjE.ujyj=(yjtj).f(x)=(yjtj).yj(1yj)=ej
f ( x ) f(x) f(x)为sigmoid激活函数
step3: 计算权重梯度
∂ E ∂ w i j ′ = ∂ E ∂ u j . ∂ u j ∂ w i j ′ = e j . h i \frac {\partial E}{\partial w_{ij}^{‘}}=\frac {\partial E} {\partial u_j}. \frac {\partial u_j} {\partial w_{ij}^{‘}}=e_j.h_i wijE=ujE.wijuj=ej.hi也就是第 n n n层的第 i i i个神经元与第 n + 1 n+1 n+1层的第 j j j个神经元连接的权重 w i j ′ w_{ij}^{‘} wij的每一次更新的梯度 Δ w i j ′ \Delta w_{ij}^{‘} Δwij就是第n层的第 i i i个神经元的输出值乘以第n+1层的第 j j j个神经元的残差
若输入 x ≤ 0 x \le 0 x0则经过ReLu激活函数后,神经元的输出为0,所谓的“死忙问题”,那么连接的该神经元的权重梯度为0,导致权重无法更新问题,神经元处于死忙状态。


















5 Leaky ReLu

6 ELU

FAST AND ACCURATE DEEP NETWORK LEARNING BY
EXPONENTIAL LINEAR UNITS


数学表达式:
f ( x ) = { x x > 0 a ( e x − 1 ) x ≤ 0 f(x)= \begin {cases} x \quad x>0 \\ a(e^x-1) \quad x \le 0 \end {cases} f(x)={
xx>0a(ex1)x0

函数图形:
在这里插入图片描述
导数数学表达式:
f ( x ) ′ = { 1 x > 0 a + f ( x ) x ≤ 0 f(x)^{‘}= \begin {cases} 1 \quad x>0 \\ a+f(x) \quad x \le 0 \end {cases} f(x)={
1x>0a+f(x)x0

导数图形:
在这里插入图片描述
其中 a a a是一个很小的常数。整体来看,Leaky ReLu,ELU以及其它的一些变体,都是在保证ReLu激活函数优势的情况下,缓解神经元”死忙”问题,从ELU公式可以看出, x x x小于0的部分,用一个指数变化形式,相对复杂一些,计算开销比Leaky ReLu要高,但输出更加平滑。


















7 GeLu

7.1 基础知识回顾

7.1.1 正态分布

正态分布又名高斯分布,是一个非常常见的连续概率分布。若随机变量 X X X服从一个位置参数 μ \mu μ、尺度参数 σ \sigma σ的正态分布,记为: X ∼ N ( μ , σ 2 ) X ∼ N(\mu,\sigma^2) XN(μ,σ2)则其概率密度函数为 f ( x ) = 1 σ 2 π e − ( x − μ ) 2 2 σ 2 f(x)=\frac{1}{\sigma \sqrt{2\pi}}e^{-\frac{(x-\mu)^2}{2\sigma^2}} f(x)=σ2π
1
e2σ2(xμ)2

正态分布的数学期望值 μ \mu μ等于位置参数,决定了分布的位置,其方差 σ 2 \sigma^2 σ2的开平方或标准差 σ \sigma σ等于尺度参数,决定了分布的幅度。我们通常说的标准正态分布是位置参数 μ = 0 \mu=0 μ=0,尺度参数 σ 2 = 1 \sigma^2=1 σ2=1的正态分布,下图展示了不同 μ \mu μ σ \sigma σ的正态分布图
在这里插入图片描述
拉普拉斯在误差分析实验中使用了正态分布,勒让德于1805年引入最小二乘法这一重要方法,而高斯则宣传在1794年就使用了该方法,并通过假设误差服从正态分布
有几种不同的方法用来说明一个随机变量,最直观的方法是概率密度函数,这种方法能够表示随机变量每个取值多大的可能性。








7.1.2 概率密度函数

正态分布的概率密度函数均值为 μ \mu μ,方差为 σ \sigma σ是高斯函数的一个实例:
f ( x ; μ , σ ) = 1 σ 2 π e x p ( − ( x − μ ) 2 2 σ 2 ) f(x;\mu,\sigma)=\frac{1}{\sigma\sqrt{2\pi}}exp(-\frac{(x-\mu)^2}{2\sigma^2}) f(x;μ,σ)=σ2π
1
exp(2σ2(xμ)2)
如果一个随机变量 X X X服从这个分布,我们写作 X ∼ N ( μ , σ 2 ) X∼ N(\mu,\sigma^2) XN(μ,σ2)。如果 μ = 0 \mu=0 μ=0并且 σ = 1 \sigma=1 σ=1,这个分布被称为标准正态分布,这个分布简化为: f ( x ) = 1 2 π e x p ( − x 2 2 ) f(x)=\frac{1}{\sqrt{2\pi}}exp(-\frac{x^2}{2}) f(x)=2π
1
exp(2x2)
,下图给出了不同参数的正态分布的函数图:
在这里插入图片描述




7.1.3 累积分布函数

累积分布函数是指随机变量 X X X小于或等于 x x x的概率,用概率密度函数表示为 F ( x ; μ , σ ) = 1 σ 2 π ∫ − ∞ x e x p ( − ( t − μ ) 2 2 σ 2 ) d t F(x;\mu,\sigma)=\frac{1}{\sigma\sqrt{2\pi}}\int^x_{-\infty} exp(-\frac{
{(t-\mu)}^2}{2\sigma^2})dt
F(x;μ,σ)=σ2π
1
xexp(2σ2(tμ)2)dt

标准正态分布的累积分布函数习惯上记为 Φ Φ Φ,它仅仅是 μ = 0 \mu=0 μ=0, σ = 1 \sigma=1 σ=1时的值,
Φ ( x ) = F ( x ; 0 , 1 ) = 1 2 π ∫ − ∞ x e x p ( − t 2 2 ) d t Φ(x)=F(x;0,1)=\frac{1}{\sqrt{2\pi}}\int^x_{-\infty} exp(-\frac{
{t}^2}{2})dt
Φ(x)=F(x;0,1)=2π
1
xexp(2t2)dt

正态分布的累积分布函数能够由一个叫做误差函数的特殊函数表示:
Φ ( z ) = 1 2 [ 1 + e r f ( z − μ σ 2 ) ] Φ(z)=\frac{1}{2}\begin{bmatrix}1+erf(\frac{z-\mu}{\sigma\sqrt{2}}) \end{bmatrix} Φ(z)=21[1+erf(σ2
zμ
)
]

标准正态分布的累积分布函数习惯上记为Φ,它仅仅是指 μ = 0 , σ = 1 \mu=0,\sigma=1 μ=0σ=1时的值,用误差函数表示的公式简化为:
Φ ( z ) = 1 2 [ 1 + e r f ( z 2 ) ] Φ(z)=\frac{1}{2}\begin{bmatrix}1+erf(\frac{z}{\sqrt{2}}) \end{bmatrix} Φ(z)=21[1+erf(2
z
)
]

其中 e r f ( x ) erf(x) erf(x),称为误差函数(也称为高斯误差函数),它的定义如下:
e r f ( x ) = 1 π ∫ − x x e − t 2 d t = 2 π ∫ 0 x e − t 2 d t erf(x)=\frac{1}{\sqrt\pi}\int^x_{-x}e^{-t^2}dt=\frac{2}{\sqrt\pi}\int_0^xe^{-t^2}dt erf(x)=π
1
xxet2dt=
π
2
0xet2dt

累积分布函数图形如下:
在这里插入图片描述




















7.1.4 Φ(x)与erf(x)函数关系公式推导

Φ ( x ) = 1 2 π ∑ − ∞ x e − t 2 2 d t = 2 2 π ∑ − ∞ x e − ( t 2 ) 2 d t 2 Φ(x)=\frac{1}{\sqrt{2\pi}}\sum_{-\infty}^xe^{-\frac{t^2}{2}}dt=\frac{\sqrt{2}}{\sqrt{2\pi}}\sum_{-\infty}^{x}e^{-(\frac{t}{\sqrt{2}})^2}d\frac{t}{\sqrt{2}} Φ(x)=2π
1
xe2t2dt=
2π
2
xe(2
t
)2
d2
t

= 1 π ∑ − ∞ x 2 e − z 2 d z = 1 π ∑ − ∞ 0 e − z 2 d z + 1 π ∑ 0 x 2 e − z 2 d z =\frac{1}{\pi}\sum_{-\infty}^{\frac{x}{\sqrt{2}}}e^{-z^2}dz=\frac{1}{\pi}\sum_{-\infty}^0e^{-z^2}dz+\frac{1}{\pi}\sum_{0}^{\frac{x}{\sqrt{2}}}e^{-z^2}dz =π12
x
ez2dz=
π10ez2dz+π102
x
ez2dz

= 1 2 + 1 2 e r f ( x π ) = 1 2 [ 1 + e r f ( x 2 ) ] =\frac{1}{2}+\frac{1}{2}erf(\frac{x}{\sqrt{\pi}})=\frac{1}{2}\begin{bmatrix}1+erf(\frac{x}{\sqrt{2}})\end{bmatrix} =21+21erf(π
x
)=
21[1+erf(2
x
)
]

8 GeLu激活函数

8.1 GeLu激活函数的直观理解

GeLu函数综合了dropout和ReLu的特色,从上面公式我们也可以看出,从ReLu, Leakly ReLu,ELU等,都是在对输入神经元乘以1或者0或者一个 a a a常量进行变化,当 x ≥ 0 x \ge 0 x0的时候,以上三个函数都是乘以1作为神经元的输出,当 x ≤ 0 x \le 0 x0的时候,则乘以0或者 a a a作为神经元的输出。
但GeLu是对 x x x乘以标准正态分布的累积分布函数,根据 x x x的输入,平滑的进行变化,随着x变小, Φ ( x ) Φ(x) Φ(x)变小,则神经元的输入 x x x会以大概率的情况下“丢弃”,整个过程相对ReLu激活函数更smooth

8.2 GeLu函数的公式推导

误差函数与标准正态分布的积分累积分布函数的关系为: Φ ( x ) = 1 2 [ 1 + e r f ( x 2 ) ] Φ(x)=\frac{1}{2}\begin{bmatrix}1+erf(\frac{x}{\sqrt{2}}) \end{bmatrix} Φ(x)=21[1+erf(2
x
)
]

从上述(1)和(2)公式可以看出,需要证明:
e r f ( x 2 ) ≈ t a n h ( 2 π ( x + a x 3 ) ) erf(\frac{x}{\sqrt2}) \approx tanh(\sqrt{\frac{2}{\pi}}(x+ax^3)) erf(2
x
)
tanh(π2
(x+
ax3))
其中 a ≈ 0.044715 a \approx 0.044715 a0.044715




证明如下:
泰勒级数
在数学上,对于一个实数或复数 a a a领域上,以实数作为变量或以复数作为变量的函数,并且是无穷可微的函数 f ( x ) f(x) f(x),它的泰勒级数是以下这种形式的幂级数:
f ( x ) = ∑ n = 0 ∞ f ( n ) ( a ) n ! ( x − a ) n f(x)=\sum_{n=0}^{\infty}\frac{f^{(n)}(a)}{n!}(x-a)^n f(x)=n=0n!f(n)(a)(xa)n这里 n ! n! n!表示 n n n的阶乘,而 f ( n ) ( a ) f^{(n)}(a) f(n)(a)表示函数 f f f在点 a a a处的 n n n阶导数,如果 a = 0 a=0 a=0,也可以把这个级数称为麦克劳林级数
指数函数 e x e^x ex的等价幂级数:
e x = 1 + ∑ n = 1 ∞ x n n ! = 1 + x + x 2 2 ! + x 3 3 ! + x 4 4 ! + . . . e^x=1+\sum_{n=1}^{\infty}\frac{x^n}{n!}=1+x+\frac{x^2}{2!}+\frac{x^3}{3!}+\frac{x^4}{4!}+… ex=1+n=1n!xn=1+x+2!x2+3!x3+4!x4+...
t a n h ( x ) tanh(x) tanh(x)的泰勒级数: t a n h ( x ) = x − x 3 3 + o ( x 3 ) tanh(x)=x-\frac{x^3}{3}+o(x^3) tanh(x)=x3x3+o(x3)
e r f ( x ) erf(x) erf(x)的泰勒级数: e r f ( x ) = 2 π ( x − x 3 3 ) + o ( x 3 ) erf(x)=\frac{2}{\sqrt{\pi}}(x-\frac{x^3}{3})+o(x^3) erf(x)=π
2
(x
3x3)+o(x3)

t a n h ( 2 π ( x + a x 3 ) ) = 2 π ( x + ( a − 2 3 π ) x 3 ) + o ( x 3 )   (3)  tanh(\sqrt{\frac{2}{\pi}}(x+ax^3)) = \sqrt{\frac{2}{\pi}}(x+(a-\frac{2}{3\pi})x^3)+o(x^3) \text{ }\text{ }\text{(3) } tanh(π2
(x+
ax3))=π2
(x+
(a3π2)x3)+o(x3)  3 

e r f ( x 2 ) = 2 π ( x − x 3 6 ) + o ( x 3 )   (4)  erf(\frac{x}{\sqrt{2}})=\sqrt{\frac{2}{\pi}}(x-\frac{x^3}{6})+o(x^3) \text{ }\text{ }\text{(4) } erf(2
x
)=
π2
(x
6x3)+o(x3)  4 

令公式(3)和公式(4)相等,则 a ≈ 0.0 a \approx 0.0 a0.04553992412,与论文中 a a a为0.044715十分接近。




















bert中的glue函数实现如下:

def gelu(x): cdf = 0.5 * (1.0 + tf.tanh( (np.sqrt(2 / np.pi) * (x + 0.044715 * tf.pow(x,3)))) return x * cdf 

说明:本文图片素材来源Casper Hansen博文以及wikipedia

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/221651.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午5:35
下一篇 2026年3月17日 下午5:36


相关推荐

  • 自定义bt服务器,[教程]Aria2自动更新BT Tracker服务器列表的方法[通俗易懂]

    自定义bt服务器,[教程]Aria2自动更新BT Tracker服务器列表的方法[通俗易懂]说明公开的BTtracker服务器,因为种种原因总会经常失效,要想获取更多的peer需要经常维护这份列表。感谢github上的小伙伴提供了这么一份tracker自动更新列表:trackerslist。我们要想Aria2也支持自动更新这份列表,那么你可以按照下面方法来实现。方法此文仅适用于Centos系统,其它系统稍作变更即可。我没有使用过其它系统,这里也就不提供兼容性的脚本了。示例:Aria2安…

    2022年9月30日
    4
  • jenkins教程_1 简介「建议收藏」

    jenkins教程_1 简介「建议收藏」文章内容https://gitee.com/fakerlove/jenkins文章目录1.简介1.1介绍1.2环境准备1.2.1安装jenkins1)离线安装2)docker安装3)访问jenkins1.2.2安装gitlab一、安装及配置1.gitlab镜像拉取2.运行gitlab镜像3.配置4.创建一个项目二、用户使用1.下载git.exe2.登录gitlab网页3.设置ssh4.从gitlab克隆代码5.提交代码到gitlab1.2.3gitlab占用内存太多问题1.简.

    2022年5月15日
    39
  • pytorch安装、环境搭建及在pycharm中的设置

    pytorch安装、环境搭建及在pycharm中的设置pytorch安装、环境搭建及在pycharm中设置这两天同学在问我pytorch的安装,因为自己的已经安装好了,但是好像又有点遗忘,所以记录一下。一、安装python直接到官网找到和自己设备匹配的版本下载安装即可。安装过程不会出现太多问题,一般情况下python安装在本机上,故可以直接在终端测试是否安装成功。只需win+R——cmd——输入python,就会输出python的版本信息。…

    2022年8月29日
    4
  • mysql全文检索 分词_sqlserver全文检索

    mysql全文检索 分词_sqlserver全文检索通常情况下,全文检索引擎我们一般会用ES组件(传送门:SpringBoot系列——ElasticSearch),但不是所有业务都有那么大的数据量、那么大的并发要求,MySQL5.7之后内置了ngram分词器,支持中文分词,使用全文索引,即可实现对中文语义分词检索MySQL全文检索官方文档介绍:https://dev.mysql.com/doc/refman/5.7/en/fulltext-search.html  查看MySQL版本创建game游戏表,并插入数据插入全文索引  可以在mysq

    2022年8月24日
    12
  • 俞敏洪是新东方_新东方创始人是谁

    俞敏洪是新东方_新东方创始人是谁一年前,不用考虑省略号后的故事,那是个不可能的假设。作为教育培训机构,新东方带有比一般企业更为浓烈的创始人气质。俞敏洪就是新东方,他的儒雅风度、人文情怀、幽默口才,卡内基式奋斗经历,都成为公司的标签。特别是另外两位同样富有个性魅力的创始人徐小平和王强离开后,俞更没有理由拒绝扮演这

    2025年11月2日
    9
  • Mysql和redis_简述Redis和MySQL的区别[通俗易懂]

    Mysql和redis_简述Redis和MySQL的区别[通俗易懂]我们知道,mysql是持久化存储,存放在磁盘里面,检索的话,会涉及到一定的IO,为了解决这个瓶颈,于是出现了缓存,比如现在用的最多的memcached(简称mc)。首先,用户访问mc,如果未命中,就去访问mysql,之后像内存和硬盘一样,把数据复制到mc一部分。redis和mc都是缓存,并且都是驻留在内存中运行的,这大大提升了高数据量web访问的访问速度。然而mc只是提供了简单的数据结构,比如…

    2022年6月16日
    52

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号