神经网络与深度学习课程总结(一)

本文介绍了线性回归的原理、优化问题中的代价函数和梯度下降法,随后探讨了分类器(包括二分类和多分类)及其使用的sigmoid和softmax函数。重点讲解了神经元模型(包括感知机)和BP网络的多层前馈结构以及反向传播学习算法。最后概述了构建神经网络的基本步骤和应对过拟合的策略。
摘要由CSDN通过智能技术生成

一、线性回归

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,这是可以将其写为向量的形式:y=\mathbf{w}^{\top }\boldsymbol{x}+b,此处黑体的w,x均为向量形式。

2.优化问题

一个好的拟合模型y=\mathbf{w}^{\top }\boldsymbol{x}+b,样本点数据应该尽可能的贴近这条直线,为了衡量样本点对拟合直线的贴合成度,提出了代价函数(误差函数的概念)。将拟合模型定义为参数w和b的函数h(w,b),损失函数L(w,b)可以定义为:

 这里采用的实际是最小二乘法即l^{^{(i)}}=\frac{1}{2}(\widehat{y}-y^{(i))})^{2},衡量回归模型的计算值与实际数据的差异。这样,线性回归问题就变成了使得L(w,b)最小的优化问题。即最小化\| y-wx \|^{^{2}},此函数的极小点只有一个,将损失函数关于参数w的导数设为0,得到解析解:(这里可以将常熟项b看作x=1时,w为b值,也就是将将原式子看作y=\mathbf{w}^{\top }\boldsymbol{x},如果原来是有n个x这时就变成了n+1个)

“像线性回归这样的简单问题存在解析解,但并不是所有的问题都存在解析解。解析解可以进行很好的数学分析,但解析解对问题的限制很严格,导致它无法广泛应用在深度学习里。”下面介绍其他解法——梯度下降法。

3.梯度下降法

梯度:梯度是一个向量,表示函数在某点处的局部特性,其方向为该点处函数值变化最快的方向,大小为在该点处最大变化率。以二元函数为例:

​上述可知最优解位于极值点处,即损失函数导数为0的地方(这里最优解应该是只有一个),但是大多时候我们构造的代价函数无法直接求出解析解(下面的分类器中会出现的非线性代价函数),为了求得最优解即可通过梯度下降法:通过不断地在损失函数递减的方向上更新参数来降低误差(直观感受即在误差函数上一步步迭代朝着最小值靠近),即令每次J(w_{k+1})<J(w_{k})即可。则可通过下式实现:

J(w_{k+1})=J(w_{k})+\left [ \frac{\mathrm{\mathit{d}\mathit{J}} }{\mathrm{\textit{d}} \mathit{w}} \right ]^{\top }\Delta w_{k};其中令\Delta w_{k}=-\alpha\frac{\mathrm{\mathit{d}\mathit{J}} }{\mathrm{\textit{d}} \mathit{w}} =-\alpha\triangledown_{w} J,\alpha >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函数,不能解析求解,利用梯度下降法,在一定误差范围内找到取得最小值的参数\theta

​(2)概率角度

条件概率公式理解二分类器的数学模型:

​从概率的角度,我们希望训练所得的参数\theta,能够使在y=1(即数据属于第一类情况下)模型的输出值h_{\theta }(x)越大越好(>0.5的基础上)。这就是极大似然法则:似然法则旨在找出令P(Y=)=p_{i}为最大概率值时的参数\theta ,即建立的学习网络模型应该为使得某随机事件 出现的概率最大。对上述条件概率两边取log,将幂次运算和乘法运算降维为乘法和加法。

​ 我们训练模型的目的即令上式的结果最大,则相应的代价函数可以写为下式即求\underset{\theta }{min}({-l(\theta )})

​  2.多分类

多分类问题需要的分类超平面不止一个,我们想要得到的模型的输出不再是一个单纯的数,而是一组概率分布,即每一个数据属于不同类别的一组概率。

​此时采用的非线性转换函数不再是sigmoid,而是softmax:

​此时条件概率表达式为p(y|x;\theta )=\prod_{j=1}^{k}f(x)_{j}^{1\left \{y=j \right \}},1{}为指示函数,表示{}里的表达式成立。

仍然用极大似然的角度分析,我们可以设置代价函数为\underset{\theta }{min}({-l(\theta )})

​简写上述表达式,所得代价函数称为交叉熵损失函数:本质是对比两组数据分布的差异

​三、神经元模型与感知机 

1.神经元模型

​MP模型认为人脑神经元之间的信息传输模型如上图所示,神经元将接收到的信息进行线性加权求和,当信息累计到达一定数值后(超过阈值),触发非线性的激活函数,再输出给下一个神经元。一般神经元之间传递的物理信息即电位,因此对神经元的电路模型的数学抽象至关重要。

常用的非线性激活函数有前面所述的sigmoid,softmax,还有relu,tahn等。非线性激活函数( Activation Function) - 知乎 (zhihu.com)

其中神经元的连接权重的更新遵循hebb法则即:

 2.感知机模型

感知机(Perceptron)是1957年,由Rosenblatt提出,是神经网络和支持向量机的基础,用来解决线性分类问题。其本质为找一个超平面实现数据的线性分类,定义点到超平面距离d=\frac{w^{T}x}{\left \| w \right \|},感知机采用sign()作为非线性激活函数,即在x<0时y=-1,x≥0时,y=1,y=sign(w^{T}x);对于任意一个样本点(x^{(i)},y^{(i)})有:

定义损失函数:

相应感知机的线性分类流程如下: 

 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求偏导;考虑网络结构如上图有三层,现只考虑更新连接权重,定义代价函数为l^{^{(i)}}=\frac{1}{2}(\widehat{y}-y^{(i))})^{2}此形式:

神经网络的BP算法推导详解_bp神经网络算法步骤-CSDN博客

五、构建神经网络的基本步骤

1.加载相关库函数torch或者tensorflow

2.加载数据集,对数据集预处理,并划分为train,test,val:

  1. train是训练数据集
  2. val(验证数据集)是训练过程中的测试集,可在边训练边看到训练的结果,及时判断学习状态。用于理想超参数的搜索和过度拟合的评估。
  3. test(测试数据集)就是训练模型结束后,用于评价模型结果的测试集其用来评估算法性能,但不会据此改变学习算法或参数。

注:只有train就可以训练,val不是必须的,test对于模型训练也不是必须的,但是一般都要预留一些用来检测,通常推荐比例是8:1:1。

3.构建神经网络模型(一般从较浅的层次尝试起)

4.设定超参数,学习率lr,批大小batch_size,损失函数loss,优化器(采用的梯度下降方式),训练周期epoch

5.过拟合和欠拟合:dropout和正则化可以避免过拟合

 lossval_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.《深度学习》陈蔼祥

  • 24
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值