针对目前比较常用的一些激活函数,对他们的性质以及特点进行分析总结,便于后面的理解以及在模型里面的使用。目前主要总结的激活函数包括:Sigmoid、Tanh、Relu、Leaky Relu以及Softmax。
激活函数的作用:
如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这是最原始的感知机;
使用激活函数可以给神经元引入非线性元素,使得神经网络可以任意逼近任何非线性函数,使得深层神经网络表达的能力更加强大,这样神经网络经可以应用到众多的非线性模型中。
补充:包含函数以及非饱和函数
饱和激活函数:
假设h(x)是一个激活函数
1、 当x趋近于正无穷,激活函数的导数趋近于0,则称其为右饱和。
2、 当x趋近于负无穷,激活函数的导数趋近于0,则称其为左饱和。
3、 当一个激活函数既满足左饱和又满足右饱和,我们就称其为饱和激活函数。比如:Sigmoid、Tanh。
Sigmoid函数将输入的值压缩到【0,1】范围,tanh函数将输入的值要锁到【-1,1】范围。
非饱和激活函数:
当激活函数不满足饱和激活函数后,就称为非饱和激活函数,例如 Relu、Leaky Relu。
相较于饱和激活函数,非饱和激活函数的优势:
1、 非饱和激活函数能解决深度神经网络(层数非常多)带来的梯度消失问题;
2、 非饱和激活函数可以加快收敛速度。
首先,简单的介绍一下常见的两个饱和激活函数:Sigmoid、Tanh
一、Sigmoid激活函数的数学表达式:
函数图像如下:
Sigmoid函数在历史上曾非常常用,输出的范围是【0,1】之间的实数。但现在不太受欢迎,实际很少用到。
Sigmoid的使用条件:
1、 Sigmoid函数的输出范围在0到1之间。非常适合为输出为0到1之间的模型的输出函数,比如用于表示二分类的类别或者表示置信度;
2、 梯度平滑,便于求导,也防止模型训练过程中的突变的梯度。
Sigmoid的缺点:
1、 容易造成梯度消失。sigmoid的导数小于0.25,在进行反向传播的过程中,梯度相乘的结果会趋向0。这样梯度信号不能通过神经元传递到前面层的梯度更新中,前面层的权值几乎没有更新,造成梯度消失。此外,为了防止饱和,必须将权重矩阵的初始化特别留意。如果初始化权重过大,可能很多神经元得到一个比较小的梯度,导致神经元不能很好的更新权重提前饱和,神经网络几乎不学习;
2、 函数输出不以0为中心,梯度可能会向特定方向移动,从而降低权重更新的效率;
3、 Sigmoid函数执行指数运算,计算机运行的较慢,比较消耗计算资源。
二、Tanh函数的数学表达式:
函数图像:
tanh是“以0为中心”的,在实际应用的过程中,tanh比sigmoid好一些。但是在饱和神经元的情况下,tanh还是没有解决梯度消失的问题。
Tanh的优势:
1、 tanh的输出间隔为1,并且整个函数以0为中心,比sigmoid好;
2、 在tanh中,负输入将被强制映射为负,零输入被映射为0。
tanh的缺点:
1、 存在梯度饱和的问题;
2、 依然进行指数运算,计算比较缓慢,比较浪费计算资源。
现在介绍一些非饱和激活函数:Relu、Leaky Relu:
一、Relu激活函数的数学表达式:
函数图像:
Relu的优势:
1、 Relu解决了梯度消失的问题,当输入值为正时,神经元不会饱和;
2、 由于Relu线性、非饱和的性质,在SGD中可以快速收敛;
3、 计算复杂度低,不需要进行指数运算。
Relu缺点:
1、 与sigmoid一样,输出不是以0为中心;
2、 当输入为负时,梯度为0。这个神经元及之后的神经元的梯度永远为0,不在对任何数据有响应,导致相应参数不会更新。
训练神经网络的时候,一旦学习率没有设置好,第一次更新权重的时候,输入是负值,这个含有Relu神经节点就会死亡,再也不会被激活,要设置一个合适的较小的学习率,以降低这种情况的发生。
二、 Leaky Relu激活函数的数学表达式:
函数图像:
Leaky Relu的优点:
1、 解决了Relu输入值为负时神经元出现死亡的问题;
2、 Leaky Relu线性,非饱和的性质,在SGD中快速收敛;
3、 计算复杂度低,不需要进行指数运算。
Leaky Relu的缺点:
1、 函数中的c,需要进行先验知识人工赋值(一般设置为0.01);
2、 有些近似线性,导致复杂分类中效果不好。
三、 Softmax激活函数的数学表达式:
函数图像:
softmax函数在神经网络输出层充当激活函数,将输出层的值通过激活函数映射到0到1之间,将神经元输出构造成概率分布,用于多分类问题,softmax几乎函数的映射值越大,真实类别的可能性越大。
说明:发布的内容为在网上一些比较好的帖子的总结,便于自己学习使用