学习笔记(5)——常用激活函数总结

激活函数

定义

神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层。输入层神经元节点将输入属性值直接传递给下一层(隐层或输出层)。
在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)。
单一神经元模型:
Alt

功能

若不用激励函数(相当于激励函数是f(x) = x),在这种情况下,每一层节点的输入都是上层输出的线性函数。很容易验证,无论神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron) 了,那么网络的逼近能力就相当有限。正因如此,决定引入非线性函数作为激励函数,这样深层神经网络表达能力就更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)。

常用激活函数总结

softmax函数

函数解析式:

S i = e i ∑ e j S_{i}=\frac{e^{i}}{\sum e^{j}} Si=ejei

softmax与sigmoid对比:

在这里插入图片描述

Sigmoid函数

Sigmoid 是常用的非线性的激活函数。sigmoid就是极端情况(类别数为2)下的softmax函数。

函数解析式:

f ( z ) = 1 1 + e − z f(z)=\frac{1}{1+e^{-z}} f(z)=1+ez1

函数图像:

Alt

特点:

能把输入的连续实值变换为0-1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1。
sigmod函数曾经比较流行,它可以想象成一个神经元的放电率,在中间斜率比较大的地方是神经元的敏感区,在两边斜率很平缓的地方是神经元的抑制区。

局限性:
  1. 在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失。其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。首先来看Sigmoid函数的导数,如下图所示:
    在这里插入图片描述
    若初始化神经网络的权值为 [0,1] 之间的随机值,由反向传播算法的数学推导可知,梯度从后向前传播时,每传递一层梯度值都会减小为原来的0.25倍,如果神经网络隐层特别多,那么梯度在穿过多层后将变得非常小接近于0,即出现梯度消失现象;当网络权值初始化为 (1,+∞) 区间内的值,则会出现梯度爆炸情况。
  2. 当输入稍微远离了坐标原点,函数的梯度就变得很小了,几乎为零。在神经网络反向传播的过程中,都是通过微分的链式法则来计算各个权重w的微分的。当反向传播经过了sigmod函数,这个链条上的微分就很小了,况且还可能经过很多个sigmod函数,最后会导致权重w对损失函数几乎没影响,这样不利于权重的优化,这个问题叫做梯度饱和,也可以叫梯度弥散
  3. Sigmoid 的 output 不是0均值(即zero-centered)。这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。 产生的一个结果就是:如 x > 0 , f = w T x + b x>0, f=w^{T} x+b x>0,f=wTx+b,那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。 当然如果按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,但跟上面提到的梯度消失问题相比还是好很多。
  4. 其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,会较大地增加训练时间。

tanh函数

tanh读作 Hyperbolic Tangent。

函数解析式:

tanh ⁡ ( x ) = sinh ⁡ ( x ) cosh ⁡ ( x ) = e x − e − x e x + e − x \tanh (x)=\frac{\sinh (x)}{\cosh (x)}=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} tanh(x)=cosh(x)sinh(x)=ex+exexex

函数及其导数图像:

在这里插入图片描述

特点:

tanh是双曲正切函数,tanh函数和sigmod函数的曲线比较相近:

  • 相同点:两个函数在输入很大或是很小的时候,输出都几乎平滑,梯度很小,不利于权重更新。
  • 不同点:tanh的输出区间是在(-1,1)之间,且整个函数是以0为中心的,这个特点比sigmod的好。tanh解决了Sigmoid函数的不是zero-centered输出问题,然而梯度消失(gradient vanishing)和幂运算的问题仍然存在。

一般二分类问题中,隐藏层tanh函数输出层sigmod函数。不过这些也都不是一成不变的,还是要具体问题具体分析,需要不断调试的。

ReLU函数

函数解析式:

R e l u = max ⁡ ( 0 , x ) R e l u=\max (0, x) Relu=max(0,x)

函数及其导数图像

在这里插入图片描述

特点:

ReLU(Rectified Linear Unit)函数是目前比较火的一个激活函数,相比于sigmod函数和tanh函数,它有以下几个优点:

  1. 在输入为正数的时候,不存在梯度饱和问题,解决了gradient vanishing问题。
  2. 计算速度要快很多,只需要判断输入是否大于0。ReLU函数只有线性关系,不管是前向传播还是反向传播,收敛速度远快于sigmod和tanh。

