激活函数

激活函数

什么是激活函数?

所谓激活函数(Activation Function),就是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。

为什么要引入激活函数

激活函数(Activation functions)对于人工神经网络 模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用。它们将非线性特性引入到我们的网络中。如图,在神经元中,输入的 inputs 通过加权,求和后,还被作用了一个函数,这个函数就是激活函数。引入激活函数是为了增加神经网络模型的非线性。没有激活函数的每层都相当于矩阵相乘。就算你叠加了若干层之后,无非还是个矩阵相乘罢了。
在这里插入图片描述

为什么要转化为非线性?

如果没有引入激活的函数,说到底还是在对线性函数的处理,线性的输入就无法转会为非线性的输出,得到结果永远是线性的就无法去拟合复杂的情况。

常用的激活函数

函数部分借鉴了 https://blog.csdn.net/tyhj_sf/article/details/79932893 博客的内容

Sigmoid函数

Sigmoid是常用的非线性的激活函数,它的数学形式如下:
f ( z ) = 1 1 + e − z f(z)=\frac{1}{1+e^{-z}} f(z)=1+ez1

Sigmoid的几何图像如下:
在这里插入图片描述

特点

它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输入就是0;如果输入是非常大的正数,输出的就是1

缺点

sigmoid函数曾经被使用的很多,不过近年来,用它的人越来越少了。主要是因为它固有的一些却缺点。
缺点1: 在深度数据网络中梯度反向传递时导致梯度爆炸和梯度消失,期中梯度爆炸发生的概率非常小,而梯度消失发送的概念比较大,向看一下它的导数
在这里插入图片描述
如果我们初始化神经网络的权值是在0到1之间的随机值,由于反向传播算法的数学推导可知,梯度从后向前传播时,每传递1层梯度值就会减小为原来的0.25倍,如果神经网络隐藏层特别多,那么梯度在穿过多层后会变的非常小接近于0,即出现梯度消失的现象;当网络权值初始化在 ( 1 , + ∞ ) (1,+\infty) (1,+)之间的值,则会出现梯度爆炸的情况
缺点2:Sigmoid 的 output 不是0均值(即zero-centered)。这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。 产生的一个结果就是:如x>0, f = w T x + b f=w^Tx+b f=wTx+b,那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。 当然了,如果按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的梯度消失问题相比还是要好很多的。
缺点3:其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。

tanh函数

tanh函数解析式:
t a n h ( x ) = e x − e − x e x + x − x tanh(x) = \frac{e^x-e^{-x}}{e^x+x^{-x}} tanh(x)=ex+xxexex
tanh函数及其导数的几何图像如下图:
在这里插入图片描述
tanh读作Hyperbolic Tangent,它解决了Sigmoid函数的不是zero-centered输出问题,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。

Relu 函数

Relu函数的解析式:
R e l u = m a x ( 0 , x ) Relu = max(0,x) Relu=max(0,x)
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,在搭建人工神经网络的时候推荐优先尝试!

Leaky ReLU函数(PReLU)

函数表达式:
f ( x ) = m a x ( α x , x ) f(x) =max(\alpha x,x) f(x)=max(αx,x)
Leaky Relu函数及其导数的图像如下图所示:
在这里插入图片描述
人们为了解决Dead ReLU Problem,提出了将ReLU的前半段设为αx\alpha xαx而非0,通常α=0.01\alpha=0.01α=0.01。另外一种直观的想法是基于参数的方法,即ParametricReLU:f(x)=max(αx,x)Parametric ReLU:f(x) = \max(\alpha x, x)ParametricReLU:f(x)=max(αx,x),其中α\alphaα
可由方向传播算法学出来。理论上来讲,Leaky ReLU有ReLU的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。

应用中如何选择合适的激活函数?

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值