【深度学习】激活函数

目录

为什么使用激活函数

sigmoid函数

Tanh函数

ReLU函数

问题

 【阿里】ReLu比sigmoid好在哪里?

为什么既然relu的梯度只有0和1,为什么还会梯度消失?

Numpy实现relu、sigmoid、tanh函数

Leaky ReLU

参数化修正线性单元(PReLU)

随机纠正线性单元(RReLU


为什么使用激活函数

我们使用激活函数并不是真的激活什么,这只是一个抽象概念,使用激活函数时为了让中间输出多样化,能够处理更复杂的问题。

如果不用激活函数的话,每一层最后输出的都是上一层输入的线性函数,不管加多少层神经网络,我们最后的输出也只是最开始输入数据的线性组合而已。激活函数给神经元引入了非线性因素,当加入多层神经网络时,就可以让神经网络拟合任何线性函数及非线性函数,从而使得神经网络可以适用于更多的非线性问题,而不仅仅是线性问题。

sigmoid函数

函数公式如下,函数曲线如下:

优点缺点
sigmoid的取值范围在(0, 1),而且是单调递增,比较容易优化Sigmoid函数收敛比较缓慢
 sigmoid求导比较容易,可以直接推导得出由于Sigmoid是软饱和,容易产生梯度消失,对于深度网络训练不太适合(从图上sigmoid的导数可以看出当x趋于无穷大的时候,也会使导数趋于0)
sigmoid函数并不是以(0,0)为中心点

Tanh函数

tanh为双切正切曲线,过(0,0)点。相比Sigmoid函数,更倾向于用tanh函数。

函数公式,函数曲线如下,

优点缺点
函数输出以(0,0)为中心tanh并没有解决sigmoid梯度消失的问题
收敛速度相对于Sigmoid更快

ReLU函数

优点缺点
在SGD中收敛速度要比Sigmoid和tanh快很多在训练过程中容易出现神经元死亡,之后梯度永远为0的情况。比如一个特别大的梯度经过神经元之后,我们调整权重参数,就会造成这个ReLU神经元对后来的输入永远都不会被激活,这个神经元的梯度永远都会是0,造成不可逆的死亡。
有效的缓解了梯度消失问题
对神经网络可以使用稀疏表达
对于无监督学习,也能获得很好的效果

问题

 【阿里】ReLu比sigmoid好在哪里?

@作者:约翰曰不约 

为什么通常Relu比sigmoid和tanh强,有什么不同?
主要是因为它们gradient特性不同。sigmoid和tanh的gradient在饱和区域非常平缓,接近于0,很容易造成vanishing gradient的问题,减缓收敛速度。vanishing gradient在网络层数多的时候尤其明显,是加深网络结构的主要障碍之一。相反,Relu的gradient大多数情况下是常数,有助于解决深层网络的收敛问题。Relu的另一个优势是在生物上的合理性,它是单边的,相比sigmoid和tanh,更符合生物神经元的特征。
而提出sigmoid和tanh,主要是因为它们全程可导。还有表达区间问题,sigmoid和tanh区间是0到1,或着-1到1,在表达上,尤其是输出层的表达上有优势。

@作者:crackhopper,

ReLU更容易学习优化。因为其分段线性性质,导致其前传,后传,求导都是分段线性。而传统的sigmoid函数,由于两端饱和,在传播过程中容易丢弃信息。

(1)从计算角度上,sigmoid和tanh激活函数均需要计算指数,复杂度高,而relu只需要一个阈值即可得到激活函数。

(2)relu的非饱和性有效的解决梯度消失的问题,提供相对宽的激活边界。

(3)relu的单侧抑制提供了网络的稀疏表达能力。

ReLu也有缺点呀!!!( ⊙ o ⊙ )!(扩展)

relu的局限性在于其训练过程中会导致神经元死亡的问题,由于函数f(z)=max(0,z)导致负梯度在经过该relu单元时被置为0,且在之后也不被任何数据激活,即流经该神经元的梯度永远为0,不对任何数据产生响应。在实际train中,如果学习率设置较大,会导致超过一定比例的神经元不可逆死亡,进而参数梯度无法更新,整个训练过程失败。——>所以提出了leaky relu。

【今天买一送一~\(≧▽≦)/~啦啦啦】

第一个问题:为什么引入非线性激励函数?(我们在每一层线性变换后叠加一个非线性激活函数,以避免多层网络等效于单层线性函数,从而活得更强大的学习与拟合能力。)
如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层输出都是上层输入的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了。
正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络就有意义了(不再是输入的线性组合,可以逼近任意函数)。最早的想法是sigmoid函数或者tanh函数,输出有界,很容易充当下一层输入(以及一些人的生物解释balabala)。

第二个问题:为什么引入Relu呢?
第一,采用sigmoid等函数,算激活函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。
第二,对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失,参见 @Haofeng Li 答案的第三点),从而无法完成深层网络的训练。
第三,Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生(以及一些人的生物解释balabala)。

