机器学习-11 BP神经网络

news2025/3/13 4:53:41

BP神经网络

  • 神经网络介绍
    • 前馈神经网络
    • BP神经网络
      • BP神经网络的核心思想
      • 误差反向传播算法
      • BP网络结构
    • 反馈神经网络
    • 自组织神经网络
  • 神经网络相关概念
    • 激活函数
      • Sigmoid函数
      • tanh双曲正切函数
      • ReLU函数
      • Leaky RuLU函数
      • Maxout函数
      • 激活函数的选择
    • 损失函数
      • Softmax
      • 交叉熵
      • 均方差损失函数
      • 自定义函数
    • 学习率
    • 过拟合
    • 模型训练中的问题
    • 神经网络效果评价

神经网络介绍

神经网络的训练目的是希望能够学习到一个模型,实现输出一个期望的目标值
学习的方式是在外界输入样本的刺激下不断改变网络的连接权值
传统神经网络主要分为以下几类:前馈型神经网络,反馈型神经网络和自组织神经网络

  • 前馈神经网络将神经元分层排列,分别是输入层、中间层和输出层。按照层数不同,划分为单层前馈神经网络和多层前馈神经网络。如感知机、BP网络、RBF网络。
  • 反馈神经网络每个神经元同时将自身的输出信号作为输入信号反馈给其他神经元,Hopfield神经网络是反馈网络中最简单且应用广泛的模型。
  • 自组织神经网络是无导师学习网络通常采用竞争原则进行网络学习。

前馈神经网络

前馈神经网络(Feed Forward Neural Network) 是一种单向多层的网络结构,即信息是从输入层开始,逐层向一个方向传递,一直到输出层结束。
所谓的**“前馈”是指输入信号的传播方向为前向**,在此过程中并不调整各层的权值参数,而反传播是将误差逐层向后传递,从而实现使用权值参数对特征的记忆,即通过反向传播(BP) 算法来计算各层网络中神经元之间边的权重
BP算法具有非线性映射能力理论上可逼近任意连续函数,从而实现对模型的学习。

BP神经网络

BP神经网络训练过程的基本步骤可以归纳如下:

  • 初始化网络权值和神经元的阈值,一般通过随机的方式进行初始化
  • 前向传播:计算隐层神经元和输出层神经元的输出
  • 后向传播:根据目标函数公式修正权值 w i j w_{ij} wij
    上述过程反复迭代,通过损失函数和成本函数对前向传播结果进行判定,并通过后向传播过程对权重参数进行修正,起到监督学习的作用,一直到满足终止条件为止。

BP神经网络的核心思想

由后层误差推导前层误差,一层一层的反传,最终获得各层的误差估计,从而得到参数的权重值。
由于权值参数的运算量过大,一般采用梯度下降法来实现。
所谓梯度下降就是让参数向着梯度的反方向前进一段距离,不断重复,直到梯度接近零时停止。此时,所有的参数恰好达到使损失函数取得最低值的状态,为了避免局部最优,可以采用随机化梯度下降

误差反向传播算法

BP神经网络是一种按照误差逆向传播算法训练的多层前馈神经网络,是目前应用最广泛的神经网络。
BP神经网络的基本思想是梯度下降法,利用梯度搜索技术,以期使网络的实际输出值和期望输出值的误差均方差为最小。
算法包括信号的前向传播误差的反向传播,即计算误差输出时,按从输入到输出的方向进行;而调整权值和阈值时,按从输出到输入的方向进行

  • 正向传播时,输入信号通过隐含层作用于输出结点,经过非线性变换,产生输出信号,若实际输出与期望输出不相符,则转入误差的反向传播过程。
  • 误差的反向传播是将输出误差通过隐含层向输入层逐层反传,并将误差分摊给各层所有单元,以从各层获得的误差信号作为调整各单元权值的依据,所以称该算法为误差反向传播算法。

BP网络结构

