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

相关文章

Python内存优化的实战技巧分享

《Python内存优化的实战技巧分享》Python作为一门解释型语言,虽然在开发效率上有着显著优势,但在执行效率方面往往被诟病,然而,通过合理的内存优化策略,我们可以让Python程序的运行速度提升3... 目录前言python内存管理机制引用计数机制垃圾回收机制内存泄漏的常见原因1. 循环引用2. 全局变

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

Linux从文件中提取特定内容的实用技巧分享

《Linux从文件中提取特定内容的实用技巧分享》在日常数据处理和配置文件管理中,我们经常需要从大型文件中提取特定内容,本文介绍的提取特定行技术正是这些高级操作的基础,以提取含有1的简单需求为例,我们可... 目录引言1、方法一:使用 grep 命令1.1 grep 命令基础1.2 命令详解1.3 高级用法2

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

OpenCV在Java中的完整集成指南分享

《OpenCV在Java中的完整集成指南分享》本文详解了在Java中集成OpenCV的方法,涵盖jar包导入、dll配置、JNI路径设置及跨平台兼容性处理,提供了图像处理、特征检测、实时视频分析等应用... 目录1. OpenCV简介与应用领域1.1 OpenCV的诞生与发展1.2 OpenCV的应用领域2

linux批量替换文件内容的实现方式

《linux批量替换文件内容的实现方式》本文总结了Linux中批量替换文件内容的几种方法,包括使用sed替换文件夹内所有文件、单个文件内容及逐行字符串,强调使用反引号和绝对路径,并分享个人经验供参考... 目录一、linux批量替换文件内容 二、替换文件内所有匹配的字符串 三、替换每一行中全部str1为st

从入门到精通详解LangChain加载HTML内容的全攻略

《从入门到精通详解LangChain加载HTML内容的全攻略》这篇文章主要为大家详细介绍了如何用LangChain优雅地处理HTML内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录引言:当大语言模型遇见html一、HTML加载器为什么需要专门的HTML加载器核心加载器对比表二