2.深度学习入门:感知机、神经网络和激活函数——探索人工智能的核心技术
神经网络
从感知机到神经网络
- 感知机和神经网络都是人工神经网络的一种形式,但是神经网络比感知机更加灵活和复杂。
- 感知机是一种最简单的神经网络,它只有一个输入层和一个输出层,没有隐藏层。它的输入是一些数字或二元值,输出是一个二元值。感知机可以用来解决二元分类问题,例如将数字图像分类为数字0或数字1。
- 神经网络则是由多个神经元组成的复杂网络,它包含
输入层
、隐藏层
和输出层
。每个神经元都有多个输入和一个输出,它们通过权重连接在一起,可以对输入数据进行处理和学习。神经网络可以用来解决各种各样的问题,例如图像识别
、自然语言处理
、语音识别
等等。 - 总的来说,感知机是神经网络的一个特例,而神经网络则是一种更加复杂和灵活的模型,可以处理更加复杂的问题。
神经网络的例子
神经网络是一种模拟人类神经系统的计算模型,它由大量的人工神经元相互连接而成。以下是一些常见的神经网络的例子:
前馈神经网络(Feedforward Neural Network,FNN)
:最简单的神经网络,信息只能从输入层到输出层单向传递。
循环神经网络(Recurrent Neural Network,RNN)
:信息可以在网络内部循环传递,适用于序列数据的处理。
卷积神经网络(Convolutional Neural Network,CNN)
:主要用于图像和视频处理,通过卷积操作提取图像的特征。
深度信念网络(Deep Belief Network,DBN)
:由多个受限玻尔兹曼机组成的深度神经网络,适用于无监督学习。
自编码器(Autoencoder,AE)
:一种无监督学习的神经网络,可以用于数据压缩和特征提取。
复习感知机
- 感知机是一种二分类的线性分类模型,它的输入是一个向量,输出是一个标量。
- 感知机的学习规则是基于误分类的梯度下降法,其目的是使误分类点到分类超平面的距离最小化。感知机的模型可以表示为: f ( x ) = s i g n ( w ⋅ x + b ) f(x) = sign(w\cdot x + b) f(x)=sign(w⋅x+b),其中 w w w 是权重向量, b b b 是偏置。
- 感知机的学习算法可以分为原始形式和对偶形式。原始形式的学习算法是通过不断地更新权重和偏置来最小化误分类点到分类超平面的距离,直到所有的样本都被正确分类。对偶形式的学习算法则是先将输入样本转换为对偶形式,然后通过不断地更新对偶权重来最小化误分类点到分类超平面的距离。
感知机的优点是模型简单,易于理解和实现。但是感知机只能处理线性可分的问题,对于非线性可分的问题需要使用更复杂的模型,如神经网络。
激活函数登场
激活函数是神经网络中的一个重要组成部分,它的作用是为神经元引入非线性因素,从而使神经网络具有更强的表达能力。以下是常见的激活函数:
sigmoid函数
: f ( x ) = 1 1 + e − x f(x) = \frac{1}{1+e^{-x}} f(x)=1+e−x1,将输入映射到0到1之间,常用于输出层或者二分类问题。tanh函数
: f ( x ) = e x − e − x e x + e − x f(x) = \frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} f(x)=ex+e−xex−e−x,将输入映射到-1到1之间,常用于隐藏层。ReLU函数
: f ( x ) = max ( 0 , x ) f(x) = \max(0, x) f(x)=max(0,x),当输入为正数时输出等于输入,否则输出0,常用于隐藏层。
4.Leaky ReLU函数
: f ( x ) = max ( α x , x ) f(x) = \max(\alpha x, x) f(x)=max(αx,x),当输入为正数时输出等于输入,否则输出一个小于0的值,常用于解决ReLU函数的死亡问题。softmax函数
: f ( x i ) = e x i ∑ j = 1 n e x j f(x_i) = \frac{e^{x_i}}{\sum_{j=1}^{n}e^{x_j}} f(xi)=∑j=1nexjexi,将输入映射到0到1之间,并且所有输出的和为1,常用于多分类问题。
不同的激活函数在不同的场景下有不同的表现,选择合适的激活函数可以提高神经网络的性能。
激活函数
sigmoid函数
- sigmoid函数是一种常用的激活函数,它的公式为: f ( x ) = 1 1 + e − x f(x) = \frac{1}{1+e^{-x}} f(x)=1+e−x1。sigmoid函数的输出值在0到1之间,输入越大,输出越接近1;输入越小,输出越接近0。sigmoid函数的导数可以表示为: f ′ ( x ) = f ( x ) ( 1 − f ( x ) ) f'(x) = f(x)(1-f(x)) f′(x)=f(x)(1−f(x)),其形状为S型曲线,常用于二分类问题或输出层的激活函数。
- sigmoid函数的优点是输出值在0到1之间,可以表示概率的概念,因此在二分类问题中比较常用。但是sigmoid函数也有一些缺点,如容易出现梯度消失的问题,导致训练过程变得困难。同时sigmoid函数的输出不是以0为中心的,可能导致后续层的输入出现偏移,影响网络的表达能力。因此在实际应用中,sigmoid函数已经被更优秀的激活函数所替代,如ReLU函数、Leaky ReLU函数等。
阶跃函数的实现
阶跃函数是一种最简单的激活函数,它的输出值只有两个:0和1。当输入大于等于0时,阶跃函数的输出为1;当输入小于0时,阶跃函数的输出为0。阶跃函数可以用以下Python代码实现:
def step_function(x):
if x >= 0:
return 1
else:
return 0
上述代码中,step_function函数接受一个输入x,如果x大于等于0,则返回1,否则返回0。这种实现方式只能处理单个输入,无法处理向量或矩阵形式的输入。如果要处理向量或矩阵形式的输入,可以使用NumPy库来实现:
import numpy as np
def step_function(x):
y = x > 0
return y.astype(np.int)
上述代码中,step_function函数接受一个向量或矩阵形式的输入x,将其与0进行比较,生成一个布尔型的数组y,然后将y转换为整型数组,即可得到阶跃函数的输出。
sigmoid函数的实现
sigmoid函数的公式为:
f
(
x
)
=
1
1
+
e
−
x
f(x) = \frac{1}{1+e^{-x}}
f(x)=1+e−x1,
可以用以下Python代码实现:
import numpy as np
def sigmoid(x):
return 1 / ( 1 + np.exp(-x) )
上述代码中,sigmoid函数接受一个输入x,将其作为指数运算的底数,计算出 e − x e^{-x} e−x的值,然后将其加1并取倒数,即可得到sigmoid函数的输出。
如果要处理向量或矩阵形式的输入,可以使用NumPy库来实现:
import numpy as np
def sigmoid(x):
return 1 / ( 1 + np.exp(-x) )
- 上述代码中,sigmoid函数接受一个向量或矩阵形式的输入x,将其作为指数运算的底数,计算出 e − x e^{-x} e−x的值,然后将其加1并取倒数,即可得到sigmoid函数的输出。
- 需要注意的是,当输入的值比较大或比较小时,sigmoid函数的导数会趋近于0,这会导致反向传播算法中的梯度消失问题。因此,在实际应用中,ReLU等激活函数已经被更广泛地使用。
sigmoid函数和阶跃函数的比较
sigmoid函数和阶跃函数都是常用的激活函数,但它们有以下几点不同:
- 输出值范围不同:阶跃函数的输出值只有0和1两种,而sigmoid函数的输出值在0到1之间。
- 连续性不同:阶跃函数在输入为0时发生突变,不连续;而sigmoid函数在整个输入范围内都是连续的。
- 平滑性不同:sigmoid函数的平滑性比阶跃函数更好,因为它的导数在整个输入范围内都存在,而阶跃函数的导数只在输入为0时存在。
- 反向传播效果不同:在神经网络的反向传播算法中,sigmoid函数的梯度比阶跃函数的梯度更容易计算,因为它是可导的。
sigmoid函数比阶跃函数更加灵活和实用,因为它可以产生平滑的输出,并且在反向传播算法中更容易计算梯度。但是,在某些情况下,阶跃函数也是有用的,例如在二元分类问题中,可以将阶跃函数作为输出层的激活函数,将输出值限制在0和1之间。
非线性函数
非线性函数是指函数图像不是一条直线的函数,即函数的斜率不是恒定的。在机器学习和深度学习中,非线性函数常用作激活函数,用于神经网络中的非线性变换,从而使神经网络可以学习更加复杂的模式和特征。
常见的非线性函数包括:
Sigmoid函数
:
f
(
x
)
=
1
1
+
e
−
x
f(x) = \frac{1}{1+e^{-x}}
f(x)=1+e−x1
ReLU函数
:
f
(
x
)
=
m
a
x
(
0
,
x
)
f(x) = max(0,x)
f(x)=max(0,x)
Tanh函数
:
f
(
x
)
=
e
x
−
e
−
x
e
x
+
e
−
x
f(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}
f(x)=ex+e−xex−e−x
Softmax函数:
f
(
x
i
)
=
e
x
i
∑
j
=
1
n
e
x
j
f(x_i) = \frac{e^{x_i}}{\sum_{j=1}^n e^{x_j}}
f(xi)=∑j=1nexjexi
这些非线性函数在神经网络中都有广泛的应用,例如Sigmoid函数和Tanh函数常用作激活函数,ReLU函数常用作卷积神经网络中的激活函数,Softmax函数常用于多分类问题中的输出层激活函数。
ReLU函数
ReLU函数是一种常用的非线性激活函数,其公式为:
f
(
x
)
=
m
a
x
(
0
,
x
)
f(x) = max(0,x)
f(x)=max(0,x)。即当输入
x
x
x大于0时,输出
f
(
x
)
=
x
f(x)=x
f(x)=x,否则输出
f
(
x
)
=
0
f(x)=0
f(x)=0。ReLU函数的优点在于它可以使神经网络更加稀疏,减少参数的数量,从而降低过拟合的风险,同时也可以加速神经网络的训练过程。
ReLU函数的导数为:
f
′
(
x
)
=
{
1
,
if
x
>
0
0
,
otherwise
f'(x) = \begin{cases} 1, & \text{if } x > 0 \ 0, & \text{otherwise} \end{cases}
f′(x)={1,if x>0 0,otherwise
- 这意味着当输入 x x x大于0时,ReLU函数的导数为1,可以保留梯度信息,而当输入 x x x小于等于0时,ReLU函数的导数为0,可以使反向传播算法中的梯度消失,从而加速训练过程。
需要注意的是,ReLU函数在输入为负数时,输出为0,存在“死亡神经元”的问题。为了解决这个问题,可以使用LeakyReLU函数或者ParametricReLU函数等变种,使得输入为负数时也有一定的输出,从而避免“死亡神经元”的问题。