在这里插入图片描述
其中, f ( x ) = s i g m o i d ( x ) = 1 1 + e − x f(x)=sigmoid(x)=\frac{1}{1+e^{-x}} f(x)=sigmoid(x)=1+ex1
在这里插入图片描述
网络模型的训练目标为找出合适的权值和阈值使得误差E最小:
E = 1 2 ∑ j = 1 l ( y j ^ − y j ) 2 E=\frac{1}{2}\sum_{j=1}^{l}(\hat{y_j}-y_j)^2 E=21j=1l(yj^yj)2

反馈神经网络

  • 与前馈神经网络相比,反馈神经网络内部神经元之间有反馈(即非单向),可以用一个无向完全图表示,包括了Hopfield 网络、BAM网络,Elman网络等。
  • Hopfield网络类似人类大脑的记忆原理,即通过关联的方式,将某一件事物与周围场中的其他事物建立关联,当人们忘记了一部分信息后,可以通过场中信息回忆起来,将缺失的信息找回。通过在反馈神经网络中引入能量函数的概念,使其运行稳定性的判断有了可靠依据,由权重值派生出能量函数是从能量高的位置向能量低的位置转化,稳定点的势能比较低。基于动力学系统理论处理状态的变换,系统的稳定态可用于描述记忆。
  • Hopfield网络分为离散型和连续型两种网络。
  • 在Hopfield网络中,学习算法是基于Hebb学习规则,权值调整规则为若相邻两个神经元同时处于兴奋状态,那么他们之间的连接应增强,权值增大;反之,则权值减少。

自组织神经网络

自组织神经网络又称Kohonen网,这一神经网络的特点是当接收到外界信号刺激时,不同区域对信号自动产生不同的响应。
这种神经网络是在生物神经元上首先发现的,如果神经元是同步活跃的则信号加强,如果异步活跃则信号减弱。

神经网络相关概念

激活函数

激活函数经常使用Sigmoid函数、tanh函数、ReLu 函数
激活函数通常有以下性质:

  • 非线性
  • 可微性
  • 单调性
  • f(x)≈x
  • 输出值范围
  • 计算简单
  • 归一化

Sigmoid函数

优点

  • 输出范围有限,数据在传递的过程中不容易发散,并且其输出范围为(0,1),可以在输出层表示概率值。
  • Sigmoid函数的导数是非零的,很容易计算。

缺点

  • 梯度下降非常明显,且两头过于平坦,容易出现梯度消失的情况,输出的值域不对称,并非像tanh函数那样值域是-1到1。
    在这里插入图片描述

tanh双曲正切函数

  • 双曲正切函数将数据映射到[-1,1],解决了Sigmoid函数输出值域不对称问题。
  • 它是完全可微分和反对称的,对称中心在原点。
  • 它的输出值域两头依旧过于平坦,梯度消失问题仍然存在。
  • 为了解决学习缓慢和梯度消失问题,可使用其更加平缓的变体,如log-log、Softsign、Symmetrical Sigmoid等。
    在这里插入图片描述

ReLU函数

  • ReLU函数是目前神经网络里常用的激活函数。
  • 由于ReLU函数是线性特点使其收敛速度比Sigmoid、Tanh更快,而且没有梯度饱和的情况出现。计算更加高效,相比于Sigmoid、Tanh函数,只需要一个阈值就可以得到激活值,不需要对输入归一化来防止达到饱和。
    在这里插入图片描述

Leaky RuLU函数

