反向传播算法

在深度学习和神经网络中,反向传播算法是一种至关重要的技术,它使得网络能够通过学习不断调整自身的参数以优化性能。作为训练神经网络的核心机制,反向传播通过计算损失函数对模型参数的梯度,并据此更新网络权重,从而逐步减少预测值与真实值之间的差距。这一过程是神经网络实现自适应学习、提升预测精度的关键步骤,为现代机器学习应用提供了强大的支持。 

在神经网络中,每个神经元的输出是通过将输入数据应用于一系列函数(如权重相乘、加偏置、激活函数等)计算得到的。每一层的输出会成为下一层的输入。这种层层嵌套的函数结构可以被看作是一系列复合函数。

反向传播算法的过程如下:

1.前向传播💥

输入数据通过网络的每一层前向传播,直到最后一层产生输出。

2.计算损失💥

网络的输出与真实值之间的差异通过损失函数计算出来,得到一个损失值,它衡量了当前网络的性能。

3.反向传播💥

通过链式法则从输出层反向逐层计算损失函数对每个参数(权重和偏置)的梯度。这涉及到对损失函数关于网络输出的导数,以及网络输出关于网络参数的导数的计算。

4.参数更新💥

一旦计算出损失函数关于所有参数的梯度,就使用梯度下降或其他优化算法来更新网络的权重和偏置,以减少损失。

神经网络反向传播

#定义输入值和期望输出
x_1 = 40.0
x_2 = 80.0
expected_output = 60.0
初始化
#定义权重
w_1_11 = 0.5
w_1_12 = 0.5
w_1_13 = 0.5
w_1_21 = 0.5
w_1_22 = 0.5
w_1_23 = 0.5
w_2_11 = 1.0
w_2_21 = 1.0
w_2_31 = 1.0
# 前向传播
z_1 = x_1 *w_1_11 +x2*w1_21
z_2 = x_1 * w_1_12 + x_2 * w_1_22
Z_3 = x_1 * w_1_13 + X_2 * w_1_23
y_pred = z_1 * w_2_11+ z_2 * w_2_21+ z_3 * w_2_31
# print(z_1,z_2,z_3,y_pred)
print("前向传播预测值为:", y_pred)
#计算损失函数值(L2损失)
loss = 0.5 *( expected_output - y_pred)**2
print("当前的loss值为: ",loss)#计算输出层关于损失函数的梯度
d_loss_predicted_output = -( expected_output - y_pred) #计算权重关于损失函数的梯度
d_loss_w_2_11 = d_loss_predicted_output * z_1
d_loss_w_2_21 = d_loss_predicted_output * z_2
d_loss_w_2_31 = d_loss_predicted_output * z_3 print(d_loss_w_2_11,d_loss_w_2_21,d_loss_w_2_31)
d_loss_w_1_11 = d_loss_predicted_output *w_2_11 *x_1
d_loss_w_1_21 = d_loss_predicted_output * w_2_11 *x_2 
d_loss_w_1_12 = d_loss_predicted_output * w_2_21 *x_1
d_loss_w_1_22 = d_loss_predicted_output * w_2_21 * x_2
d_loss_w_1_13 = d_loss_predicted_output*w_2_31 *x_1#使用梯度下降法更新权重
learning_rate = 1e-5
w_2_11 -= learning_rate * d_loss_w_2_11
w_2_21 -= learning_rate * d_loss_w_2_21
w_2_31 -= learning_rate * d_loss_w_2_31
w_1_11 -= learning_rate * d_loss_w_1_11
w_1_12 -= learning_rate * d_loss_w_1_12
w_1_13 -= learning_rate * d_loss_w_1_13
w_1_21 -= learning_rate * d_loss_w_1_21
w_1_22 -= learning_rate * d_loss_w_1_22
w_1_23 -= learning_rate * d_loss_w_1_23# 前向传播
z_1 = x_1 * w_1_11 + x_2 * w_1_21
z_2 = x_1 * w_1_12+ x_2* w_1_22
Z_3 = x_1 * w_1_13+ x_2 * w_1_23
y_pred = z_1 * w_2_11 + z_2 * w_2_21 + z_3 * w_2_31
print("Final: ",y_pred)
# print("前向传播预测值为:“, y_pred)
loss = 0.5 *(expected_output - y_pred)**2
print("当前的loss值为: ", loss)前向传播预测值为: 180.0
当前的loss值为:7200.0
Final:140.3136
当前的loss值为:3225.1371724800006

