一. 引言
神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,
它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应
如今神经网络已经为很多人所熟知,很多很多复杂的网络结构出现在我们面前。在我们日常编写神经网络代码的过程中,激活函数似乎已经是一种很自然正常的操作。可是,激活函数的原理,激活函数的性质,为什么需要激活函数,有哪些常用的激活函数,如何选用?也需要我们更加深入的了解。
二. 神经元
神经网络中最基本的成分是神经元 (neuro且)模型,即上述定义中的"简单单元"在生物神经网络中,每个神经元与其他神经元相连,当它"兴奋"时,就会 向相连的神经元发送化学物质,从而改变这些神经元 内的电位;如果某神经元的电位超过了 一个"阔值" (threshold) , 那么它就会被激活,即 "兴奋 "起来,向其他神经元发送化学物质。之前说深度网络就是模拟这种生物神经网络的,那么深度学习里的激活函数就是模仿这种神经元的激活方式。
这是一个简单的神经元模型,它接收N个输入X1, X2, ... ,Xn。并为每个输入赋予一个权重W1, W2, ... ,Wn。b是偏置参数(可以理解为为了更好的达到目标而做调整的参数)
- X是该神经元接受的N个输入
- W是N维的权重向量
- z 表示一个神经元所获得的输入信号x的加权和,称为神经元的状态
- f是激活函数
- a为神经元的活性值,也即该神经元的输出
到这里我们知道了神经元接受了多个输入后,必须要通过"激活函数"处理才会产生最终输出。
三. 理想的激活函数(阶跃函数)
理想中的激活函数是图所示 的阶跃函数,它将输入值映射为输出值 "0"或“1”,显然 "1" 对应于神经元兴奋 , "0" 对应于神经元抑制。这种情况是最符合生物特性的,但是阶跃函数具有不连续 、不光滑等不太好的性质,所以它无法被用于神经网络的结构。
既然理想的激活函数无法适用于我们的神经网络结构,那激活函数应该具有什么样的性质呢?
四. 激活函数的性质
- 可微性:计算梯度时必须要有此性质。
- 非线性:保证数据非线性可分。
- 单调性:保证凸函数。
- 输出值与输入值相差不会很大:保证神经网络训练和调参高效。
五. 激活函数的作用(非线性)
能使得神经网络的每层输出结果变得非线性化
非线性化的作用
能使得神经网络的每层输出结果变得非线性化。
线性可分
线性不可分
六. 常用的激活函数
-
Sigmoid
- 经典的激活函数
- 挤压函数:把一个实数压缩至0到1之间。当z是非常大的正数时,g(z)会趋近于1,而z是非常大的负数时,则g(z)会趋近于0。
-
挤压的好处:分类分类的概率,比如激活函数的输出为0.9的话便可以解释为90%的概率为正样本。
- 微分形式简单,可以用自身表示。
- Sigmoid函数饱和使梯度消失。当神经元的激活在接近0或1处时会饱和,在这些区域梯度几乎为0,这就会导致梯度消失,几乎就有没有信号通过神经传回上一层
- Sigmoid函数的输出不是零中心的。因为如果输入神经元的数据总是正数,那么关于W的梯度在反向传播的过程中,将会要么全部是正数,要么全部是负数,这将会导致梯度下降权重更新时出现z字型的下降。
-
TANH双曲正切
- 是sigmoid函数的一种变体,它的取值范围为【-1,1】,而不是sigmoid函数的【0,1】
- 定义域R,同样是挤压函数。
- 解决了输出不是零中心,但饱和问题仍然存在。
-
ReLU
- 相对于前面两者没有任何指数级运算,对网络计算加速具有巨大作用。
- 单侧抑制
- 只需要一个阈值就可以得到激活值,而不用去算一大堆复杂的运算。
- 容易死掉
4.Leaky ReLU
个人第一次使用是在训练GAN的过程中。
- 给与一个很小的负数梯度值,使负轴信息不会全部丢失,解决了ReLU神经元“死掉”的问题