神经网络中的激活函数介绍

转载请注明出处:http://blog.csdn.net/gamer_gyt
博主微博:http://weibo.com/234654758
Github:https://github.com/thinkgamer
公众号:搜索与推荐Wiki

个人网站:http://thinkgamer.github.io


人工神经元(Artifical Neuron)简称神经元(Neuron),是构成神经网络的基本单元,其主要是模拟生物神经元的结构和特性,接受一组输入信息并产出输出。

激活函数(Activation Function)

是神经元中非常重要的一部分,为了增强网络的表示能力和学习能力,激活函数需要具备以下几点性质:

  • 连续并可导的非线性函数,可导的激活函数可以直接利用数值优化的方法来学习网络参数。
  • 激活函数及其导函数要尽可能的简单,有利于提高网络计算效率。
  • 激活函数的导函数的值域要在一个合适的区间内,不能太大也不能太小,否则会影响训练的效率和温度性。

Sigmoid型激活函数

S型曲线函数,常见的Sigmoid函数有Logistic函数和tanh函数。

知识点:对于函数f(x),若x趋向于负无穷大,其导数f’(x)趋向于0,则称其为左饱和。若x趋向于正无穷大,其导数f’(x)趋向于0,则称其为右饱和。同时满足左右饱和时,称为两端饱和。

  • Logistic 函数
    σ ( x ) = 1 1 + e x p ( − x ) \sigma (x) = \frac{1} { 1+ exp(-x)} σ(x)=1+exp(x)1
  • tanh函数

t a n h ( x ) = e x p ( x ) − e x p ( − x ) e x p ( x ) + e x p ( − x ) tanh(x) = \frac{ exp(x)-exp(-x) }{ exp(x) + exp(-x) } tanh(x)=exp(x)+exp(x)exp(x)exp(x)

tanh函数可以看作是放大并平移的Logistic函数,其值域是(-1,1)。
t a n h ( x ) = 2 σ ( 2 x ) − 1 tanh(x) = 2 \sigma(2x) - 1 tanh(x)=2σ(2x)1

tanh函数的输出是零中心化的(Zero-Centered),而Logistic函数的输出值恒大于0。非零中心化的输出会使得最后一层的神经元的输入发生位置偏移(Bias Shift),并进一步使得梯度下降的收敛速度变慢。

image

修正线性单元

