神经网络基础

本文介绍了人工智能研究中的人工神经网络,特别是多层感知器的概念,涵盖了神经元、连接权重、激活函数(Sigmoid、Tanh、ReLU、Softmax)等关键概念。详细讨论了这些函数的特点和在深度学习中的应用,以及如何使用PyTorch的Module和Sequential容器构建神经网络模型。
摘要由CSDN通过智能技术生成

人工智能的研究者为了模拟人类的认知,提出了不同的模型。人工神经网络是人工智能中非常重要的一个学派——连接主义最为广泛使用的模型。在传统上,基于规则的符号主义学派认为,人类的认知是基于信息中的模式;而这些模式可以被表示成为符号,并可以通过操作这些符号,显式地使用逻辑规则进行计算与推理。

基于统计的连接主义的模型则从脑神经科学中获得启发,试图将认知所需的功能属性结合到模型中,通过模拟生物神经网 络的信息处理方式来构建具有认知功能的模型。类似于生物神经元与神经网络,这类模型具有3个特点:
(1)拥有处理信号的基础单元;
(2)处理单元之间以并行方式连接
(3)处理单元之间的连接是有权重的。
这类模型被称为人工神经网络,多层感知器是最为简单的一种。

 基础概念


要想了解多层感知器,需要先了解以下几个概念。
1. 神经元 :神经元是基本的信息操作和处理单位。它接收一组输入,将这组输入加权求和后,由激活函数来计算该神经元的输出。
2.输入:一个神经元可以接收一组张量作为输入x={x1,x2,...,xn}T。
3.连接权值:连接权值向量为一组张量W={w1,w2,...,wn} ,其中wi对应输入xi的连接权值;神经元将输入进行加权求和:写成向量式:s=wx

4.偏置:有时候加权求和会加上一项常数项b作为偏置,其中张量b的形状要与Wx的形状保持一致:
s=Wx+b

5.激活函数:激活函数f(∙)被施加到输入加权和sum上,产生神经元的输出;这里,若sum为大于1阶的张量,则f(∙)被施加到sum的每一个元素上 o=f(sum) 常用的激活函数有SoftMax、Sigmoid、Tanh、ReLU等

6.输出:激活函数的输出o即为神经元的输出。 一个神经元可以有多个输出o_1,o_2,…,o_m对应于不同的激活函数f_1,f_2,…,f_m

7.神经网络:神经网络是一个有向图,以神经元为顶点,神经元的输入为顶点的入边,神经元的输出为顶点的出边。 因此神经网络实际上是一个计算图,直观地展示了一系列对数据进行计算操作的过程。

8.训练:神经网络中计算操作被预定义,而要使得输入数据通过这些操作之后得到预期的输出,则需要根据一些实际的例子,对神经网络内部的参数进行调整与修正;这个调整与修正内部参数的过程称为训练,训练中使用的实际的例子称为训练样例。

9.监督训练:在监督训练中,训练样本包含神经网络的输入与预期输出;对于一个训练样本〈X,Y〉, 将X输入神经网络,得到输出Y′;我们通过一定的标准计算Y^′与Y之间的训练误差,并将这种误差反馈给神经网络,以便神经网络调整连接权重及偏置。

10.非监督训练:在非监督训练中,训练样本仅包含神经网络的输入。

激活函数

在神经网络中,全连接层只是对上层输入进行线性变换,而多个线性变换的叠加仍然是一个线性变换,即含有多个全连接层的神经网络与仅含输出层的单层神经网络等价。解决问题的一个方法是,在全连接层后增加一个非线性的变换,将非线性变换后的结果作为下一个全连接层的输入。这个非线性函数被称为激活函数(Activation Function),神经网络可以逼近任意函数的能力与激活函数的使用不可分割。常见的激活函数有Sigmoid、Tanh、ReLU和Softmax等

(1)Sigmoid函数

Sigmoid函数是一个在生物学中常见的S型函数,也称为S型生长曲线。 在信息科学中,由于其单增以及反函数单增等性质,Sigmoid函数常被用作神经网络的阈值函数,将变量映射到0到1之间。 Sigmoid函数的表达式如式所示,其中x为神经元的输入值。Sigmoid函数的几何表达如图所示由图可知,纵坐标的范围在0~1的区间内,随着横坐标值从左往右增大,曲线的纵坐标值从0无限趋近于1,表示Sigmoid函数的输出范围是0到1,即对每个神经元的输出进行了归一化。 由于概率的取值范围是0到1,因此Sigmoid函数非常适合用在以预测概率作为输出的模型中。

Sigmoid的优缺点:

优点: Sigmoid的取值范围为(0, 1),而且是单调递增,比较容易优化。 Sigmoid求导比较容易,可以直接推导得出。 缺点:Sigmoid函数收敛比较缓慢。 由于Sigmoid是软饱和,容易产生梯度消失,对于深度网络训练不太适合,由上页图可知,当x趋于无穷大时,会使导数趋于0。

