大纲: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的家族是一样的,不一样的地方是在小于零的地方,它是乘上的次方减1,就是那个激活函数的input,所以你可以想象说假设等于0的时候,=0,所以这边是接在一起的。而如果趋向于负无穷大的时候,的负无穷大次方是零,0减-1是-1,然后再乘,所以是,所以如下图绿色的线会收敛在。
SELU
上面那个ELU,要设多少?后来又出现一种新的方法,叫做:SELU。它相对于ELU做了一个新的变化:就是现在把每一个值的前面都乘上一个,然后他告诉你说跟应该设多少,,然后。
这个
如果今天设,,他的函数图就如下图所示:
他的特点是:
- 它的值有正有负:在整个ReLU的family里里面,除了一开始最原始的ReLU以外都有负值,所以这个特性还好;
- 有 Saturation Region:其他的ReLU他们没有Saturation Region,但是他有Saturation Region,不过ELU其实也有Saturation Region,因为SELU就只是ELU乘上一个而已;乘上这个有什么不同?乘上,让它在某些区域的斜率是大于的,意味着说你进来一个比较小的变化,通过Region以后,他把你的变化放大1.0507700987倍,所以它的input能是会被放大的,而且这是他一个ELU的没有的特色。
现在要讲:谜之数字是怎么来的?
假设今天我们有个输入的神经元,他们分别是:,我们可以把它视为个random variable。我们假设这 个random variable是的,mean是,variance是,那么假设它的, 。这 个random variable的分布不需要是高斯分布,它的分布可以是任何样子,以下的推论都成立。
现在我们希望的事情是找一个激活函数,它可以达到效果是说假设input的这些random variable 的,通过这个激活函数以后的output也是,这个是希望我们SELU可以得到的效果。
现在我们来做一番推导。我们先来看,我们来算它的mean跟variance:
mean的算法是: 。其实,那么;
因为input这些distribution它的平均都是零,经过weighted sum以后z的平均值,期望值也是零。我们这边做一个额外假设,等一下会用到是假设的平均值也是零,因为 是有正有负的,平均值也是零。好,我们现在知道的平均值是零,然后的平均值我们假设它是零;
接下来我们要算的,那的variance是什么呢?当然就是。
在最后这个式子的平方项里面有两种不同的项:
- 一种是:,我们可以把提出来只算平方的期望值。平方的期望值为。 假设有一个参数,他的 ,那它的平方的期望值当然就是1;因此:
- 另外一项是,在这一项里面我们可以把再提出来,因为他们是独立的,所以你可以把它拆开变成:,这一项等于0,因为我们知道。
所以在平方项里面第一项是我们需要考虑的;
在这里我们又做了一个额外的假设:假设乘以的variance也是1。所以的variance是
到这里,你只需要记住一件事:根据一些运算和假设之后,这个random variable它的,那么根据什么假设呢?我们根据每一个输入的random variable它的都是,我们还有另外一个假设是我们假设这一组,他的
但是:这些input其实也没有说它是高斯分布,input可以是任何分布啊~
但是我们这边可以直接假设:他可能是很接近高斯分布,为什么?有人在网络上评论说假设好像太强了,其实还好,因为根据中央极限定理:把一堆的random variable合起来,它会变成一个高斯分布,今天既然是很多的distribution的和,他应该会很接近高斯分布,尤其是在神经网络里面,可能是上千,可能就真的很接近高斯分布。
好,接下来假设的distribution我们已经知道,它就是一个高斯分布,接下来要推导的是说有没有哪一个激活函数,可以让我们做到说把一个normal distribution,通过他以后仍然;再推倒SELU的时候,只是有两个未知数我们不知道,一个就是,一个就是,所以接下来设两条式子把未知数解出来就结束了:现在的distribution,我们知道它是一个normal distribution,通过激活函数以后他的;而这中间当然你最需要用到积分,然后你就算到算出和了,好这个数学部分就没什么好推导的,但是这太过复杂我们就不会推,他其实花了非常大的力气做了一个非常冗长的推导,告诉你说只要我的落在某一个range之内,落在某个range之内,最后我的输出就会一直趋向于某一个和。
demo
现在我们来看demo:
在keris里面兜了一个50层的network,然后先试一下RELU,看用一下RELU 50层:没train起来,刚才RELU 10层的时候,我已经有demo过,他是train得起来的,50层就train不起来了。
好,试一下SELU,结果是:如果你跟RELU比的话有上去一点点,但是还是蛮差的;
原因是什么呢?
- 在推导SELU的时候,它有一个假设,每一个神经元的input是的,所以你的feature应该要先做一下normalize让input的时候要
- 在推SELU的时候,我们对的和是有假设的,我们假设为的是,的是,当然我没有办法在training的时候保证weight一直都是处于这个状态,但我们至少可以在initialize的时候把他initialize成这个状态,这样子我们到时候train的时候的和就不会差太多;怎么做呢?其实你可以直接在initialize的时候,让你的,你知道用一个就行了。
事实证明:把两个假设加上以后performance就不一样了。对,所以这个还是很重要,所以在deep learning的里面就是这样,差一个小细节就是天差地远。
paper的证实
接下来:我们引用paper实证一下,看看激活函数到底有没有用;
如下图上面蓝色的线就是一般的training,下面的这个SNN就是用SELU。你会发现说蓝色这些线它有一些震荡,有一些高低起伏,而红色用了SELU以后,它的曲线是非常平滑的,用那个batch normalization的话线就是会有高低起伏这个问题,为什么?因为你其实是用一个batch去来估测整个的statistics,所以这个估测的时候有时候是不太稳定的,再CIFAR-10的结果也是一样。好,下面这个是做在我记得是121个机器学习的test的上面,然后比较不同的方法,比较每个方法在所有的方法里面的排名。
所以中间这个数字代表每一个方法的排名。排名怎么赋值呢,它是把每一个方法的平均的排名减掉一个数字,然后呈现在这边,所以今天反正这个数字越小,代表说这个方法的排名在越前面,这边比了很多,SNN就是用SELU,MSRA 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乘上得到她的output。
OK,它中间有一个是可以调的,而设的时候长这个样子,可以调配得到不同的形状,然后再看paper里面好像设的时候performance就已经不错了,所以这是一个特别东西叫做Swish,然后我们再解释它是怎么来的,其实我实际试一下Swish没有比SELU好这样子。
好,这边是paper里面有把Swish跟其他的方法做一下比较,这边把Swish跟Leaky ReLU、ReLU 、PReLU、SoftPlus、ELU、SELU、GELU来比一下这样子。而什么时候Swish会赢过baseline,在多数的case Swish会赢过baseline,他就比了九个不同的test来发现说,比如说Swish去跟SELU比,在九个test里面都是Swish赢的,跟Leaky ReLU比在七个case赢,一个平局,一个输,比如说跟ELU比,8个赢,一个输,跟SELU比八个赢一个平局,然后看起来好像Swish真的是非常强。