Rectified Linear Unit(ReLU)也叫rectifier函数,是目前深层神经网络中经常使用的激活函数。ReLU实际上是一个斜坡函数,定义为:
R e L U ( x ) = { x  if  x ≥ 0 0  if  x < 0 = m a x ( 0 , x ) ReLU(x) = \begin{cases} x & \text{ if } x \geq 0 \\ 0 & \text{ if } x < 0 \end{cases} = max(0,x) ReLU(x)={x0 if x0 if x<0=max(0,x)


ReLU的优缺点:

  • 优点

采用ReLU的神经元只需要进行加,乘,和,比较的操作,计算上更加高效。Sigmoid型激活函数会导致一个非稀疏的神经网络,而ReLU却具有很好的稀疏性,大约50%的神经元会处于激活状态。

在优化方面,由于Sigmoid型函数的两端饱和,ReLU函数为左饱和函数,且在x>0时导数为1,在一定程度上缓解了神经网络的梯度消失问题,加速梯度下降的收敛速度。

  • 缺点

ReLU的输出是非零中心化的,给后一层的神经网络引入偏置偏移,会影响梯度下降的效率。此外ReLU神经元在训练时比较容易死亡。在训练时,如果参数在一次不恰当的更新后,第一个隐藏层中的某个ReLU神经元在所有的训练数据上都不能被激活,那么这个神经元自身参数的梯度永远都会是0,在以后的训练过程中永远不能被激活。这种现象称为死亡ReLU问题(Dying ReLU Problem),并且也有kennel会发生在其他隐藏层。


在实际使用中,为了避免上述情况,有集中ReLU的变种也会被广泛使用。

带泄漏的ReLU

带泄漏的ReLU在输入x<0时,保持一个很小的梯度 lambda。这样当神经元非激活时也能又一个非零的梯度可以更新参数,避免永远不能被激活。带泄漏的ReLU的定义如下:
L e a k y R e L U ( x ) = { x  if  x > 0 γ x  if  x ≤ 0 = m a x ( 0 , x ) + γ m i n ( 0 , x ) LeakyReLU(x) = \begin{cases} x & \text{ if } x > 0 \\ \gamma x & \text{ if } x \leq 0 \end{cases} = max(0,x) + \gamma min(0,x) LeakyReLU(x)={xγx if x>0 if x0=max(0,x)+γmin(0,x)
其中 gamma是一个很小的常数,比如0.01。当gamma < 1时,带泄漏的ReLU也可以写为:
L e a k y R e L U ( x ) = m a x ( x , γ x ) LeakyReLU(x) = max(x, \gamma x) LeakyReLU(x)=max(x,γx)
相当于是一个比较简单的maxout单元。

带参数的ReLU

带参数的ReLU引入一个可学习的参数,不同神经元可以有不同的参数,对于第i个神经元,其PReLU的定义为:

P R e L U ( x ) = { x  if  x > 0 γ i x  if  x ≤ 0 = m a x ( 0 , x ) + γ i m i n ( 0 , x ) PReLU(x) = \begin{cases} x & \text{ if } x > 0 \\ \gamma _ix & \text{ if } x \leq 0 \end{cases} = max(0,x) + \gamma_imin(0,x) PReLU(x)={xγix if x>0 if x0=max(0,x)+γimin(0,x)
其中γi为x≤0时函数的斜率。因此,PReLU是非饱和函数。如果γi =0,那 么 PReLU 就退化为 ReLU。如果 γi 为一个很小的常数,则 PReLU 可以看作带 泄露的 ReLU。PReLU 可以允许不同神经元具有不同的参数,也可以一组神经 元共享一个参数。


ELU

指数线性单元(Exponential Linear Unit)是一个近似的零中心化的非线性函数,其定义为:
E L U ( x ) = { x  if  x > 0 γ ( e x p ( x ) − 1 )  if  x ≤ 0 = m a x ( 0 , x ) + m i n ( 0 , γ ( e x p ( x ) − 1 ) ) ELU(x) = \begin{cases} x & \text{ if } x > 0 \\ \gamma (exp(x)-1) & \text{ if } x \leq 0 \end{cases} = max(0,x) + min(0,\gamma(exp(x)-1)) ELU(x)={xγ(exp(x)1) if x>0 if x0=max(0,x)+min(0,γ(exp(x)1))
其中 γ ≥ 0是一个超参数,决定x ≤ 0时的饱和曲线,并调整输出均值在0附
近。


Softplus函数

Softplus函数可以看作是rectifier函数的平滑版本,其定义为:
S o f t p l u s ( x ) = l o g ( 1 + e x p ( x ) ) Softplus(x) = log(1 + exp(x)) Softplus(x)=log(1+exp(x))
Softplus函数及其导数刚好是Logistic函数。Softplus函数虽然也具有单侧抑制,宽兴奋边界的特征,却没有稀疏激活性。

下图为几种激活函数的示例:

激活函数对比

Swish函数

Swish函数是一种自门控(self-Gated)激活函数,其定义为:
s w i s h ( x ) = x σ ( β x ) swish(x) = x \sigma (\beta x) swish(x)=xσ(βx)
其中 sigma(.)为logistic函数,beta为可学习的参数或一个固定超参数。 sigma(.) 属于 (0,1)可以看做是一种软性的门控机构。当sigma(beta x)接近于1时,门处于“开”状态,激活函数的输出近似于x本身;当sigma(beta x)接近于0时,门的状态为“关”,激活函数的输出近似于0。

下图为Swish函数的示例:
image

当 beta=0时,Swish函数变成线性函数 x/2。 当 beta=1时,Swish 函数在 x>0时近似线性,在x < 0时近似饱和,同时具有一定的非单调性。当beta趋向于正无穷大时, sigma(beta x)趋向于离散的0-1函数,Switch函数近似为ReLU函数。

因此Swish函数可以看作时线性函数和ReLU函数之间的非线性插值函数,其程度由参数beta控制。


Maxout单元

Maxout单元也是一种分段线性函数。Sigmoid型函数, ReLU等激活函数的输入是神经元的净输入z,是一个标量。而maxout单元的输入是上一层神经元的全部原始输入,是一个向量x=[x1;x2;…;x_d]。

每个maxout单元有K个权重向量w_k 属于 R^d 和偏置 b_k(1 <= k <= K)。对于输入x,可以得到K个净输入z_k,1 <= k <=K。
z k = w k T x + b k z_k = w^T_kx + b_k zk=wkTx+bk
其中
w k = [ w k , 1 , w k , 2 , . . . , w k , d ] T w_k = [w_{k,1},w_{k,2},...,w_{k,d}]^T wk=[wk,1,wk,2,...,wk,d]T
为第k个权重向量。
Maxout单元的非线性函数定义为:
m a x o u t ( x ) = m a x k ∈ [ 1 , K ] ( z k ) maxout(x) = \underset{k\in [1,K]}{max} (z_k) maxout(x)=k[1,K]max(zk)
Maxout单元不单是净输入到输出之间的非线性映射,而是整体学习输入到输出之间的非线性映射关系。Maxout激活函数可以看作任意凸函数的分段线性近似,并且在有限的点上是不可微的。


【技术服务】,详情点击查看: https://mp.weixin.qq.com/s/PtX9ukKRBmazAWARprGIAg

扫一扫 关注微信公众号!号主 专注于搜索和推荐系统,尝试使用算法去更好的服务于用户,包括但不局限于机器学习,深度学习,强化学习,自然语言理解,知识图谱,还不定时分享技术,资料,思考等文章!


参与评论 您还未登录,请先 登录 后发表或查看评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

搜索与推荐Wiki

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值