计算图与自动微分

news2025/2/25 8:44:58

计算图与自动微分

  • 一、自动梯度计算
    • 1.1 数值微分(Numerical Differentiation)
    • 1.2 符号微分(Symbolic Differentiation)
    • 1.3 自动微分(Automatic Differentiation,AD)
      • 1.3.1 计算图
      • 1.3.2 正向传播
      • 1.3.3 反向传播
      • 1.3.4 计算图构建方式

一、自动梯度计算

自动计算梯度的方法可以分为以下三类:数值微分、符号微分和自动微分。

1.1 数值微分(Numerical Differentiation)

数值微分使用数值的方法来计算函数 f ( x ) f(x) f(x)的导数,函数 f ( x ) f(x) f(x)的导数定义为:
f ′ ( x ) = lim ⁡ Δ x → 0 f ( x + Δ x ) − f ( x ) Δ x f^\prime(x)=\lim_{\Delta x \rightarrow 0} \frac{f(x+\Delta x) - f(x)}{\Delta x} f(x)=Δx0limΔxf(x+Δx)f(x)
要计算函数 𝑓(𝑥) 在点 𝑥 的导数,可以对 𝑥 加上一个很少的非零的扰动 Δ𝑥,通过上述定义来直接计算函数𝑓(𝑥)的梯度。如在编程中令 Δ x = 0.0001 \Delta x=0.0001 Δx=0.0001

数值微分方法非常容易实现,但

  • 很难找到一个合适的扰动Δ𝑥 ,若 Δ x \Delta x Δx过小,会有舍入误差;若过大,会增加截断误差。因此数值微分实用性不大。
  • 计算复杂度高,如果有N个参数,则每个参数都需要单独施加扰动,则计算数值微分的复杂度为 O ( N 2 ) O(N^2) O(N2)

1.2 符号微分(Symbolic Differentiation)

符号微分是一种基于符号计算的自动求导方法,符号计算也叫代数计算,是指用计算机处理处理带有变量的数学表达式,这里的变量被看作符号(symbols),一般不需要代入具体的值。符号计算的输入和输出都是书数学表达式,一般包括对数学表达式的化简、因式分解、微分、积分、解代数方程、求解常微分方程等运算。
使用Python中sympy库求函数导数:

import sympy

x = sympy.symbols('x')
func = x ** 2
func_derivative = sympy.diff(func)
print(func_derivative)
2*x

符号微分可以在编译时就计算梯度的数学表示,并进一步利用符号计算方
法进行优化.此外,符号计算的一个优点是符号计算和平台无关,可以在CPU或GPU 上运行.符号微分也有一些不足之处:

  • 1)编译时间较长,特别是对于循环,需要很长时间进行编译;
  • 2)为了进行符号微分,一般需要设计一种专门的语言来表示数学表达式,并且要对变量(符号)进行预先声明;
  • 3)很难对程序进行调试

1.3 自动微分(Automatic Differentiation,AD)

自动微分是一种可以对一个函数进行计算导数的方法,其基本原理是所有的数值计算可以分解为一些基本操作,包含±*/,和一些初等函数exp,log,sin,cos等(可以用计算图表示),然后利用链式法则来自动计算一个复合函数的梯度。

以函数 f ( x ; w , b ) f(x;w,b) f(x;w,b)为例,其中x为变量,w和b为参数。
f ( x ; w , b ) = 1 e − ( w x + b ) + 1 f(x;w,b)=\frac{1}{\text{e}^{-(wx+b)}+1} f(x;w,b)=e(wx+b)+11

1.3.1 计算图

计算图是数学运算的图形化表示.计算图中的每个非叶子节点表示一个基本操作,每个叶子节点为一个输入变量或常量。因此,将复合函数 f ( x ; w , b ) f(x;w,b) f(x;w,b)分解为一系列的基本操作,构成一个计算图,当x=1,w=0,b=0时, f ( x ; w , b ) f(x;w,b) f(x;w,b)的计算图如图所示。
在这里插入图片描述
其中红色数字代表变量实际取值。

1.3.2 正向传播

正向传播(forward propagation)是指对神经⽹络沿着从输⼊层到输出层的顺序,依次计算并存储模型的中间变量(包括输出),即对输入计算模型输出。

正向传播输入x=1,w=0,b=0,输出 f ( 1 ; 0 , 0 ) = 0.5 f(1;0,0)=0.5 f(1;0,0)=0.5

1.3.3 反向传播

反向传播(back-propagation)指的是计算神经⽹络参数梯度的⽅法。总的来说,反向传播依据
微积分中的链式法则,沿着从输出层到输⼊层的顺序,依次计算并存储⽬标函数有关神经⽹络各层的中间变量以及参数的梯度

