一、激活函数的选择
上一篇笔记中学习到,应该怎样计算网络的输出?
$$z^{[1]}=W^{[1]}x+b^{[1]}$$
$$a^{[1]}=\sigma(z^{[1]})$$
$$z^{[2]}=W^{[2]}a^{[1]}+b^{[2]}$$
$$a^{[2]}=\sigma(z^{[2]})$$
事实上,我们仅仅用到了$\sigma(x)=\frac{1}{1+e^{-x}}$激活函数,输出单元的激活函数 不仅仅是$\sigma(x)$,还有很多...那么用$g(z)$代替$\sigma(z)$,网络输出计算可改写为:
$$z^{[1]}=W^{[1]}x+b^{[1]}$$
$$a^{[1]}=g(z^{[1]})$$
$$z^{[2]}=W^{[2]}a^{[1]}+b^{[2]}$$
$$a^{[2]}=g(z^{[2]})$$
首先介绍一下另一个激活函数——双曲正切函数:$tanh(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}}.$ 如图所示,这个函数几乎总是比$\sigma$表现要好。优点在于这个非线性函数能起到数据中心化的作用,让数据平均值为0.而非0.5.使得下一层网络的学习更加方便。
小结一点:tanh函数比$\sigma$函数更具有普适性,几乎所有场合可以用tanh而非后者,但是在二分类期望输出[0,1]时,隐藏层选择tanh,输出层仍然选择$\sigma$即可。
如果说自变量$z$非常大或非常小的时候,$\sigma$和$tanh$梯度都非常小,不利于梯度下降法。接下来介绍现在默认常用的激活函数:$a=ReLU(z)=max(0,z).$ 即非线性修正单元。如果你不知道隐藏层该用什么激活函数,那么建议使用ReLU.
还有一种表现更佳的激活函数,但是使用频率较低,带泄露的ReLU(leaky ReLU)
$$a=max(0.01z,z)$$
最后总结一下激活函数的选择,我把函数和解释都放在一幅图中。
二、为什么用非线性激活函数?
如果我们令$$a^{[1]}=z^{[1]},a^{[2]}=z^{[2]}.$$
即激活函数$$g(z)=z.$$
我们称这个激活函数为线性激活函数 或 恒等激活函数。
如果用了这样一个线性激活函数,结果会怎么样?我们来看看吴恩达老师的推导过程。
如果在网络层中使用线性激活函数,输出的结果也同样只是线性结果,因为线性函数的组合同样也是线性函数,无法计算出更有趣的函数。不使用非线性激活函数就和没有隐藏层效果相同,网络层数再多,也没有一点儿用!
三、激活函数的导数
对于$sigmoid$函数$$a=g(z)=\frac{1}{1+e^{-z}}$$
$$g'(z)=\frac{d}{dz}g(z)=a(1-a)$$
对于$tanh$函数$$a=g(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}}$$
$$g'(z)=1-a^2$$
对于$ReLU$函数$$a=g(z)=max(0,z)$$
$$ f(x)=\left\{\begin{aligned}0 , z<0;\\1,z\geq0.\end{aligned}\right.$$
对于$leakyReLU$函数$$a=g(z)=max(0.01z,z)$$
$$f(x)=\left\{\begin{aligned}0.01 , z<0;\\1,z\geq0.\end{aligned}\right.$$
有了这些求导基础后,我们就可以准备实现神经网络上的梯度下降算法了.