1、激活函数
激活函数是神经网络中输出值处理的一个函数。通过激活函数,神经网络能训练更为复杂的数据。
上图所示为神经网络的一个神经元,若
n
e
t
=
∑
i
=
0
n
w
i
x
i
net=\sum_{i=0}^{n}w_ix_i
net=∑i=0nwixi没有经过激活函数的处理,则神经网络只能训练线性关系的数据,若使用激活函数处理,则可以根据激活函数的不同训练不同类型的数据。
激活函数分为两种类型:线性激活函数和非线性激活函数,神经网络使用的激活函数一般都是非线性激活函数。因为非线性激活函数能帮助神经网络训练复杂数据,计算和学习几乎表达问题的任何函数并提供精准的预测。同时他们具有导数可以反向传播。
2、常用激活函数
-
Sigmoid函数
Sigmoid函数是非线性函数,其输出值在区间(0,1)。函数表达式: y = 1 1 + 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 = e z − e − z e z + e − z ⟹ y ′ = 1 − y 2 y=\frac{e^z-e^{-z}}{e^z+e^{-z}} \Longrightarrow y'=1-y^2 y=ez+e−zez−e−z⟹y′=1−y2
Tanh函数优点:
1、解决了Sigmoid函数输出值非0对称的问题
2、训练比Sigmoid函数快,更容易收敛;
Tanh函数缺点:
1、反向传播训练时有梯度消失的问题;
Tanh函数和Sigmoid函数非常相似。
-
ReLU函数
ReLU函数是目前在神经网络使用最流行的激活函数。其表达式非常简单: y = { z if z > 0 0 if z < = 0 ⟹ y ′ = { 1 if z > 0 0 if z < = 0 y=\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 = { z if z > 0 a z if z < = 0 ⟹ y ′ = { 1 if z > 0 a if z < = 0 y=\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函数通常被用在多分类网络模型中。其表达式: y i = e z i ∑ j e z j ⟹ y i ′ = y i ( 1 − y i ) 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 = { e x − 1 if x < 0 x if x ≥ 0 ⟹ y ′ = { e x if x < 0 1 if x ≥ 0 y=\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 ˉ ) x w\gets w+\eta(y-\bar y)x w←w+η(y−yˉ)x假设有两个权重 w 0 , w 1 w_0,w_1 w0,w1且最优解 w 0 ∗ , w 1 ∗ w_0^*,w_1^* w0∗,w1∗满足条件 { w 0 < w 0 ∗ w 1 ⩾ w 1 ∗ \begin{cases} w_0 < w_0^*\\ w_1 \geqslant w_1^* \end{cases} {w0<w0∗w1⩾w1∗这也就是说,我们希望 w 0 w_0 w0适当增大,但希望 w 1 w_1 w1 适当减小。因此,在一次更新权重训练中, x 0 x_0 x0和 x 1 x_1 x1的符号必须相反。对于Sigmoid函数输出值在[0,1]的这种非0对称输出其收敛就如同下图的红折线,直接导致模型的收敛速度。而使用Tanh这样的输出值关于0对称的激活函数,其 x 0 x_0 x0和 x 1 x_1 x1有正有负,模型的收敛就如同下图的绿线,达到快速收敛。
- 为什么Sigmoid和Tanh激活函数会导致梯度消失?
上一节我们知道,Sigmoid函数的导数值域为 ( 0 , 1 4 ) (0,\frac{1}{4}) (0,41)和Tanh函数的导数值域为 ( 0 , 1 ) (0,1) (0,1)。都小于1,从而导致模型的梯度消失。虽然说ReLU函数解决了梯度消失的问题,但是在ReLU函数的左侧导数是0,引起了另一个问题:神经元死亡。故出现了其变体Leaky ReLU和Parametric ReLU。 - ReLU函数稀疏性激活
注意:我们在这里讨论模型稀疏性。数据稀疏性(缺少信息)是不同的,通常是不好的。
为什么模型稀疏性好?如果我们考虑一下人工神经网络试图模仿的生物神经网络,这在直觉上是有意义的。尽管我们体内有数十亿个神经元,但并非所有时间都为我们所做的所有事情激发。相反,它们具有不同的作用,并由不同的信号激活。
稀疏性导致简洁的模型,这些模型通常具有更好的预测能力和更少的过拟合。在稀疏网络中,神经元更有可能实际上正在处理问题的有意义的方面。例如,在检测图像中猫的模型中,可能存在可以识别耳朵的神经元,如果图像是关于建筑物的,则显然不应激活该神经元。
最后,稀疏网络比密集网络更快,因为要计算的东西更少。