1 神经元模型
1943 年,美国神经生理学家沃伦·麦卡洛克( Warren McCulloch ) 和数学家沃尔特 ·皮茨(Walter Pitts )对生物神经元进行建模,首次提出了一种形式神经元模型,并命名为McCulloch-Pitts模型,即后来广为人知的M-P模型。
在M-P模型中,神经元可以接受多个其他神经元的输出作为输入
x
=
{
x
1
,
x
2
,
…
,
x
n
}
x=\{x_1,x_2,\dots,x_n\}
x={x1,x2,…,xn},对这些信号进行加权求和,即
∑
i
w
i
x
i
\sum_iw_ix_i
∑iwixi,将获得的结果与阈值
θ
\theta
θ相比,然后经过激活函数的非线性处理,获得最终的输出:
y
=
f
(
∑
i
w
i
x
i
−
θ
)
y=f(\sum_iw_ix_i-\theta)
y=f(i∑wixi−θ)M-P 模型可以表示多种逻辑运算,如取反运算、逻辑或、逻辑与:
- 取反运算:神经元只有一个单元,当输入为1时,输出为0;当输入为0时,输出为1。因此神经元的权值和阈值分别为: w = − 2 , θ = − 1 w=-2,\theta=-1 w=−2,θ=−1。最终的计算公式为: y = f ( − 2 x + 1 ) y=f(-2x+1) y=f(−2x+1)
- 逻辑或:神经元可以有多个输入,以两个输入为例。只有当两个输入均为0时,输出才为0,否则输出为1。因此神经元的权值和阈值为: w 1 = 1 , w 2 = 1 , θ = 1 w_1=1,w_2=1,\theta=1 w1=1,w2=1,θ=1,则最终公式为 y = f ( x 1 + x 2 − 1 ) y=f(x_1+x_2-1) y=f(x1+x2−1)
- 逻辑与:只有当两个输入为1时,输出为1,否则输出为0。因此神经元的权值和阈值为: w 1 = 1 , w 2 = 1 , θ = 1.5 w_1=1,w_2=1,\theta=1.5 w1=1,w2=1,θ=1.5,则最终公式为: y = f ( x 1 + x 2 − 1.5 ) y=f(x_1+x_2-1.5) y=f(x1+x2−1.5)
由神经元构成的人工神经网络模型的结构可表示如下:
M-P模型的需要人为先确定每个神经元的权值才能进行网络的计算。
2 感知器模型
2.1 单层感知器
与M-P模型需要人为确定权值参数不同的是,1958年罗森布拉特提出的感知器不需要人为确定参数,可以通过训练自动确定参数。训练方式为有监督学习,然后根据实际输出与期望输出之差对参数进行修正,即误差修正学习:
y
^
=
f
(
w
x
−
θ
)
w
i
←
w
i
+
α
(
y
−
y
^
)
x
θ
←
θ
−
α
(
y
−
y
^
)
\hat{y}=f(wx-\theta) \\ w_i \leftarrow w_i+\alpha (y-\hat{y})x \\ \theta \leftarrow \theta-\alpha (y-\hat{y})
y^=f(wx−θ)wi←wi+α(y−y^)xθ←θ−α(y−y^)其中
α
\alpha
α为学习率,
y
y
y和
y
^
\hat{y}
y^分别为期望输出和实际输出,
f
(
⋅
)
为
激
活
函
数
f(\cdot)为激活函数
f(⋅)为激活函数。
- 当实际输出
y
^
=
0
\hat{y}=0
y^=0,期望输出
y
=
1
y=1
y=1时(未激活)
- 减小 θ \theta θ
- 增大 x i = 1 x_i=1 xi=1的链接权重 w i w_i wi
- x i = 0 x_i=0 xi=0的链接权重不变
- 当实际输出
y
^
=
1
\hat{y}=1
y^=1,期望输出
y
=
0
y=0
y=0时(激活过度)
- 增大 θ \theta θ
- 减小 x i = 1 x_i=1 xi=1的链接权重 w i w_i wi
- x i = 0 x_i=0 xi=0的链接权重不变
感知器模型的训练过程如下:
训练准备
- 准备训练样本 x = { x 1 , x 2 , … , x n } x=\{x_1,x_2,\dots,x_n\} x={x1,x2,…,xn}和对应标签 y = { y 1 , y 2 , … , y n } y=\{ y_1, y_2, \dots ,y_n\} y={y1,y2,…,yn},
- 初始化参数 w i w_i wi和 θ \theta θ
迭代训练学习,不断调整参数,直到误差为0或者小于某个指定的数值
- 逐个喂入训练样本,计算实际输出 y ^ \hat{y} y^;
- 计算实际输出与期望输出之间的误差 y − y ^ y-\hat{y} y−y^;
- 实际输出和期望输出相等时,保持参数不变,返回第1步;
- 实际输出与期望输出不同时 w i ← w i + α ( y − y ^ ) x θ ← θ − α ( y − y ^ ) w_i\leftarrow w_i+\alpha (y-\hat{y})x \\ \theta \leftarrow \theta-\alpha (y-\hat{y}) wi←wi+α(y−y^)xθ←θ−α(y−y^)
- 返回第1步,重复上述步骤
2.2 多层感知器
可以发现,单层感知器模型只有单层的输入和输出,只能进行线性处理,不能解决线性不可分问题,为了处理非线性可分问题,我们需要利用多层感知器模型进行非线性运算。仅仅使用神经元进行不同层的组合依然是线性组合,对每层用激活函数进行非线性变换后再连接,才能获得非线性链接。
多层感知器模型指由多层结构的感知器递阶组成的输入值向前传播的网络,也被称为前馈网络或正向传播网络。
以三层结构的多层感知器为例,它由输入层、中间层及输出层组成:
- 各层之间通过权重对各单元进行连接
- 各层通过阈值计算其输出值
- 前一层的输出值作为后一层的输入值
3 误差反向传播算法(BP算法)
对多层感知器模型的训练使用误差反向传播算法(Error Back Propagation),即BP算法。BP算法最早有沃博斯于1974年提出,鲁梅尔哈特等人进一步发展了该理论。
3.1 基本过程
BP算法过程分为两大部分:
- 前向传播计算:从输入层开始,向前逐层计算每层的输出结果,并由输出层输出网络的最终结果。
- 误差反向传播:获得网络的输出结果后,从后往前,将实际输出与期望输出之间的误差逐层传递,直达输入层。传递过程中,对模型的参数逐层进行更新。
这样反复进行“前向传播计算”和误差反向传播“,对模型进行训练,一步步优化模型参数。
BP算法就是先通过随机化的参数,获得模型的输出,再与期望输出计算得到误差,然后将误差从输出层逐层反向传播得到各层的误差,然后根据每层的误差调整每层的连接权重,权重的调整主要通过梯度下降法: Δ ω = − α ∂ E ∂ ω \Delta \omega=-\alpha \frac{\partial E}{\partial \omega} Δω=−α∂ω∂E
一个BP算法的示例:
以包含一个中间层和一个输出单元
y
y
y的三层感知器模型为例:
ω
1
i
j
\omega_{1ij}
ω1ij表示输入层与中间层之间的连接权重,
ω
2
j
1
\omega_{2j1}
ω2j1表示中间层与输出层之间的连接权重,
i
i
i表示输入层感知器单元,
j
j
j表示中间层感知器单元。
- 第一步,调整中间层与输出层之间的连接权重,其中
y
=
f
(
u
21
)
y=f(u_{21})
y=f(u21),
f
(
⋅
)
f(\cdot)
f(⋅)是激活函数Sigmod,
u
21
=
∑
j
=
1
m
ω
2
j
1
z
j
u_{21}=\sum_{j=1}^{m} \omega_{2j1}z_j
u21=∑j=1mω2j1zj,
z
j
z_j
zj是中间层的值,把误差函数
E
E
E对连接权重
ω
2
j
1
\omega_{2j1}
ω2j1的求导展开成符合函数求导:
∂
E
∂
ω
2
j
1
=
∂
E
∂
y
⋅
∂
y
∂
u
21
⋅
u
21
∂
w
2
j
1
=
−
(
y
^
−
y
)
⋅
y
(
1
−
y
)
⋅
z
j
\frac{\partial E}{\partial{\omega_{2j1}}} = \frac{\partial E}{\partial y} \cdot \frac{\partial y}{\partial u_{21}} \cdot \frac{u_{21}}{\partial w_{2j1}} = -(\hat{y}-y)\cdot y(1-y)\cdot z_j
∂ω2j1∂E=∂y∂E⋅∂u21∂y⋅∂w2j1u21=−(y^−y)⋅y(1−y)⋅zj
中间层到输出层的连接权重调整如下: Δ ω 2 j 1 = α ( y ^ − y ) y ( 1 − y ) z j \Delta \omega_{2j1}=\alpha(\hat{y}-y)y(1-y)z_j Δω2j1=α(y^−y)y(1−y)zj - 第二步,调整输入层与中间层的连接权重,其中
z
j
=
f
(
u
1
j
)
,
u
1
j
=
∑
i
n
w
1
i
j
x
i
z_j=f(u_{1j}),u_{1j}=\sum_i^nw_{1ij}x_i
zj=f(u1j),u1j=∑inw1ijxi:
∂
E
∂
ω
1
i
j
=
∂
E
∂
y
⋅
∂
y
∂
u
21
⋅
∂
u
21
∂
ω
1
i
j
=
∂
E
∂
y
⋅
∂
y
∂
u
21
⋅
∂
u
21
∂
z
j
⋅
∂
z
j
∂
ω
1
i
j
=
∂
E
∂
y
⋅
∂
y
∂
u
21
⋅
∂
u
21
∂
z
j
⋅
∂
z
j
∂
u
1
j
⋅
∂
u
1
j
∂
w
1
i
j
=
−
(
y
^
−
y
)
⋅
y
(
1
−
y
)
⋅
ω
2
j
1
⋅
z
j
(
1
−
z
j
)
⋅
x
i
\frac{\partial E}{\partial \omega_{1ij}} = \frac{\partial E}{\partial y}\cdot \frac{\partial y}{\partial u_{21}}\cdot \frac{\partial u_{21}}{\partial \omega_{1ij}} \\= \frac{\partial E}{\partial y}\cdot \frac{\partial y}{\partial u_{21}}\cdot \frac{\partial u_{21}}{\partial z_j}\cdot \frac{\partial z_j}{\partial \omega_{1ij}} \\=\frac{\partial E}{\partial y}\cdot \frac{\partial y}{\partial u_{21}}\cdot \frac{\partial u_{21}}{\partial z_j}\cdot \frac{\partial z_j}{\partial u_{1j}}\cdot \frac{\partial u_{1j}}{\partial w_{1ij}} \\=-(\hat{y}-y)\cdot y(1-y)\cdot \omega_{2j1}\cdot z_j(1-z_j)\cdot x_i
∂ω1ij∂E=∂y∂E⋅∂u21∂y⋅∂ω1ij∂u21=∂y∂E⋅∂u21∂y⋅∂zj∂u21⋅∂ω1ij∂zj=∂y∂E⋅∂u21∂y⋅∂zj∂u21⋅∂u1j∂zj⋅∂w1ij∂u1j=−(y^−y)⋅y(1−y)⋅ω2j1⋅zj(1−zj)⋅xi
输入层与中间层的连接权重更新为: Δ ω 1 i j = α ( y ^ − y ) ⋅ y ( 1 − y ) ⋅ ω 2 j 1 ⋅ z j ( 1 − z j ) ⋅ x i \Delta \omega_{1ij}=\alpha (\hat{y}-y)\cdot y(1-y)\cdot \omega_{2j1}\cdot z_j(1-z_j)\cdot x_i Δω1ij=α(y^−y)⋅y(1−y)⋅ω2j1⋅zj(1−zj)⋅xi
3.2 激活函数
然而,进行反向传播时,面临的一个问题就是激活函数:M-P模型中使用阶跃函数作为激活函数,是非连续函数,在0位置处不可导,其他位置导数为0,无法使用梯度下降法。
为了能利用梯度下降法进行反向传播,又发展出多种激活函数,这里列出三种常用的激活函数:
-
Sigmod函数: σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1}{1+e^{-x}} σ(x)=1+e−x1
-
tanh函数: σ ( x ) = e x − e − x e x + e − x \sigma(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}} σ(x)=ex+e−xex−e−x
-
ReLU函数: σ ( x ) = m a x ( 0 , x ) \sigma(x)=max(0,x) σ(x)=max(0,x)
3.3 优化问题
然而模型在训练过程中还面临大量的问题:
- 参数过多,影响训练
- 非凸优化问题:存在局部最优解而非全局最优解,影响迭代
- 梯度消失问题,下层参数比较难调
- 参数解释起来比较困难
解决优化的基本算法有:
- 随机梯度下降法
- 动量
- Neterov动量
自适应学习率算法:
- AdaGrad
- RMSProp
- Adam
二阶近似方法:
- 牛顿法
- 共轭梯度
- BFGS
优化策略和元算法:
- 批标准化
- 坐标下降
- Polyak平均
- 监督预训练