(笔记参考b站吴恩达深度学习、 Dive into Deep Learning以及博主学校课程ppt)
线性分类与感知机
线性回归及线性分类问题
博主对基于神经网络的深度学习的理解是对于某些问题尤其是复杂的问题总结规律,并隐式(无法显示得到其解析形式)的拟合它的解析曲线。而简单的曲线拟合问题当属线性回归,什么是线性回归?
线性回归定义:利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。即对已知数据用诸如最小二乘、多项式插等方法拟合曲线并可对之后新获得的数据进行估计/预测,举一个最简单的拟合曲线是直线的例子,如下图:
以上整个过程可以看作是简单的深度学习问题的整个学习过程,曲线拟合的方法其实可以看作为一种机器学习方法,已有数据作为输入,拟合曲线看作是估计函数,用来对新的数据进行估计。
假设上述问题的估计函数为 y=
θ
\theta
θx,其中
θ
\theta
θ为系数,则我们可以将这一维问题扩展成多维问题,即 y =
θ
\theta
θT x,其中,
θ
\theta
θ = [
θ
\theta
θ1,
θ
\theta
θ2,…
θ
\theta
θn]T,x = [x1,x2,…xn]T,利用样本数据来构造误差函数的最小二乘形式,即J(
θ
\theta
θ) =
1
2
\frac 12
21
∑
i
=
1
m
\sum_{i=1}^m
∑i=1m(y(i)-h(x(i)))2;通过高斯牛顿或者LM算法或者梯度下降算法找到是J(
θ
\theta
θ)最小的系数向量**
θ
\theta
θ**。
线性分类定义:线性分类器则透过特征的线性组合来做出分类决定,以达到此种目的。简言之,样本通过直线(或超平面)可分。如下图:
线性分类其实是对线性回归后得到的结果做了进一步处理,即因为要分类,那么我们最终得到的结果是样本落在哪一类的概率,因此我们要将结果控制在0-1之间,而sigmoid函数恰好可以在保证 曲线连续性光滑性 的情况下做到了这一点,其中z即通过线性回归拟合得到的曲线,y为最终输出结果,如图:
为什么要强调曲线连续光滑呢?因为只有这样,才有办法对整个问题的参数
θ
\theta
θ进行迭代优化,因为迭代优化是离不开导数的,而只有连续光滑的曲线才能处处有导数。如下是几个多分类问题的例子:
神经元模型
那么上文中的模型是如何具体实现的呢?靠的是深度学习的神经网络模型,而神经网络模型的最小单位则是神经元模型,如下:
单神经元模型是一种最简单的神经网络模型,也称为感知机(Perceptron)。它由一个神经元组成,可以用来处理二元分类问题,即将输入的样本分为两个类别中的一个。
在单神经元模型中,输入由
n
n
n 个特征组成,每个特征都有一个对应的权重,表示该特征对最终分类结果的重要程度。输入和权重的乘积求和后再加上一个偏置,就得到了神经元的输入。该输入经过一个激活函数的处理后,就得到了神经元的输出,即分类结果。
其数学表达式如下:
y
=
f
(
∑
i
=
1
n
w
i
x
i
+
b
)
y = f(\sum_{i=1}^n w_ix_i + b)
y=f(∑i=1nwixi+b)
其中,
x
i
x_i
xi 表示第
i
i
i 个特征,
w
i
w_i
wi 表示该特征的权重,
b
b
b 表示偏置,
f
f
f 是激活函数,
y
y
y 表示分类结果。常见的激活函数包括 Sigmoid 函数、ReLU 函数、Tanh 函数等。
单神经元模型的训练过程主要是通过梯度下降算法来更新权重和偏置,以使得损失函数最小化,从而使得分类准确率最大化。常见的损失函数包括均方误差(MSE)和交叉熵(Cross Entropy)等。
感知机模型
感知机模型是一种最早的神经网络模型,它是一种二元分类模型,可以将输入数据划分为两个类别。感知机模型的基本结构包括输入层、输出层和一个激活函数。
感知机模型可以看做是由若干个神经元组成的单层神经网络,其中每个神经元都对应着一个二元分类器。对于一个具有
n
n
n 个特征的输入样本,感知机模型的输出可以表示为:
y
=
f
(
∑
i
=
1
n
w
i
x
i
+
b
)
y = f(\sum_{i=1}^n w_ix_i + b)
y=f(∑i=1nwixi+b)
其中,
x
i
x_i
xi 表示输入样本的第
i
i
i 个特征,
w
i
w_i
wi 表示对应的权重,
b
b
b 是偏置项,
f
f
f 是激活函数。
感知机模型的训练过程是一个迭代的过程,每次迭代都根据样本的真实标签和预测标签来调整权重和偏置,直到训练误差收敛或达到预设的停止条件。感知机模型的训练算法被称为感知机算法,是一个基于梯度下降的优化算法。
感知机模型的一个重要限制是只能用来处理线性可分的数据,即如果输入数据集不是线性可分的,则感知机算法会发生错误,并且无法收敛。而之后多层感知机(MLP)模型,是一种能够处理非线性分类问题的神经网络模型。
多层前馈网络与误差反传算法
多层感知机
多层感知机(MLP)是一种深度神经网络,由多个神经元组成,通常由一个输入层、若干个隐藏层和一个输出层组成。隐藏层是指输入层和输出层之间的一层或多层神经元,每个隐藏层的神经元都接收来自前一层神经元的信号,并将其加权求和后再进行激活。
在多层感知机中,每个神经元都有一个权重和一个偏置,可以通过反向传播算法来训练模型。反向传播算法是一种基于梯度下降的优化算法,它通过最小化损失函数来调整每个神经元的权重和偏置。
多层感知机可以用于分类和回归问题,其中分类问题通常使用 softmax 函数作为输出层的激活函数,回归问题则可以使用恒等函数或者其他适合的激活函数。举个一个简单的三层 MLP的例子:
图片及例子来源:https://d2l.ai/chapter_multilayer-perceptrons/mlp.html
首先,假设我们有一个输入向量
x
=
(
x
1
,
x
2
,
…
,
x
d
)
\boldsymbol{x} = (x_1, x_2, \dots, x_d)
x=(x1,x2,…,xd),其中
d
d
d 是输入维度。第一层是输入层,包含
d
d
d 个神经元,每个神经元的输出就是输入向量的对应分量
x
i
x_i
xi。
第二层是隐藏层,包含
m
m
m 个神经元。我们可以将第二层的每个神经元的输入表示为线性加权和和激活函数的组合:
h
=
(
h
1
,
h
2
,
…
,
h
m
)
=
(
f
(
w
1
⊤
x
+
b
1
)
,
f
(
w
2
⊤
x
+
b
2
)
,
…
,
f
(
w
m
⊤
x
+
b
m
)
)
\boldsymbol{h} = (h_1, h_2, \dots, h_m) = (f(\boldsymbol{w}_1^\top \boldsymbol{x} + b_1), f(\boldsymbol{w}_2^\top \boldsymbol{x} + b_2), \dots, f(\boldsymbol{w}_m^\top \boldsymbol{x} + b_m))
h=(h1,h2,…,hm)=(f(w1⊤x+b1),f(w2⊤x+b2),…,f(wm⊤x+bm))
其中 w i \boldsymbol{w}_i wi 和 b i b_i bi 分别是第 i i i 个神经元的权重向量和偏置, f f f 是激活函数,通常使用 sigmoid 函数或者 ReLU 函数。
最后一层是输出层,通常包含 k k k 个神经元,其中 k k k 是类别数目。我们可以将第三层的每个神经元的输入表示为线性加权和和激活函数的组合:
o
=
(
o
1
,
o
2
,
…
,
o
k
)
=
(
f
(
u
1
⊤
h
+
c
1
)
,
f
(
u
2
⊤
h
+
c
2
)
,
…
,
f
(
u
k
⊤
h
+
c
k
)
)
\boldsymbol{o} = (o_1, o_2, \dots, o_k) = (f(\boldsymbol{u}_1^\top \boldsymbol{h} + c_1), f(\boldsymbol{u}_2^\top \boldsymbol{h} + c_2), \dots, f(\boldsymbol{u}_k^\top \boldsymbol{h} + c_k))
o=(o1,o2,…,ok)=(f(u1⊤h+c1),f(u2⊤h+c2),…,f(uk⊤h+ck))
其中
u
i
\boldsymbol{u}_i
ui 和
c
i
c_i
ci 分别是第
i
i
i 个神经元的权重向量和偏置。
整个 MLP 的输出就是
o
\boldsymbol{o}
o,它可以用于分类或者回归问题。如果是分类问题,通常采用 softmax 函数将输出转化为概率分布。如果是回归问题,通常使用恒等函数作为输出层的激活函数。
BP神经网络(多层前馈网络)
BP神经网络概述及结构
参考:b站吴恩达深度学习课程以及本人学校课程ppt
BP 神经网络(Backpropagation Neural Network)是一种基于梯度下降算法的多层前馈神经网络。BP 神经网络通常由输入层、输出层和多个隐藏层组成。它通过反向传播算法来计算网络的梯度,并利用梯度下降算法来更新网络的权重,从而最小化代价函数。其神经网络结构如下图:
- 输入层:接收输入数据,并将数据传递给下一层。
- 隐藏层:对输入数据进行非线性变换,从而提取出更高层次的特征。
- 输出层:输出最终的预测结果
每个神经元都有一个激活函数,常见的激活函数有 sigmoid、ReLU 和 tanh 等。在 BP 神经网络中,通常使用 sigmoid 函数作为隐藏层和输出层的激活函数。
BP神经网络训练
BP 神经网络的训练通常使用反向传播算法。反向传播算法通过计算代价函数对权重的偏导数来更新网络的权重。反向传播算法包括两个过程:前向传播和反向传播。 - 前向传播:计算网络的输出。
- 反向传播:计算代价函数对网络的每个权重的偏导数,从而计算梯度。
- 代价函数通常采用均方误差(MSE)函数:
J ( W , b ) = 1 m ∑ i = 1 m 1 2 ∣ y ( i ) − a ( i ) ∣ 2 J(W,b) = \frac{1}{m}\sum_{i=1}^{m}\frac{1}{2}\left|y^{(i)}-a^{(i)}\right|^2 J(W,b)=m1i=1∑m21 y(i)−a(i) 2
其中,
W
W
W 和
b
b
b 分别是网络的权重和偏置,
m
m
m 是训练样本数,
y
(
i
)
y^{(i)}
y(i) 是第
i
i
i 个训练样本的真实标签,
a
(
i
)
a^{(i)}
a(i) 是神经网络的输出。
反向传播算法通过计算代价函数对每个权重的偏导数来更新权重:
W
[
l
]
=
W
[
l
]
−
α
∂
J
∂
W
[
l
]
W^{[l]} = W^{[l]} - \alpha \frac{\partial J}{\partial W^{[l]}}
W[l]=W[l]−α∂W[l]∂J
b
[
l
]
=
b
[
l
]
−
α
∂
J
∂
b
[
l
]
b^{[l]} = b^{[l]} - \alpha \frac{\partial J}{\partial b^{[l]}}
b[l]=b[l]−α∂b[l]∂J
其中,
α
\alpha
α 是学习率,
l
l
l 是层数。
反向传播算法的具体如下:
- 将输入层的激活值 a^{[0]} 设置为输入 x。
- 前向传播:对于 l=1,2,…,L-1,计算 z^{[l]} = W{[l]}a{[l-1]} + b^{[l]} 和a^{[l]} = g(z^{[l]}),其中 g 是激活函数。
- 计算输出层的激活值 a^{[L]} = g(z^{[L]}),其中 g 是激活函数。
- 计算误差项 d^{[L]} = da^{[L]} * g’(z^{[L]}),其中 da^{[L]} 是代价函数相对于 a^{[L]} 的导数,g’ 是激活函数的导数。
- 反向传播:对于 l=L-1,L-2,…,1,计算 d^{[l]} = (W{[l+1]})T d^{[l+1]} * g’(z^{[l]}),其中 (W{[l+1]})T 是权重矩阵的转置,* 表示逐元素乘法。
- 计算相对于权重和偏置的梯度:dW^{[l]} = d^{[l]} (a{[l-1]})T 和 db^{[l]} = d^{[l]},其中 ^T 表示矩阵的转置。
- 使用梯度下降更新权重和偏置:W^{[l]} = W^{[l]} - alpha * dW^{[l]} 和 b^{[l]} =b^{[l]} - alpha * db^{[l]},其中 alpha 是学习率。
性能优化
引出:SGD问题 如图:
动量法
动量法(Momentum)是深度学习中一种常用的梯度下降优化算法,用于加速模型的收敛过程。
在标准的梯度下降算法中,每次更新参数时,都是根据当前的梯度来更新的。而在动量法中,更新的方向不仅受当前的梯度影响,还受之前更新方向的影响。具体来说,动量法引入了一个动量变量
v
v
v,它表示之前的梯度方向的加权平均值。在每次参数更新时,不仅使用当前的梯度来更新参数,还将之前的动量方向进行一定比例的保留,以平滑更新的方向。动量法的公式如下:
v
t
=
β
v
t
−
1
+
(
1
−
β
)
∇
J
(
θ
t
)
v_{t} = \beta v_{t-1} + (1-\beta) \nabla J(\theta_{t})
vt=βvt−1+(1−β)∇J(θt)
θ
t
+
1
=
θ
t
−
α
v
t
\theta_{t+1} = \theta_{t} - \alpha v_{t}
θt+1=θt−αvt 其中,
∇
J
(
θ
t
)
\nabla J(\theta_{t})
∇J(θt) 表示当前时刻
t
t
t 的梯度,
θ
t
\theta_{t}
θt 表示当前时刻的参数值,
α
\alpha
α 表示学习率,
0
≤
β
≤
1
0 \leq \beta \leq 1
0≤β≤1 表示动量系数。在每次参数更新时,动量项
β
v
t
−
1
\beta v_{t-1}
βvt−1 对应之前的更新方向,梯度项
(
1
−
β
)
∇
J
(
θ
t
)
(1-\beta)\nabla J(\theta_{t})
(1−β)∇J(θt) 对应当前的梯度方向。由于动量项具有记忆性,可以减少梯度方向变化的影响,因此能够加速模型的收敛过程。下图是动量法示意图:
图片来源:https://d2l.ai/chapter_optimization/momentum.html
在图中,橙色的箭头表示当前时刻的梯度方向,绿色的箭头表示之前的动量方向。使用动量法之后,梯度方向与之前的动量方向进行了一定比例的加权平均,更新的方向更加平滑,能够更快地收敛到局部最优解。同时,由于动量系数
β
\beta
β 能够平衡当前梯度和之前动量的影响,因此能够避免参数更新过程中出现震荡或者震荡幅度过大的情况。
在实践中,动量法是一种非常有效的优化算法,能够加速模型的收敛过程,减少训练时间。通常,动量系数
β
\beta
β 的取值范围在 0.8 到 0.99 之间。
自适应梯度算法
自适应梯度算法是优化神经网络中使用的一种常见算法,它能够根据梯度的变化来自适应地调整学习率,从而更好地优化模型。以Adam算法为例:Adam (Adaptive Moment Estimation)是一种自适应的梯度下降算法,其可以动态地调整每个参数的学习率以及每个参数的动量大小。Adam算法是一种结合了动量法和RMSProp算法的优化算法。详情参考动手学深度学习对Adam算法的讲解;