前言
激活函数的作用
-
增加网络的非线性。
数据分布大部分是非线性的,而神经网络的计算是线性的,因此需要引入激活函数,增加网络的非线性,以强化网络的学习能力。 -
可以做概率值的处理,例如Sigmoid和tanh,它们的特点是将输出限制在(0,1)和(-1,1)之间;
-
Relu适合用于深层网络的训练,而Sigmoid和tanh会出现梯度消失。
人工神经网络中为什么ReLu要好过于tanh和sigmoid function?
-
节省计算量:sigmoid等函数在反向传播求误差梯度时,求导涉及除法和指数运算,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。
-
对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,模型权重难以更新),这种现象称为饱和,从而无法完成深层网络的训练。而ReLU就不会有饱和倾向,不会有特别小的梯度出现。
-
Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。
1. sigmoid (0,1)
-
公式:
σ ( z ) = 1 1 + e − z \sigma(z)=\frac{1}{1+e^{-z}} σ(z)=1+e−z1 -
导数:
σ ′ ( z ) = 0 − 1 ∗ ( − e − z ) ( 1 + e − z ) 2 = e − z ( 1 + e − z ) 2 = e − z ( 1 + e − z ) ∗ 1 ( 1 + e − z ) = 1 + e − z − 1 ( 1 + e − z ) ∗ σ ( z ) = ( 1 − σ ( z ) ) ∗ σ ( z ) \begin{aligned} \sigma'(z)&=\frac{0-1*(-e^{-z})}{(1+e^{-z})^2} \\ &=\frac{e^{-z}}{(1+e^{-z})^2} \\ &=\frac{e^{-z}}{(1+e^{-z})}*\frac{1}{(1+e^{-z})} \\ &=\frac{1+e^{-z}-1}{(1+e^{-z})}*\sigma(z)\\ &=(1-\sigma(z))*\sigma(z) \end{aligned} σ′(z)=(1+e−z)20−1∗(−e−z)=(1+e−z)2e−z=(1+e−z)e−z∗(1+e−z)1=(1+e−z)1+e−z−1∗σ(z)=(1−σ(z))∗σ(z) -
优点:
- 平滑、易于求导。
-
缺点:
- 激活函数计算量大(在正向传播和反向传播中都包含幂运算和除法);
- 反向传播求误差梯度时,求导涉及除法;
- Sigmoid导数取值范围是[0, 0.25],由于神经网络反向传播时的“链式反应”,很容易就会出现梯度消失的情况。例如对于一个10层的网络, 根据 0.2 5 10 0.25^{10} 0.2510近似 9.5 ∗ 1 0 − 7 9.5*10^{-7} 9.5∗10−7,第10层的误差相对第一层卷积的参数 W 1 W_1 W1的梯度将是一个非常小的值,这就是所谓的“梯度消失”。
- Sigmoid的输出不是0均值(即zero-centered);这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入,随着网络的加深,会改变数据的原始分布。
2. softmax
用于处理分类问题,总概率和相加为1。
p
i
=
e
a
i
∑
k
=
1
N
e
a
k
p_i=\frac{e^{a_i}}{\sum_{k=1}^N e^{ak}}
pi=∑k=1Neakeai
α
p
i
α
a
j
=
{
p
i
(
1
−
p
j
)
i
f
(
i
=
j
)
−
p
j
p
i
i
f
(
i
≠
j
)
\frac{\alpha p_i}{\alpha a_j}= \begin{cases} p_i(1-p_j)&if(i=j)\\ -p_jp_i &if(i\not=j)\\ \end{cases}
αajαpi={pi(1−pj)−pjpiif(i=j)if(i=j)
求导分为i=j和i≠j:
softmax与sigmoid的区别
- 最后一层连接的神经元,sigmoid为1,softmax为2.
- sigmoid只有目标/非目标的区分,即独立事件,可以用 1 − P ( 目 标 ) 1-P(目标) 1−P(目标) 得出 P ( 非 目 标 ) P(非目标) P(非目标).
- softmax可以有多类.
- sigmoid为两点分布,即P与1-P;softmax为离散概率分布,所有维度概率之和=1,当二分类时为二项分布.
- 若有二维[-0.9419 1.944]经过sigmoid和softmax
- softmax得出[0.2805 0.8748],会发现两者之和!=1,因为两者属于独立事件.
- sigmoid得出[0.0529 0.9471],两者之和=1.
3. tanh (-1,1)
tanh为双曲正切函数,输出范围(-1,1),可以把 tanh 函数看做是 sigmoid 向下平移和拉伸后的结果。
-
公式:
t a n h ( x ) = e x − e − x e x + e − x − 1 = 2 1 + e − 2 x − 1 \begin{aligned} tanh(x)&=\frac{e^x-e^{-x}}{e^x+e^{-x}}-1 \\ &=\frac{2}{1+e^{-2x}}-1 \end{aligned} tanh(x)=ex+e−xex−e−x−1=1+e−2x2−1 -
tanh的输出范围时(-1, 1),解决了Sigmoid函数的不是zero-centered输出问题;
-
幂运算的问题仍然存在;
-
tanh导数范围在(0, 1)之间,相比sigmoid的(0, 0.25),梯度消失问题会得到缓解,但仍然还会存在。
4. relu (0,x)
-
公式:
r e l u ( x ) = m a x ( 0 , x ) relu(x)=max(0, x) relu(x)=max(0,x) -
不会出现梯度消失。
-
可能出现梯度爆炸,因为导数为1,链式法则是累乘的过程。
-
注意学习率不能设置太高,特别是当值小于0的时候,也就是relu在筛选噪声数据稀疏矩阵的时候,如果设置太高,大部分神经元处于‘dead’状态,导致模型无法学习到有效特征。
-
运算速度快。
5. Leaky ReLU PReLU RReLU
为了防止模型的‘Dead’情况,后人将x<0部分并没有直接置为0,而是给了一个很小的负数梯度值 α \alpha α,即 x > = 0 x>=0 x>=0时 y = x y=x y=x; x < 0 x<0 x<0时, y = α x y=\alpha x y=αx。
- Leaky ReLU中的 α \alpha α为常数,一般设置 0.01。这个函数通常比 Relu 激活函数效果要好,但是效果不是很稳定,所以在实际中 Leaky ReLu 使用的并不多。
- PRelu(Parametric Relu 参数化修正线性单元) 中的 α \alpha α作为一个可学习的参数,会在训练的过程中进行更新。
- RReLU(Random ReLU随机纠正线性单元)。在RReLU中, α \alpha α在训练中是随机的,在之后的测试中就变成了固定的了。RReLU的亮点在于,在训练环节中, α j i \alpha_{ji} αji是从一个均匀的分布 U ( I , u ) U(I,u) U(I,u)中随机抽取的数值。
ReLU及其变体图像:
Reference
https://zhuanlan.zhihu.com/p/73214810