引言
在学习神经网络的过程中总会听到激活函数(激励函数),激活函数是神经网络中非线性的来源,如果去掉这些激活函数,那神经网络只剩下线性运算,那最终的效果就相当于单层的线性模型,本文主要从以下几个方面来讲解激活函数:
- 激活函数是什么
- 激活函数的分类以及特点
- 如何选择合适的激活函数
激活函数是什么
首先要先了解神经网络的基本模型(不熟悉的可以去看本文另一篇文章:神经网络介绍)单一神经网络模型如图所示:
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好。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。