常见的激活函数总结
一.什么是激活函数?
度娘定义:
激活函数(Activation functions)对于人工神经网络模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用。它们将非线性特性引入到我们的网络中。如下图,在神经元中,输入的 inputs 通过加权,求和后,还被作用了一个函数,这个函数就是激活函数。引入激活函数是为了增加神经网络模型的非线性。没有激活函数的每层都相当于矩阵相乘。就算你叠加了若干层之后,无非还是个矩阵相乘罢了。
狐仙定义:
激活函数又称非线性映射,顾名思义,激活函数的引入为的是增加整个网络的表达能力 (即非线性),否则,若干线性操作层的堆叠仍然只能起到线性映射的作用,无法形成复杂的函数。
二.为什么要用激活函数?
如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机(Perceptron)。至于感知机,大家知道其连最基本的异或问题都无法解决,更别提更复杂的非线性问题。
如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。
三.激活函数应该具有的性质
1.非线性:线性激活对于深层神经网络没有作用,因为其作用以后仍然是输入的各种线性变换。
2.连续可微:梯度下降法的要求。
3.范围最好不饱和,当有饱和的区间段时,若系统优化进入到该段,梯度近似为 0,网络的学习就会停止。
4.单调性:当激活函数是单调时,单层神经网络的误差函数是凸的,好优化。
5.在原点处近似线性,这样当权值初始化为接近 0 的随机值时,网络可以学习得较快,不用调节网络的初始值。
四.常见的激活函数
前言:
激活函数有许多,但本文我们只讲三巨头:
1.Sigmoid函数
它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1。
作为激活函数,其缺点如下:
1.容易出现梯度消失(gradient vanishing),也有小概率发生梯度爆炸
2.函数的输出不是以0为中心对称(zero-centered)
3.幂运算相对耗时
f
(
x
)
=
1
1
+
e
−
x
f(x)=\frac{1}{1+e^{-x}}
f(x)=1+e−x1
2.Tanh函数
它比Sigmoid函数收敛更快,而且解决了zero-centered的输出问题,但是,gradient vanishing的问题和幂运算的问题仍然存在。
f
(
x
)
=
e
x
−
e
−
x
e
x
+
e
−
x
f(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}
f(x)=ex+e−xex−e−x
3.ReLU函数
优点:
1.解决了gradient vanishing问题 (在正区间)
2.计算速度非常快,只需要判断输入是否大于0
3.收敛速度远快于sigmoid和tanh
缺点:
1.ReLU的输出不是zero-centered
2.Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。
有两个主要原因可能导致这种情况产生:
(1) 非常不幸的参数初始化,这种情况比较少见
(2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态
f
(
x
)
=
m
a
x
(
0
,
x
)
f(x)=max(0,x)
f(x)=max(0,x)