BP神经网络学习内容分享:前向传播与后向传播

2024-09-01 22:28

本文主要是介绍BP神经网络学习内容分享:前向传播与后向传播,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       在深度学习和神经网络领域,BP(Backpropagation,反向传播)神经网络是一种非常基础且广泛应用的网络结构。它通过前向传播进行预测,并通过反向传播算法调整网络权重以优化预测结果。本文将详细介绍BP神经网络的前向传播和反向传播过程,并展示一个简单的BP神经网络实现。

一、前向传播过程

        1.基本概念

        前向传播是神经网络中信息从输入层经过隐藏层到输出层的传递过程。在这个过程中,每一层的神经元接收前一层神经元的输出作为输入,并通过激活函数处理后输出给下一层。

        2.公式表示

        假设我们有一个简单的三层神经网络(输入层、一个隐藏层、输出层),每层神经元均使用Sigmoid激活函数。如图所示就是前向传播图:          (1)输入层到隐藏层

       其中,xi 是输入层第 i 个神经元的输出,wij 是从输入层第 i 个神经元到隐藏层第 j 个神经元的权重,bj 是隐藏层第 j 个神经元的偏置,zj 是隐藏层第 j 个神经元的线性组合输出,aj 是经过Sigmoid激活函数后的输出。

         (2)隐藏层到输出层

       过程与输入层到隐藏层类似,只是输入变为了隐藏层的输出aj。

           3.前向传播包括以下几个步骤:

         (1)将输入数据送入输入层,每个输入节点接收一个输入数据值。

         (2)将输入数据与输入层与隐藏层之间的连接权重相乘,并将结果加权求和,得到隐藏层神经元的输入值。

         (3)对隐藏层的输入值进行激活函数的处理,将其转化为隐藏层神经元的输出值。

         (4)重复步骤2和3,将隐藏层的输出值与隐藏层与输出层之间的连接权重相乘,并加权求和,得到输出层神经元的输入值。

        (5)对输出层的输入值进行激活函数的处理,将其转化为输出层神经元的输出值。

        (6)输出层的输出值即为BP网络对输入数据的预测结果。

二、反向传播算法

      1.链式法则

      反向传播算法的核心是链式法则,用于计算损失函数关于每个权重的梯度。如图所示反向传播计算:

       2.梯度下降

       梯度下降是一种优化算法,用于最小化损失函数。在BP神经网络中,我们通过反向传播算法计算梯度,然后使用梯度下降法更新权重。

       3.反向传播计算

       (1)计算输出层的误差

       其中,yk 是真实输出,ok 是网络预测输出。

       (2)计算隐藏层的误差

       (3)计算输出层的误差

        其中,η 是学习率。

        4.后向传播包括以下几个步骤:

       (1)计算网络输出层的误差,即预测值与真实值之间的差异。

       (2)根据误差计算输出层神经元的梯度,用于调整输出层与隐藏层之间的连接权重。

       (3)根据输出层梯度和隐藏层的输出值,计算隐藏层神经元的梯度,用于调整隐藏层与输入层之间的连接权重。

       (4)根据梯度和学习率,调整连接权重,使得误差最小化。

       (5)重复以上步骤,直到网络的预测结果达到预期或训练迭代次数达到设定值。

三、BP神经网络代码实现

        下面是一个简单的BP神经网络实现,使用Python编写,并手动计算权重更新。

import numpy as np  def sigmoid(x):  return 1 / (1 + np.exp(-x))  def sigmoid_derivative(x):  return x * (1 - x)  # 初始化参数  
input_size = 3  
hidden_size = 4  
output_size = 2  np.random.seed(1)  
weights_input_hidden = np.random.uniform(-1, 1, (input_size, hidden_size))  
weights_hidden_output = np.random.uniform(-1, 1, (hidden_size, output_size))  
bias_hidden = np.zeros(hidden_size)  
bias_output = np.zeros(output_size)  # 前向传播  
def forward_pass(X):  hidden_layer_input = np.dot(X, weights_input_hidden) + bias_hidden  hidden_layer_output = sigmoid(hidden_layer_input)  final_output_input = np.dot(hidden_layer_output, weights_hidden_output) + bias_output  final_output = sigmoid(final_output_input)  return final_output, hidden_layer_output  # 反向传播和权重更新  
def backward_pass(X, y, output, hidden_output):  # 计算输出层误差  output_error = y - output  d_output = output_error * sigmoid_derivative(output)  # 计算隐藏层误差  hidden_error = d_output.dot(weights_hidden_output.T) * sigmoid_derivative(hidden_output)  # 更新输出层权重和偏置  weights_hidden_output += hidden_output.T.dot(d_output) * 0.1  bias_output += np.sum(d_output, axis=0, keepdims=True) * 0.1  # 更新输入层到隐藏层权重和偏置  weights_input_hidden += X.T.dot(hidden_error) * 0.1  bias_hidden += np.sum(hidden_error, axis=0, keepdims=True) * 0.1  # 示例数据  
X = np.array([[0.1, 0.2, 0.3]])  
y = np.array([[0.9, 0.1]])  # 训练网络  
for _ in range(10000):  output, hidden_output = forward_pass(X)  backward_pass(X, y, output, hidden_output)  # 测试网络  
print("Output after training:", forward_pass(X)[0])

四、总结

        本文详细介绍了BP神经网络的前向传播和反向传播算法,并通过Python代码实现了一个简单的BP神经网络。通过不断迭代训练,网络能够逐渐优化其权重,从而提高预测的准确性。

这篇关于BP神经网络学习内容分享:前向传播与后向传播的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1128218

相关文章

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

C#读取本地网络配置信息全攻略分享

《C#读取本地网络配置信息全攻略分享》在当今数字化时代,网络已深度融入我们生活与工作的方方面面,对于软件开发而言,掌握本地计算机的网络配置信息显得尤为关键,而在C#编程的世界里,我们又该如何巧妙地读取... 目录一、引言二、C# 读取本地网络配置信息的基础准备2.1 引入关键命名空间2.2 理解核心类与方法

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作

Python中列表的高级索引技巧分享

《Python中列表的高级索引技巧分享》列表是Python中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素,本文将带你深入了解Python列表的高级索引技巧,希望对... 目录1.基本索引2.切片3.负数索引切片4.步长5.多维列表6.列表解析7.切片赋值8.删除元素9.反转列表

Python中处理NaN值的技巧分享

《Python中处理NaN值的技巧分享》在数据科学和数据分析领域,NaN(NotaNumber)是一个常见的概念,它表示一个缺失或未定义的数值,在Python中,尤其是在使用pandas库处理数据时,... 目录NaN 值的来源和影响使用 pandas 的 isna()和 isnull()函数直接比较 Na

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;