制作梯度下降求最小值的动画

为了展示梯度下降算法寻找函数最小值的过程,我们可以使用Python的matplotlib库来可视化这个过程。以下是一个简单的案例,使用梯度下降算法来寻找一个二次函数(例如 (f(x) = x^2))的最小值,并先静态地显示梯度下降的过程,然后将其制作成动画。

第一步:静态显示梯度下降

import numpy as np  
import matplotlib.pyplot as plt  def f(x):  return x ** 2  def df(x):  return 2 * x  def gradient_descent(x_start, learning_rate, epochs):  x = x_start  history = []  for i in range(epochs):  grad = df(x)  x -= learning_rate * grad  history.append(x)  return history  # 初始值、学习率和迭代次数  
x_start = 5.0  
learning_rate = 0.1  
epochs = 50  # 执行梯度下降  
history = gradient_descent(x_start, learning_rate, epochs)  # 绘制函数图像和梯度下降的轨迹  
x_values = np.linspace(-10, 10, 400)  
y_values = [f(x) for x in x_values]  plt.figure(figsize=(10, 6))  
plt.plot(x_values, y_values, label="f(x) = x^2")  
plt.scatter(history, [f(x) for x in history], color='red', label="Gradient Descent Path")  
plt.xlabel("x")  
plt.ylabel("f(x)")  
plt.title("Gradient Descent to Find Minimum of f(x) = x^2")  
plt.legend()  
plt.show()

第二步:动画显示

为了实现动画效果,我们可以使用matplotlib.animation模块。以下是一个示例代码,展示了如何使用动画来可视化梯度下降的过程:

import numpy as np  
import matplotlib.pyplot as plt  
import matplotlib.animation as animation  fig, ax = plt.subplots(figsize=(10, 6))  x_values = np.linspace(-10, 10, 400)  
y_values = [f(x) for x in x_values]  
ax.plot(x_values, y_values, label="f(x) = x^2")  
line, = ax.plot([], [], 'ro', animated=True)  
ax.set_xlim(-10, 10)  
ax.set_ylim(0, 100)  
ax.set_xlabel("x")  
ax.set_ylabel("f(x)")  
ax.set_title("Gradient Descent Animation for f(x) = x^2")  def init():  line.set_data([], [])  return line,  def animate(i):  x = x_start - i * learning_rate * df(x_start - i * learning_rate)  y = f(x)  line.set_data(x, y)  return line,  ani = animation.FuncAnimation(fig, animate, init_func=init, frames=epochs, interval=100, blit=True)  plt.show()
  • 注意:在实际运行动画代码之前,请确保已经安装了必要的库,并且你的环境支持动画的显示。

实现三维平面的梯度下降 

在三维空间中实现梯度下降算法的可视化会稍微复杂一些,因为我们需要处理三个维度。为了简化问题,我们可以选择一个简单的三维函数,比如 (f(x, y) = x2 + y2),这是一个碗状的三维曲面,其最小值在原点 (0, 0)。

