在深度学习中,信号从一个神经元传入到下一层神经元之前是通过线性叠加来计算的,而进入下一层神经元需要经过非线性的激活函数,继续往下传递,如此循环下去。由于这些非线性函数的反复叠加,才使得神经网络有足够的capacity来抓取复杂的特征。
为什么要使用非线性激活函数?
答:如果不使用激活函数,这种情况下每一层输出都是上一层输入的线性函数。无论神经网络有多少层,输出都是输入的线性函数,这样就和只有一个隐藏层的效果是一样的。这种情况相当于多层感知机(MLP)。
1、Sigmoid函数
优点:
(1)便于求导的平滑函数;
(2)能压缩数据,保证数据幅度不会有问题;
(3)适合用于前向传播。
缺点:(1)容易出现梯度消失(gradient vanishing)的现象:当激活函数接近饱和区时,变化太缓慢,导数接近0,根据后向传递的数学依据是微积分求导的链式法则,当前导数需要之前各层导数的乘积,几个比较小的数相乘,导数结果很接近0,从而无法完成深层网络的训练。
(2)Sigmoid的输出不是0均值(zero-centered)的:这会导致后层的神经元的输入是非0均值的信号,这会对梯度产生影响。以 f=sigmoid(wx+b)为例, 假设输入均为正数(或负数),那么对w的导数总是正数(或负数),这样在反向传播过程中要么都往正方向更新,要么都往负方向更新,导致有一种捆绑效果,使得收敛缓慢。
(3)幂运算相对耗时
2、tanh函数
tanh函数将输入值压缩到 -1~1 的范围,因此它是0均值的,解决了Sigmoid函数的非zero-centered问题,但是它也存在梯度消失和幂运算的问题。
其实 tanh(x)=2sigmoid(2x)-1
3、ReLU函数:全区间不可导
优点:
(1)ReLu的收敛速度比 sigmoid 和 tanh 快;(梯度不会饱和,解决了梯度消失问题)
(2)计算复杂度低,不需要进行指数运算;
(3)适合用于后向传播。
缺点:
(1)ReLU的输出不是zero-centered;
(2)Dead ReLU Problem(神经元坏死现象):某些神经元可能永远不会被激活,导致相应参数永远不会被更新(在负数部分,梯度为0)。产生这种现象的两个原因:参数初始化问题;learning rate太高导致在训练过程中参数更新太大。 解决方法:采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
(3)ReLU不会对数据做幅度压缩,所以数据的幅度会随着模型层数的增加不断扩张。
4、Leakly ReLU函数
用来解决ReLU带来的神经元坏死的问题,可以将0.01设置成一个变量a,其中a由后向传播学出来。但是其表现并不一定比ReLU好。
5、ELU函数(指数线性函数)
ELU有ReLU的所有优点,并且不会有 Dead ReLU问题,输出的均值接近0(zero-centered)。但是计算量大,其表现并不一定比ReLU好。。
转载至:https://blog.csdn.net/not_guy/article/details/78749509