缺点:

  1. 当输入是负数的时候,ReLU是完全不被激活的,这就表明一旦输入到了负数,ReLU就会死掉。这样在前向传播过程中,还不算什么问题,有的区域是敏感的,有的是不敏感的。但是到了反向传播过程中,输入负数,梯度就会完全到0,这个和sigmod函数、tanh函数有一样的问题。
  2. ReLU函数的输出要么是0,要么是正数,这种操作被成为单侧抑制(使得神经网络的激活更接近于生物学上的处理过程)。这也就是说,ReLU函数也不是以0为中心的函数。
  3. Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。

Leaky ReLU函数(PReLU)

函数解析式:

f ( x ) = max ⁡ ( α x , x ) f(x)=\max (\alpha x, x) f(x)=max(αx,x)

函数及其导数图像:

在这里插入图片描述

特点:

为了解决Dead ReLU Problem,提出了将ReLU的前半段设为αx 而非0,PReLU的公式,里面的参数α一般是取0~1之间的数,而且一般还是比较小的,通常α = 0.01
另外一种直观的想法是基于参数的方法,即ParametricReLU:f(x)=max(αx,x),其中α 可由方向传播算法学出来。
理论上来讲,Leaky ReLU有ReLU的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。

ELU (Exponential Linear Units) 函数

函数解析式:

f ( x ) = { x ,  if  x > 0 α ( e x − 1 ) ,  otherwise  f(x)=\left\{\begin{array}{ll} x, & \text { if } x>0 \\ \alpha\left(e^{x}-1\right), & \text { otherwise } \end{array}\right. f(x)={x,α(ex1), if x>0 otherwise 

函数及其导数图像:

在这里插入图片描述

特点:

ELU也是为解决ReLU存在的问题而提出,显然,ELU有ReLU的基本所有优点:

  • 在输入为负数的情况下,是有一定的输出的,而且这部分输出还具有一定的抗干扰能力。这样可以消除ReLU死掉的问题,不会有Dead ReLU问题;
  • 输出的均值接近0,zero-centered。

它的一个小问题在于计算量稍大。类似于Leaky ReLU,理论上虽然好于ReLU,但在实际使用中目前并没有好的证据ELU总是优于ReLU。

MaxOut函数

Maxout是深度学习网络中的一层网络,就像池化层、卷积层一样等,我们可以把maxout 看成是网络的激活函数层,我们假设网络某一层的输入特征向量为:X=(x1,x2,……xd),也就是我们输入是d个神经元。Maxout隐藏层每个神经元的计算公式如下:
h i ( x ) = max ⁡ j ∈ [ 1 , k ] z i j h_{i}(x)=\max _{j \in[1, k]} z_{i j} hi(x)=j[1,k]maxzij
上面的公式就是maxout隐藏层神经元i的计算公式。其中,k就是maxout层所需要的参数了,由我们人为设定大小。就像dropout一样,也有自己的参数p(每个神经元dropout概率),maxout的参数是k。公式中Z的计算公式为:
z i j = x T W ⋯ i j + b i j z_{i j}=x^{T} W_{\cdots i j}+b_{i j} zij=xTWij+bij
权重w是一个大小为(d,m,k)三维矩阵,b是一个大小为(m,k)的二维矩阵,这两个就是我们需要学习的参数。如果我们设定参数k=1,此时,网络就类似于以前我们所学普通的MLP网络。
可以这么理解,本来传统的MLP算法在第i层到第i+1层,参数只有一组,然而现在我们在这一层同时训练n组的w、b参数,然后选择激活值Z最大的作为下一层神经元的激活值,这个max(z)函数即充当了激活函数。

选择激活函数的一些经验

  1. 深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。所以要尽量选择输出具有zero-centered特点的激活函数以加快模型的收敛速度。
  2. 如果使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者 Maxout。
  3. 最好不要用 sigmoid,可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout。

参考文章
常用激活函数(激励函数)理解与总结
几种常用激活函数的简介

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值