各种激活函数比较docxWord格式.docx
《各种激活函数比较docxWord格式.docx》由会员分享,可在线阅读,更多相关《各种激活函数比较docxWord格式.docx(10页珍藏版)》请在冰豆网上搜索。
ActivationFunctions.
Sigmoid
Left:
Sigmoidnon-linearilysquashesrealnumberstorangebetween[0,1]Right:
Thetanhnon・linearitysquashesrealnumberstorangebetween[-1,1].
新。
•函数输出不是以0为中心的。
这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。
我们更偏向于当激活函数的输入是0时,输出也是0的函数。
产生的一个结果就是:
如果数据进入神经元的时候是正的(e.g.x>
0elementwiseinf^wTx+b),那么"
计算出的梯度也会始终都是正的。
当然了,如果你是按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。
因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的killgradients问题相比还是要好很多的。
tanh
tanh是上图中的右图,可以看出,tanh跟sigmoid还是很像的,实际上,tanh是sigmoid的变形:
tanh(炉2sigmoid(^-*
CMS
9ewFsel
101»
2026>
0M40
Epochs
与sigmoid不同的是,tanh是0均值的。
因此,实际应用中,tanh会比sigmoid更好(毕竟去粗取精了嘛\tanh函数将一个实数输入映射到卜1,1]范围内,如上图(右)所示。
当输入为0时,tanh函数输出为0,符合我们对激活函数的要求。
然而,tanh函数也存在梯度饱和问题,导致训练效率低下。
RectifiedLinearUnit(ReLU)activationfunction,whichiszerowhenx<
0andthenlinearwithslope1whenx>
0・Right:
AplotfromKrizhevskyetal.(pdf)paperindicatingthe6ximprovement!
inconvergencewiththeReLUunitcomparedtothetanhunit.
心)二/77輕0乂很显然,从图左可以看出,输入信号vO时,输出都是0,>
0的情况下,输出等于输入。
"
是二维的情况下,
使用ReLU之后的效果如下:
\\\r+6金H
相比sigmoid和tanh函数,Relu激活函数的优点在于:
•梯度不饱和。
梯度计算公式为:
l{x>
0}。
因此在反向传播过程屮,减轻了梯度弥散的问题,神经网络前几层的参数也可以很快的更新。
•计算速度快。
正向传播过程中,sigmoid和tanh函数计算激活值时需要计算指数,而Relu函数仅需要设置阈值。
如果xvO,f(x)二0,如果x>
O,f(x)=x。
加快了正向传播的计算速度。
因此,Relu激活函数可以极大地加快收敛速度,相比tanh函数,收敛速度可以加快6倍
ReLU的优点:
•Krizhevskyetal.发现使用ReLU得到的SGD(随机梯度下降)的收敛速度会比sigmoid/tanh快很多(看右图)。
有人说这是因为它是linear,而且non-saturating
•相比于sigmoid/tanh,ReLU只需要一个阈值就可以得到激活值,而不用去算一大堆复杂的运算。
ReLU的缺点:
当然ReLU也有缺点,就是训练的时候很”脆弱”,很容易就”die”了.什么意思呢?
举个例子:
一个非常大的梯度流过一个ReLU神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了。
如果这个情况发生了,那么这个神经元的梯度就永远都会是0.
当然,如果你设置了一个合适的较小的learningrate,这个问题发生的情况其实也不会太频繁。
Leaky-ReLU.P-ReLU.R-ReLU
LeakyReLUs:
就是用来解决这个“dyingReLU”的问题的。
与ReLU不同的是:
f[^)=ax,(%<
0)
K炉x,(%>
=0)
这里的a是一个很小的常数。
这样,即修正了数据分布,又保留了一些负轴的值,使得负轴信息不会全部丢失。
关于LeakyReLU的效果,众说纷纭,没有清晰的定论。
有些人做了实验发现LeakyReLU表现的很好;
有
LeakyReLU/PReLU
Vi=OiXiI
I
些实验则证明并不是这样。
ParametricReLU:
对于LeakyReLU中的a,通常都是通过先验知识人工赋值的。
然而可以观察到,损失函数对a的导数我们是可以求得的,可不可以将它作为一个参数进行训练呢?
KaimingHe的论文《DelvingDeepintoRectifiers:
SurpassingHuman-LevelPerformanceonImageNetClassification》指出,不仅可以训练,而且效果更好。
公式非常简单,反向传播至未激活前的神经元的公式就不写了,很容易就能得到°
对a的导数如下:
6yi6a^Q,(ifyi>
Q),e/se=yi
原文说使用了ParametricReLU后,最终效果比不用提高了1.03%.
RandomizedReLU:
RandomizedLeakyReLU是leakyReLU的random版本(a是random的).
它首次试在kaggle的NDSB比赛中被提出的。
核心思想就是,在训练过程中,a是从一个高斯分布5仙中随机出来的,然后再测试过程中进行修正(有点像dropout的用法)□
ifgO
ifXji<
0,
数学表示如下:
where
aji~U仏u),I<
uandE[0,1)
在测试阶段,把训练过程中所有的a〃取个平均值。
NDSB冠军的a是从"
3,8)中随机出来的。
那么,在测
试阶段,激活函数就是就是:
yip刈Rd!
看看cifar-100中的实验结果:
ReLUTrain
—ReLUVol
RReLU,【3,8]Tram—RReLU.(3,8lVai
■
111
4.5
4.0
225
2.0
1.5
IS
10
1.0
OS
JOC
325
RelUTrain—RelUVdl
PReUJTramPReLUVil
ReUJTrain
RdUV^I
LeakyReUJ.aa100Train
LeakyReLU.a-lOOVdl
300
Maxout
Maxout出现在ICML2013上,作者Goodfellow将maxout和dropout结合后,号称在MNIST,CIFAR-10,CIFAR-100,SVHN这4个数据上都取得了start-of-art的识别率。
Maxout公式如下:
f{^=maxjE[\yk[zij
假设"
是2维,那么有:
側=巾叭"
门x+M,i^72x+b2)
可以注意到,ReLU和LeakyReLU都是它的一个变形(比如,"
I力仁0的时候,就是ReLU).
Maxout的拟合能力是非常强的,它可以拟合任意的的凸函数。
作者从数学的角度上也证明了这个结论,即只
需2个maxout节点就可以拟合任意的凸函数了(相减),前提是”隐隐含层”节点的个数可以任意多.
XXX
所以,Maxout具有ReLU的优点(如:
计算简单,不会saturation),同时又没有ReLU的一些缺点(如:
容易Godieb不过呢,还是有一些缺点的嘛:
就是把参数double了。
还有其他一些激活函数,请看下表:
Ia*e
Plot
Equation
Derivative
Identity
/
/W=i
f'
M=1
Binarystep
牡forKO八丿1fori>
阳p
0fori0
?
fori=0
Logistic(a±
a
Softstep)
“—
/W=l+r«
f(x)=/(z)(l-/(j))
Taifl
2
/W=tanh(i)=^—5;
-1
rw=i-/m2
ArcTan
厂
/(i)=tan"
1(i)
Rectified
LinearUnit
(ReLU)
佝J0forI<
fori>
i'
m=■
0fori<
0
1fori>
ParaietericRectifiedLinearUnit(PReLU)121
V
/_
“、Iaxfori<
0/(I)=(ifori>
rw=
afori<
—
ExponentialLinearUnit(EUJ)⑶
/.
“、{a(ex-1)fori<
/(I>
=|iforr>
M=<
r/(i)+qfori<
i1fori>
SoftPlus
f(i)=loge(l+eI)
Bentidentity
阳*時I44
SoftExponential
「泌业地fora<
=<
ifora=0
1^^+0fora>
\Cl
八'
丿]严forq>
Sinusoid
f(x)=sin(i)
f(J)=cos(i)
Sine
-x/
/1fori=0
他)-(学for玮0
x/0渝i=0
/(』)-(警—讐for殍。
Gaussian
:
\
J
/W=e"
l'
(i)=-2xe~z2
Howtochooseaactivationfunction?
怎么选择激活函数呢?
我觉得这种问题不可能有定论的吧,只能说是个人建议。
如果你使用ReLU,那么一定要小心设置learningrate,而且要注意不要让你的网络出现很多“dead”神经元,
如果这个问题不好解决,那么可以试试LeakyReLU、PReLU或者Maxout.
友情提醒:
最好不要用sigmoid,你可以试试tanh,不过可以预期它的效果会比不上ReLU和Maxout.
还有,通常来说,很少会把各种激活函数串起来在一个网络中使用的。
Sigmoid是常用的非线性的激活函数,它的数学形式如下:
/(A)=1/1+e-Z
正如前一节提到的,它能够把输入的连续实值“压缩”到0和1之间。
特别的,如果是非常大的负数,那么输出就是0;
如果是非常大的正数,输出就是1.
sigmoid函数曾经被使用的很多,不过近年来,用它的人越来越少了。
主要是因为它的一些缺点:
•梯度饱和。
Sigmoidssaturateandkillgradients.(saturate这个词怎么翻译?
饱和?
)sigmoid有一个非常致命的缺点,当输入非常大或者非常小的肘候(saturation),即当函数激活值接近于0或者1时,这些神经元的梯度是接近于0的,从图中可以看岀梯度的趋势。
所以,你需要尤其注意参数的初始值来尽量避免saturation的情况。
如果你的初始值很大的话,大部分神经元可能都会处在saturation的状态而把gradientkill掉,这会导致网络变的很难学习。
在反向传播计算梯度过程中:
決)=(眇⑴)唧+1)**f(㈣,每层残差接近于°
计算出的梯度也不可避免地接近于o0这样在参数微调过程中,会引起参数弥散问题,传到前几层的梯度已经非常靠近0了,参数几乎不会再更
ReLU
近年来,ReLU变的越来越受欢迎。
它的数学表达式如下: