Press "Enter" to skip to content

激活函数

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

引言

 

在学习神经网络的过程中总会听到激活函数(激励函数),激活函数是神经网络中非线性的来源,如果去掉这些激活函数,那神经网络只剩下线性运算,那最终的效果就相当于单层的线性模型,本文主要从以下几个方面来讲解激活函数:

激活函数是什幺
激活函数的分类以及特点
如何选择合适的激活函数

激活函数是什幺

 

首先要先了解神经网络的基本模型(不熟悉的可以去看本文另一篇文章:神经网络介绍)单一神经网络模型如图所示:

 

 

SUM代表神经元,xi代表输入层,wi代表权值,t代表输出层,输入乘以对应的权值输入到神经元,并传递到输出层,在输入和输出之间具有一个函数关系f,这个函数称为激活函数(激励函数)。

 

激活函数的分类和特点

 

Sigmoid函数

 

Sigmoid是常用的非线性激活函数,数学形式如下所示:

 

$$ f(z) = \frac{1}{1+ e^{-z}} $$

 

几何图像及其导数如图所示:

 

 

特点:

 

1、在于输出范围有限[0,1],数据在传递过程中不容易发散

 

2、可以在输出层表示概率值。

 

缺点:

 

1、输出不是zero-centered

 

2、梯度下降非常明显,并且两头过于平坦,容易出现梯度消失的情况,这是因为Sigmoid导数小于0.25,在进行反向传播时,梯度相乘会慢慢趋近0,还有就是输出的值域不对称。

 

3、数学表达式中含有幂运算,对于规模大的深度网络,会较大地增加训练时间。

 

4、左端趋于0,右端趋于1,两端均趋于饱和。

 

双曲正切函数(tanh)

 

数学形式如下所示:

 

$$ tanh(x) =\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} $$

 

tanh(x)函数及其导数如下图所示:

 

 

特点:

 

1、将数据映射到[-1,1],解决了Sigmoid函数输出值域不对称问题。

 

2、完全可以可微分和反对称的,对称中心在原点,输出为zero-centered。

 

缺点:

 

1、输出值域两头依旧平坦,梯度消失问题仍然存在。

 

2、依然是指数运算

 

3、两端均趋于饱和

 

ReLU函数

 

ReLu函数是目前神经网络里常用的激活函数,数学形式如下所示:

 

$$ f(x)=relu(x)=max(x,0) $$

 

几何图像及其导数如下图所示:

 

 

左边图为ReLU函数图像,可以看到,在负半轴函数值为0,正半轴是个线性函数

 

特点:

 

1、在正半轴是线性的,所以在正半轴没有梯度饱和的现象出现;

 

2、收敛速度比Sigmoid、Tanh更快;

 

3、计算更加高效,只需要一个阈值就可以得到激活值。

 

缺点:

 

1、ReLU的输出不是zero-centered;

 

2、Dead ReLU Problem,就是说是“死亡神经元”,也就是指某些神经元永远不会被激活,导致相应的参数不能被更新。导致这种情况原因主要有两个:(1)参数初始化,这种情况比较少。(2)leaning rate太高导致训练过程中参数更新太大,不幸使网络进入这种状态,可以使用Xavier初始化方法解决,或者使用adagrad等自动调节learning rate的算法。

 

总结

 

虽说ReLU存在这两个问题,但仍是目前最常用的激活函数,这是因为其非线性比较弱,而神经网络一般比较深,因为更深的网络的泛化能力更好。

 

带泄露修正线性神经元(Leaky ReLU函数(PReLU))

 

数学表达式为:

 

$$ f(x)=\ \{{\alpha x,\ x<0 \ \atop x,\ x\geq0} $$

 

几何图像如下图所示:

 

 

特点:

 

1、解决Dead ReLU Problem问题,将relu的前半部分设为$\alpha$x,$\alpha$通常为0.01。

 

2、不管输入小于0还是 大于0,均不会出现饱和现象。

 

3、由于是线性,不管前向传播,还是反向传播,计算速度比较快

 

缺点:

 

1、$\alpha$需要人工赋值。

 

总结

 

Leaky ReLU拥有ReLU所有优点,外加不会有Dead ReLU Problem问题,但实际操作用,没有完全证明Leaky ReLU总是优于ReLU。

 

ELU(Exponential Linear Units)

 

数学表达式为:

 

$$ f(x)=\ \{{x,\ x>0 \ \atop \alpha (e^{x}-1),\ otherwise} $$

 

图像及其导数的图像如下所示:

 

 

特点:

 

1、类似于Leaky ReLU,且具有ReLU所有优点;

 

2、解决Dead ReLU Problem 问题

 

3、输出均值接近于0

 

缺点:

 

1、计算时是需要计算指数,因此计算量比较大。

 

MaxOut函数

 

Maxout “Neuron” 是一种很有特点的神经元,它的激活函数、计算的变量、计算方式和普通的神经元完全不同,并有两组权重。先得到两个超平面,再进行最大值计算。MaxOut层的每个神经元的计算公式如下:

 

$$ f_{i}(x)=max_{j\in[1,k]}z_{ij} $$

 

i表示第i个神经元,k代表MaxOut层所需要的参数,人为设定大小,其中$z_{ij}$=$x^TW_{…ij}+b_{ij}$,我们假定k为1,i也为1,w是两维的,那幺可以得出如下公式:

 

$$ f(x)=max(w_{1}^Tx+b_{1},w_{2}^Tx+b_{2}) $$

 

可以这样理解,传统MLP算法在第一层到第二层,参数只有一组,为$wx+b$,现在我们同时训练两组,然后选择激活值最大的,这个$max(z)$就充当了激活函数。

 

特点:

 

1、具有ReLU所有优点

 

2、能够解决Dead ReLU Problem问题

 

缺点:

 

1、每个神经元将有两组w,参数增加一倍,导致整体参数数量激增。

 

如何选择合适的激活函数

 

这个问题没有确定的办法,看实际情况

 

1、一般情况下,不要在一个网络中混着使用不同的激活函数

 

2、深度学习通常需要大量的时间进行数据处理,那幺收敛速度就很重要,训练深度网络尽量使用具有输出zero-centered特点的激活函数用于加快收敛速度。

 

3、如果使用ReLU,需要注意learning rate,不要让网络中出现过多的死亡神经元,如果死亡神经元过多,可以试试Leaky ReLU ,MaxOut。

 

4、少用Sigmoid,可以试试Tanh,不过效果应该没有ReLU和MaxOut好。

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注