- 什么是激活函数
神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层)。在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)。
- 为什么使用激活函数
如果不用激活函数(其实相当于激励函数是 f ( x ) = x f(x) = x f(x)=x),每一层节点的输入都是上层输出的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种就是最原始的感知机(Perceptron)了,那么网络的逼近能力就相当有限。因此,引入非线性函数作为激励函数,这样深层神经网络表达能力就更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)。
- 激活函数在运用中所需要得性质
右饱和:当一个激活函数
h
(
x
)
h(x)
h(x)满足以下条件,n趋于正无穷,称为右饱和
lim
n
→
+
∞
=
h
′
(
x
)
=
0
\lim\limits_{n\to+\infty}=h'(x)=0
n→+∞lim=h′(x)=0
左饱和:当一个激活函数h(x)满足以下条件,n趋于负无穷,称为左饱和
lim
n
→
−
∞
=
h
′
(
x
)
=
0
\lim\limits_{n\to-\infty}=h'(x)=0
n→−∞lim=h′(x)=0
饱和:当一个激活函数,既满足左饱和又满足又饱和时,我们称之为饱和
硬饱和:对任意的 x x x,如果存在常数 c c c,当 x > c x>c x>c时恒有 h ′ ( x ) = 0 h'(x)=0 h′(x)=0,则称其为右硬饱和,当 x < c x<c x<c时恒有 h ′ ( x ) = 0 h'(x)=0 h′(x)=0,则称其为左硬饱和。若既满足左硬饱和,又满足右硬饱和,则称这种激活函数为硬饱和。
软饱和:对任意的 x x x,如果存在常数 c c c,当 x > c x>c x>c时,恒有趋近于 0 0 0,则称其为右软饱和。如果对于任意的 x x x,如果存在常数 c c c,当 x < c x<c x<c时,恒有趋近于 0 0 0,则称其为左软饱和。既满足左软饱和又满足右软饱和的我们称这种函数为软饱和。
Sigmoid函数
f ( x ) = 1 1 + e − x f(x)=\frac{1}{1+e^{-x}} f(x)=1+e−x1
![](https://i-blog.csdnimg.cn/blog_migrate/e15dd67fd63a8c18aa7d969c68bdac41.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b40ed74af08b9b3e121b3f400766113e.png)
- 梯度消失:
如果我们初始化神经网络的权值为 [ 0 , 1 ] [0,1] [0,1]之间的随机值,而函数趋近 0 和 1 的时候变化率会变得平坦,也就是说,Sigmoid 的梯度趋近于 0,并且Sigmoid函数导数的最大值是0.25。神经网络使用Sigmoid 激活函数进行反向传播时,输出接近 0 或 1 的神经元其梯度趋近于0。这些神经元叫作饱和神经元。因此,这些神经元的权重不会更新。此外,与此类神经元相连的神经元的权重也更新得很慢。该问题叫作梯度消失。因此,如果一个大型神经网络包含Sigmoid 神经元,而其中很多个都处于饱和状态,那么该网络无法执行反向传播。
- 梯度爆炸:
当网络权值初始化为 [ 1 , + ∞ ] [1,+\infty] [1,+∞]区间内的值,则会出现梯度爆炸情况。
- 不以零为中心:
Sigmoid 输出不以零为中心的,output 不是0均值。会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。 产生的一个结果就是:如 x > 0 x>0 x>0, f = w T x + b f=w^Tx+b f=wTx+b,那么对 w w w求局部梯度则都为正,这样在反向传播的过程中 w w w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。
- 计算量大
其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间
tanh函数
t a n h ( x ) = e x − e − x e x + e − x tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}} tanh(x)=ex+e−xex−e−x
![](https://i-blog.csdnimg.cn/blog_migrate/7075f9f2fa245875f4f60df59e3072d4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5e8e106ead5e0d5ac6a60fb42b3145e1.png)
解决了Sigmoid函数的不是zero-centered输出问题,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。
Relu函数
R
e
l
u
=
m
a
x
(
0
,
x
)
Relu=max(0,x)
Relu=max(0,x)
优点:
- 解决了gradient vanishing问题 (在正区间)
- 计算速度非常快,只需要判断输入是否大于0
- 收敛速度远快于sigmoid和tanh
缺点:
-
ReLU的输出不是zero-centered
-
Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
LeakyReLU
f ( x ) = m a x ( 0.01 x , x ) f(x)=max(0.01x,x) f(x)=max(0.01x,x)
- 为了解决Dead ReLU Problem,让负数区域不在饱和死掉。理论上来讲,LeakyReLU有ReLU的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明 Leaky ReLU总是好于ReLU。
PReLU
f ( x ) = m a x ( α x , x ) f(x)=max(\alpha x,x) f(x)=max(αx,x)
- 这里的 α \alpha α不是固定下来的,而是可学习的。
ELU (Exponential Linear Units) 函数
f ( x ) = { x x>0 α ( e x − 1 ) else f(x)= \begin{cases} x& \text{x>0}\\ \alpha(e^x-1)& \text{else} \end{cases} f(x)={xα(ex−1)x>0else
- 不会有Dead ReLU问题
- 输出的均值接近0,zero-centered
MaxOut函数
这个函数可以参考论文《maxout networks》,Maxout是深度学习网络中的一层网络,就像池化层、卷积层一样等,我们可以把maxout 看成是网络的激活函数层,我们假设网络某一层的输入特征向量为:X=(x1,x2,……xd),也就是我们输入是d个神经元。Maxout隐藏层每个神经元的计算公式如下:
h
i
(
x
)
=
max
j
∈
[
1
,
k
]
z
i
j
h_i(x)=\max\limits_{j\in[1,k]} z_{ij}
hi(x)=j∈[1,k]maxzij
k就是maxout层所需要的参数了,由我们人为设定大小。就像dropout一样,也有自己的参数p(每个神经元dropout概率),maxout的参数是k。公式中Z的计算公式为:
z
i
j
=
x
T
W
.
.
.
i
j
+
b
i
j
z_{ij}=x^TW_{...ij}+b_{ij}
zij=xTW...ij+bij
权重w是一个大小为(d,m,k)三维矩阵,b是一个大小为(m,k)的二维矩阵,这两个就是我们需要学习的参数。如果我们设定参数k=1,那么这个时候,网络就类似于以前我们所学普通的MLP网络。
我们可以这么理解,本来传统的MLP算法在第i层到第i+1层,参数只有一组,然而现在我们不这么干了,我们在这一层同时训练n组的w、b参数,然后选择激活值Z最大的作为下一层神经元的激活值,这个max(z)函数即充当了激活函数。
Swish激活函数
f ( x ) = x 1 + e − x f(x)=\frac{x}{1+e^{-x}} f(x)=1+e−xx
在 x 轴的负区域曲线的形状与 ReLU 激活函数不同,因此,Swish 激活函数的输出可能下降,即使在输入值增大的情况下。大多数激活函数是单调的,即输入值增大的情况下,输出值不可能下降。而 Swish 函数为 0 时具备单侧有界(one-sided boundedness)的特性,它是平滑、非单调的。
参考博客
常用激活函数(激励函数)理解与总结
神经网络激活函数汇总(Sigmoid、tanh、ReLU、LeakyReLU、pReLU、ELU、maxout)
谈谈激活函数以零为中心的问题
激活函数
一文概览深度学习中的激活函数
深度神经网络为何很难训练
出现梯度消失与梯度爆炸的原因以及解决方案