《神经网络与深度学习》学习笔记(1)概述、线性回归、BP网络
目录
前言
作者目前为某高校在读研究生,本文是应《神经网络与深度学习》课程的授课教师要求撰写的课程总结,如有纰漏欢迎指正。本文内容主要是对文献[1](《动手学深度学习》)和授课教师课程PPT的归纳与分析,因此使用了上述文献的部分内容,若存在侵权恳请联系作者及时删除。
1 概述
什么是人工神经网络?人工神经网络是从微观结构与功能上模拟人脑神经系统而建立的一类模型,是模拟人的智能的一条途径。其中信息处理由人工神经元间的相互作用来实现,由联接权来传递,具有学习能力、自适应性、联接强度的可变性。人工神经网络是人脑的抽象、简化和模拟,反映了人脑功能的若干基本特征。多隐层的人工神经网络被称为深度学习,具有优异的特征学习能力,并可通过无监督学习实现的“逐层初始化”来克服在训练上的难度。
神经网络与深度学习发展回顾。1957年,Frank Rosenblatt提出了感知机,一种最简形式的前馈人工神经网络,能够进行二元分类,但是无法处理异或等非线性分类问题,随后神经网络的发展陷入了低谷。1986年,多层神经网络和由Rumelhart和McClelland为首的科学家小组提出的BP算法顺利地解决了非线性分类问题,神经网络又迎来了新一轮的发展。2012年,Alex Krizhevsky等人提出的AlexNet[7]的问世,大大降低了神经网络在图像分类问题上的错误率,大大鼓舞了人们研究神经网络的热情,推动了深度学习研究的热潮。
神经网络与深度学习应用。进入二十一世纪以来,伴随着人工智能研究的热潮,人工神经网络等技术得到了广泛的应用。世界主要经济体都非常重视人工智能技术的发展,陆续开展了人工智能相关计划,并从国家战略层面开始加紧布局。深度学习作为人工智能领域的热门研究方向在近年也得到了飞速的发展,并被应用在智能机器人、自动驾驶、智能穿戴、智能家居、机器翻译、智慧物流、智能制造等诸多邻域。
2 线性回归
2.1 线性回归
线性回归的定义:利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。例如,假设房价和房屋面积、年限有关,则可以将该关系表示为一个二维线性函数,见式(2.1)。
y
=
θ
1
x
1
+
θ
2
x
2
+
θ
0
(2.1)
y=\theta_1x_1+\theta_2x_2+\theta_0\tag{2.1}
y=θ1x1+θ2x2+θ0(2.1) 若进一步拓展该问题,假设房价和n个因素有关,则可以表示为式(2.2)。
y
=
θ
⊤
x
=
h
θ
(
x
)
(2.2)
y=\boldsymbol{\theta}^\top\boldsymbol{x}=h_{\boldsymbol{\theta}}(\boldsymbol{x})\tag{2.2}
y=θ⊤x=hθ(x)(2.2)其中
θ
=
[
θ
n
,
θ
n
−
1
,
⋯
,
θ
1
,
θ
0
]
⊤
\boldsymbol{\theta}=\begin{bmatrix}\theta_n,\theta_{n-1},\cdots,\theta_{1},\theta_{0}\end{bmatrix}^\top
θ=[θn,θn−1,⋯,θ1,θ0]⊤,
x
=
[
x
n
,
x
n
−
1
,
⋯
,
x
1
,
1
]
⊤
\boldsymbol{x}=\begin{bmatrix}x_n,x_{n-1},\cdots,x_{1},1\end{bmatrix}^\top
x=[xn,xn−1,⋯,x1,1]⊤。
此外,再假设给定样本
(
x
(
i
)
,
y
(
i
)
)
(\boldsymbol{x}^{(i)},y^{(i)})
(x(i),y(i))并构造损失函数
J
(
θ
)
=
1
2
∑
i
=
1
m
(
y
(
i
)
−
h
θ
(
x
(
i
)
)
)
2
J(\boldsymbol{\theta})=\frac{1}{2}\sum_{i=1}^{m} {(y^{(i)}-h_{\boldsymbol{\theta}}(\boldsymbol{x}^{(i)}))}^{2}
J(θ)=21∑i=1m(y(i)−hθ(x(i)))2。目标是找到超平面参数
θ
\boldsymbol{\theta}
θ,使
J
(
θ
)
J(\boldsymbol{\theta})
J(θ)最小,即求解
min
θ
J
(
θ
)
\mathop{\min}\limits_{\boldsymbol{\theta}}J(\boldsymbol{\theta})
θminJ(θ)。令
∂
J
(
θ
)
∂
θ
=
0
\frac{\partial J(\boldsymbol{\theta})}{\partial \boldsymbol{\theta}}=0
∂θ∂J(θ)=0可得解析解,见式(2.3)。
θ
=
(
X
⊤
X
)
−
1
X
⊤
y
(2.3)
\boldsymbol{\theta}=(\mathbf{X^{\top}}\mathbf{X})^{-1}\mathbf{X}^{\top}\mathbf{y}\tag{2.3}
θ=(X⊤X)−1X⊤y(2.3)其中
X
=
[
(
x
(
N
)
)
⊤
,
(
x
(
N
−
1
)
)
⊤
,
⋯
,
(
x
(
1
)
)
⊤
]
⊤
\mathbf{X}=\begin{bmatrix}{(\boldsymbol{x}^{(N)})}^{\top} ,{(\boldsymbol{x}^{(N-1)})}^{\top},\cdots,{(\boldsymbol{x}^{(1)})}^{\top}\end{bmatrix}^\top
X=[(x(N))⊤,(x(N−1))⊤,⋯,(x(1))⊤]⊤,
y
=
[
y
(
N
)
,
y
(
N
−
1
)
,
⋯
,
y
(
1
)
]
⊤
\mathbf{y}=\begin{bmatrix}y^{(N)},y^{(N-1)},\cdots,y^{(1)}\end{bmatrix}^\top
y=[y(N),y(N−1),⋯,y(1)]⊤。
2.2 线性二分类问题
例如,苹果分类问题,用苹果的两个特征:苹果的直径、苹果外观评价。则线性分类器的输入为上述特征组成的特征向量;输出为类别,如果是二分类问题,则为0和1,或者是属于某类的概率,即0-1之间的数。若输出为属于某类的概率(0-1),则需要进行值变换将神经网络的输出限定在区间(0,1)内,比如使用Sigmoid函数,见式(2.4)。
y
=
1
1
+
e
−
z
(2.4)
y=\frac{1}{1+e^{-z}}\tag{2.4}
y=1+e−z1(2.4)其中
z
=
θ
1
x
1
+
θ
2
x
2
+
θ
0
z=\theta_1x_1+\theta_2x_2+\theta_0
z=θ1x1+θ2x2+θ0,函数图像见图2-1。
同样给定样本 ( x ( i ) , y ( i ) ) (\boldsymbol{x}^{(i)},y^{(i)}) (x(i),y(i))并构造损失函数 J ( θ ) = 1 2 ∑ i = 1 N ( y ( i ) − h θ ( x ( i ) ) ) 2 J(\boldsymbol{\theta})=\frac{1}{2}\sum_{i=1}^{N} {(y^{(i)}-h_{\boldsymbol{\theta}}(\boldsymbol{x}^{(i)}))}^{2} J(θ)=21∑i=1N(y(i)−hθ(x(i)))2,其中 h θ ( x ( i ) ) = 1 1 + e − θ ⊤ x ( i ) h_{\boldsymbol{\theta}}(\boldsymbol{x}^{(i)})=\frac{1}{1+e^{-\boldsymbol{\theta}^\top\boldsymbol{x}^{(i)}}} hθ(x(i))=1+e−θ⊤x(i)1。目标一样是找到超平面参数 θ \boldsymbol{\theta} θ,使 J ( θ ) J(\boldsymbol{\theta}) J(θ)最小,即求解 min θ J ( θ ) \mathop{\min}\limits_{\boldsymbol{\theta}}J(\boldsymbol{\theta}) θminJ(θ)。同样令 ∂ J ( θ ) ∂ θ = 0 \frac{\partial J(\boldsymbol{\theta})}{\partial \boldsymbol{\theta}}=0 ∂θ∂J(θ)=0,但是由于这里的损失函数是非线性的因此无法直接求解。于是可以采用梯度下降算法: θ k + 1 = θ k + Δ θ k (2.5) \boldsymbol{\theta}_{k+1}=\boldsymbol{\theta}_{k}+\Delta\boldsymbol{\theta}_{k}\tag{2.5} θk+1=θk+Δθk(2.5) Δ θ k = − α ∂ J ∂ θ (2.6) \Delta\boldsymbol{\theta}_{k}=-\alpha\frac{\partial J}{\partial \boldsymbol{\theta}}\tag{2.6} Δθk=−α∂θ∂J(2.6) ∂ J ∂ θ = 1 2 ∑ i = 1 N ( y ( i ) − h θ ( x ( i ) ) ) ( − ∂ h θ ( x ( i ) ) ∂ θ ) (2.7) \frac{\partial J}{\partial \boldsymbol{\theta}}=\frac{1}{2}\sum_{i=1}^{N} (y^{(i)}-h_{\boldsymbol{\theta}}(\boldsymbol{x}^{(i)}))(-\frac{\partial h_{\boldsymbol{\theta}}(\boldsymbol{x}^{(i)})}{\partial \boldsymbol{\theta}})\tag{2.7} ∂θ∂J=21i=1∑N(y(i)−hθ(x(i)))(−∂θ∂hθ(x(i)))(2.7) ∂ h θ ( x ( i ) ) ∂ θ = h θ ( 1 − h θ ) x ( i ) (2.8) \frac{\partial h_{\boldsymbol{\theta}}(\boldsymbol{x}^{(i)})}{\partial \boldsymbol{\theta}}=h_{\boldsymbol{\theta}}(1-h_{\boldsymbol{\theta}})\boldsymbol{x}^{(i)}\tag{2.8} ∂θ∂hθ(x(i))=hθ(1−hθ)x(i)(2.8)
2.3 对数回归与多分类回归
上述二分类问题也可使用条件概率描述:
P
(
y
(
i
)
=
1
∣
x
(
i
)
)
=
h
θ
(
x
(
i
)
)
=
1
1
+
e
−
θ
⊤
x
(
i
)
(2.9)
P(y^{(i)}=1|\boldsymbol{x}^{(i)})=h_{\boldsymbol{\theta}}(\boldsymbol{x}^{(i)})=\frac{1}{1+e^{-\boldsymbol{\theta}^\top\boldsymbol{x}^{(i)}}}\tag{2.9}
P(y(i)=1∣x(i))=hθ(x(i))=1+e−θ⊤x(i)1(2.9)
P
(
y
(
i
)
=
0
∣
x
(
i
)
)
=
1
−
P
(
y
(
i
)
=
1
∣
x
(
i
)
)
=
1
−
h
θ
(
x
(
i
)
)
(2.10)
P(y^{(i)}=0|\boldsymbol{x}^{(i)})=1-P(y^{(i)}=1|\boldsymbol{x}^{(i)})=1-h_{\boldsymbol{\theta}}(\boldsymbol{x}^{(i)})\tag{2.10}
P(y(i)=0∣x(i))=1−P(y(i)=1∣x(i))=1−hθ(x(i))(2.10)
由于输出为[0,1],需要修改指标函数
J
(
θ
)
=
1
2
∑
i
(
y
(
i
)
log
(
h
θ
(
x
(
i
)
)
)
+
(
1
−
y
(
i
)
)
log
(
1
−
h
θ
(
x
(
i
)
)
)
)
(2.11)
J(\boldsymbol{\theta})=\frac{1}{2}\sum_{i} {(y^{(i)}\log(h_{\boldsymbol{\theta}}(\boldsymbol{x}^{(i)}))+(1-y^{(i)})\log(1-h_{\boldsymbol{\theta}}(\boldsymbol{x}^{(i)})))}\tag{2.11}
J(θ)=21i∑(y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i))))(2.11)对其最小化则有
∇
θ
J
(
θ
)
=
∑
i
x
(
i
)
(
h
θ
(
x
(
i
)
)
−
y
(
i
)
)
(2.12)
\nabla_{\boldsymbol{\theta}}J(\boldsymbol{\theta})=\sum_{i} {\boldsymbol{x}^{(i)}(h_{\boldsymbol{\theta}}(\boldsymbol{x}^{(i)})-y^{(i)})}\tag{2.12}
∇θJ(θ)=i∑x(i)(hθ(x(i))−y(i))(2.12) 根据贝叶斯公式二分类问题可使用条件概率描述为,
P
(
y
(
i
)
=
1
∣
x
(
i
)
,
θ
)
=
h
θ
(
x
(
i
)
)
P(y^{(i)}=1|\boldsymbol{x}^{(i)},\boldsymbol{\theta})=h_{\boldsymbol{\theta}}(\boldsymbol{x}^{(i)})
P(y(i)=1∣x(i),θ)=hθ(x(i)),
P
(
y
(
i
)
=
0
∣
x
(
i
)
,
θ
)
=
1
−
h
θ
(
x
(
i
)
)
P(y^{(i)}=0|\boldsymbol{x}^{(i)},\boldsymbol{\theta})=1-h_{\boldsymbol{\theta}}(\boldsymbol{x}^{(i)})
P(y(i)=0∣x(i),θ)=1−hθ(x(i))。或者统一写成
P
(
y
(
i
)
∣
x
(
i
)
,
θ
)
=
(
h
θ
(
x
(
i
)
)
)
y
(
i
)
(
1
−
h
θ
(
x
(
i
)
)
)
1
−
y
(
i
)
(2.13)
P(y^{(i)}|\boldsymbol{x}^{(i)},\boldsymbol{\theta})=(h_{\boldsymbol{\theta}}(\boldsymbol{x}^{(i)}))^{y^{(i)}}(1-h_{\boldsymbol{\theta}}(\boldsymbol{x}^{(i)}))^{1-y^{(i)}}\tag{2.13}
P(y(i)∣x(i),θ)=(hθ(x(i)))y(i)(1−hθ(x(i)))1−y(i)(2.13)
假设样本相互独立,则合理的估计值应让所有样本事件产生的几率最大,即是极大似然的,因此取似然函数
L
(
θ
)
=
∏
i
=
1
m
p
(
y
(
i
)
∣
x
(
i
)
,
θ
)
L(\boldsymbol{\theta})=\prod_{i=1}^{m} p(y^{(i)}|\boldsymbol{x}^{(i)},\boldsymbol{\theta})
L(θ)=∏i=1mp(y(i)∣x(i),θ)或
l
(
θ
)
=
log
L
(
θ
)
=
∑
i
(
y
(
i
)
log
(
h
θ
(
x
(
i
)
)
)
+
(
1
−
y
(
i
)
)
log
(
1
−
h
θ
(
x
(
i
)
)
)
)
(2.14)
l(\boldsymbol{\theta})=\log L(\boldsymbol{\theta})=\sum_{i}{(y^{(i)}\log(h_{\boldsymbol{\theta}}(\boldsymbol{x}^{(i)}))+(1-y^{(i)})\log(1-h_{\boldsymbol{\theta}}(\boldsymbol{x}^{(i)})))}\tag{2.14}
l(θ)=logL(θ)=i∑(y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i))))(2.14)对式(2.14)的最大化等价于
min
θ
−
l
(
θ
)
\mathop{\min}\limits_{\boldsymbol{\theta}}-l(\boldsymbol{\theta})
θmin−l(θ)。
对于有k个标记的分类问题,取损失函数
J
(
θ
)
=
−
[
∑
i
=
1
m
∑
k
=
1
K
1
{
y
(
i
)
=
k
}
log
exp
(
θ
(
k
)
⊤
x
(
i
)
)
∑
j
=
1
K
exp
(
θ
(
k
)
⊤
x
(
i
)
)
]
(2.15)
J(\boldsymbol{\theta})=-[\mathop{\sum}\limits_{i=1}^{m}{\mathop{\sum}\limits_{k=1}^{K}{1\{y^{(i)}=k\}\log{\frac{\exp(\boldsymbol{\theta}^{(k)\top}\boldsymbol{x}^{(i)})}{\sum_{j=1}^{K}{\exp(\boldsymbol{\theta}^{(k)\top}\boldsymbol{x}^{(i)})}}}}}]\tag{2.15}
J(θ)=−[i=1∑mk=1∑K1{y(i)=k}log∑j=1Kexp(θ(k)⊤x(i))exp(θ(k)⊤x(i))](2.15)也可以简写为
l
(
y
,
y
^
)
=
∑
j
=
1
K
y
j
log
y
j
^
l(\boldsymbol{y},\boldsymbol{\hat{y}})=\mathop{\sum}\limits_{j=1}^{K}{y_j\log\hat{y_j}}
l(y,y^)=j=1∑Kyjlogyj^称为交叉熵,对应梯度
∇
θ
(
k
)
J
(
θ
)
=
−
∑
i
=
1
m
[
x
(
i
)
(
1
{
y
(
i
)
=
k
}
−
P
(
y
(
i
)
=
k
∣
x
(
i
)
,
θ
)
)
]
(2.16)
\nabla_{\boldsymbol{\theta}^{(k)}}J(\boldsymbol{\theta})=-\sum_{i=1}^{m}[\boldsymbol{x}^{(i)}(1\{y^{(i)}=k\}-P(y^{(i)}=k|\boldsymbol{x}^{(i)},\boldsymbol{\theta}))]\tag{2.16}
∇θ(k)J(θ)=−i=1∑m[x(i)(1{y(i)=k}−P(y(i)=k∣x(i),θ))](2.16)这种方式称为Softmax。
2.4 神经元模型
神经元模型即模仿人脑神经元产生的模型。当单个神经元有三个输入时,该模型的运算过程如图2-2所示,首先神经元的输入与对应权重分别相乘后再求和得到输入的加权和,再经过激活函数成为神经网络的输出,上文中使用的Sigmoid函数就是一种典型的激活函数。
2.5 感知机模型
1957年,Rosenblatt提出的感知机(Perceptron)成为了神经网络和支持向量机的基础,能解决线性分类问题。感知机从输入到输出的模型如下:
y
=
f
(
x
)
=
s
i
g
n
(
w
⊤
x
)
(2.17)
y=f(\boldsymbol{x})=sign(\mathbf{w}^{\top}\mathbf{x})\tag{2.17}
y=f(x)=sign(w⊤x)(2.17)其中
s
i
g
n
(
)
sign()
sign()为符号函数:
s
i
g
n
(
x
)
=
{
−
1
x
<
0
1
x
≥
0
(2.18)
sign(x)=\begin{cases} -1 & x<0 \\ 1 & x\geq0 \\ \end{cases}\tag{2.18}
sign(x)={−11x<0x≥0(2.18) 对于样本
(
x
(
i
)
,
y
(
i
)
)
(\boldsymbol{x}^{(i)},y^{(i)})
(x(i),y(i)),如果正确分类则:
{
y
(
i
)
(
w
⊤
x
(
i
)
)
∥
w
∥
>
0
正确分类样本
y
(
i
)
(
w
⊤
x
(
i
)
)
∥
w
∥
<
0
错误分类样本
(2.19)
\begin{cases} \frac{y^{(i)}(\mathbf{w}^{\top}\mathbf{x}^{(i)})}{\Vert \mathbf{w} \Vert}>0 & 正确分类样本 \\ \frac{y^{(i)}(\mathbf{w}^{\top}\mathbf{x}^{(i)})}{\Vert \mathbf{w} \Vert}<0& 错误分类样本 \\ \end{cases}\tag{2.19}
⎩
⎨
⎧∥w∥y(i)(w⊤x(i))>0∥w∥y(i)(w⊤x(i))<0正确分类样本错误分类样本(2.19)因此可以定义损失函数:
L
(
w
)
=
−
1
∥
w
∥
∑
y
(
i
)
(
w
⊤
x
(
i
)
)
(2.20)
L(\mathbf{w})= -\frac{1}{\Vert \mathbf{w} \Vert}\sum{y^{(i)}(\mathbf{w}^{\top}\mathbf{x}^{(i)})}\tag{2.20}
L(w)=−∥w∥1∑y(i)(w⊤x(i))(2.20)目标是找到超平面参数
w
∗
\mathbf{w}^*
w∗满足:
L
(
w
∗
)
=
min
w
∑
y
(
i
)
(
w
⊤
x
(
i
)
)
(2.21)
L(\mathbf{w}^*)=\mathop{\min}\limits_{\mathbf{w}}\sum y^{(i)}(\mathbf{w}^{\top}\mathbf{x}^{(i)})\tag{2.21}
L(w∗)=wmin∑y(i)(w⊤x(i))(2.21) 设输入为训练数据集
{
x
(
i
)
,
y
(
i
)
}
\{\boldsymbol{x}^{(i)},y^{(i)}\}
{x(i),y(i)},输出为
w
\mathbf{w}
w,则具体训练流程如下:
- 赋初值 w 0 \mathbf{w}_0 w0,数据序号 i = 1 i=1 i=1,迭代次数 k = 0 k=0 k=0。
- 选择数据点 ( x ( i ) , y ( i ) ) (\boldsymbol{x}^{(i)},y^{(i)}) (x(i),y(i))。
- 判断该数据点是否为当前模型的误分类点,即判断若 y ( i ) ( w ⊤ x ( i ) ) ≤ 0 y^{(i)}(\mathbf{w}^{\top}\mathbf{x}^{(i)})\leq0 y(i)(w⊤x(i))≤0,则更新权值: w k + 1 = w k + η y ( i ) x ( i ) (2.22) \mathbf{w}_{k+1}=\mathbf{w}_{k}+\eta y^{(i)} \mathbf{x}^{(i)}\tag{2.22} wk+1=wk+ηy(i)x(i)(2.22)
- 判断预测结果是否有误分类点,若存在,转到2;若不存在,结束。
2.6 程序实例
以下将分析一个线性神经网络的例子来深化对于上述概念的理解。假设线性模型如式(2.23)
y
=
w
⊤
x
+
b
+
ϵ
(2.23)
y=\boldsymbol{w}^\top\boldsymbol{x}+b+\epsilon\tag{2.23}
y=w⊤x+b+ϵ(2.23)其中
w
=
[
2
−
3.4
]
\boldsymbol{w}=\begin{bmatrix}2\\-3.4\end{bmatrix}
w=[2−3.4];
b
=
4.2
b=4.2
b=4.2;
ϵ
\epsilon
ϵ为噪声项,服从均值为0方差为0.01的正态分布;
x
\boldsymbol{x}
x为输入,包含两个特征;
y
y
y为标签;。
下文将以上述线性模型为基础,生成一个包含1000个样本的数据集,并通过线性神经网络对该模型进行拟合,得到
w
^
\hat{\boldsymbol{w}}
w^和
b
^
\hat{b}
b^。于是便可以写成
y
=
X
w
+
b
+
ϵ
(2.24)
\mathbf{y}=\mathbf{X}\boldsymbol{w}+b+\epsilon\tag{2.24}
y=Xw+b+ϵ(2.24)其中
X
∈
R
1000
×
2
\mathbf{X}\in\R^{1000\times2}
X∈R1000×2。需要注意的是式(2.24)并非严格数学意义上的公式(在数学中向量与标量不能相加),这里的“
+
+
+”相当于Python中的加号,具有广播的作用。
以下为具体程序(来自文献[1],略有删改)和注释:
# 导入库
import torch
from torch.utils import data
from torch import nn
# 生成数据
def synthetic_data(w, b, num_examples):
X = torch.normal(0, 1, (num_examples, len(w)))
y = torch.matmul(X, w) + b
y += torch.normal(0, 0.01, y.shape)
return X, y.reshape((-1, 1))
# 构造一个PyTorch数据迭代器
def load_array(data_arrays, batch_size, is_train=True):
dataset = data.TensorDataset(*data_arrays)
return data.DataLoader(dataset, batch_size, shuffle=is_train)
# 初始化线性模型的权重、偏执和噪声项,并生成1000个样本
true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = synthetic_data(true_w, true_b, 1000)
# 设定每一次迭代(iteration)输入网络的数据的数量(batch_suze)
batch_size = 10
data_iter = load_array((features, labels), batch_size)
# 定义网络结构,两个输入,一个输出
net = nn.Sequential(nn.Linear(2, 1))
# 初始化网络的参数
net[0].weight.data.normal_(0, 0.01)
net[0].bias.data.fill_(0)
# 定义网络的损失函数为均方误差
loss = nn.MSELoss()
# 定义训练的优化器为随机梯度下降(有时也成为最速梯度下降),学习率为0.03
trainer = torch.optim.SGD(net.parameters(), lr=0.03)
# 训练,将所有数据输入网络3次为止
num_epochs = 3
for epoch in range(num_epochs):
for X, y in data_iter:
l = loss(net(X), y)
trainer.zero_grad()
l.backward()
trainer.step()
l = loss(net(features), labels)
print(f'epoch {epoch + 1}, loss {l:f}')
# 输出参数真值和网络参数的误差
w = net[0].weight.data
print('w的估计误差:', true_w - w.reshape(true_w.shape))
b = net[0].bias.data
print('b的估计误差:', true_b - b)
运行结果为:
epoch 1, loss 0.000187
epoch 2, loss 0.000101
epoch 3, loss 0.000101
w的估计误差: tensor([ 0.0007, -0.0001])
b的估计误差: tensor([-0.0005])
可以看出,随着训练次数的增加,损失函数的值有下降的趋势,并且经过三轮训练,参数真值和网络拟合的参数的差值较小。
3 BP网络
3.1 多层感知机
在2.5中提到的单层感知机无法进行线性分类,例如Minsky在1969年提出的异或(XOR)问题。而使用多层感知机,即在输入和输出层间加一层或多层隐藏单元,构成多层感知器,即可解决异或(XOR)问题。
此外,多层感知器网络还存在如下定理:
- 若隐层节点(单元)可任意设置,用三层阈值节点的网络,可以实现任意的二值逻辑函数。
- 若隐层节点(单元)可任意设置,用三层S型非线性特性节点的网络,可以一致逼近紧集上的连续函数或按 范数逼近紧集上的平方可积函数。
3.2 BP算法
多层前馈网络的误差反向传播(Backward Propagation, BP)学习算法,属于监督学习,是梯度下降法在多层前馈网中的应用。而网络训练的目的,是使对每一个输入样本,调整网络参数,使得输出均方误差最小化。
假设有N个样本数据为
{
x
(
1
)
,
y
(
1
)
}
,
{
x
(
2
)
,
y
(
2
)
}
,
⋯
,
{
x
(
N
)
,
y
(
N
)
}
\{\boldsymbol{x}^{(1)},\boldsymbol{y}^{(1)}\},\{\boldsymbol{x}^{(2)},\boldsymbol{y}^{(2)}\},\cdots,\{\boldsymbol{x}^{(N)},\boldsymbol{y}^{(N)}\}
{x(1),y(1)},{x(2),y(2)},⋯,{x(N),y(N)}。则可选取损失函数:
J
(
x
(
i
)
;
w
)
=
1
2
(
y
(
i
)
−
y
^
(
i
)
(
x
;
w
)
)
2
=
1
2
(
y
(
i
)
−
a
(
i
)
(
x
;
w
)
)
2
(3.1)
J(\mathbf{x}^{(i)};\mathbf{w})=\frac{1}{2}(\mathbf{y}^{(i)}-\hat{\mathbf{y}}^{(i)}(\mathbf{x};\mathbf{w}))^2=\frac{1}{2}(\mathbf{y}^{(i)}-{\mathbf{a}}^{(i)}(\mathbf{x};\mathbf{w}))^2\tag{3.1}
J(x(i);w)=21(y(i)−y^(i)(x;w))2=21(y(i)−a(i)(x;w))2(3.1)采用迭代算法,设初始权重为
w
0
\mathbf{w}_0
w0,k时刻的权重为
w
k
\mathbf{w}_k
wk,使用泰勒级数展开有
J
(
w
k
+
1
)
=
J
(
w
k
)
+
[
d
J
d
θ
]
⊤
Δ
w
k
+
⋯
(3.2)
J(\mathbf{w}_{k+1})=J(\mathbf{w}_{k})+[\frac{dJ}{d\boldsymbol{\theta}}]^{\top}\Delta\mathbf{w}_{k}+\cdots\tag{3.2}
J(wk+1)=J(wk)+[dθdJ]⊤Δwk+⋯(3.2)为使
J
J
J最小,应选择
Δ
w
k
=
−
α
d
J
d
w
,
0
<
α
≤
1
\Delta\mathbf{w}_{k}=-\alpha\frac{dJ}{d\mathbf{w}},0<\alpha\le 1
Δwk=−αdwdJ,0<α≤1。这样每一步都能保证
J
(
w
k
+
1
)
≤
J
(
w
k
)
J(\mathbf{w}_{k+1})\le J(\mathbf{w}_{k})
J(wk+1)≤J(wk),从而使
J
J
J最终可收敛到最小。这就是梯度下降算法、BP学习算法的基本思想。
3.3 程序实例
通过高级API实现多层感知机(程序来自文献[1],略有删改)。
# 导入库
import torch
from torch import nn
from d2l import torch as d2l
# 定义网络结构
net = nn.Sequential(nn.Flatten(),
nn.Linear(784, 256),
nn.ReLU(),
nn.Linear(256, 10))
# 初始化网络的参数
def init_weights(m):
if type(m) == nn.Linear:
nn.init.normal_(m.weight, std=0.01)
net.apply(init_weights);
# 定义训练的超参数及优化器
batch_size, lr, num_epochs = 256, 0.1, 10
loss = nn.CrossEntropyLoss(reduction='none')
trainer = torch.optim.SGD(net.parameters(), lr=lr)
# 根据设置的参数,使用数据集进行训练
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)
训练历史如图3-1所示。
参考文献
[1]阿斯顿·张.动手学深度学习[M].北京:人民邮电出版社,2023:85-389.