激活函数
激活函数的主要作用是提供网络的非线性建模能力,分层的非线性映射学习能力。几乎所有的连续可导函数都可以用作激活函数,但目前常见的多是分段线性和具有指数形状的非线性函数。
sigmoid
s
i
g
m
o
i
d
(
x
)
=
1
1
+
e
−
x
,
s
i
g
m
o
i
d
′
(
x
)
=
s
i
g
m
o
i
d
(
x
)
(
1
−
s
i
g
m
o
i
d
(
x
)
)
sigmoid(x)=\frac{1}{1+e^{-x}},sigmoid^{'}(x)=sigmoid(x)(1-sigmoid(x))
sigmoid(x)=1+e−x1,sigmoid′(x)=sigmoid(x)(1−sigmoid(x))
sigmoid 在定义域内处处可导,且两侧导数逐渐趋近于0——软饱和激活函数。
sigmoid 的软饱和性,使深度神经网络难以有效训练,在后向传递过程中,sigmoid向下传导的梯度包含了一个f’(x) 因子(sigmoid关于输入的导数),一旦输入落入饱和区,f’(x) 就会变得接近于0,导致了向底层传递的梯度也变得非常小,网络参数很难得到有效训练,即梯度消失。一般来说, sigmoid 网络在 5 层之内就会产生梯度消失现象。梯度消失问题至今仍然存在,但可以使用有效缓解了,例如DBN中的分层预训练,Batch Normalization的逐层归一化,Xavier和MSRA权重初始化等代表性技术。sigmoid 的饱和性虽然会导致梯度消失,但也有其有利的一面。例如它在物理意义上最为接近生物神经元。 (0, 1) 的输出还可以被表示作概率,或用于输入的归一化,代表性的如sigmoid交叉熵损失函数。
tanh
t
a
n
h
(
x
)
=
1
−
e
−
2
x
1
+
e
−
2
x
=
2
s
i
g
m
o
i
d
(
2
x
)
−
1
tanh(x)=\frac{1-e^{-2x}}{1+e^{-2x}}=2sigmoid(2x)-1
tanh(x)=1+e−2x1−e−2x=2sigmoid(2x)−1
tanh也具有软饱和性。tanh 网络的收敛速度要比sigmoid快,因为 tanh 的输出均值比 sigmoid 更接近 0,SGD会更接近 natural gradient(一种二次优化技术),从而降低所需的迭代次数。
ReLU
R
e
L
U
(
x
)
=
{
x
,
x
>
=
0
0
,
x
<
0
ReLU(x)=\begin{cases} x,x>=0 \cr 0,x<0\end{cases}
ReLU(x)={x,x>=00,x<0
硬饱和函数:
f
′
(
x
)
=
0
,
当
∣
x
∣
>
c
,
c
为
常
数
f'(x)=0,当 |x| > c, c 为常数
f′(x)=0,当∣x∣>c,c为常数。
尽管在ReLU之前,通过分层无监督预训练解决深层网络训练困难的问题;但是深度网络的直接监督式训练的最终突破,最主要的原因是采用了新型激活函数ReLU。ReLU能够有效缓解梯度消失问题,从而直接以监督的方式训练深度神经网络,无需依赖无监督的逐层预训练。
ReLU 在x<0 时硬饱和。由于 x>0时导数为 1,所以,ReLU 能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。但随着训练的推进,部分输入会落入硬饱和区,导致对应权重无法更新——神经元死亡。ReLU的输出均值恒大于零——偏移现象。偏移现象和 神经元死亡会共同影响网络的收敛性。如果不采用Batch Normalization,即使用 MSRA 初始化30层以上的ReLU网络,最终也难以收敛。相对的,PReLU和ELU网络都能顺利收敛。
ReLU另外一个性质是提供神经网络的稀疏表达能力,但后来的研究发现稀疏性并非性能提升的必要条件。ReLU的稀疏性与网络性能(分类精度)间并不存在绝对正负比关系。
PReLU
P
R
e
L
U
(
x
)
=
{
x
,
x
>
0
α
x
,
x
<
=
0
PReLU(x)=\begin{cases} x,x>0 \cr \alpha x,x<=0\end{cases}
PReLU(x)={x,x>0αx,x<=0
PReLU与LReLU相比,PReLU中的负半轴斜率a可学习而非固定。
α
\alpha
α的取值,原文献建议初始化a为0.25,不采用正则(是否采用正则应视具体的数据和网络,通常使用正则能带来性能提升)。
虽然PReLU 引入了额外的参数,但基本不需要担心过拟合。实验中若发现网络性能不好,建议从其他角度寻找原因。
与ReLU相比,PReLU收敛速度更快,因为PReLU的输出更接近0均值,使得SGD更接近natural gradient。
Maxout
M
a
x
o
u
t
(
x
)
=
m
a
x
(
w
1
x
+
b
1
,
w
2
x
+
b
2
,
.
.
.
,
w
n
x
+
b
n
)
Maxout(x)=max(w_1x+b_1, w_2x+b_2, ..., w_nx+b_n)
Maxout(x)=max(w1x+b1,w2x+b2,...,wnx+bn)
Maxout是ReLU的推广,其发生饱和是一个零测集事件。Maxout网络能够近似任意连续函数,且当
w
2
,
b
2
,
…
,
w
n
,
b
n
w_2,b_2,…,w_n,b_n
w2,b2,…,wn,bn为0时,退化为ReLU。
Maxout的思想在视觉领域存在已久。Maxout能够缓解梯度消失,同时又规避了ReLU神经元死亡的缺点,但增加了参数和计算量。
ELU
E
L
U
(
x
)
=
{
x
,
x
>
0
α
(
e
x
−
1
)
,
x
<
=
0
ELU(x)=\begin{cases} x,x>0 \cr \alpha (e^x-1),x<=0\end{cases}
ELU(x)={x,x>0α(ex−1),x<=0
ELU融合sigmoid和ReLU,具有左侧软饱性。右侧线性能缓解梯度消失,左侧软饱能让ELU对输入变化或噪声更鲁棒。ELU的输出均值接近于零,所以收敛速度更快。
总结:
如何选择激活函数目前尚无统一定论,需依靠实验指导。一般在分类问题上,建议先尝试 ReLU,其次ELU,这是两类不引入额外参数的激活函数。然后可考虑用具备学习能力的PReLU,并使用正则化技术,例如应该考虑在网络中增加Batch Normalization层。
参考文献:
https://zhuanlan.zhihu.com/p/22142013
二次代价函数与输出层线性激活函数对应使用
交叉熵代价函数与输出层用sigmoid激活函数对应使用
对数似然代价函数与输出层用softmax激活函数对应使用