从计算图可以看出,复合函数 f ( x ; w , b ) f(x;w,b) f(x;w,b)由6个基本函数 h i , 1 ≤ i ≤ 6 h_i, 1 \leq i \leq 6 hi,1i6组成。如下表所示,每个基本函数的导数都十分简单,可以通过规则来实现。

在这里插入图片描述

整个复合函数 f ( x ; w , b ) f(x;w,b) f(x;w,b)关于参数 w w w b b b的导数可以通过计算图上的节点 f ( x ; w , b ) f(x;w,b) f(x;w,b)与参数 w w w b b b之间路径上所有的导数连乘得到,即
在这里插入图片描述
∂ f ( x ; w , b ) ∂ w = ∂ f ( x ; w , b ) ∂ h 6 ∂ h 6 ∂ h 5 ∂ h 5 ∂ h 4 ∂ h 4 ∂ h 3 ∂ h 3 ∂ h 2 ∂ h 2 ∂ h 1 ∂ h 1 ∂ w = 1 × − 1 h 5 2 × 1 × e h 3 × − 1 × 1 × x = 0.25 \begin{align} \frac{\partial f(x;w,b)}{\partial w} &=\frac{\partial f(x;w,b)}{\partial h_6} \frac{ \partial h_6}{\partial h_5} \frac{\partial h_5}{\partial h_4} \frac{\partial h_4}{\partial h_3} \frac{\partial h_3}{\partial h_2} \frac{\partial h_2}{\partial h_1} \frac{\partial h_1}{\partial w} \\ &=1 \times -\frac{1}{h_5^2} \times 1 \times \text{e}^{h_3} \times-1 \times 1 \times x\\ &= 0.25 \end{align} wf(x;w,b)=h6f(x;w,b)h5h6h4h5h3h4h2h3h1h2wh1=1×h521×1×eh3×1×1×x=0.25

如果函数和参数之间有多条路径,可以将这多条路径上的导数再进行相加,得到最终的梯度.

1.3.4 计算图构建方式

计算图按构建方式可以分为

  • 动态计算图:在程序运行时动态构建,不容易优化,当不同输入的网络结构不一致时,难以并行计算,但是灵活性比较高.
  • 静态计算图:在编译时构建计算图,计算图构建好之后在程序运行时不能改变,在构建时可以进行优化,并行能力强,但灵活性比较差.

参考:

  • https://www.bilibili.com/video/BV1PF411h7Ew/?spm_id_from=333.337.search-card.all.click&vd_source=52f9eb63aa834f8c039c3dedc7463736
  • 《动手学深度学习》
  • 《神经网络与深度学习》
  • 《深度学习入门—基于Python的理论与实现》

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

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

相关文章

Vue3:项目创建

