深度学习之反向传播

反向传播英文叫做Back Propagation。

为什么需要使用反向传播

对于简单的模型我们可以用解析式求出它的损失函数的梯度,例如,其损失函数的梯度就是,我们可以通过我们的数学知识很容易就得到其损失函数的梯度,继而进行使用梯度下降算法是参数(权重)更新。

但是这仅限于对于简单的模型,一旦模型的深度增加,模型变得复杂,我们就很难直观的看出损失函数的梯度。

例如这个模型,每连接的两个节点里面都有相应的权重,权重数量相当的多。

在这个图中,最左边五个输入表示的是输入的x1到x5,连线表示经过和权重的混合运算,,第二层是隐藏层,输入的样本数量是5,输出的样本数量是6,那么输出相当于是输入6*5的权重矩阵*5*1的样本矩阵得到的结果。显然,我们有三十个不同的权重,同理,第二层到第三层之间有42个权重,第三层到第四层之间有49个权重,依次类推,显然权重的数量不便于我们直接写出损失函数的梯度。

如何进行反向传播:

前馈:

面对这样的复杂网络的时候我们要回过来想一下,能不能把我们的网络看做是一个图,图中可以来传播我们的梯度,最终我们根据链式法则,把梯度都求出来。这种算法我们称之为反向传播算法,

我们以两层的神经网络为例:

不妨设X是输入的矩阵是\mathbb{R}^{^{n}},输入的维度是n,(对于向量来说,维度即是长度)。设为输出的维度是m,第一层的输出是W1X,有的时候W会加转置,对于不加转置的W1来说,W1是m*n的矩阵,对于加了转置的W1来说,转置之后W^{^{T}}是m*n,那么转置之前的W是n*m阶矩阵。注意我们的输出还要加上一个b1(Bias偏移量),显然,矩阵相乘(MM=Matrix multiplication)之后得到的是一个m维的向量,此时加上去的b1也要是一个m维的向量。

我们将W1*X+b1的运算用图示表示出来,这称作一个层,也就是我们的第一层。然后我们再对得到的输出进行又一轮新的运算。

不妨设第一层得到的输出是A,则W2*A+b2就是第二层,在图示中已经表现出来,绿色的部分表示我们进行的运算,蓝色的部分也就是我们的权重和偏移量,肉色的部分是我的每一步得到的输出。

在计算图中,对于不同的计算模块(绿色部分),它求局部的偏导的方法是不同的。例如矩阵的求导可以参考《matrix cookbook》中的公式。

不过这一部分我们并不要求会对矩阵求导,计算机会给你答案。

但是,其实我们那个两层的神经网络其实可以展开为一层。

如果只进行线性变换,最终不管我们有多少层,最终都会统一成图中右边部分的形式。也就是层数多喝层数少时没区别的,

这时候我们选择了那么多权重是不是就没意义了呢?我们可以选择少量的权重,但是我们选择你们多不是浪费时间吗?其实不然,我们可以对每一层的结果进行处理,使每个权重包含的信息更多,这样就不能省去了。

例如,我们可以对第一层的结果进行非线性变化(加一个非线性的变化函数),我们对输出向量里面的每一个值,都应用一个非线性函数,比如说sigmoid函数我们将每一个成员都带入sigmoid函数,。这样的话,我们就没办法再做这种展开了,我们就保留了更多的权重,保留更多的信息。

反向传播:

接下来我们来说求导。

对于复合函数求导,这里就不再多说。

接下来我我们看back propagation(反向传播)的过程。

首先第一步,我们需要创建计算图。例如:

在计算过程中,我们首先要做的是前馈,我们首先沿着图里的箭头,也就是边的方向,由输入向最终的loss传播,计算最终的loss。在计算的过程中,我们在拿到了x和权重,我们要计算我们的输出z,以及它对于x和权重w的导数,f做的运算是得到梯度函数的值,即既得到,又得到输出的结果z。

前馈的过程是从输入,一直往前算,往loss算。我们往前计算的时候保留了梯度函数,当我们得到loss的时候,带入loss对于z的梯度函数,得到,拿到偏导之后,我们在经过f的时候,我们已知loss对z的偏导,以及,这个时候我们就可以计算出来loss对x的导数,和loss对w的导数。这里我们有个问题,我们要将损失降到最小,得到loss对w的损失函数不就行了吗,因为我们需要更新的是w啊,那我们为什么要求出loss对x的梯度呢?

在图中,我们的x并不是表示我们的初始输入,我们表示的是某一层的输入,该层可能是隐藏层,那么这时x是原始样本输入经好多权重的运算得到的结果,只有求出loss对x的梯度,才能前馈得到loss对前面权重的梯度。

我们将得到的梯度不断往前相乘就得到loss对该层损失的梯度。

总的来说,就是某一层的输入和权重,接入到一个函数计算模块里面,也就是f,f可以计算局部的梯度,然后我们只要能拿到损失对最后一层输出y的梯度,然后不断往前传播。

