优秀激活函数的特点
-
假设我们在神经元模型中加入线性的激活函数,那么数据向量在前向传播时,每经过一层都只是做了一次线性变换,这也就意味着网络只能感知输入的向量与输出的向量仅存在线性关系的事件,而现实中我们不可能让神经网络去感知如此简单的事物。因此,必须给神经元加入一个非线性的变换,这可以极大的提高网络对各类事物的拟合能力。
-
激活函数应当是可导的或不可导点是有限的,在不可导点可以做特殊定义。
-
我们将神经网络的基本原理一文中反向传播章节的两组式子作进一步展开,如下:
{ ∂ ℓ ∂ y 4 = ∂ ℓ ∂ y 6 ⋅ ∂ y 6 ∂ y 4 + ∂ ℓ ∂ y 5 ⋅ ∂ y 5 ∂ y 4 = A ′ ( s 6 ) ⋅ ∂ ℓ ∂ y 6 ⋅ w 12 + A ′ ( s 5 ) ⋅ ∂ ℓ ∂ y 5 ⋅ w 10 ∂ ℓ ∂ y 3 = ∂ ℓ ∂ y 6 ⋅ ∂ y 6 ∂ y 3 + ∂ ℓ ∂ y 5 ⋅ ∂ y 5 ∂ y 3 = A ′ ( s 6 ) ⋅ ∂ ℓ ∂ y 6 ⋅ w 11 + A ′ ( s 5 ) ⋅ ∂ ℓ ∂ y 5 ⋅ w 9 \left\{ \begin{array}{l} \frac{\partial \ell}{\partial y_4}= \frac{\partial \ell}{\partial y_6} \cdot \frac{\partial y_6}{\partial y_4}+ \frac{\partial \ell}{\partial y_5} \cdot \frac{\partial y_5}{\partial y_4}= A'(s_6) \cdot \frac{\partial \ell}{\partial y_6} \cdot w_{12}+ A'(s_5) \cdot \frac{\partial \ell}{\partial y_5} \cdot w_{10} \\ \frac{\partial \ell}{\partial y_3}= \frac{\partial \ell}{\partial y_6} \cdot \frac{\partial y_6}{\partial y_3}+ \frac{\partial \ell}{\partial y_5} \cdot \frac{\partial y_5}{\partial y_3}= A'(s_6) \cdot \frac{\partial \ell}{\partial y_6} \cdot w_{11}+ A'(s_5) \cdot \frac{\partial \ell}{\partial y_5} \cdot w_{9} \end{array} \right. {∂y4∂ℓ=∂y6∂ℓ⋅∂y4∂y6+∂y5∂ℓ⋅∂y4∂y5=A′(s6)⋅∂y6∂ℓ⋅w12+A′(s5)⋅∂y5∂ℓ⋅w10∂y3∂ℓ=∂y6∂ℓ⋅∂y3∂y6+∂y5∂ℓ⋅∂y3∂y5=A′(s6)⋅∂y6∂ℓ⋅w11+A′(s5)⋅∂y5∂ℓ⋅w9 { ∂ ℓ ∂ y 2 = ∂ ℓ ∂ y 4 ⋅ ∂ y 4 ∂ y 2 + ∂ ℓ ∂ y 3 ⋅ ∂ y 3 ∂ y 2 = A ′ ( s 6 ) ⋅ A ′ ( s 4 ) ⋅ ∂ ℓ ∂ y 6 ⋅ w 12 ⋅ w 8 + A ′ ( s 5 ) ⋅ A ′ ( s 4 ) ⋅ ∂ ℓ ∂ y 5 ⋅ w 10 ⋅ w 8 + A ′ ( s 6 ) ⋅ A ′ ( s 3 ) ⋅ ∂ ℓ ∂ y 6 ⋅ w 12 ⋅ w 6 + A ′ ( s 5 ) ⋅ A ′ ( s 3 ) ⋅ ∂ ℓ ∂ y 5 ⋅ w 10 ⋅ w 6 ∂ ℓ ∂ y 1 = ∂ ℓ ∂ y 4 ⋅ ∂ y 4 ∂ y 1 + ∂ ℓ ∂ y 3 ⋅ ∂ y 3 ∂ y 1 = A ′ ( s 6 ) ⋅ A ′ ( s 4 ) ⋅ ∂ ℓ ∂ y 6 ⋅ w 12 ⋅ w 7 + A ′ ( s 5 ) ⋅ A ′ ( s 4 ) ⋅ ∂ ℓ ∂ y 5 ⋅ w 10 ⋅ w 7 + A ′ ( s 6 ) ⋅ A ′ ( s 3 ) ⋅ ∂ ℓ ∂ y 6 ⋅ w 12 ⋅ w 5 + A ′ ( s 5 ) ⋅ A ′ ( s 3 ) ⋅ ∂ ℓ ∂ y 5 ⋅ w 10 ⋅ w 5 \left\{ \begin{array}{l} \frac{\partial \ell}{\partial y_2}= \frac{\partial \ell}{\partial y_4} \cdot \frac{\partial y_4}{\partial y_2}+ \frac{\partial \ell}{\partial y_3} \cdot \frac{\partial y_3}{\partial y_2}= A'(s_6) \cdot A'(s_4) \cdot \frac{\partial \ell}{\partial y_6} \cdot w_{12} \cdot w_8 + A'(s_5) \cdot A'(s_4) \cdot \frac{\partial \ell}{\partial y_5} \cdot w_{10} \cdot w_8 + A'(s_6) \cdot A'(s_3) \cdot \frac{\partial \ell}{\partial y_6} \cdot w_{12} \cdot w_6 + A'(s_5) \cdot A'(s_3) \cdot \frac{\partial \ell}{\partial y_5} \cdot w_{10} \cdot w_6 \\ \frac{\partial \ell}{\partial y_1}= \frac{\partial \ell}{\partial y_4} \cdot \frac{\partial y_4}{\partial y_1}+ \frac{\partial \ell}{\partial y_3} \cdot \frac{\partial y_3}{\partial y_1}= A'(s_6) \cdot A'(s_4) \cdot \frac{\partial \ell}{\partial y_6} \cdot w_{12} \cdot w_7 + A'(s_5) \cdot A'(s_4) \cdot \frac{\partial \ell}{\partial y_5} \cdot w_{10} \cdot w_7 + A'(s_6) \cdot A'(s_3) \cdot \frac{\partial \ell}{\partial y_6} \cdot w_{12} \cdot w_5 + A'(s_5) \cdot A'(s_3) \cdot \frac{\partial \ell}{\partial y_5} \cdot w_{10} \cdot w_5\end{array} \right. {∂y2∂ℓ=∂y4∂ℓ⋅∂y2∂y4+∂y3∂ℓ⋅∂y2∂y3=A′(s6)⋅A′(s4)⋅∂y6∂ℓ⋅w12⋅w8+A′(s5)⋅A′(s4)⋅∂y5∂ℓ⋅w10⋅w8+A′(s6)⋅A′(s3)⋅∂y6∂ℓ⋅w12⋅w6+A′(s5)⋅A′(s3)⋅∂y5∂ℓ⋅w10⋅w6∂y1∂ℓ=∂y4∂ℓ⋅∂y1∂y4+∂y3∂ℓ⋅∂y1∂y3=A′(s6)⋅A′(s4)⋅∂y6∂ℓ⋅w12⋅w7+A′(s5)⋅A′(s4)⋅∂y5∂ℓ⋅w10⋅w7+A′(s6)⋅A′(s3)⋅∂y6∂ℓ⋅w12⋅w5+A′(s5)⋅A′(s3)⋅∂y5∂ℓ⋅w10⋅w5
我们可以发现这样一个规律:随着一层层的迭代求导, A ′ A' A′ 的次数在不断增加。接下来,我们将作出两种假设:- 假设 ∣ A ′ ∣ < 1 \left| A' \right|<1 ∣A′∣<1 。此时在 A ′ n A'^n A′n 中 n n n 越大,其值就越趋近于 0 0 0。这也就意味着,越靠近输入层的网络层的可训练参数的偏导数值越接近 0 或者等于 0。这种现象被称为梯度消失,它会导致靠近输入端的网络层训练的速度(收敛速度)极慢或者根本无法得到训练。
- 假设 ∣ A ′ ∣ > 1 \left| A' \right|>1 ∣A′∣>1 。此时在 A ′ n A'^n A′n 中 n n n 越大,其值就越趋近于 ∞ \infty ∞,这就使得靠近输入层的偏导数值变得极大。该现象被称为梯度爆炸,它会使得靠近输入端的网络层变换过于剧烈,训练变得毫无意义。
产生以上两个问题的原因,一方面与激活函数的选择有关;另一方面,也是反向传播算法缺陷造成的,它对靠近输入层的网络层不友好。
-
我们设网络中某一神经元的表达式如下:
y = A ( w 1 ⋅ y 1 + w 2 ⋅ y 2 + b ) y=A(w_1\cdot y_1+w_2\cdot y_2 + b) y=A(w1⋅y1+w2⋅y2+b)
其中 y 1 y_1 y1、 y 2 y_2 y2 为上一层的两个神经元的输出, w 1 w_1 w1、 w 2 w_2 w2 为二者对应的权重, b b b 为偏置, A A A 为激活函数。设 l l l 为损失值,那么对权重的的偏导如下:
{ ∂ ℓ ∂ w 1 = ∂ ℓ ∂ y ⋅ A ′ ⋅ y 1 ∂ ℓ ∂ w 2 = ∂ ℓ ∂ y ⋅ A ′ ⋅ y 2 \left\{ \begin{array}{l} \frac{\partial \ell}{\partial w_1}=\frac{\partial \ell}{\partial y}\cdot A' \cdot y_1 \\ \frac{\partial \ell}{\partial w_2}=\frac{\partial \ell}{\partial y}\cdot A' \cdot y_2 \end{array} \right. {∂w1∂ℓ=∂y∂ℓ⋅A′⋅y1∂w2∂ℓ=∂y∂ℓ⋅A′⋅y2
我们发现,如果 y 1 y_1 y1、 y 2 y_2 y2 同号(同为正数或同为负数),那么 ∂ ℓ ∂ w 1 \frac{\partial \ell}{\partial w_1} ∂w1∂ℓ、 ∂ ℓ ∂ w 2 \frac{\partial \ell}{\partial w_2} ∂w2∂ℓ 也同号。现在假设 A A A 恒正或恒负。由于 y 1 y_1 y1、 y 2 y_2 y2 是上一层神经元的输出值,那么就必然是激活函数的输出值,又因为激活函数输出值恒正或恒负,则 y 1 y_1 y1、 y 2 y_2 y2 必然同号。那么 ∂ ℓ ∂ w 1 \frac{\partial \ell}{\partial w_1} ∂w1∂ℓ、 ∂ ℓ ∂ w 2 \frac{\partial \ell}{\partial w_2} ∂w2∂ℓ 也必然同号,则 w 1 w_1 w1、 w 2 w_2 w2 更新时,只能共同正向移动或负向移动,不可能出现一个正向移动一个负向移动。
如上图所示,假设 w 1 w_1 w1、 w 2 w_2 w2 的最佳取值点在 ( w 1 ′ , w 2 ′ ) (w_1', w_2') (w1′,w2′),那么最佳的更新路径就是如图中蓝线所示。但是由于 w 1 w_1 w1、 w 2 w_2 w2 更新时只能共同正向移动或负向移动,而蓝色线是 w 1 w_1 w1 正向移动、 w 2 w_2 w2负向移动,所以它们只能延黄色线以 Z 型的轨迹移动到最佳取值点。显而易见,Z 型的轨迹会极大降低收敛速度(训练速度)。
综上所述,优秀的激活函数是非线性的、可导且导数值保持在 1 1 1 左右以及值域有正有负。
Sigmoid
我们已经了解在反向传播求导过程中使用到了激活函数的导数,而 MP 模型给出的激活函数显然无法适用 BP 算法,因为其导数恒为
0
0
0,使得可训练参数的偏导值皆为
0
0
0,可训练参数无法得到更新。为了使 MP 模型适用 BP 算法,研究者们使用 Sigmoid 函数作为激活函数。由此
Sigmoid 函数成为了深度神经网络最先使用的激活函数,其表达式及函数图像如下:
A
(
x
)
=
1
1
+
e
−
x
A(x)=\frac{1}{1+e^{-x}}
A(x)=1+e−x1
我们从从图像上可以看出 Sigmoid 函数与 MP 模型给出的函数很相似。该函数的取值范围为 ( 0 , 1 ) (0,1) (0,1),因此该函数适合用在分类模型中做二分类。现在几乎不再使用该函数了,原因有以下几点:
- 通过上图我们知道导数范围为 ( 0 , 0.25 ] (0,0.25] (0,0.25],借助上文中对优秀激活函数的论述,可以得出该函数在深层网络中必然会发生梯度消失。
- 函数值域在正区间,会降低收敛速度。
- 函数及其导函数涉及到指数和除法运算,会拉低正向传播和反向传播的速度。
另外补充一点,我们看到函数在远离 0 0 0 的两侧,其导函数值几乎为 0 0 0,如果函数自变量落入该区间则会发生梯度消失现象。学术上将导函数值几乎为 0 0 0 或为 0 0 0 的区间称之为该函数的饱和区(saturation region),可以再进一步划分,如果导函数取值几乎为 0 0 0 但不为 0 0 0 称之为软饱和(soft saturation),如果恒为 0 0 0 称之为硬饱和(hard saturation)。
tanh
tanh 称为双曲正切函数,是 Sigmoid 的继任者。其表达式及其函数图像如下:
A
(
x
)
=
e
x
−
e
−
x
e
x
+
e
−
x
A(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}
A(x)=ex+e−xex−e−x
tanh 是关于原点中心对称的,由优秀激活函数的特点可知,该函数相对于 Sigmoid 收敛速度更快。但也仍有以下缺点:
- 导函数仅在 0 0 0 处取值为 1 1 1,相对于 Sigmoid 梯度消失有所缓和,但仍然存在。
- 函数及其导函数包含指数和除法运算,正向传播和反向传播速度较慢。
ReLU
2010 年 ICML 录用了 Vinod Nair 与 Geoffrey E. Hinton 撰写的论文《Rectified Linear Units Improve Restricted Boltzmann Machines》。该文提出了新的激活函数——线性整流单元(rectified linear unit,ReLU)。该函数在数学上被称为斜坡函数,是 tanh 的继任者,也是当前应用较为广泛的激活函数。其表达式及其函数图像如下:
A
(
x
)
=
max
(
0
,
x
)
A(x)=\max(0,x)
A(x)=max(0,x)
ReLU 更加仿生。新的研究成果表明在同一时刻大脑中只有
1
%
1\%
1% 到
4
%
4\%
4% 的神经元处于活跃状态。当送入 ReLU 的值小于
0
0
0 时,ReLU 输出为
0
0
0,神经元处于抑制状态;当送入 ReLU 的值大于
0
0
0 时,ReLU 输出原值,神经元处于激活状态。这样网络中同一时刻大约有
50
%
50\%
50% 的神经元处于激活状态。
ReLU 在激活状态时的导数恒为
1
1
1,彻底解决了梯度消失的问题;函数及其导函数的计算简单,提高了正向传播和反向传播的速度。但根据优秀激活特点,ReLU 存在 Z 型更新轨迹,在一定程度上拉低了收敛速度。
然而,任何激活函数都不是完美的,ReLU 也带来了前所未有的问题——神经元死亡。
我们假设在训练过程中某神经元(
y
=
R
e
L
U
(
w
1
x
1
+
w
2
x
2
+
⋯
+
w
i
x
i
+
⋯
+
w
n
x
n
+
b
)
=
记作
R
e
L
U
(
s
)
y=ReLU(w_1x_1+w_2x_2+ \cdots + w_ix_i+\cdots+w_nx_n+b)\xlongequal{记作}ReLU(s)
y=ReLU(w1x1+w2x2+⋯+wixi+⋯+wnxn+b)记作ReLU(s) )的第
i
i
i 个输入端
x
i
x_i
xi 收到了一个极大的正数输入
x
i
˙
\dot{x_i}
xi˙。反向传播时
x
i
x_i
xi 对应的权重
w
i
w_i
wi 的偏导为
∂
ℓ
∂
w
i
=
∂
ℓ
∂
y
⋅
R
e
L
U
′
(
s
)
⋅
x
i
\frac{\partial \ell}{\partial w_i}=\frac{\partial \ell}{\partial y} \cdot ReLU'(s) \cdot x_i
∂wi∂ℓ=∂y∂ℓ⋅ReLU′(s)⋅xi。我们再假设
∂
ℓ
∂
y
∣
x
i
˙
\left.\frac{\partial \ell}{\partial y}\right|_{\dot{x_i}}
∂y∂ℓ
xi˙ 为正,由于
x
i
˙
\dot{x_i}
xi˙ 极大,使得
∂
ℓ
∂
w
i
∣
x
i
˙
\left.\frac{\partial \ell}{\partial w_i}\right|_{\dot{x_i}}
∂wi∂ℓ
xi˙ 极大,那么就使
w
i
w_i
wi 更新成一个极小的负数。
现在,又有新的数值
x
i
¨
\ddot{x_i}
xi¨ 输入,由于 ReLU 只传递非负数,
x
i
¨
\ddot{x_i}
xi¨ 必然为非负数。若
x
i
¨
\ddot{x_i}
xi¨ 为正数,由于
w
i
w_i
wi 是极小的负数,所以
w
1
x
1
¨
+
w
2
x
2
¨
+
⋯
+
w
i
x
i
¨
+
⋯
+
w
n
x
n
¨
−
θ
=
记作
s
¨
w_1\ddot{x_1}+w_2\ddot{x_2}+ \cdots + w_i\ddot{x_i}+\cdots+w_n\ddot{x_n}-\theta \xlongequal{记作}\ddot{s}
w1x1¨+w2x2¨+⋯+wixi¨+⋯+wnxn¨−θ记作s¨ 大概率也是个负数,那么此时
R
e
L
U
′
(
s
¨
)
ReLU'(\ddot{s})
ReLU′(s¨) 为
0
0
0,则损失值对该神经元内所有权重和阈值的偏导值都是
0
0
0,导致神经元的所有可训练参数无法得到更新;若
x
¨
\ddot{x}
x¨ 为零,则
∂
ℓ
∂
w
i
∣
x
i
¨
\left.\frac{\partial \ell}{\partial w_i}\right|_{\ddot{x_i}}
∂wi∂ℓ
xi¨ 为
0
0
0,
w
i
w_i
wi 无法得到更新。
可见当神经元某输入端收到一个极大的正数输入后就会导致其对应的权重值永远无法得到更新,而其它可训练参数只有等到该输入端输入
0
0
0 时才能得到更新,整个神经元的可训练参数几乎无法再训练。以上仅是一个输入端收到极大正数,而现实中往往是多个输入端同时收到极大正数,那时神经元的每次输出几乎或完全皆为
0
0
0,我们认定该神经元处于 ‘死亡’ 状态。
缓解神经元死亡问题最直接的方法就是降低学利率。降低学习率会使
w
i
w_i
wi 在某次更新时不至于变得太小,但终究不是一个根治神经元死亡的办法。为了根治该问题,研究者们提出一些 ReLU 的变体,如 PReLU(parametric rectified linear unit) 等,这里不再赘述。
Softmax
在分类模型中,网络输出层神经元的个数取决于类别的数量,即输出层神经元的个数等于类别数,一个类别对应一个神经元。我们作出这样的设计是让每个神经元完成一个二分类,即我们希望如果某事物是某个类别的,那么该类别对应的输出层神经元输出
1
1
1,其它神经元输出
0
0
0。基于以上,我们可以得出在分类模型中,目标值向量是一个单位坐标向量(分量中仅有一个
1
1
1,其余都为
0
0
0),学术领域也对这种数据给出了一个名词——独热码(one-hot)。
通过上文,我们已经规范了对分类模型输出层的输出格式,接下来我们讨论如何实现这种格式输出。我们首次想到的是在输出层的激活函数外再增加一层函数,使外层函数来完成规范化输出。但这种方式显得太过冗余,完全可以剥掉原有的激活函数,重新为其设计一个激活函数,使其输出规范化。
相信大多数人首先想到的方法就是:将输出层所有的激活值拿出来比较,拥有最大激活值的那个神经元输出
1
1
1,其余输出
0
0
0。这种方法被称为 Hardmax,仔细想想这种方法就是行不同的,单是求导就很难实现,另外这种非黑即白的输出很难衡量出模型的预测值距离目标值到底相差多少。
我们实际上需要的是一种概率输出,即模型认为某事物是各个类别的概率分别是多少。下面给出 Softmax 的表达式:
y
j
=
e
s
j
∑
τ
=
1
m
e
s
τ
y_j=\frac{e^{s_j}}{\sum_{\tau=1}^m{e^{s_\tau}}}
yj=∑τ=1mesτesj
其中
y
j
y_j
yj 为本层第
j
j
j 个神经元的输出值,
s
j
s_j
sj 为本层第
j
j
j 个神经元的激活值。Softmax 通过指数函数将
s
s
s 映射到正数区间,而后归一化,从而使得每个神经元的输出变为一个概率值。这既符合我们的输出格式,也方便后期的误差计算过程。因此,在分类模型中,常常使用 Softmax 作为输出层的激活函数。我们也可以发现 Softmax 与其它激活函数的不同,其他激活函数仅作用在一个神经元上,而 Softmax 相当于一层神经元联合起来的激活函数。
但是有一个问题也不能被忽视。由于引入了对数函数,当
s
s
s 过大时,
e
s
e^s
es 容易向上溢出(超出浮点数的表示范围),从而发生计算错误。这个问题可以采用如下方法来解决。在所有
s
s
s 中找出最大的
s
max
s_{\max}
smax ,再令所有的
s
s
s 减去
s
max
s_{\max}
smax 后再带入对数运算,公式就演变为如下形式:
y
j
=
e
s
j
−
s
max
∑
τ
=
1
m
e
s
τ
−
s
max
y_j=\frac{e^{s_j-s_{\max}}}{\sum_{\tau=1}^m{e^{s_\tau-s_{\max}}}}
yj=∑τ=1mesτ−smaxesj−smax