import numpy as np  
import matplotlib.pyplot as plt  
from mpl_toolkits.mplot3d import Axes3D  
from matplotlib.animation import FuncAnimation  # 定义目标函数和它的梯度  
def f(x, y):  return x**2 + y**2  def grad_f(x, y):  dfdx = 2 * x  dfdy = 2 * y  return np.array([dfdx, dfdy])  # 梯度下降算法  
def gradient_descent(x_start, y_start, learning_rate, epochs):  path = []  x, y = x_start, y_start  for _ in range(epochs):  grad = grad_f(x, y)  x, y = x - learning_rate * grad[0], y - learning_rate * grad[1]  path.append((x, y, f(x, y)))  return np.array(path)  # 初始参数设置  
x_start, y_start = 1.5, 1.5  
learning_rate = 0.1  
epochs = 50  # 执行梯度下降算法并记录路径  
path = gradient_descent(x_start, y_start, learning_rate, epochs)  # 设置3D图形  
fig = plt.figure(figsize=(10, 8))  
ax = fig.add_subplot(111, projection='3d')  # 绘制3D曲面  
X = np.linspace(-2, 2, 100)  
Y = np.linspace(-2, 2, 100)  
X, Y = np.meshgrid(X, Y)  
Z = f(X, Y)  
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='viridis', alpha=0.8)  # 绘制梯度下降的路径  
x_vals, y_vals, z_vals = path[:, 0], path[:, 1], path[:, 2]  
ax.plot(x_vals, y_vals, z_vals, 'r-', label='Gradient Descent Path')  # 图形装饰  
ax.set_xlabel('X')  
ax.set_ylabel('Y')  
ax.set_zlabel('Z')  
ax.set_title('Gradient Descent in 3D')  
ax.legend()  # 显示图形  
plt.show()
  • 首先定义了一个目标函数 (f(x, y)) 和它的梯度函数 grad_f(x, y)。然后,gradient_descent 函数执行梯度下降算法,并记录每一步的路径。最后,我们使用matplotlib的3D功能来绘制函数曲面和梯度下降的路径。

在深入探讨神经网络反向传播算法之后,我们可以清晰地认识到这一机制在现代深度学习领域中的核心地位。反向传播不仅为神经网络提供了自我学习和优化的能力,更是推动了人工智能技术的飞速发展。通过不断地迭代和调整网络参数,反向传播使得神经网络能够逐渐逼近复杂的非线性函数,从而在各种应用场景中展现出强大的性能。未来,随着计算能力的提升和算法的不断改进,反向传播算法将继续引领神经网络的发展,为人工智能的普及和应用奠定坚实基础。 

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

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

相关文章

this关键字,构造函数(构造器)

