数学形式: f ( z ) = 1 1 + e − z f(z)={1\over1+e^{-z}} f(z)=1+e−z1 几何图像: 特点: 它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1. 缺点: sigmoid函数曾经被使用的很多,不过近年来,用它的人越来越少了。主要是因为它固有的一些 缺点。
缺点1:在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。首先来看Sigmoid函数的导数,如下图所示: 如果我们初始化神经网络的权值为 [0,1]之间的随机值,由反向传播算法的数学推导可知,梯度从后向前传播时,每传递一层梯度值都会减小为原来的0.25倍,如果神经网络隐层特别多,那么梯度在穿过多层后将变得非常小接近于0,即出现梯度消失现象;当网络权值初始化为 (1,+∞)区间内的值,则会出现梯度爆炸情况。 详细数学分析见文章:http://neuralnetworksanddeeplearning.com/chap5.html 中文译文:深度神经网络为何很难训练
缺点2:Sigmoid 的 output 不是0均值(即zero-centered)。这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。 产生的一个结果就是:如 x > 0 x>0 x>0, f = w T x + b f=w^Tx+b f=wTx+b,那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。 当然了,如果按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的梯度消失问题相比还是要好很多的。
缺点3:其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。
解析式: t a n h ( x ) = e x − e − x e x + e − x tanh(x)={e^x-e^{-x}\over e^x+e^{-x}} tanh(x)=ex+e−xex−e−x
tanh函数的几何图像如下图: tanh函数的导数的几何图像如下图: tanh读作Hyperbolic Tangent,它解决了Sigmoid函数的不是zero-centered输出问题,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。
解析式: R e l u = m a x ( x , 0 ) Relu=max(x,0) Relu=max(x,0) Relu函数的几何图像如下图所示: Relu函数的导数的几何图像如下图所示: ReLU函数其实就是一个取最大值函数,注意这并不是全区间可导的,但是我们可以取sub-gradient,如上图所示。ReLU虽然简单,但却是近几年的重要成果,有以下几大优点: 1) 解决了gradient vanishing问题 (在正区间) 2)计算速度非常快,只需要判断输入是否大于0 3)收敛速度远快于sigmoid和tanh
ReLU也有几个需要特别注意的问题: 1)ReLU的输出不是zero-centered 2)Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用**Xavier初始化方法**,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
尽管存在这两个问题,ReLU目前仍是最常用的activation function,在搭建人工神经网络的时候推荐优先尝试!
解析式: f ( x ) = { x , if x >=0 α x , otherwise f(x)= \begin{cases} x, & \text{if $x$ >=0} \\ \alpha x, & \text{otherwise} \end{cases} f(x)={x,αx,if x >=0otherwise Leaky Relu函数几何图像如下图所示: Leaky Relu函数的导数的几何图像如下图所示: 优点:
(1)神经元不会出现死亡的情况。 (2)对于所有的输入,不管是大于等于0还是小于0,神经元不会饱和。 (3)由于Leaky ReLU线性、非饱和的形式,在SGD中能够快速收敛。 (4)计算速度要快很多。Leaky ReLU函数只有线性关系,不需要指数计算,不管在前向传播还是反向传播,计算速度都比sigmoid和tanh快。
缺点:(1)Leaky ReLU函数中的α,需要通过先验知识人工赋值。
总结:Leaky ReLU很好的解决了“dead ReLU”的问题。因为Leaky ReLU保留了x小于0时的梯度,在x小于0时,不会出现神经元死亡的问题。对于Leaky ReLU给出了一个很小的负数梯度值α,这个值是很小的常数。比如:0.01。这样即修正了数据分布,又保留了一些负轴的值,使得负轴信息不会全部丢失。但是这个α通常是通过先验知识人工赋值的。理论上来讲,Leaky ReLU有ReLU的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。
解析式: f ( x ) = { x , if x >0 α ( e x − 1 ) , otherwise f(x)= \begin{cases} x, & \text{if $x$ >0} \\ \alpha (e^x-1), & \text{otherwise} \end{cases} f(x)={x,α(ex−1),if x >0otherwise 函数的几何图像如下图所示: 函数的导数的几何图像如下图所示: ELU也是为解决ReLU存在的问题而提出,显然,ELU有ReLU的基本所有优点,以及:
不会有Dead ReLU问题输出的均值接近0,zero-centered它的一个小问题在于计算量稍大。类似于Leaky ReLU,理论上虽然好于ReLU,但在实际使用中目前并没有好的证据ELU总是优于ReLU。
这个问题目前没有确定的方法,凭一些经验吧。 1)深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。所以要尽量选择输出具有zero-centered特点的激活函数以加快模型的收敛速度。 2)通常来说,不能把各种激活函数串起来在一个网络中使用。 3)如果使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者 Maxout. 4)最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout.
参考资料: https://blog.csdn.net/tyhj_sf/article/details/79932893