如图,我们在前馈过程中,我们能算出我们的每个输出结果对输入结果的梯度(每个黄色项对前一个黄色项的梯度(第一层是对w的梯度))。注意,只要中间结果在前馈的过程中使用到了需要求的权重,那么loss对于这个值的梯度是做要求的。

下图是我们反向传播的过程:

即先前馈,再反向。

前馈过程计算每一层的输出值,并计算梯度函数,反向的过程中,利用链式法则,求出loss对每一层的权重的梯度,不断往前走,直到求出来对我们所需要更新的权重的梯度。

这时看似我们在求损失对权重梯度的时候我们没有用到损失值(显然,我们反向传播的第一项是求损失对残差r的梯度,而梯度函数是2r,我们并没有使用到loss),这时我们有必要保留loss吗?答案是有必要,loss对于我们评估模型的好坏很重要,损失越小,说明模型的预测效果越好,也就是越接近真实结果,我们可以通过对损失进行可视化来评价模型。

在pytorch里面如何进行前馈和反馈运算呢?


Tensor是用来存数据的,可以用来存标量,向量,矩阵,以及高维度张量。Tensor是一个类,里面有两个很重要的成员,例如Tensor w,里面的data和Grad成员,分别用来保存权重w本身的值,以及损失对权重的梯度。

我们在创造权重的时候使用:w=torch.Tensor([1.0]),然后我们要保存其梯度,要加上:
w.requires_grad=True。

在进行张量乘法的过程中,w一定是张量,x可能不是,这时会进行重载,将x重载为一个张量。

每当我们调用一次loss函数,我们就把计算图动态的构建出来了,代码是在构建计算图,而不是进行计算。前馈的过程中,梯度会存在w里面,反向传播的过程中计算图会被逐渐销毁。在下一轮计算中再重新构建计算图以及销毁。

这一段能不能写:w=w-0.01*w.grad?答案是不能的,这样写只是构建计算图。取所有 张量的data进行计算不会构建计算图,而是直接计算数值。(对张量的运算是产生计算图,对标量运算是产生数值。)

例如:在l=loss(x,y)这一步,只是构建计算图,然后通过l.backward()来得到w的梯度信息。

能不能这样写呢?sum是一个张量,然后一直对张量l进行累加,会构建一个深度很深的计算图,图越做越大可能会把内存吃光,我们计算损失一般是累加标量,即loss.item()。

然后我们要做梯度清零的操作,在前面我们已经得到损失loss对w的导数,这时候如果我们不进行清零工作,而是直接进行第二轮训练,得到的另一个loss对w的导数会进行累加:,很显然,我们不想用这个去更新。我们需要的是直接利用

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

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

相关文章

网络原理,网络通信以及网络协议

​​​​💓 博客主页:从零开始的-CodeNinja之路 ⏩ 收录专栏:网络原理,网络通信以及网络协议 🎉欢迎大家点赞👍评论📝收藏⭐文章 文章目录 网络原理概念网络通信局域网LAN广域网WAN 网络通信IP地址端口号…

HBase介绍

一、HBase简介 1.1、HBase是什么 Google在200-2006发表了GFS、MapReduce、BigTable三篇 论文 ,号称“三驾马车”,开启了大数据的时代。 GFS是Google File System,开源实现是HDFS(Hadoop File System)。 MapReduce…

深度学习-搭建Colab环境

Google Colab(Colaboratory) 是一个免费的云端环境,旨在帮助开发者和研究人员轻松进行机器学习和数据科学工作。它提供了许多优势,使得编写、执行和共享代码变得更加简单和高效。Colab 在云端提供了预配置的环境,可以直接开始编写代码&#x…

vue2 导入使用vue-codemirror详解

目录 vue2 导入使用vue-codemirror详解1 介绍2 安装使用2.1 安装 vue-codemirror2.2 使用 codemirror2.2.1 引入 3 配置详情3.1 语言模式配置3.2 自动高度设置3.4 主题配置 4 总结 vue2 导入使用vue-codemirror详解 1 介绍 vue-codemirror是一个基于Vue的代码在线编辑器组件&…

Linux部署DataEase数据分析工具并结合内网穿透实现任意设备远程查看数据

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具,帮助用户快速分析数据并洞察业务趋势,从而实现业务…

线性表的链式表示【单链表】

目录 单链表的优缺点 单链表结点的定义 头插法新建链表 尾插法新建链表 按位查找 按值查找 i 位置插入元素 单链表的删除 单链表的优缺点 优点缺点 1. 插入和删除操作不需要移动元素,只需要修改指针 2. 不需要大量的连续存储空间 1. 单链表附加指针域&…

【昕宝爸爸小模块】日志系列之什么是分布式日志系统

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你👍点赞、🗂️收藏、加❤️关注哦。 本文章CSDN首发,欢迎转载,要注明出处哦! 先感谢优秀的你能认真的看完本文&…

