【小白学图像】CNN的十大激活函数

908 阅读6分钟

文章目录: [TOC]

这篇文章主要总结一下CNN中已有的各种激活函数,然后讲述每个激活函数的特点以及存在的问题。

1 为什么要激活函数

答:如果不使用激活函数,这种情况下每一层输出都是上一层输入的线性函数。无论神经网络有多少层,输出都是输入的线性函数,这样就和只有一个隐藏层的效果是一样的。这种情况相当于多层感知机(MLP)。

2 激活函数

2.1 Sigmoid

【函数表达】 f(x)=11+exf(x)=\frac{1}{1+e^{-x}}

【函数图像】

【优点】

  • 单调连续,容易求导,可以用自身表示导数:f(x)(1f(x))f(x)(1-f(x))

【缺点】

  • 软饱和性,在输出值较大较小的时候(饱和区),梯度较小,网络难更新
  • 导数的取值空间为[0,0.25],因此多层sigmoid必然会导致梯度消失问题
  • sigmoid函数左右是以0为分界点的,但是输出的中心是0.5,因此使用sigmoid作为激活函数会有一个向右偏移的趋势。不过问题不大。 总之,sigmoid一般用在二分类的最后一个激活函数

2.2 Tanh

【函数表达】 f(x)=1e2x1+e2xf(x)=\frac{1-e^{-2x}}{1+e^{-2x}}

【函数图像】

【优点】

  • 相比sigmoid好一点,因为输出均值为0.
  • 快速求导,f(x)=1(f(x))2f'(x)=1-(f(x))^2,而且导数取值[0,1],比sigmoid导数[0,0.25]性质好。

【缺点】

  • 软饱和性

2.3 ReLU

【函数表达】

【函数图像】

【优点】

AlexNet提出的激活函数,非常优秀,在很长一段时间内是设计CNN网络的默认激活函数

  • 输入为正数的时候,输出导数为1,缓解了梯度消失问题,没有软饱和性。
  • 输入为负数的时候,神经元不更新,为网络带来稀疏性,人脑中的稀疏性达到95%。(我理解的稀疏性就是不干活不学习的脑细胞?)
  • 计算简单

【缺点】

  • 输入小于零的时候,左硬饱和,神经元无法更新,出现神经元死亡现象
  • ReLU输出没有负值,因此所有的输出都会是正值,出现均值偏移的情况。个人理解就是,假设一组数据都是正数那么对训练模型的参数的难度就会更大,收敛难。但是之后BN层+ReLU就可以解决这个问题,所以BN + ReLU基本是现在的默认配置。

2.4 Leaky ReLU

【函数表达】 f(x)=max(αx,x)f(x) = max(\alpha*x,x)

【函数图像】

【优点】

  • 为了解决relu中“神经元死亡”的问题,leaky relu给小于零的输入一个非常小的梯度

【缺点】

  • 公式中的 α\alpha 是一个很小的值,一般取0.01,首先这就是个超参数,另外也有文献指出它的性能很不稳定,有时候比relu好,有时候差,可想而知,不太靠谱。

2.5 PReLU

【函数表达】

公式和Leaky ReLU一样,只不过它的 α\alpha 参数是可学习的。

【优点】

  • 收敛速度比relu快

【缺点】

  • 目前还不清楚,只能说表现还不稳定,不够“通用”,其作者何凯明在他的ResNet也没使用,而是使用的ReLU。

2.6 RReLU 与 ELU

【RReLU】

和PReLU类似,只不过它这里的 α\alpha 参数是一个高斯分布上的随机值,在测试时固定。

【ELU】 ReLU在小于零的时候,梯度都是固定的,ELU想在小于零梯度都很小的基础上,希望靠近0梯度稍微大一些。

2.7 SELU

牛逼的地方是提出该方法的论文后面有长达93页的论证。。。。

【函数图像】

f(x)=λELU(x)f(x)=\lambda*ELU(x)

【优点】

  • 新增的参数 λ\lambda 大于1,所以在正半轴,函数的导数是大于1的。
  • 激活函数有一个不动点,网络深了以后每一层的输出都会向正态分布靠拢,美其名曰自归一化

【缺点】

  • selu的证明部分前提是权重服从正态分布,但是这个假设在实际中并不能一定成立。
  • 众多实验发现效果并不比relu好。

2.8 CReLU

【函数公式】 CReLU(x)=[ReLU(x),ReLU(x)]CReLU(x)=[ReLU(x),ReLU(-x)]

作者发现在网络的浅层卷积核更倾向于捕捉正负相位的信息,而ReLU会将负相位的信息归0,所以才有了CReLU操作。就是在浅层网络中,为了保存负相位的信息,将输入x取反,然后把两个激活函数的输出拼接起来,通道数翻倍

【优点】

  • 通道数翻倍,利用对称的关系,保留负相位的信息

【缺点】

  • 依赖调试,无法确定哪些层使用

2.9 Maxout (2013)

【函数公式】 max(w1Tx+b1,w2Tx+b2,...,wnTx+bn)max(w_1^Tx+b_1,w_2^Tx+b_2,...,w_n^Tx+b_n)

【优点】

  • maxout可以拟合任意的凸函数。
  • 具备relu的所有优点。
  • 不会出现神经元死亡。

【缺点】 参数量巨大(以k倍增加),因为之前我们每个神经元只需要一组权重和偏置,现在不是了,我们添加了冗余的k组权重和偏置,让输入均经过这些权重和偏置计算,只保留激活值最大的输出。可以理解为训练了k个网络参数

【基于个人理解的详解】

2013年,ICML上的一篇文献:《Maxout Networks》,这个算法我目前也很少用到,个人感觉最主要的原因应该是这个算法参数个数会成k倍增加(k是maxout的一个参数),不过没关系,对于我们来说知识积累才是最重要的,指不定某一天我们就需要用到这个算法,技多不压身。

传统的神经网络假设有两个输入,一个输出那么就会有两个权重和一个bias,计算出z的值,然后再把z放到激活函数里面,得到output:

现在假设我们设置Maxout的参数k=5,那么相当于在中间增加了一层,结构如下: 两个神经元,经过10个权重和5个bias,得到5个z,然后通过max这个函数,选取5个z中最大的那个z作为output。因此才说Maxout是激活函数。而这也是参数成k倍增加的原因。

2.10 Swish

【函数公式】 f(x)=xsigmoid(βx)f(x) = x*sigmoid(\beta*x)

其中 β\beta 参数可以是常数也可以是训练的。

【函数图像】

从图中可以看出来,当β\beta较小的时候,其实类似于线性函数,因为sigmoid为0的时候,导数约为0.25,因此当β\beta足够小的时候,近似为以0.25斜率的直线

β\beta较大的时候,是一个平滑的ReLU函数。

【优点】

  • 无上界有下界、平滑、非单调。
  • Swish函数可以看做是介于线性函数与ReLU函数之间的平滑函数。
  • 论文给出的实验,各种数据集上,各种网络,都比relu性能好(并且在深层网络上优势更大)。

【缺点】

  • 只有实验证明,没有理论支持。
  • 在浅层网络上,性能与relu差别不大。

3 总结

学习这么多激活函数之后,我个人的体会有几点:

  • CNN模型的baseline还是会使用BN+ReLU;
  • 有空的话会尝试使用BN+Swish激活函数;
  • Maxout激活函数的机制挺有趣;
  • 其他的激活函数了解了解就行了。