文章目录: [TOC]
这篇文章主要总结一下CNN中已有的各种激活函数,然后讲述每个激活函数的特点以及存在的问题。
1 为什么要激活函数
答:如果不使用激活函数,这种情况下每一层输出都是上一层输入的线性函数。无论神经网络有多少层,输出都是输入的线性函数,这样就和只有一个隐藏层的效果是一样的。这种情况相当于多层感知机(MLP)。
2 激活函数
2.1 Sigmoid
【函数表达】
【函数图像】
【优点】
- 单调连续,容易求导,可以用自身表示导数:
【缺点】
- 软饱和性,在输出值较大较小的时候(饱和区),梯度较小,网络难更新
- 导数的取值空间为[0,0.25],因此多层sigmoid必然会导致梯度消失问题
- sigmoid函数左右是以0为分界点的,但是输出的中心是0.5,因此使用sigmoid作为激活函数会有一个向右偏移的趋势。不过问题不大。 总之,sigmoid一般用在二分类的最后一个激活函数
2.2 Tanh
【函数表达】
【函数图像】
【优点】
- 相比sigmoid好一点,因为输出均值为0.
- 快速求导,,而且导数取值[0,1],比sigmoid导数[0,0.25]性质好。
【缺点】
- 软饱和性
2.3 ReLU
【函数表达】
【函数图像】
【优点】
AlexNet提出的激活函数,非常优秀,在很长一段时间内是设计CNN网络的默认激活函数
- 输入为正数的时候,输出导数为1,缓解了梯度消失问题,没有软饱和性。
- 输入为负数的时候,神经元不更新,为网络带来稀疏性,人脑中的稀疏性达到95%。(我理解的稀疏性就是不干活不学习的脑细胞?)
- 计算简单
【缺点】
- 输入小于零的时候,左硬饱和,神经元无法更新,出现神经元死亡现象
- ReLU输出没有负值,因此所有的输出都会是正值,出现均值偏移的情况。个人理解就是,假设一组数据都是正数那么对训练模型的参数的难度就会更大,收敛难。但是之后BN层+ReLU就可以解决这个问题,所以BN + ReLU基本是现在的默认配置。
2.4 Leaky ReLU
【函数表达】
【函数图像】
【优点】
- 为了解决relu中“神经元死亡”的问题,leaky relu给小于零的输入一个非常小的梯度
【缺点】
- 公式中的 是一个很小的值,一般取0.01,首先这就是个超参数,另外也有文献指出它的性能很不稳定,有时候比relu好,有时候差,可想而知,不太靠谱。
2.5 PReLU
【函数表达】
公式和Leaky ReLU一样,只不过它的 参数是可学习的。
【优点】
- 收敛速度比relu快
【缺点】
- 目前还不清楚,只能说表现还不稳定,不够“通用”,其作者何凯明在他的ResNet也没使用,而是使用的ReLU。
2.6 RReLU 与 ELU
【RReLU】
和PReLU类似,只不过它这里的 参数是一个高斯分布上的随机值,在测试时固定。
【ELU】
ReLU在小于零的时候,梯度都是固定的,ELU想在小于零梯度都很小的基础上,希望靠近0梯度稍微大一些。
2.7 SELU
牛逼的地方是提出该方法的论文后面有长达93页的论证。。。。
【函数图像】
【优点】
- 新增的参数 大于1,所以在正半轴,函数的导数是大于1的。
- 激活函数有一个不动点,网络深了以后每一层的输出都会向正态分布靠拢,美其名曰自归一化
【缺点】
- selu的证明部分前提是权重服从正态分布,但是这个假设在实际中并不能一定成立。
- 众多实验发现效果并不比relu好。
2.8 CReLU
【函数公式】
作者发现在网络的浅层卷积核更倾向于捕捉正负相位的信息,而ReLU会将负相位的信息归0,所以才有了CReLU操作。就是在浅层网络中,为了保存负相位的信息,将输入x取反,然后把两个激活函数的输出拼接起来,通道数翻倍
【优点】
- 通道数翻倍,利用对称的关系,保留负相位的信息
【缺点】
- 依赖调试,无法确定哪些层使用
2.9 Maxout (2013)
【函数公式】
【优点】
- 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
【函数公式】
其中 参数可以是常数也可以是训练的。
【函数图像】
从图中可以看出来,当较小的时候,其实类似于线性函数,因为sigmoid为0的时候,导数约为0.25,因此当足够小的时候,近似为以0.25斜率的直线
当较大的时候,是一个平滑的ReLU函数。
【优点】
- 无上界有下界、平滑、非单调。
- Swish函数可以看做是介于线性函数与ReLU函数之间的平滑函数。
- 论文给出的实验,各种数据集上,各种网络,都比relu性能好(并且在深层网络上优势更大)。
【缺点】
- 只有实验证明,没有理论支持。
- 在浅层网络上,性能与relu差别不大。
3 总结
学习这么多激活函数之后,我个人的体会有几点:
- CNN模型的baseline还是会使用BN+ReLU;
- 有空的话会尝试使用BN+Swish激活函数;
- Maxout激活函数的机制挺有趣;
- 其他的激活函数了解了解就行了。