当前位置: 首页 > news >正文

【人工智能基础二】人工神经网络基础

文章目录

    • 1. 神经元感知器模型
    • 2. 神经网络模型
    • 3. 学习方式
    • 4. 学习规则
      • 4.1. 正向传播求误差
      • 4.2. 反向传播求偏导(ing)
    • 5. 激活函数
    • 6. 梯度下降法
      • 6.1. 批量梯度下降
      • 6.2. 随机梯度下降
      • 6.3. 小批量梯度下降
    • 7. 交叉熵损失函数
    • 8. 过拟合与欠拟合

人工神经网络是基于生物学中脑认知神经网络的基本原理,模仿大脑神经系统工作原理所创建的数学模型,它有并行的分布处理能力、高容错性、自我学习等特征。

1. 神经元感知器模型

人工神经网络中最基本的单元叫神经元,又叫感知器,如图所示。它是模拟人脑神经系统的神经元(分析和记忆)树突(感知)轴突(传导)的工作原理,借助计算机的快速计算和存储来实现。

在这里插入图片描述

从上图可以看到,人工神经网络中一个基本的神经元由以下几个部分组成:

  • 输入 ( Input ) : 一个神经元可以接收多个输入 { x 1 , x 2 , . . . , x n ∣ x i ∈ R } \{x_1,x_2,...,x_n|x_i∈R\} {x1,x2,...,xnxiR}
  • 权值(Weight):每个输入都有一个权值 w i ∈ R w_i∈R wiR
  • 偏置值(Bias):b∈R
  • 激活函数(Activate Function):激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数, 从而可以应用到众多非线性模型中。
  • 输出(Output): 神经元输出,该输出可由下面公式计算: y = f { Σ i = 0 n ( w i ∗ x i ) + b } y = f\{ Σ_{i=0}^n(w_i * x_i) +b \} y=f{Σi=0n(wixi)+b}

 

2. 神经网络模型

下图为神经网络的结构模型图,最左边的层叫作输入层(Input Layer),最右边的层叫作输出层(Output Layer)。输入层和输出层之间的层叫作隐藏层(Hidden Layer)。含多个隐藏层的神经网络叫作深度神经网络。

对于拟合任意一个函数而言,浅层神经网络浅而宽,需要大量的神经元,而深层神经网络深而窄,需要更多的层和较 少的神经元。

一般来说深层网络参数更少,更节省资源,但是深层网络并不好训练,需要大量的数据和很好的技巧才能去拟合并训练出好的神经网络。

在这里插入图片描述

 

3. 学习方式

神经网络的学习方式很多,根据有无数据训练可以将其分为3大 类。
(1)有监督学习:将训练样本的数据加入到神经网络的输入端, 将期望答案和实际输出做差,可以得到误差信号,通过误差信号来调 整权值大小,以此来优化模型输出。
(2)无监督学习:首先并不给定标准数据样本,而是直接将网络 置于环境之中,由自身根据数据特征进行自动学习。
(3)半监督学习:输入信息介于有监督和无监督之间,不需要给 定标准数据样本,但需要对网络的输出做出评判,以此来调整网络参 数。

 

4. 学习规则

学习规则是用来修改神经网络的权值和偏置值的过程和方法,其目的是训练网络,更好地拟合应用的需求,从而完成特殊的任务。常见的学习规则有:

  • Hebb学习规则
  • Delta算法及
  • 反向传播算法(Back- propagation,BP)算法

 

BP算法基本思想

  • BP算法是人工神经网络较常采用的学习方法,其基本思想是逐一地由样本集中的样本 ( X k , Y k ) (X_k ,Y_k) (XkYk)计算出实际输出 O k O_k Ok和误差测度 E p E_p Ep,对 w 1 , w 2 , . . . , w n w_1,w_2,...,w_n w1w2...wn权值做调整,重复这个循环,直到误差降至最低。
  • 用输出层的误差调整输出层权值矩阵,并用此误差估计输出层的直接前导层误差,再用输出层前导层误差估计更前一层的误差,如此获得所有其他各层的误差估计,并用这些估计实现对权矩阵的修改,形成将输出端表现出的误差沿着与输入信号相反的方向逐级向输入端传递的链式求解过程。

 

