【DL基础】激活函数总结

前言

本文主要总结深度学习中激活函数的来龙去脉,理解激活函数的定义,掌握常见激活函数的特性,能够灵活使用激活函数解决实际项目中的问题。

一、激活函数的基本理解

1. 什么是激活函数

所谓激活函数(Activation Function),就是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。激活函数对于人工神经网络模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用。它们将非线性特性引入到网络中。如图1,在神经元中,输入的 inputs 通过加权,求和后,还被作用了一个函数,这个函数就是激活函数。引入激活函数是为了增加神经网络模型的非线性。没有激活函数的每层都相当于矩阵相乘。就算你叠加了若干层之后,无非还是个矩阵相乘罢了。

激活函数可以使得神经网络从线性进化为到非线性,意思就是说。原本只能线性可分,现在可以分类非线性分布的数据了。

2. 为什么要使用激活函数

如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机(Perceptron)。如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。 

因为深度学习模型中其它的层都是线性的函数拟合,即便是用很深的网络去拟合,其还是避免不了线性的特性,无法进行非线性建模,而加入非线性激活函数单元,当线性函数的输出层经过非线性激活单元的时候,其输出呈现一种非线性的变化,这样经过多层的拟合,就可以完成对输入的非线性建模操作。同时还可以起到一种特征组合的作用。

好的激活函数的特征一般应当是平滑的,而且对于负值有较好的处理。

3. 激活函数的非线性与线性

为什么使用非线性的激活函数:
因为如果使用线性的激活函数, 那么输入x跟输出y之间的关系为线性的 ,便可以不需要网络结构,直接使用线性组合便可以.只有在输出层极小可能使用线性激活函数,在隐含层都使用非线性激活函数.

线性的激活函数所做的工作仅仅是将输入数据进行线性组合后再输出,如果只使用现行的激活函数,那么即便神经网络的层数再多、隐藏单元的个数再多也没啥卵用,最终还是将数据进行线性组合后就输出了,而且很多时候数据的复杂程度是线性函数根本无法学习的!

其实实际运用中,隐藏层使用线性激活函数的场景非常非常非常少,可能除了与压缩有关的一些非常特殊的情况才会在隐藏层使用线性激活函数,否则大部分都是在隐藏层使用非线性的激活函数。

只有一个地方可以使用线性的激活函数,就是针对回归问题,比如房价预测,但是也仅仅限制在输出单元,也就是输出层使用线性激活函数,隐藏单元还是别用线性激活函数了,你可以使用ReLU、tanh、leaky ReLU都可以。

我们必须用非线性函数来描述这些特征。大多数神经网络通过仿射变换之后紧跟着一个被称为激活函数的固定非线性函数来实现这个目标,其中仿射变换由学得的参数控制。
 
4. 激活函数的饱和与非饱和

4.1 定义理解

右饱和:当 x 趋向于正无穷大时,导数值趋近于 0

左饱和:当 x 趋向于负无穷大,导数值趋近于 0

饱和激活函数:当满足右饱和和左饱和时,称作饱和激活函数,分别有 Sigmoid 和 tanh 

非饱和激活函数:只满足右饱和或左饱和中的一个,或都不满足,则称作非饱和激活函数,有 ReLU 及其他的变种

4.2 非饱和激活函数的优点

1)解决梯度消失的问题,以 ReLU 为例,当 x 小于等于 0 时,ReLU 的梯度为 0,但是当 x 大于 0 时,ReLU 的梯度恒为 1,这样即使是 N 层的梯度相乘,也还是 1,即不会产生梯度消失问题

2)加快收敛速度,同样以 ReLU 为例,由于在训练的过程中 ReLU 产生的梯度不会越来越小,因此有利于网络更快地收敛;

4.3 什么是梯度消失?为什么可以解决梯度消失问题?

 

4.4 什么是梯度爆炸?怎么解决梯度爆炸问题?

 

二、常见的激活函数
Visualising Activation Functions in Neural Networks(介绍了多种激活函数及其特性)
1. Sigmoid函数
1.1 定义
1.2 函数图像
1.3 导函数图像
1.4 特性及优缺点

观察Sigmoid函数曲线,可以知道其输出分布在【0,1】区间,而且在输入值较大和较小的情况,其输出值变化都会比较小,仅仅当输入值接近为0时,它们才对输入强烈敏感。Sigmod单元的广泛饱和性会使得基于梯度的学习变得非常困难。因为这个原因,现在已经不鼓励将它们作为前馈网络的隐藏单元。

