激活函数(Activation Function)

简介

提到神经网络,就必然会聊到激活函数这一话题,常用的激活函数有:sigmoid、ReLU、tanh等,那么问题来了:

为什么需要激活函数?
激活函数有哪些?有哪些特点?
如何选用激活函数?

本文基于这3个问题展开,欢迎指正!

activation function

激活函数的作用

激活函数的作用是能够在神经网络中加入一些非线性元素,使得NN能够更好地解决较复杂的问题。
基于此,激活函数通常有如下一些性质,非线性可微性单调性(单调,单层网络能保证是凸函数)、f(x)≈x

常用激活函数

Sigmoid函数

曾被广泛使用,但由于自身缺陷,现很少使用,其定义为:
$$ f(x)= \frac{1}{1+e^{-x}} $$
函数对应图像如左图:
sigmoid

优点
  • Sigmoid函数的输出映射在(0,1)之间,单调连续,输出范围有限,基于梯度优化会更稳定,可作为输出层;
  • 求导容易。
缺点
  • 容易产生梯度消失,导致网络变得很难学习;
  • 输出不是以0为均值,导致后一层神经元输入是非0均值的信号。

tanh

与sigmoid很像,函数位于[-1,1]区间上,数学形式是sigmoid的变形:$$ tanh(x)=2sigmoid(2x)-1 = \frac{1-e^{-2x}}{1+e^{-2x}} $$ 函数对应上图右图,tanh是0均值的,实际应用中,tanh比sigmoid更好。

优点
  • 比sigmoid函数收敛速度更快;
  • 输出以0为均值(相比于sigmoid)。
缺点

并没有改变sigmoid的最大问题——梯度消失。

ReLU

近几年受宠爱的激活函数,定义为:$$ y= \begin{matrix}
0 & (x\leq 0) \
, y= x & (x>0)
\end{matrix} $$
函数对应图像如下:
relu

优点
  • 相比sigmoid和tanh,ReLU在SGD中能够快速收敛,如上图右图所示,在一个四层的卷积神经网络中,实线代表ReLU,虚线代表tanh,ReLU比tanh更快到达错误率0.25处。这一点可归因与ReLU是线性,且输出范围是无限的;
  • sigmoid和tanh涉及很多指数操作,ReLU实现更加简单;
  • 有效缓解梯度消失;
缺点

ReLU神经元在训练中不可逆地死亡,e.g. 随着训练的进行,可能神经元死亡,权重无法更新,那么流经神经元的梯度从这一刻开始永远是0。
learning rate设为合适的较小值,可以减少发生该问题的频次。

LReLU、PReLU与RReLU

LReLU、PReLU中,定义为这样的激活函数:$$ y= \begin{matrix}
ax & (x\leq 0) \
, y=x & (x>0)
\end{matrix} $$
,这里的a是一个很小的值,对应图像如下,
r_p_lReLU

其他激活函数

blog-ac1

如何选择?

关于激活函数的选取,目前没有定论,实践过程中更多需要结合实际问题,综合考虑不同激活函数优缺点。
根据Andrew Ng的deeplearning.ai课程讲解,他建议最好不要在隐藏层使用sigmoid,可试试tanh;如果使用ReLU,一定要小心设置learning rate,也可以试试Leaky ReLU、PReLU等。
Tips:
TensorFlow里有现成的方法可供使用。激活函数相关TensorFlow的官方文档

参考文献

  1. http://blog.csdn.net/cyh_24/article/details/50593400
  2. http://www.cnblogs.com/rgvb178/p/6055213.html
分享