在阅读DarkNet源码的时候发现作者定义了大量从古至今流行的损失函数,本着科普的态度我打算做一个全面的总结,所以就有了这篇文章。
提到激活函数,最想问的一个问题肯定是它是干什么用的?激活函数的主要作用是提供网络的非线性表达建模能力,想象一下如果没有激活函数,那么神经网络只能表达线性映射,此刻即便是有再多的隐藏层,其整个网络和单层的神经网络都是等价的。因此正式由于激活函数的存在,深度神经网络才具有了强大的非线性学习能力。接下来我们就来盘点一下当前有哪些流行的激活函数吧,这是一件非常有意义的事,希望你能接着读下去。
Sigmoid激活函数
(0,1)
,具有很好的性质,可以被表示为概率或者用于输入的归一化等。可以看出,Sigmoid函数连续,光滑,严格单调,以(0,0.5)
中心对称,是一个非常良好的阈值函数。当x
趋近负无穷时,y
趋近于0
;x
趋近于正无穷时,y
趋近于1
;x=0
时,y=0.5
。当然,在x
超出[-6,6]
的范围后,函数值基本上没有变化,值非常接近,在应用中一般不考虑。Sigmoid函数的导数是其本身的函数,即f′(x)=f(x)(1−f(x))
,计算非常方便,也非常节省计算时间。0
,即: 。我们将具有这种性质的激活函数叫作软饱和激活函数。具体的,饱和又可分为左饱和与右饱和。与软饱和对应的是硬饱和, 即f′(x)=0
,当|x|>c
,其中c
为常数。sigmoid 的软饱和性,使得深度神经网络在二三十年里一直难以有效的训练,是阻碍神经网络发展的重要原因。另外,Sigmoid函数的输出均大于0
,使得输出不是0
均值,这称为偏移现象,这会导致后一层的神经元将得到上一层输出的非0
均值的信号作为输入。Tanh激活函数和它的导数
0
,使得其收敛速度要比Sigmoid快,减少迭代次数。0
值(仍然具有软饱和性),会造成梯度消失。还有其更复杂的幂运算。ReLU激活函数
x<0
时,ReLU硬饱和,而当x>0
时,则不存在饱和问题。所以,ReLU 能够在x>0
时保持梯度不衰减,从而缓解梯度消失问题。这让我们能够直接以监督的方式训练深度神经网络,而无需依赖无监督的逐层预训练。0
,偏移现象和神经元死亡会共同影响网络的收敛性。Leaky ReLU
Leaky ReLU激活函数
6
(对输出值做clip
),这是为了在移动端设备float16
的低精度的时候,也能有很好的数值分辨率,如果对ReLU的激活范围不加限制,输出范围为0到正无穷,如果激活值非常大,分布在一个很大的范围内,则低精度的float16
无法很好地精确描述如此大范围的数值,带来精度损失。ELU表达式
ELU激活函数
Softsign激活函数和它的导数
SoftPlus激活函数及导数
Swish激活函数
Swish激活函数导数
神经网络
激活值,其中是激活函数,在这里代表內积。然后,。那么当我们对层使用Maxout(设定)然后再输出的时候,情况就发生了改变。网络就变成了:
使用了Maxout后的网络
此时网络形式上就变成上面的样子,用公式表现出来就是: 也就是说第层的激活值计算了次,可我们明明只需要个激活值,那么我们该怎么办?其实上面的叙述中已经给出了答案,取这个的最大值来作为最终的结果。
可以看到采用Maxout的话参数个数也增加了倍,计算开销会增大。
MisH激活函数
本文分享自 GiantPandaCV 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!