共计 2435 个字符,预计需要花费 7 分钟才能阅读完成。
引言
在学习神经网络的过程中总会听到激活函数(激励函数),激活函数是神经网络中非线性的来源,如果去掉这些激活函数,那神经网络只剩下线性运算,那最终的效果就相当于单层的线性模型,本文主要从以下几个方面来讲解激活函数:
- 激活函数是什么
- 激活函数的分类以及特点
- 如何选择合适的激活函数
激活函数是什么
首先要先了解神经网络的基本模型(不熟悉的可以去看本文另一篇文章:神经网络介绍)单一神经网络模型如图所示:
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 好。