当然现在也有一些对relu的改进,比如prelu,random relu等,在不同的数据集上会有一些训练速度上或者准确率上的改进,具体的大家可以找相关的paper看。
多加一句,现在主流的做法,会在做完relu之后,加一步batch normalization,尽可能保证每一层网络的输入具有相同的分布[1]。而最新的paper[2],他们在加入bypass connection之后,发现改变batch normalization的位置会有更好的效果。大家有兴趣可以看下。

为什么既然relu的梯度只有0和1,为什么还会梯度消失?

假如f(x) = 0.1x,g(x)是relu函数。
x1 = g(f(x0))
x2 = g(f(x1))
那么:
x2 = g(f(g(f(x0))))
假设这个复合函数中relu全部都在正半轴区域,即梯度为1的区域。我们会得到:

神经网络中不只relu这一种变换,其他的变换同样可以影响梯度值。故relu只是相对于其他激活函数可以缓解梯度消失,并不能消除。

Numpy实现relu、sigmoid、tanh函数

from matplotlib import pyplot as pl
 
 
x=np.arange(-5,5,0.01)
 
#Relu
y1=np.where(x>0,x,0)
pl.plot(x,y1)
pl.show()
 
y2=(x+np.abs(x))/2
pl.plot(x,y2)
pl.show()
 
y3=np.maximum(x,0)
pl.plot(x,y3)
pl.show()
 
 
#Sigmoid
y4=1/(1+np.exp(-x))
pl.plot(x,y4)
pl.show()
 
#Tanh
y5=(np.exp(x)-np.exp(-x))/(np.exp(x)+np.exp(-x))##np.tanh(x)
pl.plot(x,y5)
pl.show()

激活函数

误差越小,调整越慢;反之。

如果输出神经元是线性的,那么二次代价函数就是一种合适的选择。如果输出神经元是S型函数,那么比较适合用交叉熵代价函数。

Leaky ReLU

ReLU是将所有的负值都设为零,相反,Leaky ReLU是给所有负值赋予一个非零斜率。Leaky ReLU激活函数是在声学模型(2013)中首次提出的。以数学的方式我们可以表示为:

参数化修正线性单元(PReLU)

 PReLU可以看作是Leaky ReLU的一个变体。在PReLU中,负值部分的斜率是根据数据来定的,而非预先定义的。

随机纠正线性单元(RReLU)

   “随机纠正线性单元”RReLU也是Leaky ReLU的一个变体。在RReLU中,负值的斜率在训练中是随机的,在之后的测试中就变成了固定的了。RReLU的亮点在于,在训练环节中,aji是从一个均匀的分布U(I,u)中随机抽取的数值。形式上来说,我们能得到以下结果:

总结
    下图是ReLU、Leaky ReLU、PReLU和RReLU的比较:

  •  Leaky ReLU中的ai是固定的;  
  • PReLU中的ai是根据数据变化的;
  • RReLU中的aji是一个在一个给定的范围内随机抽取的值,这个值在测试环节就会固定下来。

参考:

几种常用激活函数的简介

tanh,relu,sigmoid激活函数numpy实现_geter_CS的博客-CSDN博客_np.tanh

激活函数-Sigmoid, Tanh及ReLU_lawenliu的专栏-CSDN博客_tanh函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值