大家好,又见面了,我是你们的朋友全栈君。
什么是激活函数
在神经网络中,我们会对所有的输入进行加权求和,之后我们会在对结果施加一个函数,这个函数就是我们所说的激活函数。如下图所示。
为什么使用激活函数
我们使用激活函数并不是真的激活什么,这只是一个抽象概念,使用激活函数时为了让中间输出多样化,能够处理更复杂的问题。
如果不适用结果函数的话,每一层最后输出的都是上一层输入的线性函数,不管加多少层神经网络,我们最后的输出也只是最开始输入数据的线性组合而已。激活函数给神经元引入了非线性因素,当加入多层神经网络时,就可以让神经网络拟合任何线性函数及非线性函数,从而使得神经网络可以适用于更多的非线性问题,而不仅仅是线性问题。
有论文中把激活函数定义为一个几乎处处可微的函数f: R->R
有哪些激活函数
对于神经网络,一版我们会使用三种激活函数:Sigmoid函数、Tanh函数、ReLU函数。
基本概念:
饱和:
当函数f(x)满足:
时,称为右饱和;
当函数f(x)满足:
时,称为左饱和。
当f(x)同时满足左饱和及右饱和时,称为饱和。
软包和与硬包和:
在饱和定义的基础上,如果存在常数c1,当x>c1时候恒满足,称之为右硬饱和;同样的,如果存在c2,当x<c2时恒满足,称之为左硬饱和。如果同时满足了左饱和,又满足了右饱和,称之为硬包和。相对的,只有在x趋于极值时才能满足f(x)的倒数为0,则成为软饱和。
1. Sigmoid 函数
sigmoid 曾经风靡一时,但是由于sigmoid有自身的缺陷,现在用的比较少了。
函数公式如下:
,相应的
函数曲线如下:
优点:
<1> Sigmoid的取值范围在(0, 1),而且是单调递增,比较容易优化
<2> Sigmoid求导比较容易,可以直接推导得出。
缺点:
<1> Sigmoid函数收敛比较缓慢
<2> 由于Sigmoid是软饱和,容易产生梯度消失,对于深度网络训练不太适合(从图上sigmoid的导数可以看出当x趋于无穷大的时候,也会使导数趋于0)
<3> Sigmoid函数并不是以(0,0)为中心点
2. Tanh函数
tanh为双切正切曲线,过(0,0)点。相比Sigmoid函数,更倾向于用tanh函数
函数公式:
相应的
函数曲线如下:
优点:
<1> 函数输出以(0,0)为中学
<2> 收敛速度相对于Sigmoid更快
缺点:
<1> tanh并没有解决sigmoid梯度消失的问题
3. ReLU函数
最近这几年很常用的激活函数。
公式如下:
优点:
<1> 在SGD中收敛速度要比Sigmoid和tanh快很多
<2> 有效的缓解了梯度消失问题
<3> 对神经网络可以使用稀疏表达
<4> 对于无监督学习,也能获得很好的效果
缺点:
<1> 在训练过程中容易出现神经元失望,之后梯度永远为0的情况。比如一个特别大的梯度结果神经元之后,我们调整权重参数,就会造成这个ReLU神经元对后来来的输入永远都不会被激活,这个神经元的梯度永远都会是0,造成不可逆的死亡。
参考:http://www.cnblogs.com/rgvb178/p/6055213.html
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/124662.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...