【DL-CV】反向传播,(随机)梯度下降<前篇---后篇>【DL-CV】神经网络的补充
在介绍线性分类器的时候,提到了激活函数,还提到线性分类器的输出要经过激活函数才能作为下一层网络的输入。为什么呢?本文将对这一问题进行解疑并介绍多种多种激活函数。
引入激活函数
假如神经网络只由多个线性分类组器合而成,那无论怎样组合,他们对数据的操作永远都是线性变换而已,复杂度有限,只能实现线性分类而不能实现非线性分类,但现实中的数据往往不是线性可分的。为了解决这个问题,就要给神经网络引入非线性因素,提高神经网络模型的表达能力(学习更复杂的映射)。激活函数就是用来引入这个非线性因素的,下面介绍几种常见的激活函数及其优缺点(正负号表示)。
Sigmoid
其数学公式及其图像如下
它把输入压缩到(0,1)区间内,有两端饱和的特性,对于很大的正数它输出趋近与1,对于绝对值很小的负数它输出趋近于0。
这个函数曾经非常流行,但是由于其缺点(主要是两边饱和)饱受诟病,现在没什么人用了
- (-)梯度消失:当输入过大或过小时,由图可知局部梯度几乎为0,经过链式法则后梯度也几乎为0,你会失去梯度流的反馈,使权重几乎不更新
- (-)非零中心:sigmoid的输出均大于零(不是零均值),即给下一层神经元的x都大于零,$\sigma(W*x+b)$,假如这里的x全是正数,那么经过反向传播${∂L\over ∂W}会全正或全负$,于是所有权重值都会往一个方向更新,这样训练效率非常低。
tanh
其数学公式及其图像如下(双曲正切)
形状和sigmoid很像,也是两端饱和,不同的是它把输入压缩到(-1,1)区间内。
- (+)以零为中心
- (-)梯度消失
比sigmoid好了一点,没有非零中心的问题
ReLU
其数学公式及其图像如下
就是个取最大值得函数,当输入为负数,输出为0;当输入为正数,输出还是这个数
- (+)在正区间不会饱和(一个优势):在正区间梯度可传递
- (+)计算成本低
- (+)使用ReLU之后,权重收敛速度比sigmoid/tanh快(约6倍)
- (-)非零中心
- (-)在负区间梯度消失:某些权重永远不会更新,我们称这种情况叫“dead ReLU”。导致这种情况频发的原因主要有权重初始化不好或学习率太高
虽然有“dead ReLU”的情况发生,但这并不阻碍它成为优秀的激活函数,实际应用中其表现不错,是非常常用的激活函数
Leaky ReLU(LReLU)
其数学公式及其图像如下
ReLU的变种,负区间不再是0,而是给它一个很小的斜率(上图是0.01,也可以是其他常数)
- (+)ReLU的优点
- (+)不会出现梯度消失的情况
关于其效果没有清晰的定论,有的实验表现好,有些则不好
其实还可以把那个斜率当作可以反向传播和学习的参数α,然后就变成了Parametric ReLU(PReLU)激活函数
$$f(x)=max(\alpha x,x)$$
ELU
其数学公式及其图像如下
全名指数线性单元Exponential Linear Units,α是一个可调整的参数,它控制着ELU负值部分在何时饱和
- (+)ReLU的优点
- (+)输出均值接近零
- (+)负饱和机制,使模型对噪音有更强的鲁棒性
Maxout
这个函数有点奇,我觉得它直接改变了原有MLP网络的结构,以至于形成了maxout网络,其本身就集成了激活函数的功能。
$$f(x)=max_{j\in [1,k]}z_{j}$$
k是需人为设定的参数,k=1,网络就类相当于普通的MLP网络;k>1,就变身成maxout网络了。这个函数的原理如下图,笔者文字表达欠佳,需作图才能展示出来。如果想了解更多可上网搜“maxout激活函数”
选择
在同一个模型中,激活函数不会混搭使用,选定一个就用一个。一般最好的经验法则是使用ReLU函数,但是要谨慎的调节学习率。像LReLU,PReLU,ELU,Maxout这些函数则实验性强一点(实用性弱一点),但也可以试下。tanh和sigmoid就em....,算了吧。
除了这里介绍的6个外,还有一些其他的激活函数(如有着丧心病狂证明的SeLU),感兴趣的可以去查一下