1 激活函数(Activation functions)
之前用过 sigmoid 函数,sigmoid 函数在这里被称为激活函数,公式为:
更通常的情况下,使用不同的函数g(z[1]),g可以是除了 sigmoid 函数意外的非线性函数 ,效果总是优于 sigmoid 函数,因为函数值域在-1 和+1的激活函数,其均值是更接近零均值的。
tanh 函数或者双曲正切函数是总体上都优于 sigmoid 函数的激活函数,,tanh 函数是 sigmoid 的向下平移和伸缩后的结果,对它进行了变形后,穿过了(0,0)点,并且值域介于+1 和-1 之间,sigmoid 函数和 tanh 函数两者共同的缺点是,在z特别大或者特别小的情况下,导数的梯度或者函数的斜率会变得特别小,最后就会接近于 0,导致降低梯度下降的速度,公式为:
在机器学习另一个很流行的函数是:修正线性单元的函数(ReLu),ReLu 函数图像是如下图:
另一个版本的 Relu 被称为 Leaky Relu,当z是负值时,这个函数的值不是等于 0,而是轻微的倾斜,这个函数通常比 Relu 激活函数效果要好,尽管在实际中 Leaky ReLu 使用的并不多,如图:
这是一些选择激活函数的经验法则:
sigmoid 激活函数:除了输出层是一个二分类问题基本不会用它。
tanh 激活函数:tanh 是非常优秀的,几乎适合所有场合。
ReLu 激活函数:最常用的默认函数,,如果不确定用哪个激活函数,就使用 ReLu 或者Leaky ReLu。
1.51为什么需要非线性激活函数?(why need a nonlinear activation function?)
如果你是用线性激活函数或者叫恒等激励函数,那么神经网络只是把输入线性组合再输出,事实证明,如果你使用线性激活函数或者没有使用一个激活函数,那么无论你的神经网络有多少层一直在做的只是计算线性函数,相当于不如直接去掉全部隐藏层,所以除非你引入非线性,否则你无法计算更有趣的函数,即使你的网络层数再多也不行。总而言之,不能在隐藏层用线性激活函数,可以用 ReLU 或者 tanh 或者 leaky ReLU 或者其他的非线性激活函数,唯一可以用线性激活函数的通常就是输出层。还有一些特殊情况,不做讨论。
1.2 激活函数的导数(Derivatives of activation functions)
(1)sigmoid激活函数
(2)Tanh激活函数
(3)Rectified Linear Unit (ReLU)
注:通常在z= 0 的时候给定其导数 1,0;当然z=0 的情况很少
(4)Leaky linear unit (Leaky ReLU)
注:通常在z= 0的时候给定其导数 1,0.01;当然z = 0的情况很少