Pytorch反向传播算法(Back Propagation)

news2024/11/19 23:15:27

一:revise

我们在最开始提出一个线性模型。

x为我们的输入,w为权重。相乘的结果是我们对y的预测值。

那我们在训练时就是对这个权重w进行更新,就需要用到上一章提到的梯度下降算法,不断更新w。但是此时注意不是用y的预测值对w进行求导,应该是使用loss损失值对w权重进行求导,因为我们需要得到最小的loss。

对于简单的模型我们可以使用解析式去解决,但是对于复杂的模型的w会很难算。

最左边的5个⚪代表的是5个输入,右边的5个⚪代表的是5个输出,中间的每个⚪都是隐藏的值设为H。中间的4列我们如果用向量表示,分别都是一个六维的向量,而我们想用输入的五维向量得到六维向量,就需要使用输入的五维向量乘上6x5的矩阵才能得到这个六维的向量,这就意味着我们需要30个不同的w,其实也就对应着我们图片上的线,每条线都代表需要一个w。

所以此时如果要是写解析式就是一件非常复杂的事情,因此我们希望做一种算法把我们的网络看成一个图,在图上进行传播,根据链式法则把梯度求出来。这个就是我们想要完成的bp(back propagation)

二:forward

先来一个简单的两层神经网络:

我们现在一层一层分析,其实可以看出两层的操作都是一样的。首先第一层计算的是w1*x+b1,假如说我们的输入x是一个n维的列向量,结果是一个m维的列向量,MM是矩阵相乘,那我们需要的w1是一个m*n的矩阵,相乘得到的结果是一个m维的列向量,需要b1也是一个m维的列向量,ADD表示相加,得到的结果可以看成这个层的输出,但其实这个值还需要放入到下一层进行第二层的运算,而两个的运算过程都差不多,大家可以自己看一下。

ok,现在知道每一层的运算了,但是有一个问题出现了。

大家看,在一个线性的运算中,其中不管有多少层,w1,w2都是可以通过计算放在一起的,那最后得到的结果也可以看出来,又是一个新的线性运算。这样就意味着,无论我们经过多少层的运算,最后得到的还是一个线性的运算。

为什么说这样不行,因为我们不希望化简,这样会导致我们的那些增加的权重没有意义,所以我们需要对每一层最终的输出加上一个非线性的变化函数。如下图所示:

三:BP

3.1 链式法则

链式求导第一步就是需要创建计算图。

接下来就是一个前馈forword,其实就是先有x,w通过f函数计算出z,最后得到loss的值。

现在我们如果想知道loss对于x或者w进行求导数,就是需要我们的链式法则,这个过程也就是bp(back propagation)。过程就是如下图

 ok,现在举一个具体的例子1:设x=2,w=3,f(x,w)=x*w。求z的值和求z对w和x求导的结果。大家可以自己计算一下,结果看文末。

3.2整体流程

现在大家目光向下:整体的过一遍流程,先前馈forward,后backward。

这个例子中给出的y_head的计算公式,就类似于我们上面提到的f(x,w)函数,和loss的计算公式。给出了w=1,x=1,y=2,其中r为y_head 减去y。首先计算出y_head为1,随后计算出r为-1,最后算出loss为1,以上为forward过程。接下来就是backforward,通过链式法则的知识,先通过loss和r的函数关系,用loss对r进行求导,接着r对y_head求导,最后y_head对w求导,几个结果相乘最终得到的就是loss对w求导的结果。

上面的计算大家也学会了,现在加上一个偏置量,大家计算一下loss值,loss对b和w的导数。此为例2,结果在文末。

3.3 tensor

在pytorch里最重要的数据成员就是tensor,存我们上面提到的一些数值,数据可以是标量,矩阵或者高阶的tensor,其中有两个比较重要的成员,一个是data(用于存放w本身的值),一个是grad(用于存放loss对于w的梯度值)。在链式法则部分我们提到,链式求导第一步就是需要创建计算图,这个就是使用tensor创建的。

第一部分代码,输入的相关参数:

import torch

#为举例子,自己设置的值
x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]

w = torch.tensor([1.0])
w.requires_grad = True  #默认是不进行梯度计算的,我们让他为true就是进行梯度计算

