常用激活函数进化史

在使用神经网络时,我们要加入非线性的函数,这样神经网络学到的 “边界” 才会更加的精确、光滑,神经网络的 “黑箱” 才可以表示更多复杂的函数来解决更加复杂的问题。

  1. Sigmoid 激活函数。我们知道在做二分类时我们经常使用sigmoid函数,它可以表示 P(y=1|x) 的概率,但是我们基本只在输出层使用它,几乎不在神经网络中间使用它,是因为如下图,如果输入落在0附近,梯度是相当大的,我们迭代weights时一般使用Backpropagation,根据求导的链式法则,由于神经网络层数一层层叠加,就会出现梯度爆炸的问题,一般我们使用梯度裁剪即Gradient Clipping来解决梯度爆炸问题;而如果输入不落在中间区间,sigmoid函数saturate,saturated neurons kill the gradient flow,梯度逐渐趋近于0,这时候会出现梯度消失问题,对于梯度消失问题我们可以使用ReLU函数来解决。而且Sigmoid 函数输出一直是positive的,s = sigmoid(f(x))其中f(x)=wx+b, 对w求导根据链式法则我们可以得到

    前一项大于0,而x大于零或者小于0,就使得在梯度下降迭代weights时,it is going to be either positive or negative for all weights, 这时候梯度下降的路线会出现Zig Zag path,使得优化过程变得缓慢,原本可以一步到位的可能多出好多倍的时间。

    • 优:可以很好的表示概率P(y=1|x)

    • 缺:梯度爆炸;梯度消失; Zig Zag path

      Tanh
  1. Tanh 激活函数。 类似于sigmoid的函数,在sigmoid基础上变为zero-centered,更容易被优化,但是梯度爆炸以及消失的缺点仍然存在。

Tanh
  1. ReLU 激活函数。ReLU函数由于梯度在第一象限恒为1,所以可以很好解决梯度消失的问题,并且由于梯度为一个constant,所以使用梯度下降时间以及空间复杂度会十分低,但是由于在输入为负时,梯度会负,这时候会有死亡ReLU的问题。

    • 优:避免梯度消失;时间空间复杂度更低
    • 缺:无法避免梯度爆炸;死亡ReLU
ReLU
  1. ELU 激活函数。在ReLU基础上让其在输入为负时梯度不为0,但是由于引入指数运算,计算复杂度会大大上升,并且α是一个hyper parameter,不能被学习到,会影响神经网络的性能。

    • 优:继承ReLU优点,避免死亡ReLU的问题
    • 缺:无法避免梯度爆炸;指数运算复杂;引入新的hyper parameter
    ELU ELU
  2. Leaky ReLU激活函数。相比ELU,无指数运算,大大降低计算复杂度,但是由于正负时均为线性函数,所以相比ELU,有一些局限性

    • 优:继承ELU优点;无指数运算,计算复杂度大大下降
    • 缺:无法避免梯度爆炸;相比ELU,由于正负部分均为线性,有一定局限性;引入了一个新的hyper parameter

    f(x) = max(αx,x)

Leaky ReLU
  1. SELU 激活函数。收敛快,不会出现梯度爆炸或者消失问题(internal normalization), 但是对初始化有特殊要求(initialization function lecun_normal)。

    Leaky ReLU
  1. Maxout Units。注意是很多个Units共同组成(数目不定)。多个线性的分界线可以去逼近一个convex function。个数越多,越逼近

    • 优:不会死;不会saturate;Linear Regimes;Generalization of ReLUs
    • 缺:会大大增加参数量
    Maxout Units

一些激活函数使用建议:

  • Sigmoid 函数一般真的不用:)
  • ReLU是最普遍使用的激活函数
  • 除了ReLU的第二选择是ReLU的变种(ELU,Leaky ReLU等等)或者Maxout激活函数
  • Recurrent nets需要使用tanh或者相似的函数