天天看点

吴恩达深度学习 —— 3.6 激活函数

要搭建一个神经网络,可以选择的是选择隐层里用哪一个激活函数,还有神经网络的输出单元用什么激活函数。

到目前为止,我们一直用的是sigmoid激活函数,但有时候其它函数效果要好得多,我们看看一些可供选择的函数。

吴恩达深度学习 —— 3.6 激活函数

在神经网络的正向传播步骤中,有两步用了sigmoid函数,就是 a = 1 1 + e − z a = \frac{1}{1+e^{-z}} a=1+e−z1​。在更一般的情况下,我们可以使用不同的函数 g ( z ) g(z) g(z)而不仅仅是 σ ( z ) \sigma(z) σ(z),可以是其它非线性函数。

吴恩达深度学习 —— 3.6 激活函数

比如说 σ \sigma σ函数介于0和1之间,有个激活函数几乎总比 σ \sigma σ函数表现更好,就是 t a n h tanh tanh函数,或者叫双曲正切函数,函数值介于-1和1之间,其函数公式表示为 a = t a n h ( z ) = e z − e ( − z ) e z + e ( − z ) a=tanh(z)=\frac{e^{z}-e^{(-z)}}{e^{z}+e^{(-z)}} a=tanh(z)=ez+e(−z)ez−e(−z)​,在数学上这实际上是 σ \sigma σ函数平移后的版本,让 σ \sigma σ平移经过零点然后函数值在-1到1之间,。

事实证明,对于隐藏单元,如果让函数 g ( z ) = t a n h ( z ) g(z)=tanh(z) g(z)=tanh(z),这几乎总比 σ \sigma σ函数效果要好,因为现在函数输出介于-1和1之间,激活函数的平均值更接近0。你可能需要平移所有的数据,让数据的平均值为0。使用 T a n h Tanh Tanh而不是 σ \sigma σ函数也有类似于数据中心化的效果,使得数据的平均值接近0,而不是0.5,这实际上让下一层的学习更方便一点。 t a n h tanh tanh函数几乎在所有场合都更优越,一个例外是输出层,因为如果y是0或者1,那么你希望 y ^ \hat{y} y^​介于0到1之间更合理,而不是-1到1。会用 σ \sigma σ激活函数的一个例外场合是使用二分分类时,在这种情况下,可以用 σ \sigma σ激活函数作为输出层。

不同层的激活函数可以不同,有时候为了表示不同层的不同激活函数,可能会用方括号上标来表示激活函数 g [ 1 ] g^{[1]} g[1]和激活函数 g [ 2 ] g^{[2]} g[2]的不同。

现在 σ \sigma σ函数和 t a n h tanh tanh函数都有一个缺点,如果z非常大或非常小,那么导数的梯度或者说这个函数的斜率可能就很小,这样会拖慢梯度下降算法。

吴恩达深度学习 —— 3.6 激活函数

机器学习中最有欢迎的一个玩具是所谓的修正线性单元(ReLU), R e L U = m a x ( 0 , z ) ReLU=max(0,z) ReLU=max(0,z),只要z为正,导数就是1,当z为负时,斜率为0。当使用这个函数时,当z刚好为0时,导数是没有定义的。但如果你编程实现时,得到的z刚好等于一个很小很小的非常接近0的值。在实践中不用担心这点,可以在z=0时,给导数赋值,可以赋值为1或者0都是可以的。

在选择激活函数时有一些经验法则,如果输出值是0和1,如果在做二元分类, s i g m o i d sigmoid sigmoid函数很适合作为输出层的激活函数,然后其它所有单元都用 R e L U ReLU ReLU激活函数。如果你不确定隐藏层应该用哪个,那就用ReLU作为激活函数。

吴恩达深度学习 —— 3.6 激活函数

而ReLU的一个缺点是当z为负时导数等于零,在实践中这没什么问题。ReLU还有另外一个版本,叫带泄漏的ReLU,激活函数为 l e a k y   R e L U = m a x ( 0.01 z , z ) leaky\space ReLU=max(0.01z,z) leaky ReLU=max(0.01z,z)。当z为负时,导数不再为0,它有一个很平缓的斜率在,这通常比ReLU激活函数更好,不过在实际中使用的频率没有那么高。你可能会问,为什么这个激活函数的常数是0.01呢?你也可以把它设成学习函数的另一个参数,根据自己的需要进行调整。

ReLU和带泄漏的ReLU的好处在于,对于很多z空间,激活函数的导数,激活函数的斜率和0差很远,所以在实践中使用ReLU激活函数,神经网络的学习速度通常会快很多,比 t a n h tanh tanh和 s i g m o i d sigmoid sigmoid函数都快得多,主要原因在于ReLU函数没有这种函数接近0从而减缓梯度下降的情况。对于z的一半范围来说,ReLU的斜率为零,但在实践中,有足够多的隐藏单元,令z大于0,所以对于大多数训练样本来说还是很快的。

快速回顾一下,各种激活函数的利弊。

对于 s i g m o i d sigmoid sigmoid函数,除非用在二元分类的输出层,不然绝对不要用,原因在于 t a n h tanh tanh几乎在所有的场合都更优越。还有最常用的默认激活函数是ReLU,如果你不确定要用哪个,就用这个ReLU函数;或者你想用的话,也可以尝试带泄漏的ReLU激活函数。

深度学习其中一个特点是,在建立神经网络时经常有很多不同的选择,比如隐藏单元数,激活函数,还有如何初始化权重等。有时候很难定下一个准则确定什么参数最适合你的问题。所以可以尝试在交叉验证集上跑跑,看看哪个参数效果更好,就用哪个。

继续阅读