观察Simod导数曲线,呈现一个类似高斯分布的驼峰装,其取值范围在【0,0.25】之间,而我们初始化后的网络权值通常小于1,因此当层数增多时,小于1的值不断相乘,最后就会导致梯度消失的情况出现。而梯度爆炸则是当权值过大,导致其导数大于1,大于1的数不断相乘,发生梯度爆炸。
同时Sigmoid还有其他缺点,如输出不是以0为中心,而是0.5,这样在求解权重的梯度时,梯度总是正或负的,指数计算耗时。

总之不推荐使用sigmoid饱和激活函数。

1.5 存在的问题
1) 梯度消失问题。
从导函数图像中可以看出sigmoid的导数都是小于0.25的,那么在进行反向传播的时候,梯度相乘结果会慢慢地趋近于0。这样,几乎就没有梯度信号通过神经元传递到前面层的梯度更新中,因此这时前面层的权值几乎没有更新,这就叫梯度消失。除此之外,为了防止饱和,必须对于权重矩阵的初始化特别留意。如果初始化权重过大,可能很多神经元得到一个比较小的梯度,致使神经元不能很好的更新权重提前饱和,神经网络几乎不学习。
2) sigmoid函数的输出不是零为中心(zero-centered)。
 如何理解????
3) 指数函数的计算是比较消耗计算资源的。
 
2. Tanh函数
1.1 定义
1.2 函数图像
1.3 导函数图像
1.4 特性及优缺点
1) 优点: tanh解决了sigmoid的输出非“零为中心”的问题;
2) 缺点:(1) 依然有sigmoid函数过饱和的问题;(2) 依然进行的是指数运算;
1.5 存在的问题

 

3. ReLU函数

ReLU(Rectified Linear Unit),即修正线性单元,是一种线性不饱和激活函数。

1.1 定义

1.2 函数图像
1.3 导函数图像
1.4 特性及优缺点
1) 优点:
(1) ReLU解决了梯度消失的问题,至少x在正区间内,神经元不会饱和;
(2) 由于ReLU线性非饱和的特性,在SGD中能够快速收敛;
(3) 计算速度要快很多,ReLU函数只有线性关系,不需要指数计算,不管在前向还是反向传播计算,计算速度都比sigmoid和tanh快。
2) 缺点
(1) ReLU的输出不是"零为中心";
(2) 随着训练的进行,可能会出现神经元死亡,权重无法更新的情况,这种神经元的死亡是不可逆转的死亡;
1.5 存在的问题
 
4. Leaky ReLU函数

1.1 定义

1.2 函数图像
1.3 导函数图像
1.4 特性及优缺点
1) 优点:
(1) 神经元不会出现死亡的情况;
(2) 对于所有的输入,不管是大于等于0还是小于0,神经元不会饱和;
(3) 由于分段线性非饱和的特性,在SGD中能够快速收敛;
(4) 计算速度要快很多,LeakyReLU函数只有线性关系,不需要指数计算,不管在前向还是反向传播计算,计算速度都比sigmoid和tanh快。
2) 缺点:函数定义中的超参数需要通过先验知识人工赋值;
5.
6. 
7. 
8.
9.
三、如何选择激活函数
在实践过程中更多还是需要结合实际情况,考虑不同激活函数的优缺点综合使用,这里给出一些训练模型时候的建议;
1. 通常来说,不能把各种激活函数串起来在一个网络中使用;
2. 如果使用ReLU函数,一定要小心设置学习率,并且注意不要让网络中出现很多死亡神经元。如果死亡神经元过多的问题不好解决,可以试试LeakyReLU,PReLU或者Maxout;
3. 尽量不要使用sigmoid激活函数,可以试试tanh,不过tanh的效果比不上ReLU和Maxout;
 

参考

1. 深度学习—激活函数详解

2. 为什么需要非线性激活函数

3. 线性与非线性激活函数的作用(以一个2层的神经网络为例)

4. [激活函数]饱和函数和非饱和激活函数

5. 饱和及非饱和激活函数的特点

6. Visualising Activation Functions in Neural Networks

posted on 2022-07-07 18:22  鹅要长大  阅读(135)  评论(0编辑  收藏  举报

导航