参考 Activation Functions Explained - GELU, SELU, ELU, ReLU and more
1.sigmoid
s
i
g
m
o
i
d
sigmoid
sigmoid 是一个
l
o
g
i
s
t
i
c
logistic
logistic 非线性函数,即不管输入是什么,得到的输出都在区间
(
0
,
1
)
(0,1)
(0,1):
s
i
g
m
o
i
d
(
x
)
=
1
1
+
e
−
x
sigmoid(x)=\frac{1}{1+e^{-x}}
sigmoid(x)=1+e−x1
假设前向传播时为:
z
(
L
)
=
w
(
L
)
×
a
+
b
a
(
L
)
=
σ
(
z
(
L
)
)
C
=
(
a
(
L
)
−
y
)
2
z^{(L)}=w^{(L)}\times a +b\\ a^{(L)}=\sigma(z^{(L)})\\ C=(a^{(L)}-y)^2
z(L)=w(L)×a+ba(L)=σ(z(L))C=(a(L)−y)2
那么反向传播的梯度将是:
∂
C
∂
w
L
=
∂
C
∂
a
L
∂
a
L
∂
z
L
∂
z
L
∂
w
L
\frac{\partial C}{\partial w^L}=\frac{\partial C}{\partial a^L}\frac{\partial a^L}{\partial z^L}\frac{\partial z^L}{\partial w^L}
∂wL∂C=∂aL∂C∂zL∂aL∂wL∂zL
其中:
∂
a
L
∂
z
L
=
σ
′
(
w
×
a
L
−
1
+
b
)
σ
′
(
x
)
=
σ
(
x
)
(
1
−
σ
′
(
x
)
)
\frac{\partial a^L}{\partial z^L}=\sigma'(w\times a^{L-1}+b)\\ \sigma'(x)=\sigma(x)(1-\sigma'(x))
∂zL∂aL=σ′(w×aL−1+b)σ′(x)=σ(x)(1−σ′(x))
σ
′
(
x
)
\sigma'(x)
σ′(x) 的值在
[
0
,
0.25
]
[0,0.25]
[0,0.25],而多个小于
0
0
0 的数连乘将会导致梯度消失,每个权重更新得都会很慢,有时导致训练不会有任何进展
假设单个神经元串成一条线,最后产生输出,当
b
1
b_1
b1发生变化时:
a
1
=
σ
(
z
1
)
=
σ
(
w
1
a
0
+
b
1
)
∂
a
1
∂
b
1
=
∂
σ
(
z
1
)
∂
b
1
Δ
a
1
≈
∂
σ
(
w
1
a
0
+
b
1
)
∂
b
1
Δ
b
1
=
σ
′
(
z
1
)
Δ
b
1
z
2
=
w
2
a
1
+
b
2
Δ
z
2
≈
∂
z
2
∂
a
1
Δ
a
1
=
w
2
Δ
a
1
=
w
2
σ
′
(
z
1
)
Δ
b
1
.
.
.
C
=
w
2
σ
′
(
z
1
)
w
3
σ
′
(
z
2
)
w
3
σ
′
(
z
4
)
.
.
.
∂
C
∂
a
Δ
b
1
∂
C
∂
b
1
=
w
2
σ
′
(
z
1
)
w
3
σ
′
(
z
2
)
w
3
σ
′
(
z
4
)
.
.
.
∂
C
∂
a
L
a_1=\sigma (z_1)=\sigma (w_1a_0+b_1)\\ \frac{\partial a_1}{\partial b_1}=\frac{\partial \sigma (z_1)}{\partial b_1}\\ \Delta a_1\approx \frac{\partial \sigma (w_1a_0+b_1)}{\partial b_1}\Delta b_1=\sigma'(z_1)\Delta b_1\\ z_2=w_2a_1+b_2\\ \Delta z_2\approx \frac{\partial z_2}{\partial a_1}\Delta a_1=w_2\Delta a_1=w_2\sigma'(z_1)\Delta b_1\\ ...\\ C=w_2\sigma'(z_1)w_3\sigma'(z_2)w_3\sigma'(z_4)...\frac{\partial C}{\partial a}\Delta b_1\\ \frac{\partial C}{\partial b_1}=w_2\sigma'(z_1)w_3\sigma'(z_2)w_3\sigma'(z_4)...\frac{\partial C}{\partial a_L}
a1=σ(z1)=σ(w1a0+b1)∂b1∂a1=∂b1∂σ(z1)Δa1≈∂b1∂σ(w1a0+b1)Δb1=σ′(z1)Δb1z2=w2a1+b2Δz2≈∂a1∂z2Δa1=w2Δa1=w2σ′(z1)Δb1...C=w2σ′(z1)w3σ′(z2)w3σ′(z4)...∂a∂CΔb1∂b1∂C=w2σ′(z1)w3σ′(z2)w3σ′(z4)...∂aL∂C
当
w
1
,
w
2
,
.
.
.
w
L
w_1,w_2,...w_L
w1,w2,...wL比较大的时候,连乘将导致梯度爆炸,网络将收敛不到合适的值,有时甚至超出计算机数值表示范围产生
i
n
f
inf
inf或者
n
a
n
nan
nan,同时使学习率的调整十分敏感,有一些方法可以缓解,比如梯度裁剪等
2.relu
r e l u ( x ) = m a x ( x , 0 ) relu(x)=max(x,0) relu(x)=max(x,0)
梯度要么是
0
0
0,要么是
1
1
1,如果某个梯度为
0
0
0:
∂
C
∂
b
1
=
w
2
σ
′
(
z
1
)
w
3
σ
′
(
z
2
)
w
3
σ
′
(
z
4
)
.
.
.
∂
C
∂
a
L
\frac{\partial C}{\partial b_1}=w_2\sigma'(z_1)w_3\sigma'(z_2)w_3\sigma'(z_4)...\frac{\partial C}{\partial a_L}
∂b1∂C=w2σ′(z1)w3σ′(z2)w3σ′(z4)...∂aL∂C
整个梯度将会是
0
0
0,此时
b
1
b_1
b1 将不会更新,称为
r
e
l
u
relu
relu 死亡,此时梯度将会比较稀疏,空间和时间方面将更有效率,因此使用
r
e
l
u
relu
relu 作为激活函数时:
- 能够避免梯度消失(最后梯度不是 0 0 0 就是 1 1 1,不会得到接近 0 0 0 的非 0 0 0 数),但不能避免梯度爆炸
- 引入了稀疏性
3.elu
e
l
u
elu
elu 修补了
r
e
l
u
relu
relu 的一些问题,而且保留了一些它好的性质:
e
l
u
(
x
)
=
{
x
if x>0
α
(
e
x
−
1
)
if x<0
elu(x)=\begin{cases} x &\text{if\ x>0}\\ \alpha(e^x-1)&\text{if\ x<0} \end{cases}
elu(x)={xα(ex−1)if x>0if x<0
大于
0
0
0 的部分和
r
e
l
u
relu
relu 一致,小于
0
0
0 的部分改动了,保留了避免梯度消失的性质:
e
l
u
′
(
x
)
=
{
1
if x>0
e
l
u
(
x
)
+
α
if x
≤
0
=
{
1
if x>0
α
e
x
if x
≤
0
elu'(x)=\begin{cases} 1 &\text{if\ x>0}\\ elu(x)+\alpha&\text{if\ x${\le}$ 0} \end{cases}\ =\ \begin{cases} 1 &\text{if\ x>0}\\ \alpha e^x&\text{if\ x${\le}$ 0} \end{cases}
elu′(x)={1elu(x)+αif x>0if x≤ 0 = {1αexif x>0if x≤ 0
使用
e
l
u
elu
elu 作为激活函数:
- 避免了死亡 r e l u relu relu 问题
- 能够产生负输出,输出均值接近 0 0 0,加速收敛
- 激活值更平滑,而不是很多 0 0 0
- 较 r e l u relu relu 计算复杂度更高且也不能避免梯度爆炸
- 引入参数 α \alpha α
4.leaky relu
l
e
a
k
y
r
e
l
u
leaky\ relu
leaky relu 相较
e
l
u
elu
elu 有一些缺陷,较
r
e
l
u
relu
relu 有一些优势:
l
r
e
l
u
(
x
)
=
{
x
if x>0
α
x
if
x
≤
0
l
r
e
l
u
′
(
x
)
=
{
1
if x>0
α
if
x
≤
0
lrelu(x)=\begin{cases} x &\text{if\ x>0}\\ \alpha x&\text{if\ $x\le0$} \end{cases}\\ lrelu'(x)=\begin{cases} 1 &\text{if\ x>0}\\ \alpha&\text{if\ $x\le0$} \end{cases}
lrelu(x)={xαxif x>0if x≤0lrelu′(x)={1αif x>0if x≤0
使用
l
e
a
k
y
r
e
l
u
leaky\ relu
leaky relu 作为激活函数:
- 避免了死亡 r e l u relu relu 问题,因为引入了一个小的梯度 α \alpha α 而不是截断为 0 0 0
- 相较 e l u elu elu 计算更快,但更加“线性”,而 e l u elu elu 由于有指数部分不那么"线性"
- 不能避免梯度爆炸,且也引入了参数 α \alpha α
5.数值稳定
为了让梯度在合理范围内可以采取一些方法:
- 将乘法变成加法,比如 R e s N e t , L S T M ResNet,LSTM ResNet,LSTM
- 归一化:梯度归一化,梯度裁剪
- 合理的权重初始(Xavier初始化)和激活函数选择
- 数值稳定性 + 模型初始化和激活函数【动手学深度学习v2】