使用一个神经网络时,需要决定使用哪种激活函数用隐藏层上,哪种用在输出节点上。之前逻辑回归输出节点使用的激活函数是sigmoid激活函数,图像如下,

激活函数swish 激活函数图像_深度学习

但是,有时其他的激活函数效果会更好。tanh函数或者双曲正切函数是总体上都优于sigmoid激活函数。

激活函数swish 激活函数图像_神经网络_02

如图,激活函数swish 激活函数图像_深度学习_03的值域是位于+1和-1之间。事实上,tanh函数是sigmoid的向下平移和伸缩后的结果。对它进行了变形后,穿过了(0,0)点,并且值域介于+1和-1之间。

结果表明,如果在隐藏层上使用函数公式tanh(z)效果总是优于sigmoid函数。因为函数值域在-1和+1的激活函数,其均值是更接近零均值的。在训练一个算法模型时,如果使用tanh函数代替sigmoid函数中心化数据,使得数据的平均值更接近0而不是0.5.这会使下一层学习简单一点。在讨论优化算法时,有一点要说明:现在基本已经不用sigmoid激活函数了,tanh函数在所有场合都优于sigmoid函数。但有一个例外:在二分类的问题中,对于输出层,因为y的值是0或1,所以想让激活函数swish 激活函数图像_激活函数swish_04的数值介于0和1之间,而不是在-1和+1之间。所以需要使用sigmoid激活函数。一般情况下对隐藏层使用tanh激活函数,输出层使用sigmoid函数。所以,在不同的神经网络层中,激活函数可以不同。

但是sigmoid函数和tanh函数有一个共同缺点,当输入数据的值比较大时,神经网络的学习速度就很慢。学习速度与偏导数的大小有关,偏导数就是斜率,斜率越大偏导数越大那么学习速度越快。通过观察sigmoid和tanh的图像可知——当输入值越来越大时,曲线的斜率越来越小。为了解决这个问题,研究者们创造了另一个激活函数——relu。

激活函数swish 激活函数图像_激活函数swish_05

如图y=max(0,x),从图像可以看出,只要x是正值的情况下,导数恒等于1,当z是负值的时候,导数恒等于0。但在实际应用中,输入值一般都是大于零的。为了解决没有斜率的问题,人们又创造了另一个激活函数leaky relu,但是这个意义不是特别大,用的人不太多。

激活函数swish 激活函数图像_斜率_06


两者的优点是:

第一,在z的区间变动很大的情况下,激活函数的导数或者激活函数的斜率都会远大于0,在程序实现就是一个if-else语句,而sigmoid函数需要进行浮点四则运算,在实践中,使用ReLu激活函数神经网络通常会比使用sigmoid或者tanh激活函数学习的更快。

第二,sigmoid和tanh函数的导数在正负饱和区的梯度都会接近于0,这会造成梯度弥散,而Relu和Leaky ReLu函数大于0部分都为常熟,不会产生梯度弥散现象。(同时应该注意到的是,Relu进入负半区的时候,梯度为0,神经元此时不会训练,产生所谓的稀疏性,而Leaky ReLu不会有这问题)

总结不同激活函数的使用场景。sigmoid激活函数:除了输出层是一个二分类问题基本不会用它。tanh激活函数:tanh各方面都比sigmoid优秀。ReLu激活函数:最常用的默认函数,如果不确定用哪个激活函数,就使用ReLu或者Leaky ReLu。