1、激活函数
激活函数是神经网络中输出值处理的一个函数。通过激活函数,神经网络能训练更为复杂的数据。
上图所示为神经网络的一个神经元,若net=∑i=0nwixinet=\sum_{i=0}^{n}w_ix_inet=∑i=0nwixi没有经过激活函数的处理,则神经网络只能训练线性关系的数据,若使用激活函数处理,则可以根据激活函数的不同训练不同类型的数据。
激活函数分为两种类型:线性激活函数和非线性激活函数,神经网络使用的激活函数一般都是非线性激活函数。因为非线性激活函数能帮助神经网络训练复杂数据,计算和学习几乎表达问题的任何函数并提供精准的预测。同时他们具有导数可以反向传播。
2、常用激活函数
-
Sigmoid函数
Sigmoid函数是非线性函数,其输出值在区间(0,1)。函数表达式:y=11+e−z⟹y′=y(1−y)y=\frac{1}{1+e^{-z}} \Longrightarrow y'=y(1-y)y=1+e−z1⟹y′=y(1−y)
Sigmoid函数优点:
1、简单、非常适用分类任务;
Sigmoid函数缺点:
1、反向传播训练时有梯度消失的问题;
2、输出值区间为(0,1),不关于0对称;
3、梯度更新在不同方向走得太远,使得优化难度增大,训练耗时; -
Tanh函数
Tanh函数是非线性函数,其输出值在区间[-1,1]。函数表达式:y=ez−e−zez+e−z⟹y′=1−y2y=\frac{e^z-e^{-z}}{e^z+e^{-z}} \Longrightarrow y'=1-y^2y=ez+e−zez−e−z⟹y′=1−y2
Tanh函数优点:
1、解决了Sigmoid函数输出值非0对称的问题
2、训练比Sigmoid函数快,更容易收敛;
Tanh函数缺点:
1、反向传播训练时有梯度消失的问题;
Tanh函数和Sigmoid函数非常相似。
-
ReLU函数
ReLU函数是目前在神经网络使用最流行的激活函数。其表达式非常简单:y={zif z>00if z<=0⟹y′={1if z>00if z<=0y=\begin{cases} z &\text{if } z>0 \\ 0 &\text{if } z<=0 \end{cases}\Longrightarrow y'=\begin{cases} 1 &\text{if } z>0 \\ 0 &\text{if } z<=0 \end{cases}y={z0if z>0if z<=0⟹y′={10if z>0if z<=0
ReLU函数优点:
1、解决了梯度消失的问题;
2、计算更为简单,没有Sigmoid函数和Tanh函数的指数运算;
3、稀疏性激活
ReLU函数缺点:
1、训练时可能出现神经元死亡; -
Leaky ReLU函数
LReLU函数是ReLU函数的变体。其表达式:y={zif z>0azif z<=0⟹y′={1if z>0aif z<=0y=\begin{cases} z &\text{if } z>0 \\ az &\text{if } z<=0 \end{cases}\Longrightarrow y'=\begin{cases} 1 &\text{if } z>0 \\ a &\text{if } z<=0 \end{cases}y={zazif z>0if z<=0⟹y′={1aif z>0if z<=0
LReLU函数优点:
1、解决了ReLU的神经元死亡问题;
LReLU函数缺点:
1、无法为正负输入值提供一致的关系预测(不同区间函数不同) -
SoftMax激活函数
SoftMax函数通常被用在多分类网络模型中。其表达式:yi=ezi∑jezj⟹yi′=yi(1−yi)y_i=\frac{e^{z_i}}{\sum_{j}e^{z_j}} \Longrightarrow y_i'=y_i(1-y_i)yi=∑jezjezi⟹yi′=yi(1−yi)
把结果映射到[0,1],且所有结果的值之和为1。 -
ELU(Exponential Linear Unit)激活函数
没有梯度消失和爆炸的问题,同时也没有神经元死亡的问题。被证明比ReLU及其变种好。y={ex−1if x<0xif x≥0⟹y′={exif x<01if x≥0y=\begin{cases} e^x-1 &\text{if } x<0 \\ x &\text{if } x \ge 0 \end{cases}\Longrightarrow y'=\begin{cases} e^x &\text{if } x<0 \\ 1 &\text{if } x \ge0 \end{cases}y={ex−1xif x<0if x≥0⟹y′={ex1if x<0if x≥0
优点:
1、elu在所有点上都连续且可导。
2、比其他线性非饱和激活函数(如ReLU及其变种)训练速度快。
3、没有神经元死亡的问题,因为对于所有的点,其梯度都是非零的。
4、是一个非饱和函数,没有梯度消失和爆炸的问题。
5、对比其他的激活函数可以获得更高的准确率。
缺点:
1、由于非饱和函数涉及到负值输入,导致它的计算比ReLU函数慢。然而,在训练时由于elu激活函数的快速收敛,可以弥补这一缺点,但是在测试时则要比ReLU及其变种慢。
3、常见问题
Sigmoid、Tanh主要应用在二分类任务输出层、模型隐藏层
ReLU、Leaky ReLU主要应用在回归任务、卷积神经网络隐藏层
SoftMax主要应用在多分类任务输出层
- 为什么输出值要关于0对称?
由于权重更新公式:w←w+η(y−yˉ)xw\gets w+\eta(y-\bar y)xw←w+η(y−yˉ)x假设有两个权重w0,w1w_0,w_1w0,w1且最优解w0∗,w1∗w_0^*,w_1^*w0∗,w1∗满足条件{w0<w0∗w1⩾w1∗\begin{cases} w_0 < w_0^*\\ w_1 \geqslant w_1^* \end{cases}{w0<w0∗w1⩾w1∗这也就是说,我们希望 w0w_0w0适当增大,但希望 w1w_1w1 适当减小。因此,在一次更新权重训练中,x0x_0x0和x1x_1x1的符号必须相反。对于Sigmoid函数输出值在[0,1]的这种非0对称输出其收敛就如同下图的红折线,直接导致模型的收敛速度。而使用Tanh这样的输出值关于0对称的激活函数,其x0x_0x0和x1x_1x1有正有负,模型的收敛就如同下图的绿线,达到快速收敛。
- 为什么Sigmoid和Tanh激活函数会导致梯度消失?
上一节我们知道,Sigmoid函数的导数值域为(0,14)(0,\frac{1}{4})(0,41)和Tanh函数的导数值域为(0,1)(0,1)(0,1)。都小于1,从而导致模型的梯度消失。虽然说ReLU函数解决了梯度消失的问题,但是在ReLU函数的左侧导数是0,引起了另一个问题:神经元死亡。故出现了其变体Leaky ReLU和Parametric ReLU。 - ReLU函数稀疏性激活
注意:我们在这里讨论模型稀疏性。数据稀疏性(缺少信息)是不同的,通常是不好的。
为什么模型稀疏性好?如果我们考虑一下人工神经网络试图模仿的生物神经网络,这在直觉上是有意义的。尽管我们体内有数十亿个神经元,但并非所有时间都为我们所做的所有事情激发。相反,它们具有不同的作用,并由不同的信号激活。
稀疏性导致简洁的模型,这些模型通常具有更好的预测能力和更少的过拟合。在稀疏网络中,神经元更有可能实际上正在处理问题的有意义的方面。例如,在检测图像中猫的模型中,可能存在可以识别耳朵的神经元,如果图像是关于建筑物的,则显然不应激活该神经元。
最后,稀疏网络比密集网络更快,因为要计算的东西更少。