13.激活函数(SELU)

作者: SpareNoEfforts | 来源:发表于2019-02-25 22:57 被阅读0次


    大纲:Tips for Training Deep Network

    • Training Strategy: Batch Normalization
    • Activation Function: SELU
    • Network Structure: Highway Network


    ReLU

    Sigmoid激活函数现在基本上没有人在使用了,大家都用ReLU。

    ReLU的好处:它可以对抗gradient vanishing等等;


    自从有了ReLU以后,就有各式各样的变形,举例来说,有一个东西叫做Leaky ReLU,Leaky ReLU就是说小于0的地方我们不是乘0,我们小于零的地方乘上0.01,马上就会有人问说为什么是乘0.01呢 ? 那么就出现了Parametric ReLU,Parametric ReLU就是说小于0的地方,我们就乘上一个

    后来又有人想了一招叫Randomized ReLU,那就我所知,Randomized ReLU应该是没有paper的,但是某一个比赛的时候有人用了这一招,然后就得到好的结果,所以就被广为流传这个叫Randomized ReLU,他是说我们今天小于0的地方一样是乘上α但是α的值也不是从data learn出来的,他是从distribution做sample出来的。也就是说以前在做training的时候,每次你的α都是不一样的,但是在testing的时候你会fix住你的α,他就有点类似它是想要做到类似有点dropout的效果。

    ELU

    后来有人提出了一个ReLU的进化版叫做ELU,ELU就是Exponential Linear Unit的意思,如果他在大于0的地方跟其他的ReLU的家族是一样的,不一样的地方是在小于零的地方,它是α乘上ez次方减1,z就是那个激活函数的input,所以你可以想象说假设z等于0的时候,a=0,所以这边是接在一起的。而如果z趋向于负无穷大的时候,e的负无穷大次方是零,0减-1是-1,然后再乘α,所以是-α,所以如下图绿色的线会收敛在-α

    SELU

    上面那个ELU,α要设多少?后来又出现一种新的方法,叫做:SELU。它相对于ELU做了一个新的变化:就是现在把每一个值的前面都乘上一个λ,然后他告诉你说λα应该设多少,α=1.67326324……,然后λ=1.050700987……


    这个

    如果今天设α=1.67326324……λ=1.050700987……,他的函数图就如下图所示:


    他的特点是:
    • 它的值有正有负:在整个ReLU的family里里面,除了一开始最原始的ReLU以外都有负值,所以这个特性还好;
    • 有 Saturation Region:其他的ReLU他们没有Saturation Region,但是他有Saturation Region,不过ELU其实也有Saturation Region,因为SELU就只是ELU乘上一个λ而已;乘上这个λ有什么不同?乘上λ,让它在某些区域的斜率是大于1的,意味着说你进来一个比较小的变化,通过Region以后,他把你的变化放大1.0507700987倍,所以它的input能是会被放大的,而且这是他一个ELU的没有的特色。
    现在要讲:谜之数字是怎么来的?

    假设今天我们有K个输入的神经元,他们分别是:a_1,a_2,……,a_K,我们可以把它视为K个random variable。我们假设这K 个random variable是i.i.d的,mean是μ,variance是σ^2,那么假设它的μ=0variance=1。这K 个random variable的分布不需要是高斯分布,它的分布可以是任何样子,以下的推论都成立。

    现在我们希望的事情是找一个激活函数,它可以达到效果是说假设input的这些random variable 的mean=0,variance=1,通过这个激活函数以后的output也是mean=0,variance=1,这个是希望我们SELU可以得到的效果。

    现在我们来做一番推导。我们先来看z,我们来算它的mean跟variance:z = {a_1}{w_1} + ... + {a_k}{w_k} + ... + {a_K}{w_K}

    mean的算法是:\begin{array}{*{20}{c}} {{\mu _z}}& = &{E\left[ z \right]}\\ {}& = &{\sum\limits_{k = 1}^K {E[{a_k}]{w_k}} }\\ {}& = &{\mu \sum\limits_{k = 1}^K {{w_k}} }\\ {}& = &{\mu \cdot K{\mu _w}} \end{array} 。其实\mu =0,那么mean=\mu_z=0

    因为input这些distribution它的平均都是零,经过weighted sum以后z的平均值,期望值也是零。我们这边做一个额外假设,等一下会用到是假设weight的平均值也是零,因为 weight是有正有负的,平均值也是零。好,我们现在知道z的平均值是零,然后weight的平均值我们假设它是零;

    接下来我们要算zvariance,那z的variance是什么呢?当然就是{\sigma _z} = E[{(z - {\mu _z})^2}]=E[z^2]=E[({a_1}{w_1} + ... + {a_k}{w_k} + ... + {a_K}{w_K})^2]
    在最后这个式子的平方项里面有两种不同的项:

    • 一种是:E[{({a_k}{w_k})^2}],我们可以把w_k提出来只算a_k平方的期望值。a_k平方的期望值为1。 假设有一个参数,他的mean=0, variance=1,那它的平方的期望值当然就是1;因此:E[{({a_k}{w_k})^2}] = {({w_k})^2}E[{({a_k})^2}]=({w_k})^2\sigma ^2
    • 另外一项是a_ia_jw_iw_j,在这一项里面我们可以把w_i,w_j再提出来,因为a_i,a_j他们是独立的,所以你可以把它拆开变成:w_iw_jE[a_i]E[a_j],这一项等于0,因为我们知道E[a_i]=E[a_j]=0

    所以在平方项里面第一项是我们需要考虑的;
    \begin{array}{*{20}{c}} {{\sigma _z}}& = &{E[{{(z - {\mu _z})}^2}]}\\ {}& = &{E[{{(z)}^2}]}\\ {}& = &{E[{{({a_1}{w_1} + ... + {a_k}{w_k} + ... + {a_K}{w_K})}^2}]}\\ {}& = &{ = \sum\limits_{k = 1}^K {{{({w_k})}^2}{\sigma ^2} = {\sigma ^2} \cdot K\sigma _w^2 = 1} } \end{array}
    在这里我们又做了一个额外的假设:假设K乘以weight的variance也是1。所以weight的variance是1/K

    到这里,你只需要记住一件事:根据一些运算和假设之后,z这个random variable它的mean=0.variance=1,那么根据什么假设呢?我们根据每一个输入的random variable它的都是mean=0.variance=1,我们还有另外一个假设是我们假设这一组weight,他的mean=0.variance=1/K

    但是:这些input其实也没有说它是高斯分布,input可以是任何分布啊~
    但是我们这边可以直接假设z他可能是很接近高斯分布,为什么?有人在网络上评论说假设好像太强了,其实还好,因为根据中央极限定理:把一堆i.i.d的random variable合起来,它会变成一个高斯分布,今天既然z是很多i.i.d的distribution的和,他应该会很接近高斯分布,尤其是在神经网络里面,k可能是上千,z可能就真的很接近高斯分布。

    好,接下来假设z的distribution我们已经知道,它就是一个高斯分布,接下来要推导的是说有没有哪一个激活函数,可以让我们做到说把一个normal distribution,通过他以后仍然mean=0,variance=1;再推倒SELU的时候,只是有两个未知数我们不知道,一个就是α,一个就是λ,所以接下来设两条式子把未知数解出来就结束了:现在z的distribution,我们知道它是一个normal distribution,通过激活函数以后他的mean=0,variance=1;而这中间当然你最需要用到积分,然后你就算到算出αλ了,好这个数学部分就没什么好推导的,但是这太过复杂我们就不会推,他其实花了非常大的力气做了一个非常冗长的推导,告诉你说只要我的mean落在某一个range之内,variance落在某个range之内,最后我的输出就会一直趋向于某一个meanvariance

    demo

    现在我们来看demo:

    在keris里面兜了一个50层的network,然后先试一下RELU,看用一下RELU 50层:没train起来,刚才RELU 10层的时候,我已经有demo过,他是train得起来的,50层就train不起来了。

    好,试一下SELU,结果是:如果你跟RELU比的话有上去一点点,但是还是蛮差的;

    原因是什么呢?

    • 在推导SELU的时候,它有一个假设,每一个神经元的input是mean=0.variance=1i.i.d,所以你的feature应该要先做一下normalize让input的时候要mean=0,varaince=1
    • 在推SELU的时候,我们对weightmeanvariance是有假设的,我们假设为weightmean0weightvariance1/K,当然我没有办法在training的时候保证weight一直都是处于这个状态,但我们至少可以在initialize的时候把他initialize成这个状态,这样子我们到时候train的时候weightmeanvariance就不会差太多;怎么做呢?其实你可以直接在initialize的时候,让你的mean=0,variance=1/K,你知道用一个lecun_normal就行了。

    事实证明:把两个假设加上以后performance就不一样了。对,所以这个还是很重要,所以在deep learning的里面就是这样,差一个小细节就是天差地远。

    paper的证实

    接下来:我们引用paper实证一下,看看激活函数到底有没有用;

    如下图上面蓝色的线就是一般的training,下面的这个SNN就是用SELU。你会发现说蓝色这些线它有一些震荡,有一些高低起伏,而红色用了SELU以后,它的曲线是非常平滑的,用那个batch normalization的话线就是会有高低起伏这个问题,为什么?因为你其实是用一个batch去来估测整个的statistics,所以这个估测的时候有时候是不太稳定的,再CIFAR-10的结果也是一样。好,下面这个是做在我记得是121个机器学习的test的上面,然后比较不同的方法,比较每个方法在所有的方法里面的排名。

    所以中间这个数字代表每一个方法的排名。排名怎么赋值呢,它是把每一个方法的平均的排名减掉一个数字,然后呈现在这边,所以今天反正这个数字越小,代表说这个方法的排名在越前面,这边比了很多,SNN就是用SELUMSRA init你可以想象当然是MSRA的propose,这是一种initialization的方法特别适合用在RELU上面。layer normalization、Highway Network、Residual Network、Weight normalization、Batch normalization
    好,总之SELU的performance最好。
    好在接下来把SELU跟其它方法比一下,我这边就比了SVN,Random Forest等等就发现说SELU也是以SVN,Random Forest的,这边数字越小就代表排名在越前面了。所以有个有趣的事就是你发现说其实SVN是引其他deep learning的方法的,其实真的就是这个样子,在121个machine learning的比较里面,deep learning其实并没有特别强,其实少数可以deep learning ??,然后打败其他的去抛能力方法的时候,其实在deep learning的那些那几个test上面, SVN和Random Forest其实还是颇强的。

    Swish

    还有一个新的激活函数叫做Swish。这个Swish激活函数长什么样子,它是一个非常神奇的激活函数,他把sigmoid乘上z得到她的output。

    OK,它中间有一个β是可以调的,而β1.0的时候长这个样子,可以调配β得到不同的形状,然后再看paper里面好像β1.0的时候performance就已经不错了,所以这是一个特别东西叫做Swish,然后我们再解释它是怎么来的,其实我实际试一下Swish没有比SELU好这样子

    好,这边是paper里面有把Swish跟其他的方法做一下比较,这边把SwishLeaky ReLU、ReLU 、PReLU、SoftPlus、ELU、SELU、GELU来比一下这样子。而什么时候Swish会赢过baseline,在多数的case Swish会赢过baseline,他就比了九个不同的test来发现说,比如说Swish去跟SELU比,在九个test里面都是Swish赢的,跟Leaky ReLU比在七个case赢,一个平局,一个输,比如说跟ELU比,8个赢,一个输,跟SELU比八个赢一个平局,然后看起来好像Swish真的是非常强。

    相关文章

      网友评论

        本文标题:13.激活函数(SELU)

        本文链接:https://www.haomeiwen.com/subject/xkjnyqtx.html