深入探索BP神经网络【简单原理、实际应用和Python示例】

人工神经网络(Artificial Neural Networks)是一种受到生物神经网络启发的机器学习模型,它的应用范围广泛,包括图像识别、语音识别、自然语言处理等领域。其中,BP神经网络(Backpropagation Neural Network)是最常见和基础的神经网络之一。

背景

BP神经网络是一种 前馈神经网络,最早由David Rumelhart、Geoffrey Hinton和Ron Williams于1986年提出。它的设计灵感来自于 人脑中神经元之间的信息传递机制,通过神经元之间的连接和权重来模拟信息处理 。BP神经网络由输入层、隐含层(可以有多个)、输出层组成,每个神经元都与上一层的所有神经元相连,每个连接都有一个权重。

它就像一条信息流水管,把信息从一头输送到另一头。想象一下,你把一些问题的答案输入到这个水管的一端,然后它通过一系列的阀门和管道,最终给你正确的答案。这些阀门和管道就是我们的神经元,而它们之间的强弱连接就是权重。

与前馈神经网络不同,后馈神经网络 在信息传递方面更加复杂。前馈神经网络只向前传递信息,而后馈神经网络可以在信息传递的同时,也允许信息反馈,形成循环。这使得后馈神经网络在处理某些复杂问题时更加强大,但也更加复杂。虽然后馈神经网络在某些情况下非常有用。

解决的问题

BP神经网络主要用于解决分类和回归问题。它可以应用于诸如图像分类、文本情感分析、手写数字识别等任务。通过学习和调整神经元之间的权重,BP神经网络可以自动地发现输入数据中的模式特征,从而进行准确的预测和分类。

实现原理

梯度下降算法

BP神经网络的训练基于梯度下降算法。该算法的核心思想是最小化损失函数,使预测值与实际值之间的误差尽可能小。下面是梯度下降算法的关键步骤:

  1. 初始化权重和偏置: 刚开始,我们给网络的每个"连接"(类似神经元之间的道路)随机设置了一些权重,就像是在城市的交叉口上设置了一些标志。

  2. 前向传播: 我们把数据传递给网络,就像是车辆在城市中行驶,经过每个交叉口。每个神经元计算出一些东西,就像是每个交叉口告诉车辆往哪里走。

  3. 计算损失: 我们想要知道网络的预测是否准确,所以我们计算出它的错误,就像是检查车辆是否按照地图行驶。

  4. 反向传播: 然后,我们回头看每个连接的错误,就像是回头看每个交叉口上的标志是否设置得合适。如果错了,我们会微调标志,就像是微调道路的方向

  5. 重复迭代: 我们一遍又一遍地重复这个过程,每次都试图让预测更准确。就像是一辆车一步一步地走向正确的目的地,最终我们希望网络的预测变得非常准确,损失变得很小。

代码示例

以下将演示如何使用BP神经网络解决二分类问题(解决XOR问题)

import numpy as np
import matplotlib.pyplot as plt# 定义激活函数
def sigmoid(x):return 1 / (1 + np.exp(-x))# 初始化权重和偏置
input_size = 2
hidden_size = 3
output_size = 1
learning_rate = 0.1w1 = np.random.randn(input_size, hidden_size)
b1 = np.zeros((1, hidden_size))
w2 = np.random.randn(hidden_size, output_size)
b2 = np.zeros((1, output_size))# 训练数据
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])# 存储损失值
losses = []# 训练神经网络
for epoch in range(10000):# 前向传播z1 = np.dot(X, w1) + b1a1 = sigmoid(z1)z2 = np.dot(a1, w2) + b2a2 = sigmoid(z2)# 计算损失loss = np.mean((a2 - y) ** 2)losses.append(loss)# 反向传播dloss_da2 = 2 * (a2 - y)da2_dz2 = a2 * (1 - a2)dz2_dw2 = a1dz2_db2 = 1dloss_dw2 = np.dot(dz2_dw2.T, dloss_da2 * da2_dz2)dloss_db2 = np.sum(dloss_da2 * da2_dz2, axis=0, keepdims=True)da2_dz1 = w2dz1_dw1 = Xdz1_db1 = 1dloss_da1 = np.dot(dloss_da2 * da2_dz2, da2_dz1.T)dloss_dw1 = np.dot(dz1_dw1.T, dloss_da1 * sigmoid(z1) * (1 - sigmoid(z1)))dloss_db1 = np.sum(dloss_da1 * sigmoid(z1) * (1 - sigmoid(z1)), axis=0, keepdims=True)# 更新权重和偏置w1 -= learning_rate * dloss_dw1b1 -= learning_rate * dloss_db1w2 -= learning_rate * dloss_dw2b2 -= learning_rate * dloss_db2if epoch % 1000 == 0:print(f'Epoch {epoch}, Loss: {loss}')# 使用训练好的模型进行预测
def predict(X):z1 = np.dot(X, w1) + b1a1 = sigmoid(z1)z2 = np.dot(a1, w2) + b2a2 = sigmoid(z2)return a2# 测试
X_test = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
predictions = predict(X_test)
print("Predictions:")
print(predictions)# 绘制损失曲线
plt.plot(losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Training Loss')
plt.show()

在上述代码中,各个变量的意义如下:

  1. w1:第一层权重矩阵,它包含了输入数据到隐含层神经元的连接权重。其形状为 (input_size, hidden_size),其中 input_size 是输入特征的数量,hidden_size 是隐含层神经元的数量。

  2. b1:第一层偏置,它包含了隐含层每个神经元的偏置。其形状为 (1, hidden_size),用于调整神经元的激活阈值——如果偏置值很大,神经元更容易被激活;如果偏置值很小,神经元更难被激活

  3. w2:第二层权重矩阵,它包含了隐含层到输出层神经元的连接权重。其形状为 (hidden_size, output_size),其中 output_size 是输出层神经元的数量。

  4. b2:第二层偏置,它包含了输出层每个神经元的偏置。其形状为 (1, output_size),用于调整输出层神经元的激活阈值。

  5. X:训练数据集,包含输入数据的矩阵。其形状为 (样本数, input_size),其中 样本数 表示训练数据的数量。

  6. y:目标输出数据,包含每个样本的目标输出。其形状为 (样本数, output_size)

  7. losses:用于存储每个训练周期(epoch)中的损失值。损失是模型的预测与实际目标的误差。

  8. input_size:输入特征的数量,通常等于 X 矩阵的列数。

  9. hidden_size:隐含层神经元的数量,是神经网络结构中的一个超参数。

  10. output_size:输出层神经元的数量,通常等于 y 矩阵的列数。

  11. learning_rate:学习率,用于控制权重和偏置的更新步长。这是一个超参数,影响训练过程的速度和稳定性。

如何理解超参数?
“超” 表示它们在神经网络模型中处于更高的层次,是一种 控制参数的参数,是我们手动设置的。它们影响着训练的方式和结果,但不是从数据中学习得到的,两个常见的超参数是:

  1. 隐含层神经元数量(hidden_size): 这就好像是一个神秘的房间,我们在这个房间里进行了一些数学运算,以便理解和解决问题。但我们需要决定房间里有多少人。如果人太多,可能会变得复杂而慢,如果人太少,可能无法解决复杂的问题。所以,hidden_size 是一个数字,帮助我们控制神经网络中这个房间里有多少“工作人员”。
  2. 学习率(learning_rate): 学习率就像是我们在学校学习的速度。如果我们学习得太快,可能会错过重要的东西;如果我们学习得太慢,可能会浪费时间。所以,learning_rate 是一个数字,它帮助我们控制在训练神经网络时,我们每次更新权重和偏置的速度。如果它太大,可能导致不稳定,如果太小,训练可能会很慢。

这两个超参数,hidden_sizelearning_rate,是我们在构建神经网络时需要做的决策,它们会影响我们的模型是如何工作的。所以,选择适合问题的隐含层神经元数量和学习率非常重要。学习率要选择得当,使得模型在训练过程中能够迅速学习,同时又保持稳定,而隐含层神经元数量要足够适应问题的复杂度,但也不能过多,以免增加计算负担。

在上述代码中,用到的三个函数的简单解释:

  1. np.random.randn:这是一个用于生成随机数的函数。它创建一个包含随机数的数组,这些随机数遵循标准 正态分布 (均值为0,标准差为1)。在神经网络中,我们通常使用这些随机数来初始化神经网络的权重,使它们具有随机的初始值。

  2. np.zeros:这个函数用于创建一个数组,其中所有的元素都是零。在神经网络中,我们通常使用它来初始化偏置,以确保它们的初始值为零。

  3. np.dot:这是一个用于进行矩阵相乘的函数。在神经网络中,我们使用这个函数来计算不同层之间神经元的连接以及权重与输入数据之间的乘积。这有助于执行神经网络的前向传播和反向传播计算。

这些函数在神经网络的实现中非常有用,因为它们可以帮助我们进行随机初始化、初始化和数学运算,这些都是神经网络训练过程中的基本操作。

如何理解激活函数Sigmod?
它是一种用来处理神经网络中的数值的特殊函数。它的作用就像是一个开关,可以把输入的数值变成0到1之间的输出
如果我们把一个大的数值输入 Sigmoid 函数,它会输出接近于1的值,就好像是 开关被打开 一样。而如果我们输入一个负数或者很小的数,它会输出接近于0的值,就好像是开关被关闭一样。

所以,Sigmoid 函数的作用是把输入的数值 转换成一个在0到1之间的数 ,这在神经网络中常用于控制神经元的激活状态。这个函数的特点是输出总是在0到1之间,有助于神经网络学习非常复杂的模式和信息。

为什么需要设置b1、b2偏置调整神经元激活阈值呢?
简单来说,偏置就像是神经元的调节器,它帮助神经元更好地理解和处理各种不同的数据。

有些数据可能需要更小的刺激才能激活神经元,而有些数据可能需要更大的刺激。偏置就像是用来调整神经元敏感度的工具,使神经网络可以更好地学习和理解各种不同类型的数据。所以,偏置是神经网络中非常重要的部分,它增加了网络的适应能力,帮助网络更好地解决各种问题。

效果展示

经过训练的BP神经网络可以用于进行二分类任务,例如逻辑门操作,如AND、OR、XOR。在上面的代码示例(XOR)中,网络在经过足够的训练迭代后,可以准确地进行预测。
在这里插入图片描述

总结

BP神经网络是一种重要的神经网络模型,通过梯度下降算法来训练和优化模型,以解决分类和回归问题。它在机器学习和深度学习中具有广泛的应用,是许多人工智能应用的基础。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java开发-参数校验@NotEmpty、@NotBlank、@NotNull

大家好,我是小资。今天给大家说下参数校验。 标题中说的这三个注解所在的包路径为import javax.validation.constraints.*; 千万不要导错包哦,因为他们在好多包里都存在。开发只需引入Spring-web依赖就可以使用了。轻轻松松干掉多余的if-else。 下面我…

someip 入门

什么是someip? SomeIP(Scalable Service-Oriented MiddlewarE over IP)是一种基于以太网的通信协议,用于汽车领域的通信。它允许不同的汽车电子控制单元(ECUs)之间通过网络进行通信,以便在车辆内…

“小程序:改变电商行业的新趋势“

目录 引言1. 小程序的简介1.1 什么是小程序?1.2 小程序的优势 2. 小程序之电商演示1.注册微信小程序2.安装开发工具3.创建项目 3. 小程序之入门案例总结 引言 随着移动互联网的迅猛发展,小程序作为一种全新的应用形态,正在逐渐改变着传统电商…

数据结构--》解锁数据结构中树与二叉树的奥秘(二)

数据结构中的树与二叉树,是在建立非线性数据结构方面极为重要的两个概念。它们不仅能够模拟出生活中各种实际问题的复杂关系,还常被用于实现搜索、排序、查找等算法,甚至成为一些大型软件和系统中的基础设施。 无论你是初学者还是进阶者&…

Spring Cloud--Nacos+@RefreshScope实现配置的动态更新

原文网址:Spring Cloud--NacosRefreshScope实现配置的动态更新_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍SpringCloud整合Nacos使用RefreshScope实现动态更新配置。 官网 Nacos Spring Cloud 快速开始 动态更新的介绍 动态更新的含义:修改应…

【09】基础知识:React组件的生命周期

组件从创建到死亡它会经历一些特定的阶段。 React 组件中包含一系列勾子函数&#xff08;生命周期回调函数 <> 生命周期钩子函数 <> 生命周期函数 <> 生命周期钩子&#xff09;&#xff0c;会在特定的时刻调用。 我们在定义组件时&#xff0c;会在特定的生…

挖机技术哪家强

挖机技术哪家强&#xff0c;中国山东找蓝翔&#xff0c;开挖机是我曾经的梦想&#xff0c;每个男人心中都有一台自己的挖机&#xff0c;近半年做的项目就是关于挖机销售CRM&ERP系统&#xff0c; 今天我们聊聊关于挖机的基本知识。 注&#xff1a;此文并非广告&#xff0c;…

Mybatis学习笔记注解/xml映射/动态SQL%%%Mybatis教程

介绍 Mybatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 的开发 MyBatis中文网 Mybatis 入门 快速入门 步骤 创建 SpringBoot 工程、数据库表 user、实体类 User引入 Mybatis 相关依赖&#xff0c;配置 Mybatis&#xff08;数据库连接信息&#xff09;编写 SQL 语…

金x软件有限公司安全测试岗位面试

目录 一、自我介绍 二、你是网络空间安全专业的&#xff0c;那你介绍下网络空间安全这块主要学习的东西&#xff1f; 三、本科专业是网络工程&#xff0c;在嘉兴海视嘉安智城科技有限公司实习过&#xff0c;你能说下干的工作吗&#xff1f;&#xff08;没想到问的是本科实习…

二十四、【参考素描三大面和五大调】

文章目录 三种色面(黑白灰)五种色调 这个可以参考素描对物体受光的理解&#xff1a;素描调子的基本规律与素描三大面五大调物体的明暗规律 三种色面(黑白灰) 如下图所示&#xff0c;我们可以看到光源是从亮面所对应的方向射过来的,所以我们去分析图形的时候&#xff0c;首先要…

【算法练习Day19】二叉搜索树的最近公共祖先二叉搜索树中的插入操作删除二叉搜索树中的节点

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 二叉搜索树的最近公共祖先叉…

vue七牛云视频直传

完成后样式&#xff1a; 下面的代码是我自己项目里面用到的&#xff0c;一些判断看自己情况去掉&#xff0c;用的是element-ui组件 安装 uuid 库。你可以使用 npm 或 yarn 来完成安装。在终端中执行以下命令&#xff1a; npm install uuidhtml部分 <el-upload class&quo…

Google zxing 生成带logo的二维码图片

环境准备 开发环境 JDK 1.8SpringBoot2.2.1Maven 3.2 开发工具 IntelliJ IDEAsmartGitNavicat15 添加maven配置 <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.0</version> </…

2023年09月 C/C++(七级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C编程&#xff08;1~8级&#xff09;全部真题・点这里 Python编程&#xff08;1~6级&#xff09;全部真题・点这里 第1题&#xff1a;红与黑 有一间长方形的房子&#xff0c;地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上&#xff0c;只能向相邻的黑色…

新式茶饮品牌如何写出生活感软文

居民消费水平的提升使新式茶饮品牌的市场不断扩张&#xff0c;在竞争激烈的茶饮市场中&#xff0c;品牌提高知名度的主要方式之一就是软文营销&#xff0c;而生活感软文是茶饮软文中较为常见的类型&#xff0c;它能有效拉进品牌与消费者之间的距离&#xff0c;那么新式茶饮品牌…

24字符串-kmp寻找重复子串

目录 字符串匹配——kmp算法 LeetCode之路——459. 重复的子字符串 分析&#xff1a; 字符串匹配——kmp算法 强烈建议参考Carl的讲解&#xff1a; 视频讲解版&#xff1a;帮你把KMP算法学个通透&#xff01;&#xff08;理论篇&#xff09;(opens new window) 视频讲解版&…

近地面无人机植被定量遥感与生理参数反演

目录 专题一 近十年近地面无人机植被遥感文献分析、传感器选择、观测方式及质量控制要点 专题二 辐射度量与地物反射特性 专题三 无人机遥感影像辐射与几何处理 专题四 光在植被叶片与冠层中的辐射传输机理及平面模型应用 专题五 植被覆盖度与叶面积指数遥感估算 更多应用…

【开源】给ChatGLM写个,Java对接的SDK

作者&#xff1a;小傅哥 - 百度搜 小傅哥bugstack 博客&#xff1a;bugstack.cn 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 大家好&#xff0c;我是技术UP主小傅哥。 清华大学计算机系的超大规模训练模型 ChatGLM-130B 使用效果非常牛&…

「网络编程」网络层协议_ IP协议学习_及深入理解

「前言」文章内容是网络层的IP协议讲解。 「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、IP协议简介二、IP协议报头三、IP网段划分&#xff08;子网划分&#xff09;四、特殊的IP地址五、IP地址的数量限制六、私有IP地址和公网IP地址七、路由八、分…

【Python】Python语言基础(中)

第十章 Python的数据类型 基本数据类型 数字 整数 整数就是整数 浮点数 在编程中&#xff0c;小数都称之为浮点数 浮点数的精度问题 print(0.1 0.2) --------------- 0.30000000000000004 ​​1.可以通过round()函数来控制小数点后位数 round(a b)&#xff0c;则表示…