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


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

首先我们来看下线性和非线性函数
线性变换函数,比如:

y=2x y=2x

y=2x

y=x y =x

y=x
非线性变换函数,比如:

y=2x2 y=2x^2

y=2x2

y=cosx y=cosx

y=cosx
非线性函数是指的一阶导数不为常数的函数
如果神经网络激活函数用线性函数,则网络的输出

yy

y还是

xx

x输入的一个线性函数,则模型无法表征非线性函数的输出
比如在第一层神经元:

a1=w1x+b1a_1=w_1x+b_1

a1?=w1?x+b1?
第二层神经元:

a2=w2a1+b2=w2(w1x+b1)+b2 a_2=w_2a_1+b_2=w_2(w_1x+b_1)+b_2

a2?=w2?a1?+b2?=w2?(w1?x+b1?)+b2?

=(w2w1)x+(w2b1+b2)=wx+b=(w_2w_1)x+(w_2b_1+b_2)=w^{'}x+b^{'}

=(w2?w1?)x+(w2?b1?+b2?)=w′x+b′

yy

y的输出是

xx

x的线性关系,线性函数的组合还是线性函数,所以网络再深,最后输出的

yy

y还是

xx

x的线性函数。所以用非线性激活函数,神经网络理论上可以逼近任意函数。
那么对于我们常见的非线性激活函数,他们各自又有什么特点和缺陷?

Sigmoid

数学表达式:

f(x)=11+e?x f(x)= \frac {1}{1+e^{-x}}

f(x)=1+e?x1?
函数图形:

在这里插入图片描述

f(x)f(x)

f(x)的导数数学表达式:

f(x)=f(x)(1?f(x)) f(x)^{'}=f(x)(1-f(x))

f(x)′=f(x)(1?f(x))函数导数图形:
在这里插入图片描述
python实现如下:

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

缺陷

梯度消失

我们知道

f(x)=sigmoid(x)f(x)=sigmoid(x)

f(x)=sigmoid(x)其中

maxf(x)=1/4max f(x)^{'}=1/4

maxf(x)′=1/4,根据BP算法中的链式法则,当网络很深的时候,小于1的数(1/4)累乘会趋向于0,如下图所示:
在这里插入图片描述
我们令

θu(t)\theta_u(t)

θu?(t)表示第

tt

t层神经元

uu

u的残差,

fv(x)f_v(x)

fv?(x)表示为神经元v经过激活函数

f(x)f(x)

f(x)的输出,则有如下公式:

?θv(t?q)?θu(t)={fv(netv(t?1))wuvif q=1fv(netv(t?q))l=1n?θl(t?q+1)?θ(t)wlvelse \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?(t?q)?={fv′?(netv?(t?1))wuv?if q=1fv′?(netv?(t?q))∑l=1n??θ(t)?θl?(t?q+1)?wlv?else?

?θ(t?q)?θ(t)=m=1qWF(Net(t?m))(WmaxNet{F(Net)})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)?θ(t?q)??∣∣∣?=∣∣?∏m=1q?WF(Net(t?m))?∣∣?≤(∣∣?W?∣∣?maxNet?{∣∣?F′(Net)?∣∣?})q
其中

maxf=1/4maxf^{'}=1/4

maxf′=1/4;则当

W<4\begin{vmatrix}W\end{vmatrix} < 4

∣∣?W?∣∣?<4时候,上式子将会是一个小于1的值的 qq

q次乘方,则模型越往前传播,梯度会越来越小,甚至接近0,出现梯度消失现象,网络中的参数没法学习更新的情况。

Output非zero-centered

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

Tanh

数学表达式:

f(x)=ex?e?xex+e?x=21+e?2x?1=2sigmoid(?2x)?1 f(x)= \frac {e^x-e^{-x}} {e^x+e^{-x}} = \frac {2}{1+e^{-2x}} -1=2sigmoid(-2x)-1

f(x)=ex+e?xex?e?x?=1+e?2x2??1=2sigmoid(?2x)?1
从公式可以看出,tanh函数就是sigmoid函数的一个简单缩放,输出值在(-1,1)之间,输出是以0为中心的。
函数图形:
在这里插入图片描述

f(x)f(x)

f(x)的导数数学表达式:

f(x)=1?f(x)2 f(x)^{'} = 1-f(x)^2

f(x)′=1?f(x)2

函数导数图形:
在这里插入图片描述

python实现如下:

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

缺陷

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

ReLu

ReLu(Rectified Linear Unit)数学表达式:

f(x)=max(0,x) f(x) = max(0,x)

f(x)=max(0,x)
函数图形:
在这里插入图片描述
函数导数数学表达式:

f(x)={1x>00x0 f(x)^{'} =
\begin {cases} 1 \quad x>0 \\ 0 \quad x \le 0 \end {cases}

f(x)′={1x>00x≤0?

函数导数图形:
在这里插入图片描述

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

缺陷

ReLu函数的一个缺陷是会引入死亡问题。什么叫“死亡问题”?
首先让我们来回顾下网络模型更新过程中的BP算法:

在这里插入图片描述
如上图所示,假设我们用平方和损失函数:

E=12j=1M(yj?tj)2 E = \frac {1}{2} \sum_{j=1}^{M}(y_j-t_j)^2

E=21?j=1∑M?(yj??tj?)2 其中

t={t1,...,tm}t =\{t_1,...,t_m\}

t={t1?,...,tm?}是一个M维度的向量,代表的是每个样本的真实label标签。

yjy_j

yj?是输出预测的第

jj

j个输出label值。BP反向传播更新参数梯度如下公式:

step1 :计算神经元输出值的导数

?E?yj=yj?tj \frac {\partial E} {\partial y_j} = y_j-t_j

?yj??E?=yj??tj?

step2: 计算神经元输入值的导数(通常称为“残差”)

?E?uj=?E?yj.?yj?uj=(yj?tj).f(x)=(yj?tj).yj(1?yj)=ej \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

?uj??E?=?yj??E?.?uj??yj??=(yj??tj?).f(x)′=(yj??tj?).yj?(1?yj?)=ej?

f(x)f(x)

f(x)为sigmoid激活函数

step3: 计算权重梯度

?E?wij=?E?uj.?uj?wij=ej.hi \frac {\partial E}{\partial w_{ij}^{'}}=\frac {\partial E} {\partial u_j}. \frac {\partial u_j} {\partial w_{ij}^{'}}=e_j.h_i

?wij′??E?=?uj??E?.?wij′??uj??=ej?.hi?也就是第

nn

n层的第

ii

i个神经元与第

n+1n+1

n+1层的第

jj

j个神经元连接的权重

wijw_{ij}^{'}

wij′?的每一次更新的梯度

Δwij\Delta w_{ij}^{'}

Δwij′?就是第n层的第

ii

i个神经元的输出值乘以第n+1层的第

jj

j个神经元的残差
若输入

x0x \le 0

x≤0则经过ReLu激活函数后,神经元的输出为0,所谓的“死忙问题”,那么连接的该神经元的权重梯度为0,导致权重无法更新问题,神经元处于死忙状态。

Leaky ReLu

Rectifier Nonlinearities Improve Neural Network Acoustic Models
数学表达式如下:

f(x)={xx>0axx0 f(x)=
\begin {cases} x \quad x>0 \\ ax \quad x \le 0 \end {cases}

f(x)={xx>0axx≤0?
函数图形如下:
在这里插入图片描述
函数导数数学表达式:

f(x)={1x>0ax0 f(x)^{'}=\begin {cases} 1 \quad x>0 \\ a \quad x \le 0 \end {cases}

f(x)′={1x>0ax≤0?
图像如下:
在这里插入图片描述
其中

aa

a,是一个很小的常数,避免神经元输出为0,缓解了ReLu的“死忙问题”,但是

aa

a是一个人工定的参数,不够灵活,所以,有一些工作,比如像Parametric ReLu把

aa

a当做一个参数进行训练,网络自适应学习得来。

ELU

FAST AND ACCURATE DEEP NETWORK LEARNING BY
EXPONENTIAL LINEAR UNITS
数学表达式:

f(x)={xx>0a(ex?1)x0f(x)=
\begin {cases} x \quad x>0 \\ a(e^x-1) \quad x \le 0 \end {cases}

f(x)={xx>0a(ex?1)x≤0?
函数图形:
在这里插入图片描述
导数数学表达式:

f(x)={1x>0a+f(x)x0f(x)^{'}=
\begin {cases} 1 \quad x>0 \\ a+f(x) \quad x \le 0 \end {cases}

f(x)′={1x>0a+f(x)x≤0?
导数图形:
在这里插入图片描述
其中

aa

a是一个很小的常数。整体来看,Leaky ReLu,ELU以及其它的一些变体,都是在保证ReLu激活函数优势的情况下,缓解神经元"死忙"问题,从ELU公式可以看出,

xx

x小于0的部分,用一个指数变化形式,相对复杂一些,计算开销比Leaky ReLu要高,但输出更加平滑。

GeLu

基础知识回顾

正态分布

正态分布又名高斯分布,是一个非常常见的连续概率分布。若随机变量

XX

X服从一个位置参数

μ\mu

μ、尺度参数

σ\sigma

σ的正态分布,记为:

XN(μ,σ2) X ~ N(\mu,\sigma^2)

X~N(μ,σ2)则其概率密度函数为

f(x)=1σ2πe?(x?μ)22σ2f(x)=\frac{1}{\sigma \sqrt{2\pi}}e^{-\frac{(x-\mu)^2}{2\sigma^2}}

f(x)=σ2π?1?e?2σ2(x?μ)2?
正态分布的数学期望值

μ\mu

μ等于位置参数,决定了分布的位置,其方差

σ2\sigma^2

σ2的开平方或标准差

σ\sigma

σ等于尺度参数,决定了分布的幅度。我们通常说的标准正态分布是位置参数

μ=0\mu=0

μ=0,尺度参数

σ2=1\sigma^2=1

σ2=1的正态分布,下图展示了不同

μ\mu

μ和

σ\sigma

σ的正态分布图
在这里插入图片描述
拉普拉斯在误差分析实验中使用了正态分布,勒让德于1805年引入最小二乘法这一重要方法,而高斯则宣传在1794年就使用了该方法,并通过假设误差服从正态分布
有几种不同的方法用来说明一个随机变量,最直观的方法是概率密度函数,这种方法能够表示随机变量每个取值多大的可能性。

概率密度函数

正态分布的概率密度函数均值为

μ\mu

μ,方差为

σ\sigma

σ是高斯函数的一个实例:

f(x;μ,σ)=1σ2πexp(?(x?μ)22σ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?)如果一个随机变量

XX

X服从这个分布,我们写作

XN(μ,σ2)X~ N(\mu,\sigma^2)

X~N(μ,σ2)。如果

μ=0\mu=0

μ=0并且

σ=1\sigma=1

σ=1,这个分布被称为标准正态分布,这个分布简化为:

f(x)=12πexp(?x22)f(x)=\frac{1}{\sqrt{2\pi}}exp(-\frac{x^2}{2})

f(x)=2π?1?exp(?2x2?),下图给出了不同参数的正态分布的函数图:
在这里插入图片描述

累积分布函数

累积分布函数是指随机变量

XX

X小于或等于

xx

x的概率,用概率密度函数表示为

F(x;μ,σ)=1σ2π?xexp(?t?μ22σ2)dtF(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?∫?∞x?exp(?2σ2t?μ2?)dt
正态分布的累积分布函数能够由一个叫做误差函数的特殊函数表示:

Φ(z)=12[1+erf(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)=12[1+erf(z2)] Φ(z)=\frac{1}{2}\begin{bmatrix}1+erf(\frac{z}{\sqrt{2}}) \end{bmatrix}

Φ(z)=21?[1+erf(2?z?)?]
其中

erf(x)erf(x)

erf(x),称为误差函数(也称为高斯误差函数),它的定义如下:

erf(x)=1π?xxe?t2dt=2π0xe?t2dterf(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?∫?xx?e?t2dt=π?2?∫0x?e?t2dt
累积分布函数图形如下:
在这里插入图片描述

GeLu激活函数

GAUSSIAN ERROR LINEAR UNITS (GELUS)
论文中对比了GeLu激活函数在试验效果比ReLu,ELU都好,加上在bert中的应用,最近引起了广泛的关注。
函数数学公式:

f(x)=xP(Xx)=xΦ(x)f(x)= xP(X \le x) = xΦ(x)

f(x)=xP(X≤x)=xΦ(x)
其中

Φ(x)=12[1+erf(x2)]1 Φ(x)=\frac{1}{2}\begin{bmatrix}1+erf(\frac{x}{\sqrt{2}}) \end{bmatrix} { (1)}

Φ(x)=21?[1+erf(2?x?)?](1)

XN(0,1),Φ(x)X~N(0,1){,}Φ(x)

X~N(0,1),Φ(x)是标准正态分布的累积分布函数,论文提供的近似求解公式:

f(x)=xΦ(x)=0.5x(1+tanh[2/π(x+0.044715x3)])2 f(x)=xΦ(x)=0.5x(1+tanh[ \sqrt{2/\pi}(x+0.044715x^3)]) {(2)}

f(x)=xΦ(x)=0.5x(1+tanh[2/π?(x+0.044715x3)])(2)
函数图形:
在这里插入图片描述
函数导数图形:
在这里插入图片描述

GeLu激活函数的直观理解

GeLu函数综合了dropout和ReLu的特色,从上面公式我们也可以看出,从ReLu, Leakly ReLu,ELU等,都是在对输入神经元乘以1或者0或者一个

aa

a常量进行变化,当

x0x \ge 0

x≥0的时候,以上三个函数都是乘以1作为神经元的输出,当

x0x \le 0

x≤0的时候,则乘以0或者

aa

a作为神经元的输出。
但GeLu是对

xx

x乘以标准正态分布的累积分布函数,根据

xx

x的输入,平滑的进行变化,随着x变小,

Φ(x)Φ(x)

Φ(x)变小,则神经元的输入

xx

x会以大概率的情况下“丢弃",整个过程相对ReLu激活函数更smooth

GeLu函数的公式推导

误差函数与标准正态分布的积分累积分布函数的关系为:

Φ(x)=12[1+erf(x2)]Φ(x)=\frac{1}{2}\begin{bmatrix}1+erf(\frac{x}{\sqrt{2}}) \end{bmatrix}

Φ(x)=21?[1+erf(2?x?)?]
从上述(1)和(2)公式可以看出,需要证明:

erf(x2)tanh(2π(x+ax3)) erf(\frac{x}{\sqrt2}) \approx tanh(\sqrt{\frac{2}{\pi}}(x+ax^3))

erf(2?x?)≈tanh(π2??(x+ax3))其中

a0.044715a \approx 0.044715

a≈0.044715

证明如下:
泰勒级数

在数学上,对于一个实数或复数

aa

a领域上,以实数作为变量或以复数作为变量的函数,并且是无穷可微的函数

f(x)f(x)

f(x),它的泰勒级数是以下这种形式的幂级数:

f(x)=n=0f(n)(a)n!(x?a)nf(x)=\sum_{n=0}^{\infty}\frac{f^{(n)}(a)}{n!}(x-a)^n

f(x)=n=0∑∞?n!f(n)(a)?(x?a)n这里

n!n!

n!表示

nn

n的阶乘,而

f(n)(a)f^{(n)}(a)

f(n)(a)表示函数

ff

f在点

aa

a处的

nn

n阶导数,如果

a=0a=0

a=0,也可以把这个级数称为麦克劳林级数
指数函数

exe^x

ex的等价幂级数:

ex=1+n=1xnn!=1+x+x22!+x33!+x44!+... 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=1∑∞?n!xn?=1+x+2!x2?+3!x3?+4!x4?+...

tanh(x)tanh(x)

tanh(x)的泰勒级数:

tanh(x)=x?x33+o(x3)tanh(x)=x-\frac{x^3}{3}+o(x^3)

tanh(x)=x?3x3?+o(x3)

erf(x)erf(x)

erf(x)的泰勒级数:

erf(x)=2π(x?x33)+o(x3)erf(x)=\frac{2}{\sqrt{\pi}}(x-\frac{x^3}{3})+o(x^3)

erf(x)=π?2?(x?3x3?)+o(x3)

tanh(2π(x+ax3))=2π(x+(a?23π)x3)+o(x3) (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+(a?3π2?)x3)+o(x3) (3)

erf(x2)=2π(x?x36)+o(x3) (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)相等,则

a0.04553992412a \approx 0.04553992412

a≈0.04553992412,与论文中

aa

a为0.044715十分接近。

bert中的glue函数实现如下:

1
2
3
4
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