第二部分代码,确定计算的一些步骤:

def forward(x):
    return x * w

def loss(x,y):
    y_pred = forward(x)
    return (y_pred - y)**2

 此时有一个需要注意的点,我们在第一步的时候设置的w是一个tensor值,当它遇到*时间,,此时的*已经被重载了,现在进行的是tensor于tensor的数乘。但是此时x并不是一个tensor类型,会自动转化为tensor。此时就构建出类似于这样的计算图

 并且由于我们最后需要对w计算梯度,所以求出的z也需要计算梯度。

同理定义的loss函数也会建立出一个计算图。

第三步就是计算过程。

print('predict (before training)',4,forward(4).item())

for epoch in range(100):
    for x,y in zip (x_data,y_data):
        l = loss(x,y) #这一步是前馈的过程
        l.backward() #这一步是bp的过程,注意bp完会消除所有的计算图
        print('\tgrad:',x,y,w.grad.item())
        w.data = w.data - 0.01 *w.grad.data #此时注意一定要.data 因为w是一个tensor,而我们需要的是tensor里面的data
        
        w.grad.data.zero_() #在上一步的更新完,导数还存在,所以我们需要将其清零。
    print('progress',epoch,l.item())

print('predict(after training)',4,forward(4).item)

现在大家应该知道整体的流程和代码了,现在大家可以自己尝试去写一下下面这个流程。关于x_data于y_data的值与上面的值相同,大家可以尝试一下。

四:answer

例子1:z的结果为6,z对w和x求导的结果分别为10和15。

例子2:z的结果是1,z对w和x求导结果分别为2和2。

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

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

相关文章

go解析yaml