sigmoid类的语法格式如下,其中参数“input”表示输入值。 torch.nn.functional.sigmoid(input)

(2)Tanh函数

Tanh函数是双曲正切激活函数。 Tanh函数的表达式如式所示,其中x为神经元的输入值。Tanh函数的几何表达如图所示

由图可知,当横坐标值趋于负无穷时,纵坐标值无限趋近于-1。 当横坐标值趋于正无穷时,纵坐标值无限趋近于1。 当输入的绝对值大于5时,输出几乎是平滑的并且梯度较小,不利于权重更新。Tanh函数跟Sigmoid函数的区别在于输出间隔,Tanh的输出间隔为2,并且整个函数以0为中心。 在一般的二元分类问题中,Tanh函数常用于隐藏层,而Sigmoid函数常用于输出层。 但这并不是固定的,需要根据特定问题进行调整

tanh函数的优缺点:

优点:函数输出以(0,0)为中心;收敛速度相对于Sigmoid更快。 缺点: Tanh并没有解决Sigmoid梯度消失的问题;含有较多的幂运算,增加计算所需的时间。

tanh类的语法格式如下,其中参数“input”表示输入值。 torch.nn.functional.tanh(input)

(3)softmax函数

Softmax函数常在神经网络输出层充当激活函数,将输出层的值映射到(0,1)区间,将神经元输出构造成概率分布,用于多分类问题中,Softmax激活函数映射值越大,则真实类别可能性越大。 Softmax函数的表达式如式所示,其中i为输入神经元的第i个元素。      由式可知,Softmax函数为指数形式的函数,且映射后的数值受映射前所有数值的影响。

Softmax函数的优缺点:

优点:指数函数求导的时候比较方便,加快模型的训练;能够将输出值拉开距离,使不同类间的区别更明显。 缺点: 通过Softmax函数计算得到的数值有可能会变得过大从而导致溢出; 输入均为负时,可能会出现梯度为0。

softmax类的语法格式如下。 torch.nn.functional.softmax(input, dim=None, _stacklevel=3, dtype=None)

softmax类的常用参数及其说明如表所示

(4)ReLU函数

线性整流函数(Rectified Linear Unit,ReLU),又称修正线性单元,是一种人工神经网络中常用的激活函数,通常指代以斜坡函数及其变种为代表的非线性函数。 ReLU函数的表达式如式所示,其中x为神经元的输入值。ReLU函数的几何表达如图所示:由图可知,当输入为正时,ReLU函数的输入与输出均始终保持线性关系,当输入趋于正无穷时,输出也趋于正无穷;当输入为负值时,输出为0。

ReLU函数的优缺点:

优点:反向传播时,可以避免梯度消失。 使一部分神经元的输出为0,形成稀疏网络,减少了参数的相互依存关系,缓解了过拟合问题的发生。 求导简单,整个过程的计算量节省很多。

缺点:左侧神经元为0,导致部分神经元死亡,不再更新。 输出非负,所有参数的更新方向都相同,可能导致梯度下降时出现震荡。

relu类的语法格式如下。 torch.nn.functional.relu(input, inplace=False)

relu类的常用参数说明如表所示

(5)Leaky ReLU函数

Leaky ReLU激活函数是ReLU激活函数的变式,主要是为了修复ReLU激活函数中负轴为0导致的问题。 Leaky ReLU激活函数的负轴保留了非常小的常数,使得输入信息小于0时,信息得到保留。 Leaky ReLU函数的表达式如式所示,其中x为神经元的输入值, α为非负的小数。

Leaky ReLU函数的几何表达如图所示

leaky_relu类的语法格式如下,leaky_relu类的常用参数说明与torch.nn.functional.relu类一致。 torch.nn.functional.leaky_relu(input, negative_slope=0.01, inplace=False)

神经网络

神经网络是一个有向图,以神经元为顶点,神经元的输入为顶点的入边,神经元的输出为顶点的出边。 因此神经网络实际上是一个计算图,直观地展示了一系列对数据进行计算操作的过程。 神经网络是一个端到端的系统,这个系统接受一定形式的数据作为输入,经过系统内的一系列计算操作后,给出一定形式的数据作为输出;系统内的运算可以被视为一个黑箱子,这与人类的认知在一定程度上具有相似性。 通常地,为了直观起见,人们对神经网络中的各顶点进行了层次划分。

输入层: 接受来自网络外部的数据的顶点,组成输入层。 输出层: 向网络外部输出数据的顶点,组成输出层。 隐藏层: 除了输入层和输出层以外的其他层,均为隐藏层

常用的网络构建方法

