浅谈激活函数

激活函数是啥

先从神经元开始说说。神经元能感知环境的变化,再将信息传递给其他的神经元,并指令集体做出反应。下图是一个典型的神经元结构:

神经元通过以树突和胞体组成的接收区接受信号脉冲,经过处理之后再由末梢的输出区输出脉冲至下一个神经元。

现在我们来用人工神经元类比一下,下图是一个神经网络单元:

a1 - an 为神经元接收到的信号, w1 - wn 为该神经元所拥有的权重, b 为偏置,神经元接收到这些信号并通过加权和得到一个值 x,然后把这个值通过细胞核处理,也就是上图的 f ,得到一个 y ,这个 y 就是神经元输出的信号。而这个 f 就是我们说的激活函数。

为啥要用激活函数

我们知道矩阵变换都是线性变换,而深度学习希望学习到的函数通常是复杂的非线性的,所以想要得到非线性的函数,就需要加入非线性的层,也就是激活层。

常用激活函数

线性的咱就不说了,F(x) = x , 输入啥就输出啥。直接看看非线性的。

1. sigmoid:

函数式为:

优点:sigmoid函数曲线平滑,并且易于求导,求导后其规律为 σ(x)=σ(x)(1σ(x))。

缺点:1.容易导致梯度消失,可以看到当非常大的正负数作为输入时,sigmoid函数导数就趋近于 0 ,导致梯度无法下降,更新停止。

2.中心非 0 对称,可以看到函数的输出都是正数,如果当前的神经元需要某些输入符号相反,上一层又使用sigmoid函数作为激活函数时,就会导致模型为了收敛而走 z 字型逼近最优解,致使收敛速度变慢。

3.exp() 函数的计算成本高昂。

2. Tanh

该函数又叫双曲正切,函数图像如下所示:

 

 

 双曲正切函数弥补了s型函数非 0 为中心的缺点,但是仍然存在梯度消失的问题,即当输入非常大或者非常小时,神经元依旧处于饱和状态,其梯度为 0。

3.ReLU  

ReLU函数可以说是非常好用的激活函数了,它的数学表达式为:f(x) = max(0,x),它的函数图像如下:

 

 

 优点:1.在正向上不存在饱和区域

2.计算非常的有效率

3.收敛速度比s型函数更快

4.更符合生物学上的特性(输入 = 输出)

不过ReLU函数也有一个缺点,就是当输入小于 0 时,该神经元输出为 0 ,同时梯度消失,停止迭代更新。

4.Leaky ReLU

为了解决上面提到的ReLU梯度消失问题,在初始化ReLU时,略微做一个偏正,即函数表达式为 f(x) = max(0.01x, x),函数图像如下图:

通过引入偏正避免了梯度消失且的问题。同时还可以对偏正参数做一个推广,我们用超参数来代替 0.01, 即 f(x) = max(αx, x),这个超参数也是可以被学习的,这个推广函数称为 Parametric ReLU。

5.Exponential Linear Units (ELU)

函数图像和表达式如下:

 

该激活函数具有ReLU函数的优点,同时由于具有负饱和特性,因此对噪声有一定的鲁棒性。该函数的缺点是需要计算exp()。

关于激活函数的几点建议

1.多使用 ReLU, 同时注意学习速率

2.可以试试 Leaky ReLU /  ELU

3.可以尝试 tanh 但是不要抱太大期望

4.不要使用 sigmiod。

以上。

(本文图片均来自于维基百科及 Stanford CS231n Course)

 

posted @ 2020-02-27 16:18  John-刘约翰  阅读(610)  评论(0)    收藏  举报