当前位置: 首页 > news >正文

深度学习神经网络基础知识(三)前向传播,反向传播和计算图

专栏:神经网络复现目录

深度学习神经网络基础知识(三)

本文讲述神经网络基础知识,具体细节讲述前向传播,反向传播和计算图,同时讲解神经网络优化方法:权重衰减,Dropout等方法,最后进行Kaggle实战,具体用一个预测房价的例子使用上述方法。

文章部分文字和代码来自《动手学深度学习》


文章目录

  • 深度学习神经网络基础知识(三)
    • 前向传播
    • 反向传播
    • 计算图
      • 前向传播的计算图
      • 反向传播的计算图
      • pytorch中的计算图


前向传播

前向传播(forward propagation或forward pass) :按顺序(从输入层到输出层)计算和存储神经网络中每层的结果。

在神经网络中,前向传播是指从输入层开始,经过一系列的隐藏层后,将结果输出到输出层的过程。在每一层中,输入会与对应层的权重进行线性组合,再经过激活函数进行非线性变换,得到输出并传递到下一层。这个过程可以表示为:

h(l)=f(W(l)h(l−1)+b(l))h^{(l)} = f(W^{(l)}h^{(l-1)} + b^{(l)})h(l)=f(W(l)h(l1)+b(l))

其中,h(l)h^{(l)}h(l)表示第lll层的输出,fff为该层的激活函数,W(l)W^{(l)}W(l)为该层的权重矩阵,h(l−1)h^{(l-1)}h(l1)为上一层的输出,b(l)b^{(l)}b(l)为该层的偏置。

在每一层中,输入的维度通常为(batch_size, input_size),即一批数据的输入维度。而每层输出的维度通常为(batch_size, output_size),即一批数据的输出维度。这样,一般情况下每一层的权重矩阵的维度为(input_size, output_size),每一层的偏置的维度为(output_size,)。

前向传播的过程将每层的输出作为下一层的输入,最终得到网络的输出。在训练过程中,输出可以与标签进行比较,计算出网络的误差,并通过反向传播来更新权重和偏置,使得网络的输出更接近于标签。

反向传播

反向传播是一种用于训练神经网络的优化算法,其基本思想是利用链式法则计算损失函数对每个参数的导数,从而更新参数。反向传播中的计算可以通过计算图来表示,其中每个节点代表一个运算,每个边表示数据的传递。

反向传播公式可以表示为:

∂L∂z=∂L∂y∂y∂z\frac{\partial L}{\partial \mathbf{z}} = \frac{\partial L}{\partial \mathbf{y}} \frac{\partial \mathbf{y}}{\partial \mathbf{z}}zL=yLzy

其中,LLL是损失函数,y\mathbf{y}yz\mathbf{z}z是任意两个向量,∂L∂y\frac{\partial L}{\partial \mathbf{y}}yL∂y∂z\frac{\partial \mathbf{y}}{\partial \mathbf{z}}zy分别是LLL关于y\mathbf{y}y的梯度和y\mathbf{y}y关于z\mathbf{z}z的梯度。

反向传播的主要思想是从输出层开始,计算每一层的梯度,然后根据链式法则将梯度向前传播,最终计算出每个参数的梯度。具体来说,对于每个参数,反向传播算法会计算其对损失函数的梯度,然后使用梯度下降等优化算法来更新参数。

为了更好地理解反向传播算法的推导过程,以下将给出一个简单的两层神经网络的示例,假设输入样本为 xxx,第一层的输出为 hhh,第二层的输出为 ooo,损失函数为 LLL

首先,根据链式法则,我们可以将输出层的权重 W2W_2W2 的梯度表示为:

∂L∂W2=∂L∂o⋅∂o∂W2\frac{\partial L}{\partial W_2} = \frac{\partial L}{\partial o} \cdot \frac{\partial o}{\partial W_2}W2L=oLW2o

其中,∂L∂o\frac{\partial L}{\partial o}oL 表示损失函数对输出层输出的偏导数,∂o∂W2\frac{\partial o}{\partial W_2}W2o 表示输出层输出对权重的偏导数。

对于 ∂L∂o\frac{\partial L}{\partial o}oL,我们可以通过损失函数对输出层输出的偏导数来计算:

∂L∂o=∂L∂y⋅∂y∂o\frac{\partial L}{\partial o} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial o}oL=yLoy

其中,yyy 表示经过激活函数后的输出,∂L∂y\frac{\partial L}{\partial y}yL 表示损失函数对 yyy 的偏导数,∂y∂o\frac{\partial y}{\partial o}oy 表示 yyyooo 的偏导数。

对于 ∂y∂o\frac{\partial y}{\partial o}oy,我们可以根据激活函数的不同,计算出其具体的形式。

对于 ∂L∂h\frac{\partial L}{\partial h}hL,我们可以通过链式法则,计算出其表达式:

∂L∂h=∂L∂o⋅∂o∂h\frac{\partial L}{\partial h} = \frac{\partial L}{\partial o} \cdot \frac{\partial o}{\partial h}hL=oLho

其中,∂o∂h\frac{\partial o}{\partial h}ho 表示输出层输出对隐藏层输出的偏导数。

同样地,我们可以通过链式法则,计算出隐藏层权重 W1W_1W1 的梯度:

∂L∂W1=∂L∂h⋅∂h∂W1\frac{\partial L}{\partial W_1} = \frac{\partial L}{\partial h} \cdot \frac{\partial h}{\partial W_1}W1L=hLW1h

其中,∂h∂W1\frac{\partial h}{\partial W_1}W1h 表示隐藏层输出对权重的偏导数。

在实际的反向传播算法中,我们需要依次计算每个参数的梯度,然后利用梯度下降等优化算法来更新参数。

计算图

计算图(computational graph)是用于描述数学表达式中变量之间关系的图形模型,通常用于深度学习中的自动微分。在计算图中,节点表示操作(如加法、乘法、求和、激活函数等),边表示输入和输出之间的关系。计算图可以将复杂的数学表达式拆分成简单的操作,方便求导和计算梯度。

在前向传播时,计算图会按照从输入到输出的顺序依次计算每个节点的输出值。在反向传播时,计算图则按照从输出到输入的顺序依次计算每个节点的梯度,并将梯度传递给其前驱节点。最终,计算图可以通过自动微分技术计算出整个表达式的梯度,并用于优化模型参数。

前向传播的计算图

前向传播:节点存储的是计算的值

在这里插入图片描述

反向传播的计算图

反向传播:节点存储的是此时的梯度

在这里插入图片描述

pytorch中的计算图

在 PyTorch 中,计算图是由 torch.autograd 模块负责构建和维护的。该模块提供了一个 Function 类,代表着计算图中的节点,这些节点对应于操作(例如加法、乘法等),并维护了操作的输入、输出和梯度等信息。在计算图中,输入节点称为“叶子节点”,它们对应于输入数据和模型参数。

当我们调用一个函数时,该函数对应的计算图节点将被创建,并用于计算函数的输出。同时,一个新的计算图会在内存中被构建,它会记录该操作与其他操作之间的依赖关系。这个新计算图就是梯度图,我们可以使用它来计算反向传播梯度。

当我们在 PyTorch 中进行自动微分时,每个计算图节点都维护着一个梯度。通过自动微分,我们可以在计算图中反向传播梯度,并且通过对梯度进行链式法则的运算,计算叶子节点的梯度。这些叶子节点的梯度可以用于更新模型参数,以最小化损失函数。

在PyTorch中,Tensor是中心数据结构,它不仅存储数据,还存储计算图中的梯度信息。在每个Tensor上调用.requires_grad=True,可以启用自动微分机制。计算图中每个Tensor都有一个.grad属性,它存储该张量对应的梯度信息。

在计算图中完成前向传播后,可以通过调用.backward()方法来执行反向传播计算梯度。反向传播的过程会沿着计算图反向传播,将梯度信息传递给各个参数Tensor的.grad属性。通过调用优化器的更新方法,即可使用计算出的梯度信息来更新模型的参数。

具体来说,当我们定义一个需要求导的tensor时,PyTorch会为该tensor创建一个计算图,并在图中记录所有计算操作。当我们执行前向传播时,计算图会记录所有执行的操作,以便之后可以根据链式法则计算梯度。然后,当我们执行反向传播时,PyTorch会根据链式法则和计算图中记录的操作来计算梯度。

相关文章:

深度学习神经网络基础知识(三)前向传播,反向传播和计算图

