一、单一神经元模型
如下图所示:
神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层)。在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)。
二、为什么需要激活函数
参考:http://www.360doc.com/content/18/0920/10/37113458_788165971.shtml
简单来说就是引入非线性,增加网络的表达能力。
如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层节点的输入都是上层输出的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知(Perceptron)了,那么网络的逼近能力就相当有限。
三、常见的激活函数
参考:https://blog.csdn.net/not_guy/article/details/78749509
1、Sigmoid函数
表达式:,导数:
优点:(1)便于求导的平滑函数;
(2)能压缩数据,保证数据幅度不会有问题;
(3)适合用于前向传播。
缺点:(1)容易出现梯度消失(gradient vanishing)的现象:原因在于sigmoid最大梯度是0.24,当激活函数接近饱和区时,变化太缓慢,导数接近0,根据后向传递的数学依据是微积分求导的链式法则,反向传过来的梯度至少会缩小到原来的1/4,当前导数需要之前各层导数的乘积,几个比较小的数相乘,层数越多梯度越接近0,学习停滞,从而无法完成深层网络的训练。.
(2)Sigmoid的输出不是0均值(zero-centered)的:将输入值压缩到 0~1 的范围,这会导致后层的神经元的输入是非0均值的信号,这会对梯度产生影响。以 f=sigmoid(wx+b)为例, 假设输入均为正数(或负数),那么对w的导数总是正数(或负数),这样在反向传播过程中要么都往正方向更新,要么都往负方向更新,导致有一种捆绑效果,使得收敛缓慢。
(3)幂运算相对耗时
2、Tanh函数
表达式:,导数:
tanh函数将输入值压缩到 -1~1 的范围,因此它是0均值的,解决了Sigmoid函数的非zero-centered问题,但是它也存在梯度消失和幂运算的问题。
3、ReLU函数
表达式:,导数:
优点:(1)在正区间解决了梯度消失问题
(2)计算速度非常快,不需要进行指数运算,只需要判断输入是否大于0
(3)收敛速度远快于sigmoid和tanh
缺点:(1)ReLU的输出不是zero-centered
(2)Dead ReLU Problem(神经元坏死现象):某些神经元可能永远不会被激活,导致相应的参数永远不能被更新(在负数部分,梯度为0)。有两个主要原因可能导致这种情况产生: (1) 参数初始化问题,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
(3)ReLU不会对数据做幅度压缩,所以数据的幅度会随着模型层数的增加不断扩张。
4、ReLU的其他变种
1)Leakly ReLU函数
表达式:,导数:
用来解决ReLU的神经元坏死的问题,可将0.01设置成一个变量a,其中a由后向传播学出来。但是其表现并不一定比ReLU好。
2)ELU函数(指数线性函数)
表达式:,导数:
ELU有ReLU的所有优点,并且不会有ReLU的神经元坏死的问题,输出的均值接近0(zero-centered)。但是计算量大,其表现并不一定比ReLU好。