1 为什么要使用激活函数
如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层输出都是上层输入的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了。 正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络就有意义了(不再是输入的线性组合,可以逼近任意函数)。
2常见的几个激活函数以及说明
2.1 sigmoid函数
Sigmoid函数的表达式y=1/(1+e^(-x))函数曲线如下图所示
从数学上来看,Sigmoid函数对中央区的信号增益较大,对两侧区的信号增益小
2.2 tanh函数
y=(e^x-e^(-x))/(e^x+e^-x)也属于S型函数,是0均值,其函数曲线与Sigmoid函数相似,下图是两者的比较
具体应用中,tanh函数比sigmoid函数更好,其实从数学角度,你可以看到
,更一般的我们可以证明
在x轴上任意一点,都有:
所以,当处理big data时,双曲正切的导数的绝对值>sigmoid导数的绝对值导致tanh函数更容易找到局部或者全局最优点(下降速度快)换句话说,如果你用tanh函数作为激活函数,能更快使你的损失函数收敛到局部或者全局最小值。其次,两者的导数范围不一样,sigmoid的导数取值范围是
而tanh函数导数的取值范围是
tanh函数导数的取值范围更大
3 relu函数
relu函数的全称是:Rectified Linear Units,公式是
函数图像如下
相比于 sigmoid/tanh,ReLU 只需要一个阈值就可以得到激活值,而不用去算一大堆复杂的运算。
二维情况下,使用relu之后的效果
为什么relu不会造成梯度弥散(梯度消失)
什么叫梯度弥散:具体来说就是当使用反向传播方法计算导数的时候,随着网络的深度的增加,反向传播的梯度(从输出层到网络的最初几层)的幅度值会急剧地减小。结果就造成了整体的损失函数相对于最初几层的权重的导数非常小。这样,当使用梯度下降法的时候,最初几层的权重变化非常缓慢,以至于它们不能够从样本中进行有效的学习。这种问题通常被称为“梯度的弥散”
relu的导数图形如下
下面解释为什么Relu不会造成梯度弥散(摘自知乎)
S型函数(如sigmoid函数,tanh函数)在正负饱和区的梯度都接近于0,所以这会造成梯度弥散,而relu函数在大于0的部分梯度为常数,所以不会产生梯度弥散现象
其次:relu函数具有稀疏激活性(原因)
随着训练的推进,部分输入会落入x
relu导数计算更快
参考文献:[1]https://www.zhihu.com/question/52020211
[2]https://stats.stackexchange.com/questions/330559/why-is-tanh-almost-always-better-than-sigmoid-as-an-activation-function
tanhx=2σ(2x)−1
领取专属 10元无门槛券
私享最新 技术干货