Vue 3 相对于 Vue 2 带来了许多改进和优点,这些改进主要是为了提高性能、开发体验和可维护性。但是对于创建项目,Vue3也可以采用跟Vue2相同的方式。 使用CLI创建 1. 安装Vue CLI 首先,确保你已经安装了Node.js(建议使用LTS版本…

深入理解nginx http响应限速功能

目录 1. 引言2. 配置参数2.1 limit_rate 配置指令2.2 limit_rate_after 配置指令2.3 其他限速配置 3. 源码分析 1. 引言 在现代互联网应用中,服务器的性能和响应速度是至关重要的。为了保证服务器的稳定性和可靠性,限制客户端对服务器的访问速度是一项重…

能源系统升级BACnet IP分布式I/O边缘模块深度整合

能源管理系统(EMS)的高效运行成为了实现绿色建筑、节能减排的关键。而BACnet IP分布式远程I/O模块作为这一系统中的重要组件,正发挥着不可小觑的作用。本文将以某大型商业综合体为例,探讨BACnet IP I/O模块如何在能源管理中大显身手。 商业综合体涵盖办公…

多维点分布的均匀性评估方法(NDD和Voronoi 图法)

评估多维点分布的均匀性是统计学和数据科学中的一个重要问题,特别是在模拟、空间分析和样本设计等领域。下面,我将详细介绍2种评估多维点分布均匀性的方法,包括它们的数学原理、实现公式以及各自的优缺点。 1. 最近邻距离法(Neare…

AzureDataFactory 表选项之自动创建表

接上篇, 该篇里表与表之间采取了提前mapping的方式,通过Import schemas的方式将源和目标的表的schemas做了一对一的匹配 但如果我的应用场景是将D365的表数据推送到外部数据源,需要原表clone,如果我去先建表建字段再做mapping未免过于繁琐&am…

AS-VJ900实时视频拼接系统产品介绍:两画面视频拼接方法和操作

目录 一、实时视频拼接系统介绍 (一)实时视频拼接的定义 (二)无缝拼接 (三)AS-VJ900功能介绍 1、功能 2、拼接界面介绍 二、拼接前的准备 (一)摄像机选择 (二&a…

FreeRTOS标准库例程代码

1.设备STM32F103C8T6 2.工程模板 单片机: 部分单片机的程序例程 - Gitee.comhttps://gitee.com/lovefoolnotme/singlechip/tree/master/STM32_FREERTOS/1.%E5%B7%A5%E7%A8%8B%E6%A8%A1%E6%9D%BF 3.代码 1-FreeRTOS移植模板 #include "system.h" #include "…

Linux虚拟机运行“yum install gcc-c++”报错“Loading mirror speeds from cached hostfile”

目录 一、在Linux上安装Redis时,在终端执行命令“yum install gcc-c”时,报错: 二、然后发现linux的网络不通,什么网站都访问不了 三、连上网后,再变换yum源 四、重新运行yum install gcc 一、在Linux上安装Redis时…

QT--5

1> 将网络聊天室重新实现一遍 服务器端 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);ser new QTcpServer(this); }Widget::~Widget() {delete ui; }vo…

js教程(13)

一、作用域 作用域规定了变量能够被访问的范围,而离开变量作用域的变量则不能被访问(有时也叫变量的生命周期)。作用域又分为局部作用域和全局作用域。 1.局部作用域 在函数或代码块内部声明的变量只能在其内部被访问,在外部无法…

Docker部署Azure chatgpt样例应用

Github地址 https://github.com/microsoft/sample-app-aoai-chatGPT?tabreadme-ov-file#environment-variables 使用Amazon Linux 2 AMI 的arm 64版本镜像, t4g.medium实例。 需要安装git,可能需要安装 pip3等 sudo apt-get install -y python3-pip 然后从如下…

AWS Lambda 第一个例子Hello (JAVA)

什么是Serverless(无服务器计算) 行业通常所说的Serverless,主要是指“无服务器计算(Serverless Computing)”。无服务器计算,并不是真的不需要服务器,而是说,对于用户,…

200-500人规模工厂网络方案(中小企业网络)

一、方案概述 工厂一般有单独的弱电房,类似这种 里面采用的方案如下: 主要考虑有线、无线、财务、办公、访客等业务,便于维护管理和后续扩容 还需要 Wi-Fi覆盖零死角高速率,工作不卡顿 同时考虑AV反病毒、IPS入侵防御、用户准…

C语言实现扫雷游戏完整版

游戏介绍: 目录 游戏介绍: 游戏框架: 游戏具体功能实现: 棋盘的定义: 棋盘初始化: 棋盘打印: 棋盘布置雷: 棋盘扫雷: 爆炸展开一片: 获取周围八个…

HTML【安装HBuilder、常用标签】--学习JavaEE的day44

day44 JavaEE 学习过程:前端—>数据库—>服务器端 前端的VUE在框架阶段学习 JavaEE学习过程图 HTML 前端:展示页面、与用户交互 — HTML 后端:数据的交互和传递 — JavaEE/JavaWeb 1. 前端开发的工作模式 开发输出htmlcssjs 理解&am…

keil5软件安装教程(MDKv5.39)

keil5软件安装分为三部分: 目录 1.安装mdk 2.激活mdk 3.安装STM32芯片包 1.安装mdk 安装包链接:链接:https://pan.baidu.com/s/1PZoGhzI5Y19ROv7xe9QJKA?pwdgt3s 提取码:gt3s 1、下载keil5的压缩包并解压,鼠…

浅谈如何利用 AI 提高内容生产效率?|TodayAI

在数字化时代,内容的创建和分发速度变得尤为关键。人工智能(AI)技术提供了加速这一过程的可能性,不仅提升了生产效率,还改善了内容的质量和受众的接受度。本文深入探讨AI如何在内容生成、分发与推广,以及内…

Linux下GraspNet复现流程

Linux,Ubuntu中GraspNet复现流程 文章目录 Linux,Ubuntu中GraspNet复现流程1.安装cuda和cudnn2.安装pytorch3.编译graspnetAPIReference 🚀非常重要的环境配置🚀 ubuntu 20.04cuda 11.0.1cudnn v8.9.7python 3.8.19pytorch 1.7.0…

如何使用openEuler 22.03 配置mail.rc给邮箱发送邮件

目录 需求环境总体步骤梳理详细步骤1. 安装mailx软件包(centos默认安装,openEuler不默认安装)2. 检查是否能ping得到smtp服务器3. 在qq邮箱开启smtp设置4. 修改/etc/mail.rc文件5. 测试 可能遇到的问题 需求 希望检查每日的备份和系统运行记…

在windows下安装wsl子系统

一、安装环境 windows规格 版本Windows 10企业版版本号22H2操作系统内部版本19045.4291 二、安装过程 2.1 以管理员身份打开PowerShell(win X快捷键); 2.2 输入命令:wsl --list --online(简写:wsl -l …