激活函数(activation functions)的指标是,将神经网络非线性化。激活函数是间断的(continuous),且可导的(differential)。
- 间断的:当输出值产生较小的扭转时,输入值也产生较小的扭转;
- 可导的:在定义域中,每一处都是存在导数;
常见的激活函数:sigmoid,tanh,relu。
sigmoid
sigmoid是平滑(smoothened)的阶梯函数(step function),可导(differentiable)。sigmoid能够将任何值转换为0~1概率,用于二分类。细节能够参考。
公式:
导数:
导数2:
图(红色导函数,蓝色原函数):
当应用sigmoid作为激活函数时,随着神经网络隐含层(hidden layer)层数的减少,训练误差反而加大。体现为:
- 凑近输入层的隐含层梯度较大,参数更新速度快,很快就会收敛;
- 凑近输出层的隐含层梯度较小,参数更新速度慢,简直和初始状态一样,随机散布;
- 在含有四个暗藏层的网络结构中,第一层比第四层慢了靠近100倍!
这种景象就是梯度弥散(vanishing gradient)。而另一种状况,梯度爆炸(exploding gradient),则是后面层的梯度,通过训练变大,导致前面层的梯度,以指数级增大。
因为sigmoid的导数值小于1/4,x变动的速率要快于y变动的速率,随着层数的减少,连续不断执行sigmoid函数,就会导致,后面更新较大的幅度,前面更新较小的幅度,因而,网络在学习过程中,更偏向于,更新前面(凑近输入层)的参数,而不是后面的参数(凑近输出层)。
sigmoid毛病:
- 激活函数的计算量较大,在反向流传中,当求误差梯度时,求导波及除法;
- 在反向流传中,容易就会呈现梯度隐没,无奈实现深层网络的训练;
- 函数的敏感区间较短,(-1,1)之间较为敏感,超过区间,则处于饱和状态,
参考1、参考2
tanh
tanh,即双曲正切(hyperbolic tangent),相似于幅度增大sigmoid,将输出值转换为-1至1之间。tanh的导数取值范畴在0至1之间,优于sigmoid的0至1/4,在肯定水平上,加重了梯度隐没的问题。tanh的输入和输出可能放弃非线性枯燥回升和降落关系,合乎BP(back propagation)网络的梯度求解,容错性好,有界。
公式:
导数:
图(红色导函数,蓝色原函数):
sigmoid和tanh:
- sigmoid在输出处于[-1,1]之间时,函数值变动敏感,一旦靠近或者超出区间就失去敏感性,处于饱和状态,影响神经网络预测的精度值;
- tanh的变动敏感区间较宽,导数值渐进于0、1,合乎人脑神经饱和的法则,比sigmoid函数提早了饱和期;
- tanh在原点左近与y=x函数模式相近,当激活值较低时,能够间接进行矩阵运算,训练绝对容易;
- tanh和sigmoid都是全副激活(fire),使得神经网络较重(heavy)。
参考1、参考2、参考3
relu
relu,即Rectified Linear Unit,整流线性单元,激活局部神经元,减少稠密性,当x小于0时,输入值为0,当x大于0时,输入值为x.
公式:
图:
导数:
图:
relu比照于sigmoid:
- sigmoid的导数,只有在0左近,具备较好的激活性,而在正负饱和区的梯度都靠近于0,会造成梯度弥散;而relu的导数,在大于0时,梯度为常数,不会导致梯度弥散。
- relu函数在负半区的导数为0 ,当神经元激活值进入负半区,梯度就会为0,也就是说,这个神经元不会被训练,即稠密性;
- relu函数的导数计算更快,程序实现就是一个if-else语句;而sigmoid函数要进行浮点四则运算,波及到除法;
relu的毛病:
在训练的时候,ReLU单元比拟软弱并且可能“死掉”。举例来说,当一个很大的梯度,流过ReLU的神经元的时候,可能会导致梯度更新到一种特地的状态,在这种状态下神经元将无奈被其余任何数据点再次激活。如果这种状况产生,那么从此所以流过这个神经元的梯度将都变成0。也就是说,这个ReLU单元在训练中将不可逆转的死亡,因为这导致了数据多样化的失落。
如果学习率设置得太高,可能会发现网络中40%的神经元都会死掉(在整个训练集中这些神经元都不会被激活)。通过正当设置学习率,这种状况的产生概率会升高。
在神经网络中,隐含层的激活函数,最好抉择ReLU。
对于RNN中为什么抉择tanh,而不是relu,参考。
作者:SpikeKing
链接:https://www.jianshu.com/p/857...
起源:简书
著作权归作者所有。商业转载请分割作者取得受权,非商业转载请注明出处。