盘点 深度学习妖怪 之 激活函数妖
哈哈,捉妖师的我这次给大家简单盘点一下那些在深度神经网络中兴风作浪的激活函数都有哪些妖怪吧,个个身手不凡,狡猾狡猾滴!
在此之前先给说下我们在使用神经网络的时候为啥要用到激活函数,什么?!激活函数是什么你都不知道?哈哈哈,太正常了,字面意思就是脑细胞之间相连接的树突和轴突(高中生物都没忘吧?)相当于电路中的导线。想想看你是不在肢解电子设备的时候会遇到各种五颜六色不同形状接口的线?它们的作用还千奇百怪,这就是我们要讲的激活函数了,要说它们的功能吧。。。嗯就是让脑细胞,让电子设备一下就启动,就活过来了。怎么激活?专业上讲,说的是运行在神经元之间的函数,它们将非线性引入到神经网络中(其实线性函数也是一种激活函数,也是一种激活形式,他们叫这种网络感知机,但是大家都嫌弃它笨,只会一刀切,不会拐弯,解决不了异或问题,然后它就有很多进化版本成了各种非线性形式啦),为啥要用非线性函数呢?因为有个哥们证明了如果使用非线性函数,那么神经网络可以逼近任意非线性函数,用途一下子就很广,吃得开了。但是花花世界非线性无处不在,什么样子的非线性函数好呢?在什么情况下使用什么样的激活函数效果最好?这就是本次捉妖师的我给大家要讲的内容啦!赶紧掏出不离身的小本本记下来。
再讲讲常见激活函数的一些性质,大部分激活函数具有一定的共性,也存在个性,如何要去评价一个激活函数的好坏呢?除了跑模型看结果外,大概可以参考以下介绍的几种性质:
-非线性:即导数不是常数;
-可微性:保证优化中梯度的可计算性,可以存在有限个点处不可微, 但处处subgradient;
-计算是否简单;
-非饱和性:就是在某些区间梯度接近于0,参数无法更新,饱和分为软饱和(sigmoid/tanh)和硬饱和;
-单调性:导数符号不变, 如果激活函数是单调的,单层网络可以保证是凸函数,但是这并不必须,因为神经网络本来是非凸的;
-参数计算量:激活函数有的自带参数,有的会计算原参数的k倍(没错说的就是Maxout)。
A. Sigmoid
首先介绍我们的老朋友老伙计Sigmoid(西戈莫伊),哈哈哈,想必大家对它十分熟悉了,它原本是在生物学中常见的S 型生长曲线,由于其单调递增以及反函数也递增等性质,可以用来做阈值函数,不管你什么来头先直接原子空间 一顿骚操作将变量映射(0, 1)之间。看一下公式先:
s i g m o i d ( x ) = σ ( x ) = 1 1 + e − x sigmoid(x) = \sigma(x)=\frac{1}{1+e^{-x}} sigmoid(x)=σ(x)=1+e−x1
sigmoid 函数是一个 logistic 函数 ,其图像长这样:
导数为:
σ ˙ ( x ) = σ ( x ) ( 1 − σ ( x ) ) \dot{\sigma}(x)=\sigma(x)(1-\sigma(x)) σ˙(x)=σ(x)(1−σ(x))
导数的图像长这样:
特点:
-梯度平滑;
-输出值在(0,1)之间;
-计算量较大;
-梯度消失:在sigmoid两侧,函数导数趋近于0,梯度趋近于0,无法更新参数;
-梯度爆炸发生概率很小:当网络权值初始化为 (1,+∞)(1,+∞) 区间内的值,则会出现梯度爆炸情况;
-输出不是0为中心;
B. Tanh
Tanh激活函数是Sigmoid的“胞弟”,很像,是一个双曲函数(大名双曲正切),是由基本双曲函数双曲正弦与双曲余弦推导而来,公式如下:
t a n h ( x ) = e x − e − x e x + e − x = 2 s i g m o i d ( 2 x ) − 1 tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}=2sigmoid(2x)-1 tanh(x)=ex+e−xex−e−x=2sigmoid(2x)−1
tanh函数的图像长这样:
其导数为:
t a n h ( x ) ˙ = 1 − t a n h ( x ) 2 \dot{tanh(x)}=1-tanh(x)^2 tanh(x)˙=1−tanh(x)2
其导数图像长这样: