神经网络为什么需要非线性激活函数?
首先我们来看下线性和非线性函数
线性变换函数,比如:
y=2x
y=x
非线性变换函数,比如:
y=2x2
y=cosx
非线性函数是指的一阶导数不为常数的函数
如果神经网络激活函数用线性函数,则网络的输出
y还是
x输入的一个线性函数,则模型无法表征非线性函数的输出
比如在第一层神经元:
a1?=w1?x+b1?
第二层神经元:
a2?=w2?a1?+b2?=w2?(w1?x+b1?)+b2?
=(w2?w1?)x+(w2?b1?+b2?)=w′x+b′
…
y的输出是
x的线性关系,线性函数的组合还是线性函数,所以网络再深,最后输出的
y还是
x的线性函数。所以用非线性激活函数,神经网络理论上可以逼近任意函数。
那么对于我们常见的非线性激活函数,他们各自又有什么特点和缺陷?
Sigmoid
数学表达式:
f(x)=1+e?x1?
函数图形:
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)其中
maxf(x)′=1/4,根据BP算法中的链式法则,当网络很深的时候,小于1的数(1/4)累乘会趋向于0,如下图所示:
我们令
θu?(t)表示第
t层神经元
u的残差,
fv?(x)表示为神经元v经过激活函数
f(x)的输出,则有如下公式:
?θ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)?θ(t?q)??∣∣∣?=∣∣?∏m=1q?WF(Net(t?m))?∣∣?≤(∣∣?W?∣∣?maxNet?{∣∣?F′(Net)?∣∣?})q
其中
maxf′=1/4;则当
∣∣?W?∣∣?<4时候,上式子将会是一个小于1的值的
q次乘方,则模型越往前传播,梯度会越来越小,甚至接近0,出现梯度消失现象,网络中的参数没法学习更新的情况。
Output非zero-centered
sigmoid函数,将输出值映射到 (0,1)之间,都是正数,没有负数,这导致网络的学习表达能力将会受到限制。
Tanh
数学表达式:
f(x)=ex+e?xex?e?x?=1+e?2x2??1=2sigmoid(?2x)?1
从公式可以看出,tanh函数就是sigmoid函数的一个简单缩放,输出值在(-1,1)之间,输出是以0为中心的。
函数图形:
f(x)的导数数学表达式:
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)′={1x>00x≤0?
函数导数图形:
这里需要说明的一点是,ReLu是非线性函数,因为导数不是一个常数,虽然看着简单,但是ReLu函数是分段函数,组合可以逼近任意函数。
ReLu函数,时间和空间复杂度最低,也不需要更高的指数运算,而且能够缓解梯度消失问题。
缺陷
ReLu函数的一个缺陷是会引入死亡问题。什么叫“死亡问题”?
首先让我们来回顾下网络模型更新过程中的BP算法:
如上图所示,假设我们用平方和损失函数:
E=21?j=1∑M?(yj??tj?)2 其中
t={t1?,...,tm?}是一个M维度的向量,代表的是每个样本的真实label标签。
yj?是输出预测的第
j个输出label值。BP反向传播更新参数梯度如下公式:
step1 :计算神经元输出值的导数
?yj??E?=yj??tj?
step2: 计算神经元输入值的导数(通常称为“残差”)
?uj??E?=?yj??E?.?uj??yj??=(yj??tj?).f(x)′=(yj??tj?).yj?(1?yj?)=ej?
若
f(x)为sigmoid激活函数
step3: 计算权重梯度
?wij′??E?=?uj??E?.?wij′??uj??=ej?.hi?也就是第
n层的第
i个神经元与第
n+1层的第
j个神经元连接的权重
wij′?的每一次更新的梯度
Δwij′?就是第n层的第
i个神经元的输出值乘以第n+1层的第
j个神经元的残差
若输入
x≤0则经过ReLu激活函数后,神经元的输出为0,所谓的“死忙问题”,那么连接的该神经元的权重梯度为0,导致权重无法更新问题,神经元处于死忙状态。
Leaky ReLu
Rectifier Nonlinearities Improve Neural Network Acoustic Models
数学表达式如下:
f(x)={xx>0axx≤0?
函数图形如下:
函数导数数学表达式:
f(x)′={1x>0ax≤0?
图像如下:
其中
a,是一个很小的常数,避免神经元输出为0,缓解了ReLu的“死忙问题”,但是
a是一个人工定的参数,不够灵活,所以,有一些工作,比如像Parametric ReLu把
a当做一个参数进行训练,网络自适应学习得来。
ELU
FAST AND ACCURATE DEEP NETWORK LEARNING BY
EXPONENTIAL LINEAR UNITS
数学表达式:
f(x)={xx>0a(ex?1)x≤0?
函数图形:
导数数学表达式:
f(x)′={1x>0a+f(x)x≤0?
导数图形:
其中
a是一个很小的常数。整体来看,Leaky ReLu,ELU以及其它的一些变体,都是在保证ReLu激活函数优势的情况下,缓解神经元"死忙"问题,从ELU公式可以看出,
x小于0的部分,用一个指数变化形式,相对复杂一些,计算开销比Leaky ReLu要高,但输出更加平滑。
GeLu
基础知识回顾
正态分布
正态分布又名高斯分布,是一个非常常见的连续概率分布。若随机变量
X服从一个位置参数
μ、尺度参数
σ的正态分布,记为:
X~N(μ,σ2)则其概率密度函数为
f(x)=σ2π
μ等于位置参数,决定了分布的位置,其方差
σ2的开平方或标准差
σ等于尺度参数,决定了分布的幅度。我们通常说的标准正态分布是位置参数
μ=0,尺度参数
σ2=1的正态分布,下图展示了不同
μ和
σ的正态分布图
拉普拉斯在误差分析实验中使用了正态分布,勒让德于1805年引入最小二乘法这一重要方法,而高斯则宣传在1794年就使用了该方法,并通过假设误差服从正态分布。
有几种不同的方法用来说明一个随机变量,最直观的方法是概率密度函数,这种方法能够表示随机变量每个取值多大的可能性。
概率密度函数
正态分布的概率密度函数均值为
μ,方差为
σ是高斯函数的一个实例:
f(x;μ,σ)=σ2π
X服从这个分布,我们写作
X~N(μ,σ2)。如果
μ=0并且
σ=1,这个分布被称为标准正态分布,这个分布简化为:
f(x)=2π
累积分布函数
累积分布函数是指随机变量
X小于或等于
x的概率,用概率密度函数表示为
F(x;μ,σ)=σ2π
Φ(z)=21?[1+erf(σ2
μ=0,σ=1时的值,用误差函数表示的公式简化为:
Φ(z)=21?[1+erf(2
erf(x),称为误差函数(也称为高斯误差函数),它的定义如下:
erf(x)=π
GeLu激活函数
GAUSSIAN ERROR LINEAR UNITS (GELUS)
论文中对比了GeLu激活函数在试验效果比ReLu,ELU都好,加上在bert中的应用,最近引起了广泛的关注。
函数数学公式:
f(x)=xP(X≤x)=xΦ(x)
其中
Φ(x)=21?[1+erf(2
X~N(0,1),Φ(x)是标准正态分布的累积分布函数,论文提供的近似求解公式:
f(x)=xΦ(x)=0.5x(1+tanh[2/π
函数图形:
函数导数图形:
GeLu激活函数的直观理解
GeLu函数综合了dropout和ReLu的特色,从上面公式我们也可以看出,从ReLu, Leakly ReLu,ELU等,都是在对输入神经元乘以1或者0或者一个
a常量进行变化,当
x≥0的时候,以上三个函数都是乘以1作为神经元的输出,当
x≤0的时候,则乘以0或者
a作为神经元的输出。
但GeLu是对
x乘以标准正态分布的累积分布函数,根据
x的输入,平滑的进行变化,随着x变小,
Φ(x)变小,则神经元的输入
x会以大概率的情况下“丢弃",整个过程相对ReLu激活函数更smooth
GeLu函数的公式推导
误差函数与标准正态分布的积分累积分布函数的关系为:
Φ(x)=21?[1+erf(2
从上述(1)和(2)公式可以看出,需要证明:
erf(2
a≈0.044715
证明如下:
泰勒级数
在数学上,对于一个实数或复数
a领域上,以实数作为变量或以复数作为变量的函数,并且是无穷可微的函数
f(x),它的泰勒级数是以下这种形式的幂级数:
f(x)=n=0∑∞?n!f(n)(a)?(x?a)n这里
n!表示
n的阶乘,而
f(n)(a)表示函数
f在点
a处的
n阶导数,如果
a=0,也可以把这个级数称为麦克劳林级数。
指数函数
ex的等价幂级数:
ex=1+n=1∑∞?n!xn?=1+x+2!x2?+3!x3?+4!x4?+...
tanh(x)的泰勒级数:
tanh(x)=x?3x3?+o(x3)
erf(x)的泰勒级数:
erf(x)=π
tanh(π2?
erf(2
令公式(3)和公式(4)相等,则
a≈0.04553992412,与论文中
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