激活函数
激活函数使输出的函数不再为线性,加入非线性因素,使得可以加入更多的网络层数,计算更多的函数。
唯一能使用线性激活函数的地方为机器学习的回归问题
下面介绍几种常用的激活函数:
一、sigmoid函数
σ
(
x
)
=
1
1
+
e
?
x
\sigma(x) = \frac{ 1}{1+ e^{-x}}
σ(x)=1+e?x1?
- 输出在0~1之间,常用在二元分类的输出层,其他一般不用。
- 在x=0处最大导数为0.25,会产生梯度消失现象。
二、tanh函数
t
a
n
h
(
x
)
=
e
x
?
e
?
x
e
x
+
e
?
x
tanh(x) = \frac{ e^{x}-e^{-x}}{e^{x}+ e^{-x}}
tanh(x)=ex+e?xex?e?x?
- 输出在-1~1之间,收敛速度比Sigmoid函数快
- 在x=0处最大导数为1
三、ReLU函数
f
(
x
)
=
m
a
x
(
0
,
x
)
f(x) = max(0,x)
f(x)=max(0,x)
- 不会有梯度消失问题加快了训练速度,但是在z<0处值为0.
- 由于梯度以指数方式在层中消失,导致网络较底层的训练速度非常慢。ReLU 对输入内容的所有值都应用了函数
f
(
x
)
=
m
a
x
(
0
,
x
)
f(x) = max(0, x)
f(x)=max(0,x)。用基本术语来说,这一层把所有的负激活(negative activation)都变为零。这一层会增加模型乃至整个神经网络的非线性特征,而且不会影响卷积层的感受野。
四、leaky ReLU函数(PRELU)
f
(
x
)
=
m
a
x
(
α
x
,
x
)
f(x)=max(αx,x)
f(x)=max(αx,x)
- 为了解决ReLu函数在z<0处值为0的情况,引入leaky ReLu函数,使在z<0处有值。
五、Swish函数
s
w
i
s
h
(
x
)
=
x
?
s
i
g
m
o
i
d
(
β
x
)
swish(x)=x·sigmoid(βx)
swish(x)=x?sigmoid(βx)
- Swish是Sigmoid和ReLU的改进版,类似于ReLU和Sigmoid的结合,β是个常数或可训练的参数。
- Swish 具备无上界有下界、平滑、非单调的特性。Swish 在深层模型上的效果优于 ReLU。
六、Mish函数
M
i
s
h
(
x
)
=
x
?
t
a
n
h
(
l
n
(
1
+
e
x
)
)
Mish(x)=x·tanh(ln(1+e^{x}))
Mish(x)=x?tanh(ln(1+ex))
- Mish与Swish激活函数类似,Mish具备无上界有下界、平滑、非单调的特性。Mish在深层模型上的效果优于 ReLU。
- 无上边界可以避免由于激活值过大而导致的函数饱和。
七、TensorFlow代码
在tensorflow中在建立模型时需要用到激活函数,其中activation为调用激活函数。
tf.keras.layers.Dense(128, activation='relu')
tf.keras.layers.Dense(10, activation='softmax')
model.add(Conv2D(kernel_size=(3, 3), strides=(1, 1), padding="same", filters=384,
activation='relu', kernel_initializer='he_normal'))
|