机器学习之神经网络(从神经网络结构到pytorch基本用法)

本文详细介绍了神经网络的基本概念、结构与训练方法,并深入探讨了常用的激活函数、损失函数及优化器。同时,提供了PyTorch的基础使用指南,包括张量操作、自动求导机制、神经网络构建及训练过程的可视化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

机器学习之神经网络(从神经网络结构到pytorch基本用法)

1.神经网络概念

1.1 网络结构

​ 人工神经网络(artificial neural network,ANN),简称神经网络(neural network,NN),是一种模仿生物神经网络的结构和功能的数学模型或计算模型。神经网络由大量的人工神经元联结进行计算。大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统。现代神经网络是一种非线性统计性数据建模工具,常用来对输入和输出间复杂的关系进行建模,或用来探索数据的模式。

1.1.1神经网络基本结构

在这里插入图片描述

​ 这是一个包含三个层次的神经网络。红色的是输入层,绿色的是输出层,紫色的是中间层(也叫隐藏层)。输入层有3个输入单元,隐藏层有4个单元,输出层有2个单元。

  • 设计一个神经网络时,输入层与输出层的节点数往往是固定的(输入层为输入向量的维度、输出层为输出向量的维度),中间层则可以自由指定;
  • 神经网络结构图中的拓扑与箭头代表着预测过程时数据的流向,跟训练时的数据流有一定的区别;
  • 结构图里的关键不是圆圈(代表“神经元”),而是连接线(代表“神经元”之间的连接)。每个连接线对应一个不同的权重(其值称为权值),这是需要训练得到的。
1.1.2基本组成——神经元

​ 1943年,心理学家McCulloch和数学家Pitts参考了生物神经元的结构,发表了抽象的神经元模型MP。神经元模型是一个包含输入,输出与计算功能的模型。输入可以类比为神经元的树突,而输出可以类比为神经元的轴突,计算则可以类比为细胞核。一个典型的神经元模型可以表示如下:

在这里插入图片描述

​ 连接是神经元中最重要的的东西,每一个连接上都有一个权重。一个神经网络的训练算法就是让权重的值调整到最佳,使得整个网络的预测效果最好。我们使用a来表示输入,用w来表示权值。一个表示连接的有向箭头可以这样理解:在初端,传递的信号大小仍然是a,端中间有加权参数w,经过这个加权后的信号会变成a×w,因此在连接的末端,信号的大小就变成了a×w。在神经元模型中,每个有向箭头表示的是值的加权传递。

在这里插入图片描述

将所有符号用变量来表示:

在这里插入图片描述

可见z是在输入和权值的线性加权和叠加了一个函数g的值。在MP模型里,函数g是sgn函数,也就是取符号函数。这个函数当输入大于0时,输出1,否则输出0。

可以将神经元进行扩展,如下图所示:

在这里插入图片描述

​ 当我们用“神经元”组成网络以后,描述网络中的某个“神经元”时,我们更多地会用“单元”(unit)来指代。同时由于神经网络的表现形式是一个有向图,有时也会用“节点”(node)来表达同样的意思。

​ 这里,三个已知属性的值是a1,a2,a3,未知属性的值是z。z可以通过公式计算出来。已知的属性称之为特征,未知的属性称之为目标。假设特征与目标之间确实是线性关系,并且我们已经得到表示这个关系的权值w1,w2,w3。那么,我们就可以通过神经元模型预测新样本的目标。

1.1.3单层神经网络(感知机)

​ 1958年,计算科学家Rosenblatt提出了由两层神经元组成的神经网络。他给它起了一个名字–“感知器”(Perceptron)。在“感知器”中,有两个层次,分别是输入层和输出层。==输入层里的“输入单元”只负责传输数据,不做计算。输出层里的“输出单元”则需要对前面一层的输入进行计算。==我们把需要计算的层次称之为“计算层”,并把拥有一个计算层的网络称之为“单层神经网络”。一个3输入、2输出的单层神经网络如下图所示:

在这里插入图片描述

​ 记输入变量为列向量 [ a 1 a 2 a 3 ] T [a_1 \quad a_2 \quad a_3]^T [a1a2a3]T,用向量a来表示;输出向量为列向量 [ z 1 z 2 ] T [z_1 \quad z_2]^T [z1z2]T,用向量z来表示;权重为矩阵 [ w 1 , 1 w 1 , 2 w 1 , 3 w 2 , 1 w 2 , 2 w 2 , 3 ] [\begin{matrix} w_{1,1}&w_{1,2} &w_{1,3}\\w_{2,1}&w_{2,2} &w_{2,3}\end{matrix}] [w1,1w2,1w1,2w2,2w1,3w2,3],用向量W表示。可以将输出公式表示为:
g ( W ⋅ a ) = z g(W·a)=z g(Wa)=z
依靠这个公式将神经网络中从前一层计算到后一层。

​ 感知器类似一个逻辑回归模型,可以做==线性分类任务==。

1.1.4两层神经网络(多层感知机)

​ 1986年,RumelharHinton等人提出了反向传播(Backpropagation,BP)算法,解决了两层神经网络所需要的复杂计算量问题,从而带动了业界使用两层神经网络研究的热潮。两层神经网络除了包含一个输入层,一个输出层以外,还增加了一个中间层。此时,中间层和输出层都是计算层。

在这里插入图片描述

使用矩阵运算来表达整个计算公式的话如下:
g ( W ( 1 ) ⋅ a ( 1 ) ) = a ( 2 ) g(W^{(1)}·a^{(1)})=a^{(2)} g(W(1)a(1))=a(2)

g ( W ( 2 ) ⋅ a ( 2 ) ) = z g(W^{(2)}·a^{(2)})=z g(W(2)a(2))=z

此外,考虑偏置节点,它本质上是一个只含有存储功能,且存储值永远为1的单元。在神经网络的每个层次中,除了输出层以外,都会含有这样一个偏置单元。偏置单元与后一层的所有节点都有连接,我们设这些参数值为向量b,称之为偏置。

在这里插入图片描述

在考虑了偏置以后的一个神经网络的矩阵运算如下:
g ( W ( 1 ) ⋅ a ( 1 ) + b ( 1 ) ) = a ( 2 ) g ( W ( 2 ) ⋅ a ( 2 ) + b ( 2 ) ) = z g(W^{(1)}·a^{(1)}+b^{(1)})=a^{(2)}\\ g(W^{(2)}·a^{(2)}+b^{(2)})=z g(W(1)a(1)+b(1))=a(2)g(W(2)a(2)+b(2))=z

​ 在两层神经网络中,我们不再使用sgn函数作为函数g,而是使用平滑函数sigmoid作为函数g。我们把函数g也称作激活函数(active function)。事实上,神经网络的本质就是通过参数与激活函数来拟合特征与目标之间的真实函数关系

​ 理论证明,两层神经网络可以无限逼近任意连续函数。也就是说,面对**复杂的非线性分类任务,两层(带一个隐藏层)神经网络可以分类的很好。从输入层到隐藏层时,数据发生了空间变换。也就是说,两层神经网络中,隐藏层对原始的数据进行了一个空间变换,使其可以被线性分类,然后输出层的决策分界划出了一个线性分类分界线,对其进行分类。这样就导出了两层神经网络可以做非线性分类的关键——隐藏层。联想到我们一开始推导出的矩阵公式,我们知道,矩阵和向量相乘,本质上就是对向量的坐标空间进行一个变换。因此,隐藏层的参数矩阵的作用就是使得数据的原始坐标空间从线性不可分,转换成了线性可分。两层神经网络通过两层的线性模型模拟了数据内真实的非线性函数。因此,多层的神经网络的本质就是复杂函数拟合**。

​ 在设计一个神经网络时,输入层的节点数需要与特征的维度匹配,输出层的节点数要与目标的维度匹配。而中间层的节点数,却是由设计者指定的。因此,“自由”把握在设计者的手中。但是,节点数设置的多少,却会影响到整个模型的效果。如何决定这个自由层的节点数呢?目前业界没有完善的理论来指导这个决策。一般是根据经验来设置。较好的方法就是预先设定几个可选值,通过切换这几个值来看整个模型的预测效果,选择效果最好的值作为最终选择。这种方法又叫做Grid Search(网格搜索)

1.1.5多层神经网络(深度学习)

