菜鸟进阶:(10)常用的**函数的理解与总结

常用的**函数的理解与总结

1.什么是**函数

所谓的**函数(Activation Function),就是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。

单一神经元模型如下:

菜鸟进阶:(10)常用的**函数的理解与总结

神经网络中,每一个神经元节点接受上一神经元的输出值做为本神经元的输入值,并将输入值传递给下一层。在多层神经网络中,上一层节点的输出和下一层节点的输出之间具有一个函数关系,这个函数称为**函数(又称为激励函数)

2.**函数的用途

如果不用激励函数(其实相当于激励函数是f(x)=x),在这种情况下,每一层节点的输入都是上层输出的线性函数,这样无论神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机了,那么网络的能力就相当有限。所以引入了非线性函数作为激励函数,给神经元提供了非线性的动力,这样深层神经网络表达能力就更加强大。

3.有哪些**函数,都有什么性质和特点

早期研究神经网络主要采用sigmoid函数或者tanh函数,输出有界,很容易充当下一层的输入。

sigmoid函数

sigmoid是常用的非线性的**函数,它的数学形式和几何图像如下:
菜鸟进阶:(10)常用的**函数的理解与总结

特点:

它能够把输入的连续实值变换为0和1之间的输出,特别是,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1。这样就使得输出范围有限,优化稳定。

缺点:

sigmoid函数曾经被使用的很多,但现在使用越来越少。主要是因为:

1.在深度神经网络中,在反向传播时,当梯度接近于0,权重基本不会更新 ,易导致梯度爆炸和梯度消失。其中梯度爆炸的发生概率很小,而梯度消失发生的概率比较大。首先来看sigmoid函数的导数,如下所示:
菜鸟进阶:(10)常用的**函数的理解与总结

如果我们初始化神经网络的权值为[0-1]之间的随机值,由反向传播算法的数学推导可知,梯度从后向前传播时,每传递一层梯度值都会减少原来的0.25倍。如果神经网络隐藏层特别多,那么梯度在穿过多层后变得非常小,接近于0,即出现梯度消失现象。当网络权值初始化为(1,正无穷)区间内的值,则会出现梯度爆炸的情况。

缺点2:sigmoid的输出不是0均值的。这样会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。产生的结果就是:如菜鸟进阶:(10)常用的**函数的理解与总结

那么对w求局部梯度正则都为正,这样在反向传播的过程中,w要么都往正向更新,要么都往负向更新,导致有一种捆绑的效果,使得收敛缓慢。

缺点3:其解析式中含有幂运算,计算机求解释时相对来讲比较耗时。对于规模较大的深度网络,这会较大的增加训练时间。

tanh函数

tanh函数解析式:
菜鸟进阶:(10)常用的**函数的理解与总结

tanh函数解决了sigmoid函数的不是零均值化的输出问题,然后,梯度消失的问题和幂运算的问题依旧存在。

Relu函数

该函数是目前最常用的**函数,在搭建人工网络的时候优先推荐使用。
菜鸟进阶:(10)常用的**函数的理解与总结

ReLU函数其实就是一个取最大值函数,它并不是全区间可导的,其优点主要如下:

(1)在正区间解决了梯度消失和梯度饱和的问题

(2)计算速度非常快,只需要判断输入是否大于0

(3)比sigmoid和tanh的收敛速度快

ReLU函数的注意点:

(1)ReLU的输出不是零均值化的

(2)某些神经元可能永远不会被**,导致相应的参数永远不能被更新。导致这种情况的两个主要原因是:1)参数初始化2)学习率太高,导致在训练过程中参数更新太大。解决这个问题的方法有,避免将学习率设置太大或者使用Adam优化器自动调节学习率。

Leaky ReLU函数(PReLU)

Leaky Relu函数及其导数的图像如下:
菜鸟进阶:(10)常用的**函数的理解与总结

渗漏整流线性单元(Leaky ReLU),为了解决dead ReLU现象。用一个类似0.01的小值来初始化神经元,从而使得ReLU在负数区域更偏向于**而不是死掉。 PReLU可以看作是Leaky ReLU的一个变体 。

应用中如何选择合适的**函数

(1)深度学习的过程中大量的时间被用来做数据的处理,所以模型的收敛速度尤为重要。在训练深度学习网络中,尽量使用零均值化的数据,所以要尽量选择输出具有零均值化的特点的**函数加快模型的收敛速度。

(2)在使用ReLu**函数时,要注意学习率的设置,尽量不要让网络出现很多坏死的神经元。如果出现这种情况,可以尝试使用Leaky ReLU、PReLU 或者 Maxout.

(3)**函数尽量不要使用sigmoid

(4)主要凭经验