13.激活函数(SELU)



大纲: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的地方,我们就乘上一个
α
,至于
α
的值多少根据training data把它learn出来。

后来又有人想了一招叫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……


这个
λ
α
的值看似是乱讲的,实际上是作者推导出来的,很麻烦的推导,详情也可以看作者的github:https://github.com/bioinf-jku/SNNs

如果今天设α=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真的是非常强。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容