文章目录
参考
keras layers activations API:https://keras.io/api/layers/activations/
激活函数作用:https://zhuanlan.zhihu.com/p/25279356
常见的激活函数: https://zhuanlan.zhihu.com/p/70810466
激活函数 (Activation Function)
解决非线性问题:
参考激活函数作用:https://zhuanlan.zhihu.com/p/25279356
激活函数众所周知有tanh,sigmoid,ReLU等:
Sigmoid:采用S形函数,取值范围[0,1]
Tanh:双切正切函数,取值范围[-1,1]
ReLU:简单而粗暴,大于0的留下,否则一律为0。
1. Sigmoid
sigmoid将输入挤压进(0, 1)
(这和概率的取值范围一致),这正是分类任务中sigmoid很受欢迎的原因。
2. Tanh(类似Sigmoid)
Tanh 其实与 Sigmoid类似:tanh的形状和sigmoid类似,只不过tanh将“挤压”输入至区间(-1, 1)
。因此,中心为零,(某种程度上)激活值已经是下一层的正态分布输入了。至于梯度,它有一个大得多的峰值1.0(同样位于z = 0处),但它下降得更快,当|z|的值到达3时就已经接近零了。这是所谓梯度消失(vanishing gradients)问题背后的原因,会导致网络的训练进展变慢。
3. ReLU
Relu是今时今日寻常使用的激励函数。ReLU处理了它的sigmoid、tanh中常见的梯度消失问题,同时也是计算梯度最快的激励函数。
使用ReLU的积极方面是它的梯度要么是1(正值),要么是0(负值)——再也没有梯度消失了!这一模式使网络更快收敛。
另一方面,这一表现导致所谓的“死亡神经元”问题,也就是输入持续为负的神经元激活值总是为零。
4. Leaky-ReLU & P-ReLU(改进Relu)
针对Relu公式的硬饱和问题,我们对Relu作出改进,提出Leaky-ReLU,即在 x<0 部分添加一个参数 a ,如下图所示。
P-ReLU则认为 a 也应当作为一个参数来学习,一般建议 a 初始化为0.25。
5. Elu(结合Sigmoid和Relu)
ELU是结合了sigmoid的左侧软饱和性和ReLU的右侧无饱和性而提出的一种新的激活函数。从下图中不难看到这一特点。右侧线性部分使得ELU可以缓解梯度消失问题,而左侧软饱和性能让ELU对输入变化或噪声更鲁棒。
而且ELU的输出均值接近于0,所以没有严重的偏移现象,所以收敛速度更快。
6. Softsign(类似Tanh)
Softsign是tanh激活函数的另一个替代选择,从图中可以看到它和tanh的曲线极其相似,不过相比于tanh,Sotsign的曲线更平坦,导数下降的更慢一点,这个特性使得它可以缓解梯度消失问题,可以更高效的学习。
不过,Sofsign的导数相比tanh计算要更麻烦一点。
7. SoftPlus(Relu的替代)
SoftPlus可以作为ReLu的一个不错的替代选择,可以看到与ReLU不同的是,SoftPlus的导数是连续的、非零的、无处不在的,这一特性可以防止出现ReLU中的“神经元死亡”现象。
然而,SoftPlus是不对称的,不以0为中心,存在偏移现象;而且,由于其导数常常小于1,也可能会出现梯度消失的问题。
8. Maxout
Maxout出现在ICML2013上,作者Goodfellow将maxout和dropout结合后,号称在MNIST, CIFAR-10, CIFAR-100, SVHN这4个数据上都取得了start-of-art的识别率。
可以注意到,ReLU 和 Leaky-ReLU 都是它的一个变形。这个激活函数有点大一统的感觉,因为maxout网络能够近似任意连续函数,且当w2, b2, … wn, bn 为0时,退化为ReLU。Maxout能够缓解梯度消失,同时又规避了ReLU神经元死亡的缺点,但增加了参数和计算量。
9. Swish
Paper: Searching for Activation functions(Prajit Ramachandran,Google Brain 2017) https://arxiv.org/abs/1710.05941
β是个常数或可训练的参数.Swish 具备无上界有下界、平滑、非单调的特性。
Swish:
导数:
Swish 在深层模型上的效果优于 ReLU。例如,仅仅使用 Swish 单元替换 ReLU 就能把 Mobile NASNetA 在 ImageNet 上的 top-1 分类准确率提高 0.9%,Inception-ResNet-v 的分类准确率提高 0.6%。
工程实现: 在TensorFlow框架中只需一行代码: x * tf.sigmoid(beta * x)
或tf.nn.swish(x)
.
Linear
Softmax
softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类!