专栏:神经网络复现目录 深度学习神经网络基础知识(三) 本文讲述神经网络基础知识,具体细节讲述前向传播,反向传播和计算图,同时讲解神经网络优化方法:权重衰减,Dropout等方法,最后进行Kaggle实…...

一图说明 monorepo 落地流程方案

关于 monorepo 初次讨论已有2年载,目前团队已经沉淀了成熟的技术方案且经受住了实战考验。所以特梳理相关如下: 也算是关于之前发起的 monorepo–依赖 的解答篇。 上图为目前团队贡献的主流程:① 本地开发 > ② 提交Git仓库 > ③ 触发…...

SAP ABAP WRITE语法大全

列表是ABAP/4报表程序数据的输出媒介。每个ABAP/4报表程序将其输出数据传递到直接与该程序连接的列表中。每个程序最多生成21个列表:1个基本列表和20个辅助列表。 将数据写入列表的基本ABAP/4语句是WRITE、SKIP和ULINE输出语句。 一、标准列表结构 (1&…...

微信小程序自定义全局组件showModal

开发过程中微信提供的showmodal样式不符合ui风格,又不想写成组件用的页面都引入,就考虑模拟showmodal写一个自定义的弹框组件 一,在components中新建一个navModal组件 navModal.wxml <view class="modal_mask" hidden={{hidden}}><view class="mo…...

4|无线传感器网络与应用|无线传感器网络原理及方法-许毅版|考试知识点

《无线传感器网络原理及方法》第1章无线传感器网络概述1.1无线传感器网络的基本概念1.2无线传感器网络的特征1.2.1与现有无线网络的区别1.2.2与现场总线的区别1.2.3传感器节点的限制1.2.4传感器组网的特点1.3无线传感器网络的关键性能指标1.4无线传感器网络的应用1.5无线传感器…...

startForegroundService与startService 使用浅析

一. 了解服务&#xff08;Service&#xff09;的概念 service是安卓开发中一个很重要组件&#xff0c;意为“服务”。与我们常见的activity不同&#xff0c;“服务”是默默的在背后进行工作的&#xff0c;通常&#xff0c;它用于在后台为我们执行一些耗时&#xff0c;或者需要…...

django项目实战三(django+bootstrap实现增删改查)进阶分页

目录 一、分页 1、修改case_list.html页面 2、修改views.py的case_list方法&#xff08;分页未封装&#xff09; 二、分页封装 1、新建类Pagination 2、修改views.py的case_list方法 三、再优化&#xff0c;实现搜索分页qing情况 四、优化其他查询页面实现分页和查询 五…...

Python 之 Pandas DataFrame 数据类型的简介、创建的列操作

文章目录一、DataFrame 结构简介二、DataFrame 对象创建1. 使用普通列表创建2. 使用嵌套列表创建3 指定数值元素的数据类型为 float4. 字典嵌套列表创建5. 添加自定义的行标签6. 列表嵌套字典创建 DataFrame 对象7. Series 创建 DataFrame 对象三、DataFrame 列操作1. 选取数据…...

华为OD机试真题Python实现【5键键盘的输出】真题+解题思路+代码(20222023)

🔥系列专栏 华为OD机试(Python)真题目录汇总华为OD机试(JAVA)真题目录汇总华为OD机试(C++)真题目录汇总华为OD机试(JavaScript)真题目录汇总文章目录 🔥系列专栏题目输入输出描述:示例1:示例2:解题思路代码实现运行结果:版权说明:题目...

IDEA全家桶式讲解 | IDEA安装、使用、断点调试、Git、插件 (第二篇)

目录 一&#xff1a;JavaEE阶段需要掌握的IDEA技能 1. 配置Tomcat 2. 配置Maven 3. IDEA连接数据库 4. 方便的特殊功能 5. 断点调试&#xff08;重点&#xff09; 6. IDEA中常用Git协同开发&#xff08;重点&#xff09; 7. 常用插件安装 一&#xff1a;JavaEE阶段需要…...

音视频基础之封装格式与音视频同步

封装格式的概念 封装格式(也叫容器&#xff09;就是将已经编码压缩好的视频流、音频流及字幕按照一定的方案放到一个文件中&#xff0c;便于播放软件播放。 一般来说&#xff0c;视频文件的后缀名就是它的封装格式。 封装的格式不一样&#xff0c;后缀名也就不一样。 比如&a…...

外籍在读博士|赴新西兰奥克兰大学双院士导师麾下联合培养

N同学来自阿拉伯国家&#xff0c;但本硕博都是在我国某省属高校就读&#xff0c;现为材料学专业一年级博士生。联合培养首选澳洲国家&#xff0c;包括澳大利亚和新西兰&#xff0c;其次是美国&#xff0c;希望在2023年初出国&#xff0c;以完成整个学年的学习计划。在我们的帮助…...

Learning C++ No.11【string类实现】

引言&#xff1a; 北京时间&#xff1a;2023/2/19/8:48&#xff0c;昨天更新了有关进程状态的博客&#xff0c;然后在休息的时候&#xff0c;打开了腾讯视屏&#xff0c;然后看到了了一个电视剧&#xff0c;导致上头&#xff0c;从晚上6点看到了10点&#xff0c;把我宝贵的博客…...

实力见“证”:Tapdata 技术创新与发展潜力广受认可

Tapdata 积极拥抱各种“不确定”&#xff0c;变中求新&#xff0c;只为呈现出更加好用的产品。 而 Tapdata 在专业领域不断深耕&#xff0c;持续打磨产品能力的同时&#xff0c;也收获了诸多来自外界的肯定&#xff0c;从用户到投资人&#xff0c;从生态伙伴到技术媒体以及官方…...

【C++修炼之路】18.map和set

每一个不曾起舞的日子都是对生命的辜负 map和setmap和set一.关联式容器二.set2.1 set的介绍2.2 set的使用1.set的模板参数列表2.set的构造3.set的迭代器4.set修改操作5.bound函数三.multiset四.map3.1 map的介绍3.2 map的使用1.map的模板参数说明2.pair的介绍3.map的[]重载五.m…...

ChatGPT原理与技术演进剖析

—— 要抓住一个风口&#xff0c;你得先了解这个风口的内核究竟是什么。本文作者&#xff1a;黄佳 &#xff08;著有《零基础学机器学习》《数据分析咖哥十话》&#xff09; ChatGPT相关文章已经铺天盖地&#xff0c;剖析&#xff08;现阶段或者只能说揣测&#xff09;其底层原…...

Retrofit+Hilt后端请求小项目1--项目介绍

简介 本项目根据 youtube 对应教程实现而来 将会对对应代码以及依赖&#xff08;如 Hilt、retrofit、coil&#xff09;进行详细的分析与解读&#xff0c;同时缕清项目结构安排 如文章有叙述不清晰的&#xff0c;请直接查看原教程&#xff1a;https://www.youtube.com/watch?…...

实际项目角度优化App性能

前言&#xff1a;前年替公司实现了一个在线检疫App&#xff0c;接下来一年时不时收到该App的需求功能迭代&#xff0c;部分线下问题跟进。随着新冠疫情防控政策放开&#xff0c;该项目也是下线了。 从技术角度来看&#xff0c;有自己的独特技术处理特点。下面我想记录一下该App…...

Structure|Alphafold2在肽结构预测任务上的基准实验

​题目&#xff1a;Benchmarking AlphaFold2 on peptide structureprediction 文献来源&#xff1a;2023, Structure 31, 1–9 代码&#xff1a;基准实验&#xff0c;比较了比较多的模型 1.背景介绍 由2-50个氨基酸构成的聚合物可以称为肽。但是关于肽和蛋白质之间的差异还是…...

Simple XML

简介 官网&#xff1a;https://simple.sourceforge.net/home.php Github&#xff1a;https://github.com/ngallagher/simplexml Simple 是用于 Java 的高性能 XML 序列化和配置框架。它的目标是提供一个 XML 框架&#xff0c;使 XML 配置和通信系统的快速开发成为可能。该框架…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...

大数据治理的常见方式

大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法&#xff0c;以下是几种常见的治理方式&#xff1a; 1. 数据质量管理 核心方法&#xff1a; 数据校验&#xff1a;建立数据校验规则&#xff08;格式、范围、一致性等&#xff09;数据清洗&…...

对象回调初步研究

_OBJECT_TYPE结构分析 在介绍什么是对象回调前&#xff0c;首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例&#xff0c;用_OBJECT_TYPE这个结构来解析它&#xff0c;0x80处就是今天要介绍的回调链表&#xff0c;但是先不着急&#xff0c;先把目光…...