首页 理论教育 深度学习中常用的激活函数及其特点

深度学习中常用的激活函数及其特点

时间:2023-11-18 理论教育 版权反馈
【摘要】:在了解激活函数的作用之后,下面介绍一下目前常用的激活函数的形式和特点,包括Sigmoid函数、Tanh函数、ReLU函数和Leaky ReLU函数。Sigmoid非线性激活函数的数学表达式为:其中,e为纳皮尔常数,值约等于2.71828。图4-15Tanh函数ReLU函数。ReLU是目前应用较为广泛的激活函数,其优点为在随机梯度下降的训练中收敛很快,解决了部分梯度消失问题,而且ReLU函数只有线性关系,不管是前向传播还是反向传播都比Sigmoid函数和Tanh函数要快很多。

深度学习中常用的激活函数及其特点

从单层感知器到多层感知器乃至后期各种深度神经网络结构,均在神经元中保留有激活函数,为什么激活函数在神经网络如此重要?在上图的示例中,读者可以尝试选择不同的激活函数后会发现,采用Linear激活函数时无法对异或数据集进行划分,选择Sigmoid或Tanh时的收敛速度较慢,分类效果一般,这是什么原因呢?本节就详细介绍一下激活函数。

从前面感知器的组成中可以了解到,激活函数是网络中非线性的唯一来源,去除了该部分之后网络就只剩下线性运算部分了,而无论多么复杂的线性运算的组合叠加依然是线性的。如果采用线性函数作为激活函数,相当于又叠加了一个线性函数,这样的网络等价于单层的线性模型,对解决多为非线性的实际问题没有多大帮助,因此只在高斯数据集这类线性可分问题上有解,对其他非线性数据集的分类问题无解。正如前面示例,为了保证神经网络能够适用于复杂问题的求解,需要在网络中引入非线性单元,即采用非线性的激活函数。

假如将神经元中的线性运算部分记为X=WX+b,非线性激活函数记为δ(x),那么线性操作后跟激活函数组合的结果就是a=δ(WX+b),后面一层与其连接的神经元同样是一个线性操作和激活函数,则第二个神经元的输出为a’=δ(W’a+b’)。这样通过线性运算和非线性激活函数不断地循环操作,就达到模拟复杂函数的目的。注意,用W、W’和b、b’来标注参数的目的是表明每一层神经元的权重参数一般是不同的。

在了解激活函数的作用之后,下面介绍一下目前常用的激活函数的形式和特点,包括Sigmoid函数、Tanh函数、ReLU函数和Leaky ReLU函数。

(1)Sigmoid函数。Sigmoid非线性激活函数的数学表达式为:

其中,e为纳皮尔常数,值约等于2.71828。Sigmoid函数的表达形式如图4-14所示。当x为0的时候,Sigmoid函数值为0.5,随着x的不断增大,对应的Sigmoid值将无限逼近于1,而随着x的不断的减小,Sigmoid值将无限逼近于0。所以Sigmoid函数的值域是在(0,1)之间。

图4-14 Sigmoid函数

Sigmoid函数有一个特点是其在趋近于0和1这两端的时候,曲线变得非常平缓,导致其梯度几乎变为了0,无法利用梯度更新网络权重参数,造成网络模型不收敛,这就是所谓的梯度消失问题,因此使用Sigmoid函数的人已经越来越少。

(2)Tanh函数。Tanh激活函数的数学表达式为:

Tanh函数的表达形式如图4-15所示,可以看到Tanh的值域为(-1,1)。Tanh函数和Sigmoid函数的曲线比较类似。当这两个函数在输入很大或是很小的时候,输出都几乎是平滑的,当梯度很小时,都存在梯度消失问题,都不利于权重更新;不同之处在于两个函数的值域不同,而且Tanh函数比Sigmoid函数训练时收敛更快。

图4-15 Tanh函数(www.xing528.com)

(3)ReLU函数。ReLU激活函数的数学表达式为:

f(x)=max(0,x)

ReLU函数的全称为线性整流函数(Rectified Linear Unit),又称为修正性线性单元,ReLU在原点处不可导,可看作一个分段函数,其函数图形显示如图4-16所示。

图4-16 ReLU函数

从图所示的图形很直观地说明该函数将大于0的输入直接输出,小于0的输入则输出为0。ReLU是目前应用较为广泛的激活函数,其优点为在随机梯度下降的训练中收敛很快,解决了部分梯度消失问题,而且ReLU函数只有线性关系,不管是前向传播还是反向传播都比Sigmoid函数和Tanh函数要快很多。

(4)Leaky ReLU函数。Leaky ReLU全称为带泄露修正线性单元,其表达式为:

式中α是一个很小的正数,比如0.01。其函数图形如图4-17所示。

图4-17 Leaky ReLU函数

从图示中和函数名称中可以看出Leaky ReLU函数是对Relu函数的改进,因为ReLU函数输入值小于0的时候,输出始终为0,其一阶导数也始终为0,从而导致导致神经元权重参数不再更新,因此,在Relu函数的负半区间引入一个Leaky值,可以解决Relu函数这一缺点。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