Deep Learning -- Activation Function

原文站点:https://senitco.github.io/2017/09/05/deep-learning-activation-function/git

  神经网络的激活函数(activation function)经过引入非线性因素,使得网络能够逼近任何非线性函数,提升网络模型的表达能力,更好地解决复杂问题。
github

Overview

  激活函数一般具备如下性质:
- 非线性:使用非线性激活函数的多层神经网络能够逼近全部函数
- 可微性:对于常见的优化方法——梯度降低法,可微性是必要的
- 单调性:单调激活函数可以保证单层网络是凸函数
- 输出范围:激活函数输出值是有限的时候,基于梯度的优化方法会更加稳定,由于特征的表示受有限权值的影响更显著;当输出值的范围无界时,模型训练会更加高效,不过这种状况下通常须要更小的学习率(learning rate),以保证收敛web

Sigmoid

  Sigmoid的数学公式为 f(x)=11+ex ,将输入映射到区间(0, 1),函数曲线以下图所示:
算法


sigmoid.jpeg

Sigmoid函数曾被普遍使用,但如今使用较少,主要是存在如下缺点:
- 函数饱和形成梯度消失(Sigmoids saturate and kill gradients):神经元的激活值在趋近0或1时会饱和,在这些区域梯度值几乎为0,并且梯度值非0的输入范围很是有限。在反向传播时,此处局部梯度值将与损失函数关于该神经元输出的梯度相乘,若是局部梯度很是小,那么相乘的结果也会趋近于0,形成梯度消失,使得前面网络的权值参数没法更新。为了防止饱和,初始化权重不易过大,不然大多数神经元将会饱和,致使网络难以学习。
- Sigmoid输出不是0均值(Sigmoid outputs are not zero-centered):这一性质会致使后面网络层获得的输入数据不是零中心的,影响梯度降低的运做。由于若是输入神经元的数据老是正数(好比在 f=wTx+b 中每一个元素都 x>0 ),那么关于 w 的梯度在反向传播的过程当中,要么所有是正数,要么所有是负数(具体依整个表达式 f 而定)。这将会致使梯度降低权重更新时出现z字型的降低。然而,若是是按batch去训练,那么每一个batch可能获得不一样的信号,整个批量的梯度加起来后,对于权重的最终更新将会有不一样的正负,在必定程度上减轻了这个问题。网络

此外,Sigmoid函数涉及到指数运算,增长了计算量。app

tanh

  双曲正切函数的数学表达式为 f(x)=1e2x1+e2x=2Sigmoid(2x)1 ,函数曲线以下图所示,输出值的范围为(-1, 1)
dom


tanh.jpeg

tanh函数一样存在饱和和梯度消失问题,但输出是0均值的,所以在必定程度上,性能略优于Sigmoid。svg

Rectified Linear Units(ReLU)

  ReLU应用较为普遍,其数学表达式为 f(x)=max(0,x) ,函数曲线如左下图所示
函数


relu_alexplot.jpg

ReLU激活函数主要有以下优缺点:
- (+)相比于Sigmoid和tanh,ReLU对于随机梯度降低(SGD)的收敛有显著的加速做用(在AlexNet中,比tanh收敛快6倍)。据称这是由其(分段)线性、非饱和致使的
- (+)Sigmoid、tanh包含指数运算,耗费计算资源,而ReLU经过和阈值比较便可获得激活值,不涉及复杂运算
- (-)ReLU的缺点是在训练时神经元比较脆弱,可能会“死掉”。当一个很大的梯度反向传播通过ReLU神经元时,可能会致使权值更新事后,对任何数据都再也不出现激活现象,全部流过该神经元的梯度都将变为0。也就是说,ReLU单元在训练中将不可逆转的死亡,致使数据多样性的丢失。实际上,若是学习率设置得太高,网络中约40%的神经元都会死掉,在整个训练集中都不会再激活。所以须要合理设置学习率。性能

w 是二维时,ReLU的效果如图:


relu-perf.png

leaky-ReLU、P-ReLU、R-ReLU、ELU

  leaky-ReLU是用于解决ReLU中神经元死亡的尝试方案,其数学公式以下:

f(x)={αx,x<0 x,x0

α 是一个很小的常数,可取值为0.01。有研究论文指出,leaky-ReLU激活函数的效果不错,但不是很稳定。Kaiming He等人在2015年发布的论文 Delving Deep into Rectifiers中介绍了一种新方法Parametric ReLU,把负区间上的斜率 α 当作每一个神经元中的一个参数来训练,然而该激活函数在在不一样任务中表现的效果也没有特别清晰。在另一个版本Randomized ReLU中

yji={ajixji,xji<0 xji,xji0

在训练过程当中, aji 是从一个高斯分布 U(l,u) 中随机选取的;在测试阶段是固定的,将训练过程当中的全部 aji 取平均值,测试阶段激活函数为 yji=xji(l+u)/2 。此外,还有一个ELU版本,公式定义以下(式中 a>0 ),相关内容可参考文献ELU

f(x)={a(ex1),x<0 x,x0


elu.jpg

Maxout

  Maxout源于大神Goodfellow在2013年发表的一篇论文Maxout Network,能够将其看做网络中的激活函数层。假设网络某一层的输入特征向量为 x=(x1,x2,...,xd)Rd ,Maxout隐层神经元的计算公式以下:

hj(x)=maxj[1,k]zij

zij=xTW...ij+bij

式中, WRd×m×k,bRm×k ,是须要学习的参数, k 是Maxout层所须要的参数。对于传统的MLP算法,从第 l 层到第 l+1 层的某个神经元,其输入为 x(l+1)i=w(l+1)iy(l)+bl+1i ,对第 l 层每一个神经元,本来只须要学习一组参数,引入了Maxout后,须要训练 k 组,并从中选取最大的输入值做为该神经元的激活值,至关于激活函数是一个分段线性函数。所以,Maxout能够说是ReLU和Leaky-ReLU的通常化概括。Maxout具有ReLU的优势(线性、非饱和),而没有其缺点(神经元死亡)。Maxout在MLP网络和卷积网络中都可以使用,并且其参数是可学习的,激活函数并不固定。Maxout的本质就是一个线性分段函数,能够拟合任意的凸函数(“隐隐含层”节点数k足够大时),以下图所示。和其余激活函数相比,Maxout存在参数激增的现象(k倍)。


maxout.jpg

论文中给出了相关定理:对于任意的一个连续分段线性函数 g(v) ,能够找到两个凸的分段线性函数 h1(v)h2(v) ,使得这两个凸函数的差值为 g(v)


piecewise linear approximation.jpg

Summary

  一般来讲,在一个网络中不多使用多种激活函数。若是使用ReLU,须要合理设置学习率,避免出现过多死亡神经元,也可使用leaky-ReLU或者Maxout来解决该问题。

reference