赞
踩
激活函数决定输入信号是否或多大程度上应该通过节点(或神经元)传递到下一层。众所周知,神经网络的运算是线性的,引入非线性的激活函数,可以提高神经网络的拟合能力。下面讲解释一些常见的激活函数。
数学表达式:
σ
(
x
)
=
1
1
+
e
x
p
(
−
x
)
\sigma(x)=\frac{1}{1+exp(-x)}
σ(x)=1+exp(−x)1
函数图像:
Sigmoid函数将输入数据转化到 0~1 之间的输出。具体而言,当输入为负数时,输入越小,输出越接近0;当输入为正数时,输入越大,输出越接近1;
缺点:(1)造成梯度消失,靠近1和0两端时,梯度几乎为0,无法更新参数;
(2)输出不是以0为均值,导致下一层输入为非0均值,影响更新参数。
数学表达式:
t
a
n
h
(
x
)
=
2
1
+
e
x
p
(
−
2
x
)
−
1
=
2
⋅
σ
(
2
x
)
−
1
tanh(x)=\frac{2}{1+exp(-2x)}-1 = 2\cdot\sigma(2x)-1
tanh(x)=1+exp(−2x)2−1=2⋅σ(2x)−1
函数图像:
tanh函数是Sigmoid函数的变形,将输入数据转化到 -1~1 之间,具体的输入与输出趋势可以从图像中观察。总之,这两个激活函数,面临着相同的饱和问题,即当输入是非常大的正数或者非常小的负数的时候,它们的梯度都无限趋近于0,只有当输入在0附近时,两个激活函数才比较敏感,这极大影响了梯度训练方法的实用性。也正是由于这个原因,使得Sigmoid和tanh函数在激活函数中的受欢迎程度越来越低。
缺点:解决了Sigmoid函数的第二个问题,即输出不以0为均值,但仍然存在梯度消失问题。
整流函数(Rectifier Function)类似于线性函数,唯一的区别是当输入是负数时,其输出为0。在神经网络中,采用这种激活函数的单元被称为整流线性单元(Rectifier Linear Unit )
数学表达式:
R
e
L
U
(
x
)
=
m
a
x
{
0
,
x
}
ReLU(x)=max\{ 0,x\}
ReLU(x)=max{0,x}
函数图像:
当输入是正值时,整流函数的输出和输入是相等的,当时输入是负值时,函数的输出为0。在神经网络的每一层中,一般只有少数节点被激活,这确保了计算的高效性。
优点:(1)相比于sigmoid 和 tanh 函数而言,加速梯度下降的收敛速度,不存在梯度消失的问题 ;
(2)计算方法更加简单,只需一个阈值过滤就可得到结果。
缺点:
训练时“脆弱”,函数本质上是不可逆的,直接去掉输入小于0的部分,会使梯度为 0 ,导致参数无法更新。但是可以通过设置较小的学习率来避免这个小问题,因此,ReLU函数也成为神经网络结构普遍常用的函数。
数学表达式:
L
e
a
k
y
R
e
L
U
(
x
)
=
{
α
x
x
<
0
x
x
≥
0
LeakyReLU(x) =\begin {cases} \alpha \ x &\text {$x<0$} \\ x&\text {$x\geq0$} \end{cases}
LeakyReLU(x)={α xxx<0x≥0
函数图像:
LeakyReLU是ReLU函数的变体,当输入为负值时,该单元会对输入进行一个小幅度的现象变换。
优点:修复了ReLU函数训练“脆弱”的缺点,不将
x
<
0
x<0
x<0部分变为0,而是变得很小。
注意:这里并不是说,LeakyReLU
≫
\gg
≫ ReLU,只是说,LeakyReLU函数在训练过程中,不会显得那么“脆弱”,具体在神经网络的搭建中,选取激活函数,还是要根据特定的任务来选择。
数学表达式:
E
L
U
(
x
)
=
{
c
(
e
x
p
(
x
)
−
1
)
x
<
0
x
x
≥
0
ELU(x) =\begin {cases} c\ (exp(x) - 1) &\text {$x<0$} \\ x&\text {$x\geq0$} \end{cases}
ELU(x)={c (exp(x)−1)xx<0x≥0
其中,
c
∈
(
0
,
1
)
c\in(0,1)
c∈(0,1) 表示一个正值的常数,决定了当输入为负数时,对应指数函数的斜率。
函数图像:
优点:通过减少偏置偏移的影响,使得训练梯度更接近于单位自然梯度,从而使均值向0加速学习。
缺点:含有幂运算,会使得计算成本增加。
这里再补充一个maxout函数,这个函数其实很好理解,先看表达式
数学表达式:
M
a
x
o
u
t
(
x
)
=
m
a
x
{
w
1
x
+
b
1
,
w
2
x
+
b
2
}
Maxout(x)=max\{ w_{1}x+b_{1},w_{2}x+b_{2}\}
Maxout(x)=max{w1x+b1,w2x+b2}
可以发现,当
w
1
,
b
1
=
0
w_{1},b_{1} = 0
w1,b1=0的时候,就是ReLU函数。
优点方面和ReLU函数是一样的,作为一个“部分”线性函数,解决了梯度消失问题,但是也存在最致命的缺点就是,相比于ReLU函数训练模型的参数加倍,导致模型的存储变大。
一般在同一网络中,我们都使用同一类型的激活函数。当然,通俗来讲,是一个模型一般使用一个激活函数,具体到VAE,
AAE, GANs这样会存在两个模型结合的情况,就会存在两个不一样的激活函数了。
但是大家都知道的,任何的激活函数使用都是需要根据自己构建模型的任务需求来的,所以具体问题具体分析了。
#函数可视化的代码也附一下 import numpy as np import matplotlib.pyplot as plt import math plt.rc('font',family='Times New Roman', size=15) def sigmoid(x): return 1 / (1 + np.exp(-x)) def tanh(x): result = (math.e ** (x) - math.e ** (-x)) / (math.e ** (x) + math.e ** (-x)) return result def relu(x): return np.where(x < 0, 0, x) def leaky_relu(x): a = x[x > 0] b = 0.1 * x[x < 0] result = np.concatenate((b, a), axis=0) return result def elu(x, alpha=1): a = x[x > 0] b = alpha * (math.e ** (x[x < 0]) - 1) result = np.concatenate((b, a), axis=0) return result # 举例sigmoid函数,其他的使用matplotlib可视化就行 x = np.arange(-10, 10, 0.1) #y = sigmoid(x) fig = plt.figure() ax = fig.add_subplot(111) ax.spines['top'].set_color('none') ax.spines['right'].set_color('none') ax.spines['left'].set_position(('data', 0)) ax.plot(x, y,color="black", lw=1.5) plt.xticks(fontsize=15) plt.yticks(fontsize=15) plt.xlim([-10.05, 10.05]) plt.ylim([-0.02, 1.02]) plt.text(-9, 0.6, '—Sigmoid Function',) plt.tight_layout() plt.show()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。