BP算法学习过程:

  • BP算法学习过程应用到深度学习中分为两个子过程:输入数据正向传递子过程和误差数据反向传递子过程,即“正向传播求误差,反向传播求偏导”
  • 完整的学习过程是:对于一个训练样本,将输入正向传播到输出此时产生误差,然后将误差信号反向从输出层传递到输入层,利用该误差信号求出权重修改量 W j i ( h ) W_{ji}^{(h)} Wji(h) ( h表示层数),通过它更新权值 W j i ( h ) W_{ji}^{(h)} Wji(h) ,称为一次迭代过程。当误差或者 W j i ( h ) W_{ji}^{(h)} Wji(h)仍不满足要求时重复上述操作。

下图以三层神经网络模型为例,详细说明BP算法的原理及推导求解过程。

在这里插入图片描述

 

4.1. 正向传播求误差

在这里插入图片描述

至此,完成了从输入层到输出层的数学表达与计算推导。其中, 在初始化计算时,即第一次完成从输入经过隐藏层计算后到输出的权 值 矩阵的初始值,一般根据实际情况采用随机值或者经验值。

 

4.2. 反向传播求偏导(ing)

 

BP算法虽然是经典的深度学习算法,但对于深层网络仍然有许多不足,主要原因是Sigmoid激活函数易出现梯度减小甚至消失,这也是为什么深层卷积神经网络利用ReLU函数代替Sigmoid激活函数的原因。

 

5. 激活函数

激活函数又叫激励函数,主要作用是对神经元所获得的输入进行非线性变换以此反映神经元的非线性特性。常用的激活函数有以下几种类型。