在深度学习中,构建网络通常是搭建一个完整的神经网络结构。 神经网络(Neural Networks)是一种应用类似于大脑神经突触连接的结构进行信息处理的算法。 神经网络已经被用于解决分类、回归等问题,同时被运用在机器视觉、语音识别等应用领域上。 神经网络是由具有适应性的简单单元组成的广泛并行互连网络,它的结构能够模拟生物神经系统对真实世界的交互反应。

将多个神经元按一定的层次结构连接起来,即可得到一个神经网络。 使用神经网络需要确定网络连接的拓扑结构、神经元的特征和学习规则等。 常见的神经网络的层级结构如图所示,每层神经元与下一层的神经元全部互连,同层之间神经元不存在连接关系。 图为简单的全连接神经网络,其中输入层神经元接收信号,最终输出结果由输出层神经元输出。隐含层是指除了输入、输出层以外的其他层,是模型的黑箱部分,通常可解释性较差。 值得注意的是,如果单个隐含层网络不能满足实际生产需求,那么可在网络中设置多个隐含层。 深度学习神经网络中的常见的网络层有卷积层、池化层、正则化层、归一化层和全连接层。 网络层的先后顺序通常是,卷积层优先构造,池化层放置在卷积层之后,正则化层和归一化层放置在整个网络中间偏后的位置,全连接层放置在网络的后端或多个卷积层后。 在PyTorch框架中,常用的构建网络的方法有继承Module类使用Sequential容器

继承Module类构建网络

Module类是PyTorch框架提供的一个基类,在搭建神经网络时候可以通过继承Module类,使得搭建网络的过程变得简单。 继承Module类构建网络,其中__init__()方法初始化了网络中需要使用的网络层,完全相同的网络层可以仅初始化一次,但多次进行调用,forward()方法用于设置网络中数据的传播,并返回网络的输出。 从Layer列中可以查看所构建网络的结构,从Output Shape列中可以查看每层网络输出数据的维度。 从Param列中可以查看每层网络的参数个数。

要继承torch.nn.Module类构建网络,首先需要导入torch.nn模块,然后创建一个新类并继承torch.nn.Module。在新类中,需要定义__init__方法和forward方法。__init__方法用于初始化网络层,forward方法用于定义前向传播过程。

以下是一个简单的示例:

import torch
import torch.nn as nn

class MyNetwork(nn.Module):
    def __init__(self):
        super(MyNetwork, self).__init__()
        self.layer1 = nn.Linear(10, 20)
        self.layer2 = nn.Linear(20, 30)
        self.layer3 = nn.Linear(30, 40)

    def forward(self, x):
        x = torch.relu(self.layer1(x))
        x = torch.relu(self.layer2(x))
        x = self.layer3(x)
        return x

net = MyNetwork()
print(net)

在这个示例中,我们创建了一个名为MyNetwork的类,它继承了torch.nn.Module。在__init__方法中,我们定义了三个线性层。在forward方法中,我们定义了前向传播过程,包括激活函数ReLU。最后,我们创建了一个MyNetwork实例并打印出网络结构。

使用Sequential容器构建网络

Sequential是一个有序的容器,网络层将按照在传入构造器的顺序依次被添加到计算图中执行,使用Sequential容器构建网络。 同时以神经网络模块为元素的有序字典也可以作为Sequential容器的传入参数

Sequential容器是一种用于简化神经网络模型搭建的时序容器,它可以将各种层按顺序添加到容器中。

Sequential容器在深度学习框架PyTorch中是一个非常实用的工具,它允许用户以线性的方式组织神经网络的各层。以下是一些关于Sequential容器的详细信息:

  1. 顺序添加层:用户可以将神经网络的不同层按照它们在模型中的顺序依次添加到Sequential容器中。这些层会按照添加的顺序执行,确保数据在模型中的流动是有序的。
  2. 简化模型搭建:使用Sequential容器可以简化模型的搭建过程,因为它允许用户不必关心每一层之间的连接细节,只需关注每一层如何添加即可。
  3. 灵活性:Sequential容器可以从头开始构建模型,也可以在其他容器(如Sequential、Functional、Subclass)中构建模型,还可以与其他容器组合使用,提供了很高的灵活性。
  4. 容器类型:在PyTorch中,除了Sequential容器,还有其他类型的容器,如ModuleList和ModuleDict,它们各自有不同的用途和特点。Sequential是其中一种简单且常用的容器类型。
  5. 使用方法:要使用Sequential容器,通常需要先导入torch.nn模块,然后创建一个Sequential对象,并向其添加所需的层。例如,一个基本的多层感知器(MLP)可以通过向Sequential容器中添加线性层(Linear)和激活函数层(如ReLU)来构建。

总的来说,Sequential容器是PyTorch中构建神经网络模型的一种基本工具,它以其简单和直观的特点,帮助用户快速实现模型的搭建。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值