目录
一、线性回归
1.线性回归
线性回归本质就是建立一个线性方程拟合给定的自变量和因变量,线性回归即找寻一个例如y=wx+b形式的方程,拟合x,y之间的关系,这里x可以是单变量也可以是多维变量。例子:以房屋面积(m^2)为自变量x,房屋总价格为因变量y搜集一组数据,其数据点如下图所示,直观来看数据x,y之间存在线性相关性,我们用直线拟合二者之间的关系,例如,这个关系可以用y=wx+b表示。
上面问题只有一个自变量面积x,如果我们再考虑将房屋的年龄也看做影响房屋价格的变量,为了区分将两个变量分别命名为x1,x2,这样价格y可表示为:y=w1*x1+w2*x2+b。如果加入更多的自变量x3,...,xn,这是可以将其写为向量的形式:,此处黑体的w,x均为向量形式。
2.优化问题
一个好的拟合模型,样本点数据应该尽可能的贴近这条直线,为了衡量样本点对拟合直线的贴合成度,提出了代价函数(误差函数的概念)。将拟合模型定义为参数w和b的函数h(w,b),损失函数L(w,b)可以定义为:
这里采用的实际是最小二乘法即,衡量回归模型的计算值与实际数据的差异。这样,线性回归问题就变成了使得L(w,b)最小的优化问题。即最小化
,此函数的极小点只有一个,将损失函数关于参数w的导数设为0,得到解析解:(这里可以将常熟项b看作x=1时,w为b值,也就是将将原式子看作
,如果原来是有n个x这时就变成了n+1个)
“像线性回归这样的简单问题存在解析解,但并不是所有的问题都存在解析解。解析解可以进行很好的数学分析,但解析解对问题的限制很严格,导致它无法广泛应用在深度学习里。”下面介绍其他解法——梯度下降法。
3.梯度下降法
梯度:梯度是一个向量,表示函数在某点处的局部特性,其方向为该点处函数值变化最快的方向,大小为在该点处最大变化率。以二元函数为例:
上述可知最优解位于极值点处,即损失函数导数为0的地方(这里最优解应该是只有一个),但是大多时候我们构造的代价函数无法直接求出解析解(下面的分类器中会出现的非线性代价函数),为了求得最优解即可通过梯度下降法:通过不断地在损失函数递减的方向上更新参数来降低误差(直观感受即在误差函数上一步步迭代朝着最小值靠近),即令每次即可。则可通过下式实现:
;其中令
二、分类器
不同于线性回归,分类问题是实现多种数据的划分。回归是输入自变量通过机器学习得到因变量的预测数据;分类则是得到输入数据属于某一个类别的概率(每一条数据属于任意一个类别的概率都不是0,比如属于3个类别的概率分别为0.7,0.2,0.1这时我们就说该数据被划分为第1类)。
1.二分类
(1)归回角度
下图为一组具有二维(x1,x2)特征的数据点,共两类,设这两类的标签为0,1。我们需要找一个直线(当数据点维度大于2时我们需要的是一个分类超平面),将两类数据完全划分开。
我们希望分类器的输出是一组概率,即(0,1)范围内的一组数,我们需要将数据进行变换得到在0-1范围内的数据。能够实现这一变换的是sigmoid函数,其表达式和函数图像如下图:
参考回归,此时代价函数表达式:
相比于回归模型,这里只是引入了sigmoid函数(因为输出仍然是一个具体的数,如果将两个类别用0,1分别表示,认为输出值小于0.5为第一类0,大于0.5则认为是第二类1),故又称为sigmoid回归。由于此时代价函数含有非线性的sigmoid函数,不能解析求解,利用梯度下降法,在一定误差范围内找到取得最小值的参数。
(2)概率角度
条件概率公式理解二分类器的数学模型:
从概率的角度,我们希望训练所得的参数,能够使在y=1(即数据属于第一类情况下)模型的输出值
越大越好(>0.5的基础上)。这就是极大似然法则:似然法则旨在找出令P(Y=
)=
为最大概率值时的参数
,即建立的学习网络模型应该为使得某随机事件
出现的概率最大。对上述条件概率两边取log,将幂次运算和乘法运算降维为乘法和加法。
我们训练模型的目的即令上式的结果最大,则相应的代价函数可以写为下式即求:
2.多分类
多分类问题需要的分类超平面不止一个,我们想要得到的模型的输出不再是一个单纯的数,而是一组概率分布,即每一个数据属于不同类别的一组概率。
此时采用的非线性转换函数不再是sigmoid,而是softmax:
此时条件概率表达式为,1{}为指示函数,表示{}里的表达式成立。
仍然用极大似然的角度分析,我们可以设置代价函数为:
简写上述表达式,所得代价函数称为交叉熵损失函数:本质是对比两组数据分布的差异
三、神经元模型与感知机
1.神经元模型
MP模型认为人脑神经元之间的信息传输模型如上图所示,神经元将接收到的信息进行线性加权求和,当信息累计到达一定数值后(超过阈值),触发非线性的激活函数,再输出给下一个神经元。一般神经元之间传递的物理信息即电位,因此对神经元的电路模型的数学抽象至关重要。
常用的非线性激活函数有前面所述的sigmoid,softmax,还有relu,tahn等。非线性激活函数( Activation Function) - 知乎 (zhihu.com)
其中神经元的连接权重的更新遵循hebb法则即:
2.感知机模型
感知机(Perceptron)是1957年,由Rosenblatt提出,是神经网络和支持向量机的基础,用来解决线性分类问题。其本质为找一个超平面实现数据的线性分类,定义点到超平面距离,感知机采用sign()作为非线性激活函数,即在x<0时y=-1,x≥0时,y=1,y=sign(
);对于任意一个样本点
有:
定义损失函数:
相应感知机的线性分类流程如下:
pytoch中封装的全连接网络用Linear表示,代码Linear(a,b)参数分别表示输入输出的特征维度分别是a,b
import numpy as np
import torch
from torch.utils import data
from d2l import torch as d2l
#构造数据集
true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = d2l.synthetic_data(true_w, true_b, 1000)
#数据读取
def load_array(data_arrays, batch_size, is_train=True): #@save
#is_train是个布尔值,表示是否希望数据迭代器对象在每个迭代周期内打乱数据
"""构造一个PyTorch数据迭代器"""
dataset = data.TensorDataset(*data_arrays)
return data.DataLoader(dataset, batch_size, shuffle=is_train)
batch_size = 10
data_iter = load_array((features, labels), batch_size)
'''为了验证是否正常工作,我们读取并打印第一个小批量样本,使用iter构造Python迭代器,并使用next从迭代器中获取第一项'''
next(iter(data_iter))
#nn是神经网络的缩写
from torch import nn
net = nn.Sequential(nn.Linear(2, 1))#这里输入特征维度为2,输出特征维度为1
#初始化模型参数
'''这里,我们指定每个权重参数应该从均值为0、标准差为0.01的正态分布中随机采样,偏置参b数将初始化为零'''
net[0].weight.data.normal_(0, 0.01)
net[0].bias.data.fill_(0)
loss = nn.MSELoss()#定义损失函数:均方误差
trainer = torch.optim.SGD(net.parameters(), lr=0.03)#定义优化器,小批量随机梯度下降,学习率为0.03
#模型训练
num_epochs = 3#训练周期:由于数据较少,模型简单这个参数设置较小
for epoch in range(num_epochs):
for X, y in data_iter:
l = loss(net(X) ,y)#计算模型的训练损失
trainer.zero_grad()#zero_grad()避免在优化过程中梯度的不正确累积
l.backward()#误差反向传播计算
trainer.step()#执行了参数更新的操作
l = loss(net(features), labels)
print(f'epoch {epoch + 1}, loss {l:f}')
数据第一项读取结果如下图,数据总量为1000,batch_size=10每次取10组数据训练,训练一个周期需要100个batch.
模型的训练结果:
四、BP网络
1.多层前馈网络
原本的感知机无法解决非线性分类问题,解决办法即再多增加一层,在输入输出之间加一层隐含层(隐含层的层数是一个超参数)就构成的了多层感知机。
多层感知机是一种多层前馈网络, 由多层神经网络构成,每层网络将输出传递给下一层网络。神经元间的权值连接仅出现在相邻层之间,不出现在其他位置。如果每一个神经元都连接到上一层的所有神经元(除输入层外),则成为全连接网络。
2.BP网络
多层前馈网络的反向传播 (BP)学习算法,简称BP算法,是有导师的学习,它是梯度下降法在多层前馈网中的应用。根据前向传播所得的误差,沿着网络反向传播的方向去更新权重。
根据前述梯度下降法的迭代求最优方法,如果考虑对权重w更新则代价函数J对w求偏导,如果更新参数偏置b则需要J对b求偏导;考虑网络结构如上图有三层,现只考虑更新连接权重,定义代价函数为此形式:
神经网络的BP算法推导详解_bp神经网络算法步骤-CSDN博客
五、构建神经网络的基本步骤
1.加载相关库函数torch或者tensorflow
2.加载数据集,对数据集预处理,并划分为train,test,val:
- train是训练数据集。
- val(验证数据集)是训练过程中的测试集,可在边训练边看到训练的结果,及时判断学习状态。用于理想超参数的搜索和过度拟合的评估。
- test(测试数据集)就是训练模型结束后,用于评价模型结果的测试集其用来评估算法性能,但不会据此改变学习算法或参数。
注:只有train就可以训练,val不是必须的,test对于模型训练也不是必须的,但是一般都要预留一些用来检测,通常推荐比例是8:1:1。
3.构建神经网络模型(一般从较浅的层次尝试起)
4.设定超参数,学习率lr,批大小batch_size,损失函数loss,优化器(采用的梯度下降方式),训练周期epoch
5.过拟合和欠拟合:dropout和正则化可以避免过拟合
loss和val_loss
loss:训练集的损失值;val_loss:测试集的损失值。
一般训练规律:
1) loss下降,val_loss下降:训练网络正常,最理想情况情况。
2) loss下降,val_loss稳定:网络过拟合。
解决办法:①数据集没问题:可以向网络“中间深度”的位置添加Dropout层;或者逐渐减少网络的深度(靠经验删除一部分模块)。②数据集有问题:可将所有数据集混洗重新分配,通常开源数据集不容易出现这种情况。
3) loss稳定,val_loss下降:数据集有严重问题,建议重新选择。一般不会出现这种情况。
4) loss稳定,val_loss稳定:学习过程遇到瓶颈,需要减小学习率(自适应动量优化器小范围修改的效果不明显)或batch数量。
5) loss上升,val_loss上升:可能是网络结构设计问题、训练超参数设置不当、数据集需要清洗等问题。属于训练过程中最差情况。
参考阅读:1.动手学深度学习《动手学深度学习》 — 动手学深度学习 2.0.0 documentation (d2l.ai)
2.《深度学习》陈蔼祥