激励函数介绍、常用激励函数、Tensorflow中提供的激励函数、如何选择合适的激活函数

版权声明:站在巨人的肩膀上学习。 https://blog.csdn.net/zgcr654321/article/details/82914985

激励函数 (Activation Function):

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

如果不使用激励函数,在这种情况下你每一层节点的输入都是上层输出的线性函数,此时无论你的神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了,网络的逼近能力就相当有限。

如:

正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络几乎可以逼近任何函数。

你甚至可以创造自己的激励函数来处理自己的问题, 不过要确保的是这些激励函数必须是可以微分的,因为在 backpropagation 误差反向传递的时候,只有这些可微分的激励函数才能把误差传递回去。

常用激励函数:

Sigmoid函数:

函数图像如下:

sigmoid函数的导数是 f′(z)=f(z)(1−f(z))。

sigmoid函数的特点:
它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1。
sigmoid函数的缺点:
在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大;

Sigmoid 的 output 不是0均值(即zero-centered),这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。 产生的一个结果就是:如果数据进入神经元的时候是正的(e.g. elementwise in ),那么计算出的梯度也会始终都是正的;

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

什么是梯度爆炸(梯度饱和):

tanh函数:

函数图像如下:

tanh⁡(z) 函数是sigmoid函数的一种变体,它的取值范围为 [−1,1][−1,1] ,而不是sigmoid函数的 [0,1][0,1]。

tanh函数的导数是 f′(z)=1−(f(z))2

tanh函数解决了Sigmoid函数的不是zero-centered输出问题,但梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。

Relu函数:

函数图像如下:

ReLU函数其实就是一个取最大值函数,该函数在输入小于0时输出值恒为0,在输入大于0时,输出线性增长。ReLU函数并不是全区间可导的。

ReLU函数没有Sigmoid函数及Tanh函数中的指数运算,计算速度非常快,只需要判断输入是否大于0;没有”kill” gradients的现象(在正区间中);收敛速度远快于sigmoid和tanh。

ReLU函数的缺点:

ReLU的输出不是zero-centered;

Dead ReLU Problem,即某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。如一个非常大的Gradient流过ReLU神经元,可能会导致参数更新后该神经元再也不会被激活。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。

ReLU目前是最常用的activation function,在搭建人工神经网络的时候推荐使用。

Leaky ReLU函数(PReLU):

函数图像如下:

Leaky ReLU函数是为了解决Dead ReLU Problem,将ReLU的前半段设为αx而非0,通常α=0.1。

理论上来讲,Leaky ReLU有ReLU的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。

ELU (Exponential Linear Units) 函数:

函数图像如下:

ELU有ReLU的所有优点,不会有Dead ReLU问题,输出的均值也接近0。

ELU有一个小问题是计算量稍大。类似于Leaky ReLU,理论上虽然好于ReLU,但在实际使用中目前并没有好的证据ELU总是优于ReLU。

Softplus函数:

Softplus函数是Sigmoid函数的原函数。

Softplus函数与ReLU函数图像对比:

Softplus函数可以看成是ReLU函数的平滑版本。Softplus函数是对全部数据进行了非线性映射,是一种不饱和的非线性函数其表达式如公式,Softplus函数不具备稀疏表达的能力,收敛速度比ReLUs函数要慢很多。但该函数连续可微并且变化平缓,比Sigmoid函数更加接近生物学的激活特性,同时解决了Sigmoid函数的假饱和现象,易于网络训练和泛化性能的提高。虽然该函数的表达性能更优于ReLU函数和Sigmoid函数,即精确度相对于后者有所提高,但是其并没有加速神经网络的学习速度。

Softsign函数:

函数图像如下:

MaxOut函数:

Maxout是深度学习网络中的一层网络,就像池化层、卷积层一样等,我们可以把maxout 看成是网络的激活函数层,我们假设网络某一层的输入特征向量为:X=(x1,x2,……xd),也就是我们输入是d个神经元。

Maxout隐藏层每个神经元的计算公式如下: 

k是maxout层所需要的参数,是人为设定大小的。

Z的计算公式为:

权重w是一个大小为(d,m,k)的三维矩阵,b是一个大小为(m,k)的二维矩阵。如果我们设定参数k=1,此时网络就类似普通的MLP网络。换句话说,本来传统的MLP算法在第i层到第i+1层,参数只有一组,而现在我们在这一层同时训练n组的w、b参数,然后选择激活值Z最大的作为下一层神经元的激活值,这个max(z)函数即充当了激活函数。

Maxout继承了ReLU的优点,但相比ReLU,因为有2次线性映射运算,因此计算量也会翻倍。

Tensorflow中提供的激励函数:

Tensorflow 1.0中提供了以下几种激励函数:

tf.nn.relu
tf.nn.relu6
tf.nn.crelu
tf.nn.elu
tf.nn.softplus
tf.nn.softsign
tf.nn.dropout
tf.nn.bias_add
tf.sigmoid
tf.tanh

连续非线性:sigmoid, tanh, elu, softplus, softsign;

连续但不是处处可微分:relu, relu6, crelu, relu_x;

随机函数:dropout。

如何选择合适的激活函数:

深度学习往往需要大量时间来处理大量数据,模型的收敛速度是最为重要的。所以,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。要尽量选择输出具有zero-centered特点的激活函数以加快模型的收敛速度;

如果使用 ReLU,那么一定要小心设置 learning rate,不要让网络出现很多 “dead” 神经元,如果不好解决,可以试试 Leaky ReLU、PReLU 或者 Maxout;

最好不要用 sigmoid。

在卷积神经网络 Convolutional neural networks 的卷积层中,推荐的激励函数是 relu。在循环神经网络中 recurrent neural networks,推荐的是 tanh 或者是 relu。

猜你喜欢

转载自blog.csdn.net/zgcr654321/article/details/82914985