激活函数描述
线性激活函数f(x) = kx + c
k、c为常数,线性函数常用于线性神经网络中
符号激活函数 f ( x ) = { 0 , x < 0 1 , x > = 0 f(x)=\{^{1 , x>=0}_{0, x<0} f(x)={0,x<01,x>=0
Sigmoid激活函数 f ( x ) = 1 / ( 1 + e − x ) f(x)=1/(1+e^{-x}) f(x)=1/(1+ex)
在这里插入图片描述
双曲正切激活函数在这里插入图片描述
高斯激活函数在这里插入图片描述
ReLU激活函数 f ( x ) = { 0 , x < 0 x , x > = 0 f(x)=\{^{x , x>=0}_{0, x<0} f(x)={0,x<0x,x>=0 也可表示为 f(x)=max(0,x)。

 

在神经网络中,ReLU激活函数得到广泛应用,如图5-10所示,尤其在卷积神经网络中,往往不选择Sigmoid或tanh函数而选择ReLU函数,原因有以下几点:
在这里插入图片描述

  1. 代价更小,计算速度更快:与Sigmoid函数必须计算指数和导数比较,ReLU代价小,计算速度更快
  2. 梯度不会丢失:Sigmoid函数导数最大值为1/4,并且链式求导导致梯度越来越小,训练深度神经网络容易导致梯度丢失,但是ReLU函数的导数为1,不会出现梯度下降,以及梯度消失问题,从而更易于训练深层网络。
  3. 较为理想的激活率:有研究表明,人脑在工作时只有大概5%的神经元被激活,而Sigmoid函数大概有50%的神经元被激活,而人工神经网络在理想状态时有15%~30%的激活率,所以ReLU函数在小于0的时候是完全不激活的,所以可以适应理想网络的激活率要求。

当然,没有一种完美的激活函数,不同的神经网络有不同的需求函数,需要根据具体的模型选取合适的激活函数。

 

6. 梯度下降法

梯度下降法是神经网络模型训练中最常用的优化算法之一。梯度下降法是一种致力于找到函数极值点的算法。前面介绍过,机器学习其实就是不断改进模型参数,以便通过大量训练步骤将损失最小化。 有了这个概念,将梯度下降法应用于寻找损失函数(Loss Function) 或代价函数(Cost Function)的极值点,便构成依据输入数据的模型进行自我优化的学习过程。

常见的梯度下降法主要有

  • 批量梯度下降法
  • 随机梯度下降法
  • 小批量梯度下降法

 

6.1. 批量梯度下降

批量梯度下降法是最原始的形式,它是指在每一次迭代时使用所有样本来进行梯度的更新。有以下几个优点,一是每次更新使用全部脚本,能更准确地朝向极值所在的方向。如果目标函数是凸函数,一定能收敛到全局最小值;二是他是对梯度的无偏估计,样例越多,估计越准确;三是一次迭代是对所有样本进行计算,可以利用向量化操作实现并行,但是BGD的缺点也很明显,一是遍历计算所有样本不仅耗时,而且需要大量资源,二是每次更新遍历所有样本,但有一些样本参数对参数更新价值不大;三是如果是非凸函数,可能会陷入局部最小值。其迭代的收敛曲线如下图:
在这里插入图片描述

6.2. 随机梯度下降

随机梯度下降不同于批量梯度下降,每次迭代时只使用一个样本对参数进行更新。优点一是每次只计算一个样本,更新速度大大加快;二是在学习过程中加入了噪声和随机性,提高了泛华误差;三是对于非凸函数,SGD算法的随机性有助于逃离某些不理想的局部最小值,获得全局最优解。缺点也很明显,一是更新所有样本需要大量时间;而是学习过程波动较大。其迭代的收敛曲线如上图。

 

6.3. 小批量梯度下降

小批量梯度下降介于以上两者之间,使用一个以上但不是全部的训练样本,即Batch Size。Batch Size通常是一个相对较小的数,如32128等。当训练集大小增加时,Batch Size保持不变。小批量梯度下降兼具批量梯度下降和随机梯度下降的特点,优点在于一是计算速度比BGD快,因为只比阿尼部分样例就可执行更新;二是每次不是使用全部样本,因此可以得到随机梯度下降的效果,非凸函数也不太容易陷入局部最优解。缺点在于一是学习过程会有更多的震荡,为更接近最小值,需要增加学习率衰减项,以降低学习率,避免过度震荡;而是batch_size的不当选择可能会带来一些额外问题。

 

7. 交叉熵损失函数

神经网络中分类问题较常使用交叉熵作为损失函数,二分类问题中公式如喜爱, y ∗ y^* y表示真实标签,y表示预测标签:

C = − [ y ∗ l o g y + ( 1 − y ∗ ) l o g ( 1 − y ) ] C=-[y^*logy +(1-y^*)log(1-y)] C=[ylogy+(1y)log(1y)]

多分类问题中公式可以写成下面形式:

C = − Σ i = 1 k y i ∗ l o g y i C=-Σ^k_{i=1}y^*_ilogy_i C=Σi=1kyilogyi

 

8. 过拟合与欠拟合

过拟合与欠拟合是多有机器学习算法都要考虑的问题,欠拟合指的是模型在训练集和测试集上的表现都很差,过拟合指的是模型1在训练集上表现良好但在测试集上表现很差,即泛化性能不好,如下如

在这里插入图片描述
欠拟合比较容易克服,常见解决办法有以下几种:

  1. 增加特征数量:欠拟合可能是因为模型没有足够的特征来驳货数据中的关键信息,添加更多相关的特征可以提高模型的泛化能力。可以考虑加入特征组合、高次特征,以此增大假设空间。
  2. 增加模型复杂度:欠拟合通常是因为模型过于简单而无法适应数据的复杂性。增加模型的复杂度,例如增加神经网络的层数,增加决策树深度或增加多项式次数,可以提高模型性能。
  3. 减少正则化参数:正则化的目的是用来防止过拟合,但是模型出现了欠拟合,则需要减少正则化参数。
  4. 增加训练数据:更多的训练数据可以提供更多的信息,有助于模型更好的泛化。如果可能的话,可以尝试收集更多的数据来解决欠拟合问题。
    5.改进特征工程:仔细选择和构建特征可以帮助模型更好地适应数据。确保特征工程是合适的,可以提高模型的性能。
  5. 使用更复杂的算法:如果欠拟合无法通过调整模型复杂度来解决,可以考虑使用更复杂的机器学习算法,如深度学习模型或集成学习方法。
  6. 使用集成方法:集成学习方法,如随机森林和梯度提升树,可以将多个模型组合在一起,以提高整体性能。

过拟合常见的解决办法有以下几种。

  1. 权重衰减:在神经网络模型中,可使用权值衰减的方法,即每次迭代过程中以某个小因子降低每个权值。
  2. 提前停止训练:通过早停法避免过拟合。在训练过程中监测验证集的性能,并在验证性能不提升时提前停止训练,有助于防止模型在训练数据上过拟合;
  3. 正则化,即在进行目标函数或代价函数优化时,在目标函数或代价函数后面加上一个正则项,一般有L1正则与L2正则等。以惩罚大的权重值。L1正则化倾向于生成稀疏权重矩阵,而L2正则化倾向于更平滑的权重调整。正则项的系数表示正则化的强度,有助于控制模型复杂性,防止过拟合。
  4. 减少模型参数:过拟合通常发生在模型具有过多参数,过于复杂的情况。因为这些参数容易记住训练数据的细节,而不是学习到通用的模式。减少模型参数的方法包括减少层数,减少每层神经元数量,选择简单的模型架构等。
  5. Dropout:是一种正则化技术,通过在训练过程中随机将一部分神经元的输出设置为零,来减少神经网络的复杂性,从而减低过拟合的分险。
  6. 数据增强:通过对训练数据进行一系列随机变化或扩充,生成新的训练样本,从而增加了训练数据的多样性,这有助于模型更好地泛化到新数据上,减少过拟合的风险。
  7. 决策树剪枝:决策树剪枝通过修剪决策树的一些分支或叶节点来降低树的复杂性,从而提高了模型的泛化能力。
  8. 交叉验证:使用交叉验证方法,如K折交叉验证,可以帮助检测模型是否在不同的数据子集上都表现良好,从而减轻了过拟合的风险。

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • JAVA通过debezium实时采集mysql数据
  • Unity UnityWebRequest封装类
  • Java学习Day20:基础篇10
  • 二进制与进制转换与原码、反码、补码详解--内含许多超详细图片讲解!!!
  • React(四):DOCX文件在线预览
  • 2024杭电多校(5) 1008. 猫咪们狂欢【带权最大独立集】
  • 宅家也能高效办公?试试这四款款远程控制神器!
  • 【2024年华数杯全国大学生数学建模竞赛】C题:老外游中国 问题思路分析及Python代码实现
  • C语言初阶(12)
  • 周鸿祎回应将成三六零第一大股东:会和公司一起走下去
  • 学习硬件测试04:触摸按键+PWM 驱动蜂鸣器+数码管(P62~P67、P71、P72)
  • mysql介绍
  • 1、.Net UI框架:WPF - .Net宣传系列文章
  • 反转链表(LeetCode)
  • 重燃代码之光:在PyCharm中恢复自动高亮的秘籍
  • 《深入 React 技术栈》
  • 【React系列】如何构建React应用程序
  • Apache Pulsar 2.1 重磅发布
  • JavaScript创建对象的四种方式
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • PHP的类修饰符与访问修饰符
  • Python学习笔记 字符串拼接
  • SQLServer插入数据
  • SSH 免密登录
  • 关于 Cirru Editor 存储格式
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 如何优雅地使用 Sublime Text
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 微信小程序开发问题汇总
  • 小试R空间处理新库sf
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • (1)虚拟机的安装与使用,linux系统安装
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (八)c52学习之旅-中断实验
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (三)Kafka 监控之 Streams 监控(Streams Monitoring)和其他
  • (十六)一篇文章学会Java的常用API
  • (一)Neo4j下载安装以及初次使用
  • (转)c++ std::pair 与 std::make
  • (转)VC++中ondraw在什么时候调用的
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 简介及区别
  • .net 发送邮件
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .Net 应用中使用dot trace进行性能诊断
  • .NET中使用Protobuffer 实现序列化和反序列化