1.为什么需要激活函数
神经网络用于实现复杂的函数,非线性激活函数可以使神经网络随意逼近复杂函数。没有激活函数带来的非线性,多层神经网络和单层无异。
2. sigmoid
将实数值压缩进 0 到 1 的区间内,还可以在预测概率的输出层中使用。该函数将大的负数转换成 0,将大的正数转换成 1。
σ
(
x
)
=
1
1
+
e
−
x
\sigma(x)=\frac{1}{1+e^{-x}}
σ(x)=1+e−x1
下图展示了 Sigmoid 函数及其导数:
Sigmoid 函数的三个主要缺陷:
(1) 梯度消失:注意:Sigmoid 函数趋近 0 和 1 的时候变化率会变得平坦,也就是说,Sigmoid 的梯度趋近于 0。神经网络使用 Sigmoid 激活函数进行反向传播时,输出接近 0 或 1 的神经元其梯度趋近于 0。这些神经元叫作饱和神经元。因此,这些神经元的权重不会更新。此外,与此类神经元相连的神经元的权重也更新得很慢。该问题叫作梯度消失。因此,想象一下,如果一个大型神经网络包含 Sigmoid 神经元,而其中很多个都处于饱和状态,那么该网络无法执行反向传播。
(2)不以零为中心:Sigmoid 输出不以零为中心的,这会导致神经网络收敛较慢reference
(3) 计算成本高昂:exp() 函数与其他非线性激活函数相比,计算成本高昂。
补充: 为什么sigmoid不以零为中心,会导致网络收敛变慢
梯度反向传播参数更新
梯度更新的方向
以零为中心的影响
3. tanh
tanh
(
x
)
=
2
σ
(
2
x
)
−
1
=
e
x
−
e
−
x
e
x
+
e
−
x
\tanh (x)=2 \sigma(2 x)-1=\frac{\mathrm{e}^{x}-\mathrm{e}^{-x}}{\mathrm{e}^{x}+\mathrm{e}^{-x}}
tanh(x)=2σ(2x)−1=ex+e−xex−e−x
tanh
′
(
x
)
=
1
−
tanh
2
(
x
)
\tanh ^{\prime}(x)=1-\tanh ^{2}(x)
tanh′(x)=1−tanh2(x)
Tanh 激活函数又叫作双曲正切激活函数。Tanh 函数将值压缩至-1 到 1 的区间内。与 Sigmoid 不同,Tanh 函数的输出以零为中心,因为区间在-1 到 1 之间。在实践中,Tanh 函数的使用优先性高于 Sigmoid 函数。负数输入被当作负值,零输入值的映射接近零,正数输入被当作正值。
缺点
Tanh 函数也会有梯度消失的问题,因此在饱和时也会「杀死」梯度
4. 修正线性单元(ReLU)
从上图可以看到,ReLU 是从底部开始半修正的一种函数。数学公式为:
f
(
x
)
=
m
a
x
(
0
,
x
)
f(x)=max(0, x)
f(x)=max(0,x)
当输入 x<0 时,输出为 0,当 x> 0 时,输出为 x。
优点:
该激活函数使网络更快速地收敛。它不会饱和,即它可以对抗梯度消失问题,至少在正区域(x> 0 时)可以这样,因此神经元至少在一半区域中不会把所有零进行反向传播。由于使用了简单的阈值化(thresholding),ReLU 计算效率很高。
缺点:
(1) 不以零为中心:和 Sigmoid 激活函数类似,ReLU 函数的输出不以零为中心。
(2) 前向传导(forward pass)过程中,如果 x < 0,则神经元保持非激活状态,且在后向传导(backward pass)中「杀死」梯度。这样权重无法得到更新,网络无法学习。当 x = 0 时,该点的梯度未定义,但是这个问题在实现中得到了解决,通过采用左侧或右侧的梯度的方式
为了解决 ReLU 激活函数中的梯度消失问题,当 x < 0 时,我们使用 Leaky ReLU——该函数试图修复 dead ReLU 问题。
5. Leaky ReLU
f
(
x
)
=
m
a
x
(
0.1
x
,
x
)
f(x)=max(0.1x, x)
f(x)=max(0.1x,x)
当 x < 0 时,它得到 0.1 的正梯度。该函数一定程度上缓解了 dead ReLU 问题,但是使用该函数的结果并不连贯。尽管它具备 ReLU 激活函数的所有特征,如计算高效、快速收敛、在正区域内不会饱和。
6. Parametric ReLU
Leaky ReLU 可以得到更多扩展。不让 x 乘常数项,而是让 x 乘超参数,这看起来比 Leaky ReLU 效果要好。该扩展就是 Parametric ReLU。
f
(
x
)
=
m
a
x
(
α
x
,
x
)
f(x)=max(\alpha x, x)
f(x)=max(αx,x)
其中是超参数。这里引入了一个随机的超参数,它可以被学习,因为你可以对它进行反向传播。这使神经元能够选择负区域最好的梯度,有了这种能力,它们可以变成 ReLU 或 Leaky ReLU。
7. Swish
该函数又叫作自门控激活函数
σ
(
x
)
=
x
1
+
e
−
x
\sigma(x)=\frac{x}{1+e^{-x}}
σ(x)=1+e−xx
我们可以观察到在 x 轴的负区域曲线的形状与 ReLU 激活函数不同,因此,Swish 激活函数的输出可能下降,即使在输入值增大的情况下。大多数激活函数是单调的,即输入值增大的情况下,输出值不可能下降。而 Swish 函数为 0 时具备单侧有界(one-sided boundedness)的特性,它是平滑、非单调的。
8. GELU
在神经网络的建模过程中,模型很重要的性质就是非线性,同时为了模型泛化能力,需要加入随机正则,例如dropout(随机置一些输出为0,其实也是一种变相的随机非线性激活), 而随机正则与非线性激活是分开的两个事情, 而其实模型的输入是由非线性激活与随机正则两者共同决定的。
GELUs正是在激活中引入了随机正则的思想,是一种对神经元输入的概率描述,直观上更符合自然的认识,同时实验效果要比Relus与ELUs都要好。
GELUs其实是 dropout、zoneout、Relus的综合,GELUs对于输入乘以一个0,1组成的mask,而该mask的生成则是依概率随机的依赖于输入。假设输入为X, mask为m,则m服从一个伯努利分布(
ϕ
(
x
)
=
P
(
X
≤
x
)
,
X
\phi(x)=P(X \leq x), X
ϕ(x)=P(X≤x),X服从标准正态分布)这么选择是因为神经元的输入趋向于正太分布,这么设定使得当输入x减小的时候,输入会有一个更高的概率被dropout掉,这样的激活变换就会随机依赖于输入了。
G
E
L
U
(
X
)
=
x
P
(
X
≤
x
)
=
x
ϕ
(
x
)
GELU(X)=xP(X \leq x)=x\phi(x)
GELU(X)=xP(X≤x)=xϕ(x)
这里
ϕ
(
x
)
\phi(x)
ϕ(x)是正太分布的概率分布函数,
ϕ
(
x
)
=
∫
−
∞
x
e
−
t
2
/
2
2
π
d
t
=
1
2
[
1
+
erf
(
x
2
)
]
\phi(x)=\int_{-\infty}^{x} \frac{e^{-t^{2} / 2}}{\sqrt{2 \pi}} d t=\frac{1}{2}\left[1+\operatorname{erf}\left(\frac{x}{\sqrt{2}}\right)\right]
ϕ(x)=∫−∞x2πe−t2/2dt=21[1+erf(2x)],其中
erf
(
x
)
=
2
π
∫
0
x
e
−
t
2
d
t
\operatorname{erf}(x)=\frac{2}{\sqrt{\pi}} \int_{0}^{x} e^{-t^{2}} d t
erf(x)=π2∫0xe−t2dt
ϕ ( x ) \phi(x) ϕ(x)与 x x x成正比,且取值范围为 [ 0 , 1 ] [0, 1] [0,1],当 x x x越小,越有可能激活结果为0,即此时神经元被dropout,而当 x x x越大越有可能被保留
对于假设为标准正太分布的
G
E
L
U
(
x
)
GELU(x)
GELU(x) 论文中提供了近似计算的数学公式,如下:
G
E
L
U
(
x
)
=
0.5
x
(
1
+
t
a
n
h
(
2
/
π
(
x
+
0.044715
x
3
)
)
)
GELU(x)=0.5x(1+tanh(\sqrt{2/\pi}(x+0.044715x^3)))
GELU(x)=0.5x(1+tanh(2/π(x+0.044715x3)))
GELU激活函数示意图如下: