AI知识点(1)–激活函数
a=0.1
,
导数如下:
Leaky ReLU 的概念是:当 x < 0 时,它得到 0.1 的正梯度。
该函数一定程度上缓解了 dead ReLU 问题,但是使用该函数的结果并不连贯。尽管它具备 ReLU 激活函数的所有特征,如计算高效、快速收敛、在正区域内不会饱和。
PReLU
Leaky ReLU 可以得到更多扩展。不让 x 乘常数项,而是让 x 乘超参数,这看起来比 Leaky ReLU 效果要好。该扩展就是 Parametric ReLU,也就是 PReLU,这是 LReLU 的改进。
其公式定义和 LReLU 一样,但这里的参数 a
是一个超参数,不需要自定义,而是自适应从数据中学习,也就是可以进行反向传播,这让神经元可以选择负区域最好的梯度
RReLU
公式定义如下所示:
$$a_{ji} \sim U(l,u),l就是给定范围内取样的随机变量,但在测试中是固定的,该激活函数在一定程度上可以起到正则效果。
在论文《Empirical Evaluation of Rectified Activations in Convolution Network》,作者对比了 ReLU
激活函数和其三个改进版本 LReLU
、 PReLU
、 RReLU
在数据集 CIFAR-10
、 CIFAR-100
、 NDSB
中相同网络模型的性能。
想了解的可以具体看看这篇论文,当然在实际应用中,初次训练可以选择 ReLU
激活函数,然后可以再尝试这三个改进版来看看对比的结果
3.1.5 ELU
公式定义:
导数如下:
优点:
1.ELU减少了正常梯度与单位自然梯度之间的差距,从而加快了学习。2.在负的限制条件下能够更有鲁棒性。
缺点
-
由于包含指数运算,所以计算时间更长;
-
无法避免梯度爆炸问题;
-
神经网络不学习 α 值。
ELU 激活函数可以参考 ICLR 2016的论文《FAST AND ACCURATE DEEP NETWORK LEARNING BY EXPONENTIAL LINEAR UNITS (ELUS)》。
3.1.6 Swish
这个函数也叫做自门控激活函数,来自2017年谷歌的论文《Swish: a Self-Gated Activation Function》:https://arxiv.org/abs/1710.05941v1
公式定义如下所示
其图像如下所示:
从图中可以看到,在 x<0 的部分和 ReLU 激活函数是不同的,会有一段 x 增大,但输出值下降的区域;
所以 Swish
函数具备单侧有界的特性,它是平滑、非单调的。
具体的介绍可以参考文章– Swish 激活函数的性能优于 ReLU 函数。
3.1.7 Softplus 和 Softsign
Softplus
的公式定义:
Softsign
的公式定义:
这两个激活函数的使用较少,可以参考 Tensorflow 提供的 api–激活函数相关TensorFlow的官方文档
3.1.8 Softmax(归一化指数函数)
公式定义:
该函数主要用于多分类神经网络的输出层。
3.1.9 SELU 和 GELU
这两个激活函数实际上都是最近提出或者最近才使用较多的激活函数,详细介绍可以查看文章– 从ReLU到GELU,一文概览神经网络的激活函数 ,这里简单给出公式定义和优缺点。
SELU,即扩展型指数线性单元激活函数,其公式如下所示:
优点:
-
内部归一化的速度比外部归一化快,这意味着网络能更快收敛;
-
不可能出现梯度消失或爆炸问题,见 SELU 论文附录的定理 2 和 3。
缺点:
-
这个激活函数相对较新——需要更多论文比较性地探索其在 CNN 和 RNN 等架构中应用。
-
这里有一篇使用 SELU 的 CNN 论文:https://arxiv.org/pdf/1905.01338.pdf
GELU,即高斯误差线性单元激活函数是2016年提出的,但在最近的 Transformer 模型(谷歌的 BERT 和 OpenAI 的 GPT-2)中得到了应用,其公式如下所示:
优点:
-
似乎是 NLP 领域的当前最佳;尤其在 Transformer 模型中表现最好;
-
能避免梯度消失问题。
缺点:
-
尽管是 2016 年提出的,但在实际应用中还是一个相当新颖的激活函数。
3.2 常见的激活函数的性质
-
非线性:当激活函数是线性的,一个两层的神经网络就可以基本上逼近所有的函数。但如果激活函数是恒等激活函数的时候,即 ,就不满足这个性质,而且如果 MLP 使用的是恒等激活函数,那么其实整个网络跟单层神经网络是等价的;
-
可微性:当优化方法是基于梯度的时候,就体现了该性质;
-
单调性:当激活函数是单调的时候,单层网络能够保证是凸函数;
-
:当激活函数满足这个性质的时候,如果参数的初始化是随机的较小值,那么神经网络的训练将会很高效;如果不满足这个性质,那么就需要详细地去设置初始值;
-
输出值的范围:当激活函数输出值是有限的时候,基于梯度的优化方法会更加稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是无限的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的 Learning Rate。
3.3 如何选择激活函数
通常选择一个激活函数并不容易,需要考虑很多因素,最好的做法还是一一实验所有的激活函数,但需要保证其他因素相同。
一些技巧:(来自深度学习500问第三篇深度学习基础)
-
如果 输出是 0、1 值(二分类问题) ,则 输出层选择 sigmoid 函数 ,然后其它的所有单元都选择 Relu 函数。
-
如果在隐藏层上不确定使用哪个激活函数,那么 通常会使用 Relu 激活函数 。有时,也会使用 tanh 激活函数,但 Relu 的一个优点是:当是负值的时候,导数等于 0。
-
Sigmoid 激活函数:除了输出层是一个二分类问题基本不会用它。
-
Tanh 激活函数:tanh 是非常优秀的,几乎适合所有场合。
-
ReLU 激活函数:最常用的默认函数,如果不确定用哪个激活函数,就使用 ReLu 或者 Leaky ReLu,再去尝试其他的激活函数。
-
如果遇到了一些死的神经元,我们可以使用
Leaky ReLU
函数。
3.4 激活函数以零为中心的问题
在介绍 Sigmoid
的缺点的时候说到它不是以 0 为中心,这个特点主要是影响收敛速度,因为它的输出值是恒为正的,那么在梯度下降,进行参数更新的时候,所有参数每次更新的方向都是同个方向,要不都是正方向,或者要不都是负方向,其更新就是一个 z
字形,如下图所示:
借用文章 cs231n_激活函数 的例子:
假设我们有权值 w=[1,−1,1]],我们需要将权值更新为 w=[−1,1,−1] ,如果梯度是同时有正和有负的,我们可以只更新一次就可得到结果:w=[1,−1,1]+[−2,2,−2]=[−1,1,−1];但是如果梯度只能是正或者只能是负,则需要两次更新才能得到结果:w=[1,−1,1]+[−3,−3,−3]+[1,5,1]=[−1,1,−1] 。
所以需要选择以 0 为中心的激活函数,可以提高收敛速度。
参考文章
-
The Activation Function in Deep Learning 浅谈深度学习中的激活函数
-
深度学习500问第三篇深度学习基础–3.4激活函数
-
《Empirical Evaluation of Rectified Activations in Convolution Network》:https://arxiv.org/abs/1505.00853
-
《FAST AND ACCURATE DEEP NETWORK LEARNING BY EXPONENTIAL LINEAR UNITS (ELUS)》:https://arxiv.org/pdf/1511.07289v5.pdf
-
《Swish: a Self-Gated Activation Function》:https://arxiv.org/abs/1710.05941v1
-
激活函数相关TensorFlow的官方文档
-
SELU 论文:https://arxiv.org/pdf/1706.02515.pdf
-
GELU 论文:https://arxiv.org/pdf/1606.08415.pdf
-
谈谈激活函数以零为中心的问题
-
cs231n_激活函数
欢迎关注我的微信公众号– 算法猿的成长 ,或者扫描下方的二维码,大家一起交流,学习和进步!
