一:激活函数的基本原理
从数学的角度上讲,假如神经网络中只有Conv,卷积通过矩阵乘法来计算的,给特征乘再多的矩阵,都改变不了纯卷积的运算是一个线性操作的本质。 y=ABCD....Zx,x和y仍然是线性关系。
从函数拟合的角度来看,线性函数的拟合能力就非常差劲,与神经网络能够拟合任何复杂的函数的远大理想不符。所以要加激活函数:作用就是给神经网络带来非线性的特征,负责把线性函数给掰弯,这样神经网络拟合出来的函数也能适应复杂函数起伏,拟合的更好。
此外,如果模型不能很好对数据建模,可以使用特征变换或者核变换的方式,对核函数或者特征变换函数做泰勒展开,我们就可以大致了解核函数组合了哪些特征。事实上,激活函数一定程度上也做了特征组合的事情,很多激活函数都有 项,这就是一定程度上对特征进行了组合。
激活函数的几个特性:
- 可微性:需要满足几乎处处可微的特性,神经网络需要反向传播,误差回传更新参数梯度,如果中间有一个节点不可微分的话就会导致损失无法回传,所以需要可微,但是可以适当的放缩,几乎处处可微就可以了,允许在特殊的点不可微,然后不要让这些个别的点影响了大局观就可以。如ReLU在x=0的点就是不可微的。
- 单调性:
- 输出值的范围: 当激活函数输出值是有限的时候,基于梯度的优化方法会更加稳定,因为特征的表示受有限权值的影响更显著; 当激活函数的输出是无限的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的learning rate。
二:常见的激活函数
1:sigmoid函数
反向传播 根据这个公式可以很快的求出导数
缺点:
- 梯度消失(饱和):从上图可以看出,当
时,
的值很小,几乎为0。反向传播的时候,我们通过链式求导法则计算各个权重的W的微分。由于在后向传递过程中,sigmoid向下传导的梯度包含了一个 f′(x)f′(x) 因子(sigmoid关于输入的导数),因此一旦输入落入饱和区,f′(x)f′(x) 就会变得接近于0,导致了向底层传递的梯度也变得非常小。此时,网络参数很难得到有效训练。
- 非0均值:Sigmoid的输出值不是0周围的,不以0为中心。如果 x>0,
对W求梯度为正,输入到下一层还是正的,这样W就只往正方向更新,反之只往负方向更新。可以按照batchs去训练,效果会好一些。
- 计算量大:其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。
2:tanh函数
它解决了Sigmoid函数的不是zero-centered输出问题,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。
3:ReLU函数
缺点:
- 部分神经元无法激活:由上图可以看出,当x>0的时候,
, 当x<0的时候,
, 这样的话就会导致函数不更新参数,就是我们常说的神经元死亡。可以通过设置学习率等参数使神经元的死亡概率减小。(learning rate太高导致在训练过程中参数更新太大,使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。)
- ReLU的输出不是zero-centered
优点:
- 收敛速度快:ReLU的计算非常简单,只需要使用阈值判断即可(输出是否大于0),导数也是几乎不用计算。基于以上两个优点,ReLU的收敛速度要远远快于sigmoid和tanh。
- 稀疏性:ReLU的第三大优点就是可以产生稀疏性,可以看到小于0的部分直接设置为0,这就使得神经网络的中间输出是稀疏的,有一定的Droupout的作用,也就能够在一定程度上防止过拟合。
3.1ReLU的变体
1:Leaky ReLU函数(PReLU)
这个激活函数是人们为了解决神经元无法被激活的问题,通常 a=0.01。但在实际应用中Leaky ReLU并不一定会比ReLU好。激活的值太小,对整体没有太大影响。蚊子再小也是块肉,可能肉多的时候会有一定的效果。
2:ELU (Exponential Linear Units) 函数
和leaky ReLU的想法一样ELU也是想解决神经元死亡问题。实验证明效果不一定会比ReLU好。
参考博客:
神经网络之激活函数_August-us的博客-CSDN博客 常用激活函数(激励函数)理解与总结_tyhj_sf的博客空间-CSDN博客_激活函数