go解析yaml文件关键就是结构体的创建 初学go tag字段要和yaml文件中的key对应起来,每个层级都要创建对应的结构体,有点烦 package configimport ("gopkg.in/yaml.v3""os" )type Config struct {MysqlConfig MysqlConfig yaml:&q…

生成树协议STP(Spanning Tree Protocol)

为了提高网络可靠性,交换网络中通常会使用冗余链路。然而,冗余链路会给交换网络带来环路风险,并导致广播风暴以及MAC地址表不稳定等问题,进而会影响到用户的通信质量。生成树协议STP(Spanning Tree Protocol&#xff0…

段码屏|液晶显示模块|超低功耗LCD驱动芯片

1 简介 PC164S32 是一款支持 128 点 (32 4)显示 的多功能 LCD 控制器芯片,内部存储器RAM数据直接映射到 LCD 显示。可软件配置特性使其适用于包括 LCD 模块和显示子系统在内的多种 LCD 应用。主控制器与 PC164S32接口仅需3 或 4 条线。内置的省电模式极大的降低了功…

第 11 章 排序

第 11 章 排序 Abstract 排序犹如一把将混乱变为秩序的魔法钥匙,使我们能以更高效的方式理解与处理数据。 无论是简单的升序,还是复杂的分类排列,排序都向我们展示了数据的和谐美感。 本章内容 11.1 排序算法11.2 选择排序11.3 冒…

ThinkPHP5发送邮件如何配置?有哪些技巧?

ThinkPHP5发送邮件的性能怎么优化?批量发信的方法? 邮件发送功能是许多应用程序的关键组成部分,尤其是在用户注册、密码重置和通知等功能中尤为重要。AokSend将详细介绍如何在thinkphp5中配置和使用邮件发送功能,并确保你可以轻松…

C语言王国——杨氏矩阵

目录 1. 引言 2. 了解杨氏矩阵 3. 思路分析 4. 代码 5. 总结 1. 引言 最近在做二维数组的训练的时候发现了一个很有意思的题: 一看这不是杨氏矩阵嘛,接下来就由姜糖我带大家了解一下这个著名的矩阵。 2. 了解杨氏矩阵 通过查阅百度得知: …

HNU-深度学习-电商多模态图文检索

前言 主要是跟着baseline搭了一遍,没有想到很好的优化。 有官方教程,但是有点谬误,所以就想着自己记录一下我的完成过程。 github项目地址: https://github.com/OFA-Sys/Chinese-CLIP 官方文档: 电商多模态图文检…

可用于嵌入式的解释器调研对比,及lua解释器介绍

嵌入式不一定只能用C! ---------------------------------------------------------------------------------------手动分割线-------------------------------------------------------------------------------- 本文章参考了以下文章: 这里是引用 ------------…

游戏逆向工具分析及解决方案

游戏逆向,是指通过各类工具对游戏进行反编译及源码分析,尝试分析游戏的实现逻辑的过程。这个过程需要使用解密、反编译、解压缩等技术,目的是还原或分析出游戏的代码逻辑及资源。 游戏逆向工具可以按照不同功能进行划分,如&#…

sh发送邮件如何通过配置SMTP服务器来实现?

sh发送邮件的操作方法?如何使用Shell脚本自动发信? 在Shell脚本中实现邮件发送功能是一项常见需求,特别是在自动化任务执行或系统监控中。AokSend将介绍如何通过配置SMTP服务器来实现sh发送邮件的方法和注意事项。 sh发送邮件:安…

【经典排序算法】堆排序(精简版)

什么是堆排序: 堆排序(Heapsort)是指利用堆(完全二叉树)这种数据结构所设计的一种排序算法,它是选择排序的一种。需要注意的是排升序要建大堆,排降序建小堆。 堆排序排序的特性总结: 1. 堆排序使用堆来选数…

VSCode插件Data Previewer

此插件支持直接在vscode 里对csv,xlsx等数据做可视化、统计探索 1. 安装 2. 使用效果 2.1. yaml文件 2.2. xml文件 2.3. csv文件 可以对文件进行各种分析,如此多的选项 散点图 线图 参考文献 GitHub - RandomFractals/vscode-data-preview: Data Pre…

分析和设计算法

目录 前言 循环不变式 n位二进制整数相加问题 RAM模型 使用RAM模型分析 代码的最坏情况和平均情况分析 插入排序最坏情况分析 插入排序平均情况分析 设计算法 分治法 总结 前言 循环迭代,分析算法和设计算法作为算法中的三个重要的角色,下面…

【网络安全的神秘世界】docker搭建pikachu靶场

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 docker搭建pikachu靶场 通过docker安装pikachu 访问docker官网查找pikachu: https://hub.docker.com/search?qapache 复制命令后&#xff…

SpringCloud Feign用法

1.在目标应用的启动类上添加开启远程fein调用注解: 2.添加一个feign调用的interface FeignClient("gulimall-coupon") public interface CouponFeignService {PostMapping("/coupon/spubounds/save")R save(RequestBody SpuBondTo spuBounds);…

自然语言处理学习路线

学习目标 NLP 系统知识(从入门到入土) 学习内容 NLP的基本流程:(待更)文本预处理(标点符号处理、繁体转简体、分词Tokenizer):(待更)词袋模型(TF…

VSCode Prettier - Code formatter 代码格式化

格式化代码是一个挑战,但现代开发工具可以自动保持团队代码库的一致性。 在本文中,您将设置 Prettier 以自动格式化 Visual Studio Code(也称为 VS Code)中的代码。 1. 安装插件 2. 定义代码风格 在项目根目录下创建一个pretti…

SpringBoot HelloWorld 之 实现注册功能

SpringBoot HelloWorld 之 实现注册功能 一.配置 创建数据库big_event CREATE TABLE user (id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ID,username varchar(20) COLLATE utf8_unicode_ci NOT NULL COMMENT 用户名,password varchar(32) COLLATE utf8_unicode_ci …

海外动态IP代理可以用来批量注册邮箱吗?

无论是个人还是企业,都需要使用邮箱进行沟通、注册账号、接收通知等多种用途。然而,由于互联网服务商为了防止滥用和垃圾邮件的传播,通常对注册邮箱设置了一定的限制,如IP限制、验证码验证等。为了解决这些问题,海外动…

儿童节快乐!探索图形化编程桌面的“童年”成长之路

在这个充满童真与快乐的儿童节,我要向在CSDN平台上努力拼搏的每一位朋友,送上我最热切、最深情的祝福!愿你们心中那份孩童般的纯真与对世界无尽的好奇永不褪色,愿你们的人生道路如同这个美好的节日,流光溢彩、欢乐永恒…