文章目录 thisthis是什么应用场景 构造器注意事项代码演示 this this是什么 this就是一个变量,可以在方法中,拿到当前对象 应用场景 解决变量名称 冲突问题 构造器 注意事项 必须和类名相同没有返回值只要参数不同(个数不同&#xff0…

ISO 26262《道路车辆功能安全》

ISO 26262是关于道路车辆功能安全的国际标准,专门针对总重不超过3.5吨的八座乘用车及其安全相关电子电气系统(E/E系统)的功能安全而制定。以下是关于ISO 26262的详细解释: 一、背景与目的 ISO 26262是在2011年11月15日正式发布的…

Java基础面试重点-2

21. JVM是如何处理异常(大概流程)? 如果发生异常,方法会创建一个异常对象(包括:异常名称、异常描述以及异常发生时应用程序的状态),并转交给JVM。创建异常对象,并转交给…

UML相关1

汽车租赁系统中的用例图简述(10分) 本系统根据功能可以分为三个用例图: 客户用例图:主要描述客户注册、登录、找回密码、查询车辆信息(包括所有车辆信息、已借车辆信息、租赁历史信息)、修改个人信息、网上预订车辆、电话预定车…

LabVIEW结构体内部缺陷振动检测

结构体内部缺陷会改变其振动特性,通过振动分析可以检测并定位这些缺陷。本文详细分析内部缺陷对振动的影响,从频谱分析、时域分析和模态分析等多角度探讨基于LabVIEW的检测方法,提供实施步骤和注意事项,帮助工程师有效利用LabVIEW…

Windows下Qt5.14.2连接华为IoTDA平台

一、华为IoTDA简介 华为云物联网平台(IoT 设备接入云服务)提供海量设备的接入和管理能力,将物理设备联接到云,支撑设备数据采集上云和云端下发命令给设备进行远程控制,配合华为云其他产品,帮助您快速构筑物…

JAVA:在IDEA引入本地jar包的方法并解决打包scope为system时发布无法打包进lib的方案

一.引入本地Jar包的步骤 有时maven依耐的包是本地的jar包,此时需要进行以下步骤设置。 步骤1.在pom.xml中添加插件设置,将system范围包含进来,此设置是为了在打包时,本地jar包自动生成到部署包里。(若无法打进包,请参考下文的方…

面向对象三大特征之:封装

文章目录 什么是封装?封装的设计规范 什么是封装? 就是用类设计对象处理某一个事物的数据时,应该把要处理的数据,以及处理这些书记的方法设计到一个对象中去。 封装的设计规范 合理隐藏,合理暴露 public就是都能访问…

【Python】解决Python报错:ValueError: not enough values to unpack (expected 2, got 1)

​​​​ 文章目录 引言1. 错误详解2. 常见的出错场景2.1 函数返回值解包2.2 遍历含有不同长度元组的列表 3. 解决方案3.1 检查和调整返回值3.2 安全的解包操作 4. 预防措施4.1 使用异常处理4.2 单元测试 结语 引言 在Python编程中,ValueError 是一个常见的异常类…

服务器配置(初始化)

一:什么是云服务器及用途: 云服务器(Elastic Compute Service, ECS)是一种简单高效、安全可靠、处理能力可弹性伸缩的计算服务。其管理方式比物理服务器更简单高效。用户无需提前购买硬件,即可迅速创建或释放任意多台云服务器。 我个人感觉就…

录取查询小程序怎么制作?

招生老师往往需要花费大量的时间和精力去手动整理学生的录取信息,并一一通知学生。那时的录取查询系统,复杂而繁琐,要处理大量的数据,还要确保信息的准确无误和安全。经常为了发布录取结果,不得不加班到深夜&#xff0…

[学习笔记] VFX Silhouette

目录 Part 1 : The interface of Silhouettte (Silhouette的界面介绍) Part 2: The shape divisions and manual roto(形状分区和手动roto工作): Part 3: tracking : Part 4: Mocha Tracking Part 5: Motion Blur(…

SQL 截取函数

目录 1、substring 2、left 3、right 4、substring_index 1、substring 用途:字段截取从指定开始的字符开始,截取要的数;指定开始的字符数字可以用负的,指定开始的字符从后往前(向左)数,截取要的数不能为负。 语…

mysql知识点

目录 1、数据库定义语言(DDL)(1)创建数据库(2)创建表SQL数据类型列级约束条件表级约束条件(3)修改表 2、数据库操纵语言(DML)(1)插入数…

【STM32】输入捕获应用-测量脉宽或者频率(方法1)

图1 脉宽/频率测量示意图 1 测量频率 当捕获通道TIx 上出现上升沿时,发生第一次捕获,计数器CNT 的值会被锁存到捕获寄存器CCR中,而且还会进入捕获中断,在中断服务程序中记录一次捕获(可以用一个标志变量来记录&#…

Linux “ 软件管理 “

软件管理 widows 安装 方法一: 双击exe安装包,就可以安装。 用exe安装的软件会破记录到注册表中。 注册会记录安装位置,软件名称。 方法二: 用绿色方式进行安装。 不用写到注册表中,因此无法在开始菜单里面查看和卸…

【Java】解决Java报错:IllegalArgumentException

文章目录 引言1. 错误详解2. 常见的出错场景2.1 非法的参数值2.2 空值或 null 参数2.3 非法的数组索引 3. 解决方案3.1 参数验证3.2 使用自定义异常3.3 使用Java标准库中的 Objects 类 4. 预防措施4.1 编写防御性代码4.2 使用注解和检查工具4.3 单元测试 结语 引言 在Java编程…

LM2576系列3A开关型DCDC BUCK降压稳压器

前言: 老款DCDC,使用历史几十年了,今天设计仍然使用这个DCDC的,是不合适的。主要缺点是开关频率较低只有几十Khz,导致需要使用较大感量的功率电感,这样的电感价格较高,且占用PCB空间较大&#…

【机器学习300问】114、什么是度量学习?三元组损失又是什么?

这些天都在加强自己的CV基本功,之前做过的人脸识别项目里有很多思考,在学习了这些基础知识后,我再次回顾了之前的人脸识别项目。我发现,很多之前困惑不解的问题现在都有了清晰的答案。 一、什么是度量学习? 度量学习也…

Spring框架是如何查找方法上的异步任务注解@Async

结论先行 Spring框架层面,查找方法上的注解的原理与机制是一样的。 在方法层面,Spring框架已经找到子类的Async注解,原因是查找注解会搜索整棵类型继承树,包括超类和实现的接口。 异步任务代码示例 Async注解,在父类…