TensorFlow深度学习实战(3)——深度学习中常用激活函数详解
TensorFlow深度学习实战(3)——深度学习中常用激活函数详解
- 0. 前言
- 1. 引入激活函数
- 1.1 感知器
- 1.2 多层感知器
- 1.3 训练感知器存在的问题
- 2. 激活函数
- 3. 常见激活函数
- 3.1 sigmoid
- 3.2 tanh
- 3.3 ReLU
- 3.4 ELU和Leaky ReLU
- 小结
- 系列链接
0. 前言
使用激活函数可以实现网络的高度非线性,这对于建模输入和输出之间的复杂关系非常关键。如果没有非线性激活函数,那么该网络将仅仅能够表达简单的线性映射,即便有再多的隐藏层,其整个网络跟单层神经网络也是等价的,只有加入了非线性激活函数之后,深度神经网络才具备了令人惊异的非线性映射学习能力,可以在网络中的多个层中应用激活函数。
1. 引入激活函数
1.1 感知器
感知器 (Perceptron
) 是一种简单的算法,接收一个包含
m
m
m 个值的输入向量
x
x
x
(
x
1
,
x
2
,
.
.
.
,
x
m
)
(x_1, x2, ..., x_m)
(x1,x2,...,xm),通常称为输入特征或简称特征 (feature
),然后输出 1
(是)或 0
(否)。在数学上,可以定义为以下函数:
f
(
x
)
=
{
1
w
x
+
b
>
0
0
o
t
h
e
r
w
i
s
e
f(x)= \begin{cases} 1& {wx+b>0}\\ 0& {otherwise} \end{cases}
f(x)={10wx+b>0otherwise
其中
w
w
w 是权重向量,
w
x
wx
wx 是点积
∑
j
=
1
m
w
j
x
j
\sum_{j=1}^m w_jx_j
∑j=1mwjxj,
b
b
b 是偏置。
w
x
+
b
wx + b
wx+b 定义了一个边界超平面,其位置根据
w
w
w 和
b
b
b 的赋值而变化,超平面是一个子空间,其维度比其环境空间低一维:
这是一个非常简单但有效的算法,例如,给定三个输入特征,一种颜色中的红色、绿色和蓝色通道的分量值,感知机可以尝试判断该颜色是否为“白色”。
需要注意的是,感知器不能表达“可能”这种答案。它只能回答“是” (1
) 或“否” (0
),前提是我们知道如何定义权重 (
w
w
w) 和偏置 (
b
b
b),这就是模型“训练” (training
) 过程。
1.2 多层感知器
接下来,我们介绍一个包含多个全连接层的网络。历史上,感知器是指具有单个线性层的模型,因此,如果它有多个层,则称为多层感知器 (Multi-Layer Perceptron
, MLP
)。需要注意的是,输入层和输出层是外部可见的,而中间的所有其他层都是隐藏的——因此称为隐藏层。在这种情况下,单个层只是一个简单的线性函数,MLP
通过依次堆叠多个层而得到:
在上图中,第一隐藏层中的每个节点接收输入,并根据相关线性函数的值“激活”。然后,将第一隐藏层的输出传递到第二层,应用另一个线性函数,其结果再传递到由一个单一神经元组成的最终输出层。这种分层组织大致类似于人类视觉系统的组织。
1.3 训练感知器存在的问题
对于单个神经元,为了获得权重
w
w
w 和偏置
b
b
b 的最佳值,通常通过提供一组训练样本,让计算机调整权重和偏置,以最小化输出产生的误差。
为了更具体的说明,假设我们有一组猫的图像和一组不包含猫的图像。假设每个神经元接收来自图像中单个像素的输入。当计算机处理这些图像时,我们希望神经元调整其权重和偏置,以减少错误识别的图像数量。
这种方法非常直观,但需要权重(或偏置)的微小变化只引起输出的微小变化。如果输出变化很大,就无法逐步学习。但感知器并不具备这种“逐步”的行为,感知器要么是 0
,要么是 1
,这种巨大的输出变化不利于感知器学习:
我们需要更加平滑的函数,一个从 0
逐渐变化到 1
的函数,且没有任何不连续性。在数学上,这意味着我们需要一个连续函数,以便能够计算导数。在数学中,导数是函数在某一点变化的量。对于输入为实数的函数,导数是图形上某点的切线斜率。
2. 激活函数
在神经网络中,常见激活函数 (activation function
) 包括:Sigmoid
、Tanh
、ELU
、Leaky ReLU
和 ReLU
,TensorFlow
支持多种激活函数。Sigmoid
和 ReLU
函数的梯度变化是构建学习算法的基础,算法逐步减少网络误差。例如,使用激活函数
σ
σ
σ,输入向量
(
x
1
,
x
1
,
.
.
.
,
x
m
)
(x_1, x_1, ..., x_m)
(x1,x1,...,xm),权重向量
(
w
1
,
w
2
,
.
.
.
,
w
3
)
(w_1, w_2, ..., w_3)
(w1,w2,...,w3),偏置
b
b
b,求和
Σ
Σ
Σ 如下图所示:
3. 常见激活函数
3.1 sigmoid
Sigmoid
函数定义为
σ
(
x
)
=
1
1
+
e
−
x
\sigma(x)=\frac 1{1+e^{-x}}
σ(x)=1+e−x1,当输入在
(
−
∞
,
∞
)
(−∞, ∞)
(−∞,∞) 范围内变化时,输出在
(
0
,
1
)
(0, 1)
(0,1) 范围内变化,并且在数学上是连续的。使用 Python
实现此函数:
def sigmoid(x):
return 1/(1+np.exp(-x))
函数图像如下所示:
神经元可以使用 Sigmoid
函数计算非线性函数
σ
(
z
=
w
x
+
b
)
\sigma(z=wx+b)
σ(z=wx+b)。如果
z
=
w
x
+
b
z = wx + b
z=wx+b 非常大且为正数,则
e
−
z
→
0
e^{-z}→0
e−z→0,因此
σ
(
z
)
→
1
\sigma(z)→1
σ(z)→1;而如果
z
=
w
x
+
b
z = wx + b
z=wx+b 非常大且为负数,则
e
−
z
→
∞
e^{-z}→∞
e−z→∞,因此
σ
(
z
)
→
0
\sigma(z)→0
σ(z)→0。换句话说,具有 Sigmoid
激活的神经元与感知器的行为类似,但变化是逐渐的,输出值如 0.5539
或 0.123191
是完全合理的。在这个意义上,Sigmoid
神经元可以表达“可能性”的概念。
3.2 tanh
激活函数 tanh
定义为
t
a
n
h
(
z
)
=
(
e
z
−
e
−
z
)
(
e
z
+
e
−
z
)
tanh(z) = \frac{(e^z - e^-z)}{(e^z + e^-z)}
tanh(z)=(ez+e−z)(ez−e−z),使用 Python
实现此函数:
def tanh(x):
return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))
函数图像如下所示,它在开区间 (-1, 1)
内是单调递增的奇函数,函数图形关于原点对称:
3.3 ReLU
ReLU
(REctified Linear Unit
) 激活函数有助于解决使用 Sigmoid
时的一些优化问题,特别是梯度消失的问题。ReLU
定义为
f
(
x
)
=
m
a
x
(
0
,
x
)
f(x) = max(0, x)
f(x)=max(0,x),使用 Python
实现此函数:
def relu(x):
return np.where(x>0, x, 0)
函数图像如下所示,当输入值 大于等于 0
时,则 ReLU
函数按原样输出。如果输入小于 0
,则 ReLU
函数值为 0
。因为 ReLU
函数的大于等于 0
的线性分量具有固定导数,而对另一个线性分量导数为 0
。因此,使用 ReLU
函数训练模型要快得多。
3.4 ELU和Leaky ReLU
ELU
(Exponential Linear Unit
) 定义为:
f
(
a
,
x
)
=
{
a
(
e
x
−
1
)
x
≤
0
x
x
>
0
f(a,x)= \begin{cases} a(e^x-1)& {x≤0}\\ x& {x>0} \end{cases}
f(a,x)={a(ex−1)xx≤0x>0
其中
a
>
0
a>0
a>0,使用 Python
实现此函数:
def elu(x, alpha=1.0):
return x if x >= 0 else alpha * (math.exp(x) - 1)
函数图像如下所示:
LeakyReLU
定义为:
f
(
a
,
x
)
=
{
a
x
x
≤
0
x
x
>
0
f(a,x)= \begin{cases} ax& {x≤0}\\ x& {x>0} \end{cases}
f(a,x)={axxx≤0x>0
其中
a
>
0
a>0
a>0,使用 Python
实现此函数:
def leaky_relu(x, alpha=0.1):
return np.maximum(alpha * x, x)
函数图像如下所示:
两个函数在 x x x 为负时能够进行小幅的更新。
小结
激活函数是神经网络中至关重要的一部分,它决定了神经元的输出以及神经网络模型的非线性特性。没有激活函数,神经网络就会变成一个简单的线性模型,无法处理复杂的任务。因此,激活函数的选择直接影响神经网络的表达能力和学习效果。
系列链接
TensorFlow深度学习实战(1)——神经网络与模型训练过程详解
TensorFlow深度学习实战(2)——使用TensorFlow构建神经网络
TensorFlow深度学习实战(4)——正则化技术详解