带泄漏修正线性神经元( Leaky RuLU)的出现是解决“死亡神经元”的问题。
f ( x ) = { a x , x < 0 x , x ≥ 0 f(x)=\begin{cases} ax, & \text x<0 \\ x, & \text x≥0 \end{cases} f(x)={ax,x,x<0x0
在这里插入图片描述

Maxout函数

Maxout是一种分段线性函数,理论上可以拟合任意凸函数,与其它激活函数相比,它计算k次权值,从中选择最大值作权值,所以其计算量成k倍增加。
当k为2时,可看成是分成两段的线性函数,它的函数公式如下:
m a x ( w 1 T x + b 1 , w 2 T x + b 2 ) max(w_1^Tx+b_1,w_2^Tx+b_2) max(w1Tx+b1,w2Tx+b2)

激活函数的选择

  • 通常使用ReLU函数,并注意设置好学习率
  • 如果存在死亡神经元的问题,就尝试Leaky ReLU或Maxout函数
  • 尽量避免使用Sigmoid函数
  • tanh函数大部分情况下效果不如ReLU和Maxout函数

损失函数

  • 损失函数评价的是模型对样本拟合度,预测结果与实际值越接近,说明模型的拟合能力越强,对应损失函数的结果就越小;反之,损失函数的结果越大。
  • 损失函数比较大时,对应的梯度下降比较快。
  • 为了计算方便,可以采用欧式距离作损失度量标准,通过最小化实际值与估计值之间的均方误差作为损失函数,即最小平方误差准则(MSE):
    m i n C ( Y , G ( X ) ) = ∣ ∣ G ( X ) − Y ∣ ∣ 2 = ∑ i ( G ( x i ) − y i ) 2 minC(Y,G(X))=||G(X)−Y||^2=∑_i(G(x_i)−y^i)^2 minC(Y,G(X))=∣∣G(X)Y2=i(G(xi)yi)2
  • 其中G(X)是模型根据输入矩阵X输出一个预测向量,预测值G(X)和真值Y的欧式距离越大、损失就越大,反之就越小,即求 ∣ ∣ G ( X ) − Y ∣ ∣ 2 ||G(X)−Y||^2 ∣∣G(X)Y2的极小值。
  • 如果是批量数据,则将所有数据对应模型结果与其真实值之间的差的平方进行求和
  • 合适的损失函数能够确保深度学习模型更好地收敛,常见的损失函数有Softmax、欧式损失、Sigmoid交叉熵损失、Triplet Loss、Moon Loss、Contrastive Loss等。

Softmax

  • 使用Softmax函数的好处是可以使分类问题的预测结果更加明显,不同类别之间的差距更大。
  • 在实际应用中,特别是在Tensorflow中推荐采用交叉熵与Softmax结合作为损失函数,可以避免数值不稳定的情况。

交叉熵

  • 目标为 二分类问题,分类误差越小,则损失越小,对正负分类计算各自的损失
  • 会产生梯度爆炸问题:
    L ( w ) = 1 N ∑ n = 1 N H ( p n , q n ) = − 1 N ∑ n = 1 N [ y n l o g y n ^ + ( 1 − y n ) l o g ( 1 − y n ^ ) ] L(w)=\frac{1}{N}∑_{n=1}^NH(p_n,q_n)=−\frac{1}{N}∑_{n=1}^N[y_nlog\hat {y_n}+(1−y_n)log (1−\hat {y_n})] L(w)=N1n=1NH(pn,qn)=N1n=1N[ynlogyn^+(1yn)log(1yn^)]
  • 交叉熵损失函数的用途主要应用在互相排斥的分类任务中。
  • 交叉熵也可以用于目标为[0,1]区间的回归问题。

均方差损失函数

M S E = 1 n ∑ i = 1 n ( y i − t i ) 2 MSE=\frac{1}{n}∑_{i=1}^n(y_i−t_i)^2 MSE=n1i=1n(yiti)2

自定义函数

对于某些候选属性,单独将一些预测值取出或者赋予不同大小的参数。或者合并多个损失函数,实现多目标训练任务,或者在不同的情况下采用不同的损失函数。

学习率

学习率控制每次更新参数的幅度,过高和过低的学习率都可能对模型结果带来不良影响,合适的学习率可以加快模型的训练速度。
常见学习率调整方法:

  • 基于经验的手动调整
  • 固定学习率
  • 均分分步降低策略
  • 指数级衰减
  • 多项式策略
  • AdaGrad动态调整
  • AdaDelta自动调整
  • 动量法动态调整
  • RMSProp动态调整
  • 随机梯度下降
  • Adam自动调整

过拟合

过拟合是指模型在训练集上预测效果好,但在测试集上预测效果差。
常用的防止过拟合的方法有:

  • 参数范数惩罚
  • 数据增强
  • 提前终止
  • Bagging等集成方法
  • Dropout
  • 批正则化

模型训练中的问题

  • 选择恰当的激活函数
  • 权重初始化
  • 学习率
  • 使用Dropout正则化
  • 周期 / 训练迭代次数
  • 训练过程可视化

神经网络效果评价

  • 用于分类的模型评价以**准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1分值(F1 Score)**为主,辅以ROC、AUC并结合实际应用进行结果评价。
  • 如果神经网络用于聚类,数据源并没有进行标记,那么其模型结果的评价按照聚类算法的标准来操作,如RMSSTD、R Square、SRP等。
  • 随着机器学习在不同领域中的应用,其评价方式需要与实际业务相结合,通过确定目标要求来定量设计评价标准,例如在目标检测等方面使用平均曲线下面积(mean Average Precision, mAP)指标进行衡量识别准确性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/640389.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python文件处理入门指南-如何将Python程序转化为文件

Python文件处理入门指南 - 如何将Python程序转化为文件 Python是一门广泛应用于机器学习、数据分析、网络编程等领域的高级编程语言。Python代码简洁易懂&#xff0c;具有良好的可移植性和跨平台性&#xff0c;因此备受程序员们的喜欢。然而&#xff0c;要想让代码得到更广泛的…

kotlin协程flow retry功能函数返回失败后重试(4)

kotlin协程flow retry功能函数返回失败后重试&#xff08;4&#xff09; import kotlinx.coroutines.delay import kotlinx.coroutines.flow.* import kotlinx.coroutines.runBlockingfun main(args: Array<String>) {var count 0 //重试计数runBlocking {load().onEach…

chatgpt赋能python:Python怎么往表格里写数据

Python怎么往表格里写数据 在Python中&#xff0c;我们经常需要往表格里写入数据。表格是一种最基本的数据储存结构&#xff0c;而Python在处理表格数据方面非常出色。在这篇文章中&#xff0c;我们将介绍Python中常用的几种写入表格的方法。 方法一&#xff1a;使用CSV模块 …

MySQL-索引详解(二)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️树高千尺&#xff0c;落叶归根人生不易&…

哨兵架构redisCluster-Redis(五)

上篇文章介绍了主从架构以及lua脚本。 主从架构&lua脚本-Redis&#xff08;四&#xff09;https://blog.csdn.net/ke1ying/article/details/131159229 Sentinel集群 主从的搭建我们已经完成&#xff0c;但如果主节点宕机&#xff0c;这时候导致整个redis服务不可用怎么办…

Cesium入门之十:Cesium加载3DTiles数据

目录 3DTiles介绍3DTiles数据结构Cesium中与3DTiles相关的类1.Cesium3DTileset类常用属性&#xff1a;常用方法&#xff1a; 2.Cesium3DTileStyle类常用属性&#xff1a; 3.Cesium3DTileContent类常用属性常用方法 4. Cesium3DTileFeature类常用属性常用方法 5.Cesium3DTile类常…

chatgpt赋能python:Python怎么循环

Python怎么循环 循环是编程中最重要的控制结构之一&#xff0c;它允许我们重复执行一组语句&#xff0c;直到满足某个条件为止。在Python中&#xff0c;我们有多种循环结构可供使用&#xff0c;本文将介绍它们及其用法。 for循环 for循环通常用于迭代&#xff08;遍历&#…

chatgpt赋能python:在Python中用何种方式来建立SEO友好网站?

在Python中用何种方式来建立SEO友好网站&#xff1f; 在当今数字时代&#xff0c;一个强大且易于维护的网站是任何企业或组织成功的关键。但是&#xff0c;一个网站的外观和功能不代表它的成功。如果语义不清、标记不恰当或结构不正确&#xff0c;网络爬虫可能会忽略您的网站&…

51单片机“密码锁”代码详解

注&#xff1a;此代码一经过验证&#xff0c;读者不必怀疑其正确性&#xff0c;如果烧录进去没有反应&#xff0c;请自行检查引脚端口配置&#xff0c;以及仔细分析代码实现原理。倘若能静下心来分析代码&#xff0c;一定能受益匪浅。 废话不多说&#xff0c;&#xff0c;直接…

深入理解 SpringBoot 日志框架:从入门到高级应用——(一)日志框架原理

文章目录 了解日志框架常见日志框架面向 SLF4J 编程SLF4J 接口规范其他框架统一转换为 SLF4J 框架 了解日志框架 日志框架的历史可以追溯到计算机编程的早期。在早期的编程语言中&#xff0c;如 C 和 Pascal&#xff0c;程序员通常使用 printf 或 fprintf 函数将程序的状态信息…

总结898

今天在B站上看英文短视频&#xff0c;认识了一位著名的心理学家乔丹彼得森&#xff08;号称“龙虾教授”&#xff09;。他的思想对我 产生了一定的影响。 曾在《写作:自我精进的武器》中看到过写作的5大好处&#xff0c;但他没有乔丹彼得森所讲的那么令我震撼&#xff0c;他对写…

Django框架-1

框架介绍 框架是整个或部分系统的可重用设计&#xff0c;表现为一组抽象构件及构件实例间交互的方法&#xff1b; 框架是可被应用开发者定制的应用骨架&#xff0c;是某种半成品&#xff1b; 使用框架开发的好处 开发周期短维护成本低软件生产效率和质量得到提高 Django框…

面向对象、封装、就近原则及this关键字

面向:拿、找&#xff1b; 对象:能干活的东西&#xff1b; 面向对象编程:拿东西过来做对应的事&#xff1b; 即&#xff0c;分别找对应的“对象”完成对应的“事件”。因此学习内容包括&#xff1a; ①学习各种已存在的对象并使用&#xff1b; ②学习设计对象并使用。 面向对象…

DAY21:二叉树(十一)二叉搜索树中的搜索+验证二叉搜索树(坑比较多,复盘)

文章目录 700.二叉搜索树中的搜索二叉搜索树概念二叉搜索树的搜索方式补充总结 思路递归法迭代法注意这里写if-if和if-else if的区别为什么if-if会访问空的root&#xff1f;if-if结构和if-else if-else的区别 迭代法修改结果&#xff1a; 98.验证二叉搜索树&#xff08;坑比较多…

Java小知识

一、lambda ()->{} ()中为接口唯一方法中的参数&#xff0c;可以任意取 {}为接口唯一方法中的执行语句&#xff0c;返回的结果类型必须符合接口中方法返回值的定义 原理理解&#xff1a; Public interface Printable{ String print(String suffix);} 在函数式编程中有一个方…

【哈佛积极心理学笔记】第6讲 乐观主义

第6讲 乐观主义 How can we create consciously and subconsciously a positive environment, where we actually can take out the most moral, the most successful self to appreciate that self. Create a powerful positive situation to bring out the best in people.…

STM32——08-STM32感应开关盖垃圾桶

项目二&#xff1a;感应开关盖垃圾桶 项目需求 检测靠近时&#xff0c;垃圾桶自动开盖并伴随滴一声&#xff0c; 2 秒后关盖 发生震动时&#xff0c;垃圾桶自动开盖并伴随滴一声&#xff0c; 2 秒后关盖 按下按键时&#xff0c;垃圾桶自动开盖并伴随滴一声&#xff0c; 2 秒后…

DAY19:二叉树(九)路径总和+已知中后序构造二叉树

文章目录 112.路径总和思路伪代码完整版写法1写法1必须分开两个函数的原因注意点 完整版写法2写法2不涉及到回溯的原因 106.中序和后序遍历构造二叉树思路伪代码后序数组如何切割出左右区间写法注意区间切割注意中序和前序如何唯一构造二叉树后序和前序能否唯一构造二叉树&…

03-踏入程序诗意:Golang 流程控制的优雅律动

&#x1f4c3;个人主页&#xff1a;个人主页 &#x1f525;系列专栏&#xff1a;Golang基础 &#x1f4ac;Go&#xff08;又称Golang&#xff09;是由Google开发的开源编程语言。它结合了静态类型的安全性和动态语言的灵活性&#xff0c;拥有高效的并发编程能力和简洁的语法。G…

Linux 安装Docker完整教程(六)

文章目录 背景一、Docker简介二、docker desktop 和 docker engin 区别三、Linux 安装Docker1. 安装docker的前置条件&#xff1a;2. 查看Docker版本3. 检查是否安装过Docker4. Docker的自动化安装 (不想自带化安装的可跳过本步骤&#xff0c;选择手动安装)5. Docker手动安装&a…