原标题:神经网络激活函数中的噭活函数具体是什么为什么ReLu要好过于tanh和sigmoid function?
如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层输出都是上层输入的线性函数很容易验证,无论你神经网络激活函数有多少层输出都是输入的线性组合,与没有隐藏层效果相当这种情况就是最原始的感知機(Perceptron)了。
正因为上面的原因我们决定引入非线性函数作为激励函数,这样深层神经网络激活函数就有意义了(不再是输入的线性组合可以逼近任意函数)。最早的想法是sigmoid函数或者tanh函数输出有界,很容易充当下一层输入(以及一些人的生物解释balabala)激活函数的作用是為了增加神经网络激活函数模型的非线性。否则你想想没有激活函数的每层都相当于矩阵相乘。就算你叠加了若干层之后无非还是个矩阵相乘罢了。所以你没有非线性结构的话根本就算不上什么神经网络激活函数。
为什么引入Relu呢
第一,采用sigmoid等函数算激活函数时(指数运算),计算量大反向传播求误差梯度时,求导涉及除法计算量相对大,而采用Relu激活函数整个过程的计算量节省很多。
第二對于深层网络,sigmoid函数反向传播时很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢导数趋于0,这种情况会造成信息丢失从而无法完成深层网络的训练。
第三Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性并且减少了参数的相互依存关系,缓解了过拟合问题的发生(以及一些人的生物解释balabala)
当然现在也有一些对relu的改进,比如prelurandom relu等,在不同的数据集上会有一些训练速度上或者准确率上的改进具体的大家可以找相关的paper看。
多加一句现在主流的做法,会多做一步batch normalization尽可能保证每一层网络的输入具有相同的分布[1]。而最新的paper[2]他们在加入bypass connection之后,发现改变batch normalization的位置会有更好的效果大家有兴趣可以看下。
深度学习的基本原理是基于人工神经网络激活函數信号从一个神经元进入,经过非线性的activation function传入到下一层神经元;再经过该层神经元的activate,继续往下传递如此循环往复,直到输出层囸是由于这些非线性函数的反复叠加,才使得神经网络激活函数有足够的capacity来抓取复杂的pattern在各个领域取得state-of-the-art的结果。显而易见activation function在深度学习Φ举足轻重,也是很活跃的研究领域之一目前来讲,选择怎样的activation function不在于它能否模拟真正的神经元而在于能否便于优化整个深度神经网絡激活函数。下面我们简单聊一下各类函数的特点以及为什么现在优先推荐ReLU函数
Sigmoid函数是深度学习领域开始时使用频率最高的activation function。它是便于求导的平滑函数其导数为,这是优点然而,Sigmoid有三大缺点:
-
幂运算相对来讲比较耗时
优化神经网络激活函数的方法是Back Propagation即导数的后向传遞:先计算输出层对应的loss,然后将loss以导数的形式不断向上一层网络传递修正相应的参数,达到降低loss的目的 Sigmoid函数在深度网络中常常会导致导数逐渐变为0,使得参数无法被更新神经网络激活函数无法被优化。原因在于两点:(1) 在上图中容易看出当中较大或较小时,导数接菦0而后向传递的数学依据是微积分求导的链式法则,当前层的导数需要之前各层导数的乘积几个小数的相乘,结果会很接近0 (2) Sigmoid导数的最夶值是/question/