基于单片机温度控制系统的研究

摘 要:笔者基于单片机的温度控制系统,从单片机选择、传感器选择、系统框架设计等方面概述了单片机的温度控制系统内涵,分析了其运行原理,列举了单片机温度控制系统设计的实操方法,从硬件系统、软件系统、温度检测方法…

第一节课,用户管理--后端初始化,项目调通。二次翻工2

一、网址来源: 快速开始 | MyBatis-Plus (baomidou.com) 进程: ​ 二、[此处不看]添加测试类,看下效果 2.1 参考 一、第一节课,用户管理--后端初始化,项目调通-CSDN博客 ​ 2.2 新建 SampleTest ​ 2.3 复…

基于springboot汽车租赁系统源码和论文

首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包括软件架构模式、整体功能模块、数据库设计。本项…

【漏洞复现】中移铁通禹路由器弱口令漏洞

Nx01 产品简介 中移禹路由器支持宽带拨号、动态IP和静态IP三种上网模式,一般中国移动宽带的光猫都是智能光猫也就是光猫带路由器功能,中移禹路由器作为二级路由使用。 Nx02 漏洞描述 中移禹路由器存在默认口令(admin),攻击者可利用该漏洞获取敏感信息。 Nx03 产品…

docker镜像详解

文章目录 一、什么是docker镜像 二、为什么需要镜像 三、镜像相关命令详解 3、1 命令清单 3、2 命令详解 四、镜像实战 4、1 镜像操作案例 4、2 离线迁移镜像 4、3 镜像存储的压缩与共享 🙋‍♂️ 作者:Ggggggtm 🙋‍♂️ 👀 专栏…

RabbitMQ 死信队列应用

1. 概念 死信队列(Dead Letter Queue)是在消息队列系统中的一种特殊队列,用于存储无法被消费的消息。消息可能会因为多种原因变成“死信”,例如消息过期、消息被拒绝、消息队列长度超过限制等。当消息变成“死信”时,…

喝汽水问题

答案&#xff1a; #include <stdio.h> int main() {int num 0; //可以喝汽水的次数int mon 20; //钱int cup 0; //瓶子数for (mon 20; mon > 0; mon--) //每次花1元钱买汽水喝{num; //可以喝汽水的次数加1cup; //瓶子数加1if (cup 2) //如果瓶子…

cuda基础教程(一)

文章目录 0. CURA Runtime API1. CUDA人工智能编程1.1. CUDA介绍1.2. 课程内容 2. 异构计算和并行计算2.1. 什么是并行计算2.2. 什么是异构计算 3. CUDA介绍3.1. GPU的性能指标3.2. 什么是CUDA3.3. 如何学习CUDA 4. 系统GPU查询5. Linux系统6. CUDA安装7. 查询GPU信息8. CUDA编…

故障诊断 | 一文解决,GRU门控循环单元故障诊断(Matlab)

文章目录 效果一览文章概述专栏介绍模型描述源码设计参考资料效果一览 文章概述 故障诊断 | 一文解决,GRU门控循环单元故障诊断(Matlab) 专栏介绍 订阅【故障诊断】专栏,不定期更新机器学习和深度学习在故障诊断中的应用;订阅

Java:搭建eladmin复习mvn、springboot、vue等

目录 1.源码平台后端&#xff1a; 2.源码平台前端&#xff1a; 3.操作系统&#xff1a;centos7.9 4.mysql:5.7.x 安装 5.redis:5.0.X 6.maven&#xff1a;3.8 7.java:1.8&#xff1a; 8.nodejs:16.x 9.通过mvn打包eladmin后端 10.npm打包前端项目进行部署 11.访问测试…

永磁同步电机速度环闭环控制

文章目录 1、速度环分析2、电机参数3、PI计算4、模型仿真4.1 模型总览4.2 实际转速与参考转速对比4.3 转矩波形4.4 相电流采样波形 模型下载地址&#xff1a; 链接: 速度闭环模型&#xff08;速度电流双闭环&#xff09; 1、速度环分析 2、电机参数 Udc24 V Rs0.6 LdLq1.4e-3…

二、人工智能之提示工程(Prompt Engineering)

黑8说 岁月如流水匆匆过&#xff0c;哭一哭笑一笑不用说。 黑8自那次和主任谈话后&#xff0c;对这个“妖怪”继续研究&#xff0c;开始学习OpenAI API&#xff01;关注到了提示工程(Prompt Engineering)的重要性&#xff0c;它包括明确的角色定义、自然语言理解&#xff08;…

Redis 布隆过滤器

布隆过滤器 这一篇文章主要是记录布隆过滤器的使用和认识 主要参考了如下的blog https://blog.csdn.net/weixin_42972832/article/details/131211665 他讲的还不错 简单的来说,布隆过滤器,实际上就像是一个集合,拿redis的key来举例来说,布隆过滤器的设置就是去过滤不属于redi…