简介
因为神经网络是线性组合,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中.好用的激活函数具有可求且方便求导,单调平滑.下面简单介绍一下常用的激活函数:
1.sigmoid函数:常用于LR中,也可以用于神经网络最后一层(一分类问题,是该类,和其他).函数公式和图表如下图:
如图2所示,它能够把输入的连续实值变换为(0,1)之间的输出,特别的,如果是非常大的负数,那么输出就是0,如果是非常大的正数,输出就是1. sigmoid曾经是主流的激活函数,但是由于一些缺陷,导致现在不主流了...它的缺点有:
1) 由于sigmoid导数的性质(如图3),在神经网络进行反向传播时,会发生梯度消失(权重初始值在[0,1]内)和梯度爆炸(权重初始值在[1,+∞]).
2) 其解析式中含有幂运算,计算机求解时相对来讲比较耗时,对于规模比较大的深度网络,这会较大地增加训练时间.
3) sigmoid的输出不是0均值的,这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入, 产生的一个结果就是:如果数据进入神经元的时候是正的,那么计算出的梯度也会始终都是正的.
2.tanh函数:tanh函数是拉伸后的sigmoid,它弥补了sigmoid的缺点3,tanh函数公式和曲线如下:
它的值域变成了(-1,1),均值从sigmoid的0.5,变成了0.从而解决sigmoid的缺点3输出均值不为0的问题.从图4可以看出,在0附近曲线的倾斜更为陡峭,所以它的导数的曲线是比图3更高更细一些.
它的优点是解决了sigmoid的输出均值不为0的问题,还有就是比sigmoid的收敛更快一些.
它的缺点是还没有解决sigmoid最大的问题1,梯度消失和梯度爆炸的问题.
3.ReLU函数:ReLU函数训练速度比tanh快6倍,是目前使用最广泛的激活函数.当输入值小于零时,输出值为零.当输入值大于等于零时,输出值等于输入值.公式和曲线如下:
它的优点是训练速度快(因为线性),同时当输入为正数时,不会造成梯度爆炸.
它的缺点是ReLU所在的神经元在训练的过程中可能会随机失活,如果learning rate很大,那么很有可能网络中的40%的神经元都”dead”了.而且它的输出也不是均值为0.
4.LeakyReLU & PReLU函数:这两个激活函数类似,都是ReLU的改良版,目的是为了避免出现神经单元失活的问题.公式如下:
其中LeakyReLU将α的值设为0.001,而PReLU是将α当做参数一起参与到模型训练中去学习.这样函数的输出下界不为0,从而也不会有神经元失活的现象.
5.ELU函数(指数线性单元):它解决了ReLU的两个问题,一个是失活,一个是均值不为0的问题.
6.softmax函数:常用于神经网络的最后一层(多分类),是sigmoid函数在多分类问题上的推广.公式如下:
它的值域是[0,1],输出是概率值,所以加和为1.用指数的形式是为了使大的值更大,同时也为了求导.
总结:
1.尽量不要使用sigmoid和tanh函数(梯度消失和爆炸),尽量使用ReLU及其变体.
2.使用ReLU时,注意设置小的learning rate.
3.尽量使用0均值的激活函数.