​ 2006年,Hinton在《Science》和相关期刊上发表了论文,首次提出了“深度信念网络”的概念。与传统的训练方式不同,“深度信念网络”有一个“预训练”(pre-training)的过程,这可以方便的让神经网络中的权值找到一个接近最优解的值,之后再使用“微调”(fine-tuning)技术来对整个网络进行优化训练。这两个技术的运用大幅度减少了训练多层神经网络的时间。他给多层神经网络相关的学习方法赋予了一个新名词–“深度学习”。

​ 延续两层神经网络的方式来设计一个多层神经网络。在两层神经网络的输出层后面,继续添加层次。原来的输出层变成中间层,新加的层次成为新的输出层。

在这里插入图片描述

依照这样的方式不断添加,我们可以得到更多层的多层神经网络。公式推导的话其实跟两层神经网络类似,使用矩阵运算的话就仅仅是加一个公式而已。推导公式如下:
g ( W ( 1 ) ⋅ a ( 1 ) + b ( 1 ) ) = a ( 2 ) g ( W ( 2 ) ⋅ a ( 2 ) + b ( 2 ) ) = a ( 3 ) g ( W ( 3 ) ⋅ a ( 3 ) + b ( 3 ) ) = z g(W^{(1)}·a^{(1)}+b^{(1)})=a^{(2)}\\ g(W^{(2)}·a^{(2)}+b^{(2)})=a^{(3)}\\ g(W^{(3)}·a^{(3)}+b^{(3)})=z\\ g(W(1)a(1)+b(1))=a(2)g(W(2)a(2)+b(2))=a(3)g(W(3)a(3)+b(3))=z
​ 多层神经网络中,输出也是按照一层一层的方式来计算。从最外面的层开始,算出所有单元的值以后,再继续计算更深一层。只有当前层所有单元的值都计算完毕以后,才会算下一层。有点像计算向前不断推进的感觉。所以这个过程叫做“正向传播”。

  • 网络参数个数的计算

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

与两层神经网络不同,多层神经网络中的层数增加了很多。增加更多的层次有什么好处?更深入的表示特征,以及更强的函数模拟能力。

​ 更深入的表示特征可以这样理解,随着网络的层数增加,每一层对于前一层次的抽象表示更深入。在神经网络中,每一层神经元学习到的是前一层神经元值的更抽象的表示。例如第一个隐藏层学习到的是**“边缘”的特征,第二个隐藏层学习到的是由“边缘”组成的“形状”的特征,第三个隐藏层学习到的是由“形状”组成的“图案”的特征,最后的隐藏层学习到的是由“图案”组成的“目标”**的特征。通过抽取更抽象的特征来对事物进行区分,从而获得更好的区分与分类能力。

​ 更强的函数模拟能力是由于随着层数的增加,整个网络的参数就越多。而神经网络其实本质就是模拟特征与目标之间的真实关系函数的方法,更多的参数意味着其模拟的函数可以更加的复杂,可以有更多的容量(capcity)去拟合真正的关系。

通过研究发现,在参数数量一样的情况下,更深的网络往往具有比浅层的网络更好的识别效率。

​ 在单层神经网络时,我们使用的激活函数是sgn函数。到了两层神经网络时,我们使用的最多的是sigmoid函数。而到了多层神经网络时,通过一系列的研究发现,ReLU函数在训练多层神经网络时,更容易收敛,并且预测性能更好。在深度学习中,泛化技术变的比以往更加的重要。这主要是因为神经网络的层数增加了,参数也增加了,表示能力大幅度增强,很容易出现过拟合现象。因此正则化技术就显得十分重要。

1.2权重更新(训练)

​ 从两层神经网络开始,神经网络的研究人员开始使用机器学习相关的技术进行神经网络的训练。例如用大量的数据(1000-10000左右),使用算法进行优化等等,从而使得模型训练可以获得性能与数据利用上的双重优势。

​ 机器学习模型训练的目的,就是使得参数尽可能的与真实的模型逼近。具体做法是这样的。首先给所有参数赋上随机值。我们使用这些随机生成的参数值,来预测训练数据中的样本。样本的预测目标为yp,真实目标为y。那么,定义一个值Loss,计算公式如下:
L o s s = ( y p − y ) 2 Loss=(y_p-y)^2 Loss=(ypy)2
这个值称之为损失(Loss),我们的目标就是使对所有训练数据的损失和尽可能的小。如果将先前的神经网络预测的矩阵公式带入到*** y p

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值