自动梯度计算

news2024/11/15 13:45:50

神经网络的参数主要通过梯度下降来进行优化. 当确定了风险函数以及网络结构后, 我们就可以手动用链式法则来计算风险函数对每个参数的梯度, 并用代码进行实现. 但是手动求导并转换为计算机程序的过程非常琐碎并容易出错,导致实现神经网络变得十分低效. 实际上, 参数的梯度可以让计算机来自动计算. 目前, 主流的深度学习框架都包含了自动梯度计算的功能, 即我们可以只考虑网络结构并用代码实现, 其梯度可以自动进行计算, 无须人工干预, 这样可以大幅提高开发效率.
自动计算梯度的方法可以分为以下三类: 数值微分、符号微分和自动微分.

1. 数值微分

数值微分( Numerical Differentiation)是用数值方法来计算函数𝑓(𝑥)的导数.函数𝑓(𝑥)的点𝑥 的导数定义为

要计算函数 𝑓(𝑥) 在点 𝑥 的导数,可以对 𝑥 加上一个很少的非零的扰动 Δ𝑥,通过上述定义来直接计算函数𝑓(𝑥)的梯度.数值微分方法非常容易实现,但找到一个合适的扰动 Δ𝑥 却十分困难.如果 Δ𝑥 过小,会引起数值计算问题,比如舍入误差; 如果Δ𝑥 过大, 会增加截断误差, 使得导数计算不准确.因此,数值微分的实用性比较差.

在实际应用, 经常使用下面公式来计算梯度, 可以减少截断误差. 

 

数值微分的另外一个问题是计算复杂度. 假设参数数量为𝑁, 则每个参数都需要单独施加扰动, 并计算梯度. 假设每次正向传播的计算复杂度为𝑂(𝑁), 则计算数值微分的总体时间复杂度为O(N^2)

2. 符号微分

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

比如数学表达式的化简:

符号计算一般来讲是对输入的表达式,通过迭代或递归使用一些事先定义的规则进行转换.当转换结果不能再继续使用变换规则时,便停止计算.
符号微分可以在编译时就计算梯度的数学表示,并进一步利用符号计算方法进行优化.此外,符号计算的一个优点是符号计算和平台无关,可以在CPU或GPU 上运行.符号微分也有一些不足之处: 1)编译时间较长,特别是对于循环,需要很长时间进行编译; 2)为了进行符号微分,一般需要设计一种专门的语言来表示数学表达式, 并且要对变量( 符号)进行预先声明; 3)很难对程序进行调试. 

3. 自动微分

自动微分( Automatic Differentiation, AD) 是一种可以对一个( 程序) 函数进行计算导数的方法. 符号微分的处理对象是数学表达式, 而自动微分的处理对象是一个函数或一段程序. 

自动微分的基本原理是所有的数值计算可以分解为一些基本操作, 包含+, −, ×, / 和一些初等函数 exp, log, sin, cos 等, 然后利用链式法则来自动计算一个复合函数的梯度. 

为简单起见, 这里以一个神经网络中常见的复合函数的例子来说明自动微分的过程. 令复合函数𝑓(𝑥; 𝑤, 𝑏)为 

 

其中𝑥 为输入标量, 𝑤 和𝑏分别为权重和偏置参数.

首先, 我们将复合函数 𝑓(𝑥; 𝑤, 𝑏) 分解为一系列的基本操作, 并构成一个计算图( Computational Graph).计算图是数学运算的图形化表示.计算图中的每个非叶子节点表示一个基本操作, 每个叶子节点为一个输入变量或常量.下图给出了当 𝑥 = 1, 𝑤 = 0, 𝑏 = 0 时复合函数 𝑓(𝑥; 𝑤, 𝑏) 的计算图, 其中连边上的红色数字表示前向计算时复合函数中每个变量的实际取值.

复合函数𝑓(𝑥; 𝑤, 𝑏)的计算图

从计算图上可以看出, 复合函数 𝑓(𝑥; 𝑤, 𝑏) 由 6 个基本函数 ℎ𝑖, 1 ≤ 𝑖 ≤ 6 组成. 如下表所示, 每个基本函数的导数都十分简单, 可以通过规则来实现.

复合函数𝑓(𝑥; 𝑤, 𝑏)的6个基本函数及其导数

整个复合函数 𝑓(𝑥; 𝑤, 𝑏) 关于参数 𝑤 和 𝑏 的导数可以通过计算图上的节点𝑓(𝑥; 𝑤, 𝑏)与参数𝑤 和𝑏之间路径上所有的导数连乘来得到, 即

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

按照计算导数的顺序, 自动微分可以分为两种模式: 前向模式和反向模式. 

3.1. 前向模式

前向模式是按计算图中计算方向的相同方向来递归地计算梯度. 以\frac{\partial f(x;w, b)}{\partial b}为例,当𝑥 = 1, 𝑤 = 0, 𝑏 = 0时, 前向模式的累积计算顺序如下:

 

3.2. 反向模式

反向模式是按计算图中计算方向的相反方向来递归地计算梯度. 以 \frac{\partial f(x;w, b)}{\partial b}为例, 当𝑥 = 1, 𝑤 = 0, 𝑏 = 0时, 反向模式的累积计算顺序如下:

 

前向模式和反向模式可以看作应用链式法则的两种梯度累积方式. 从反向模式的计算顺序可以看出, 反向模式和反向传播的计算梯度的方式相同.

对于一般的函数形式f: R^N \rightarrow R^M, 前向模式需要对每一个输入变量都进行一遍遍历, 共需要 𝑁 遍. 而反向模式需要对每一个输出都进行一个遍历, 共需要𝑀 遍. 当𝑁 > 𝑀 时, 反向模式更高效. 在前馈神经网络的参数学习中, 风险函数为f: R^N \rightarrow R, 输出为标量, 因此采用反向模式为最有效的计算方式, 只需要一遍计算.

3.3. 静态计算图和动态计算图

计算图按构建方式可以分为静态计算图( Static Computational Graph) 和动态计算图( Dynamic Computational Graph).静态计算图是在编译时构建计算图, 计算图构建好之后在程序运行时不能改变, 而动态计算图是在程序运行时动态构建. 两种构建方式各有优缺点.静态计算图在构建时可以进行优化, 并行能力强, 但灵活性比较差. 动态计算图则不容易优化,当不同输入的网络结构不一致时, 难以并行计算, 但是灵活性比较高.

3.4. 符号微分和自动微分

符号微分和自动微分都利用计算图和链式法则来自动求解导数. 符号微分在编译阶段先构造一个复合函数的计算图, 通过符号计算得到导数的表达式, 还可以对导数表达式进行优化, 在程序运行阶段才代入变量的具体数值来计算导数. 而自动微分则无须事先编译, 在程序运行阶段边计算边记录计算图, 计算图上的局部梯度都直接代入数值进行计算, 然后用前向或反向模式来计算最终的梯度. 

下图给出了符号微分与自动微分的对比.

符号微分与自动微分对比

参考文献

神经网络与深度学习

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

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

相关文章

二叉树的基础oj题(单值二叉树、相同的树、对称二叉树、二叉树的前序、中序、后序遍历、另一棵树的子树、二叉树的构建和遍历、翻转二叉树)

今天,我带来二叉树的基础oj题 目录单值二叉树:[链接](https://leetcode.cn/problems/univalued-binary-tree/)相同的树:[链接](https://leetcode.cn/problems/same-tree/)对称二叉树:[链接](https://leetcode.cn/problems/symmetr…

syzkaller 黑盒测试1:环境搭建

syzkaller 黑盒测试1:环境搭建 近期需要使用syzkaller对某Linux发行版系统内核进行测试,但是未提供内核源码,只能在黑盒条件下测试。这是笔者第一次接触syzkaller,对测试流程不太熟悉。另外,网上很少有syzkaller黑盒测…

C语言版扫雷——从0到1实现扫雷小游戏

🐒博客名:平凡的小苏 📚学习格言:有志者,事竟成,破釜沉舟,百二秦关终属楚;苦心人,天不负,卧薪尝胆,三千越甲可吞吴。 扫雷思维导图 目录 扫雷思维…

9_2、Java基本语法之常用类日期、时间类的使用

一、JDK 8之前时间日期API jdk8之前的日期时间类 1.System的currentTimeMillis() 2.java.util.Date以及子类java.sql.Date 3.SimpleDateFormat 4.Calender类:日历类 1、获取系统当前时间:System类下的currentTimeMillis(); //返回的是当前时间与1970年…

MySQL--整合Keepalived进行双机热备自动切换(升级版)

原文网址:MySQL--整合Keepalived进行双机热备自动切换(升级版)_IT利刃出鞘的博客-CSDN博客 简介 本文介绍MySQL整合Keepalived进行双机热备自动切换(升级版)。 服务器要考虑高可用问题。nginx、tomcat、缓存、队列、数…

Java开发的古董拍卖系统竞标系统拍卖网

简介 古董展品拍卖网站 用户可以注册成为买家也可以申请开店成为卖家,发布古董展品,设置拍卖起止时间进行展品的拍卖。如果早于拍卖开始时间或者晚于拍卖结束时间,则不可以竞拍。多人竞拍,买家可以根据最高价设置谁中标&#xff…

系分 - 结构化方法【概念】

个人总结,仅供参考,欢迎加好友一起讨论 系分 - (概念)结构化方法 结构化方法贯穿整个软件工程全部,可以单独细分出来作为某个软件工程环节的技术指引 结构化方法,由结构化分析(SA,St…

【C语言进阶】速学,不会用数据库可不能再错过文本与二进制文件操作

目录 ✨前言✨: 🎈一、文本文件与二进制文件🎈: 🎁二、文件读取结束的判定🎁: 1.错误使用 feof 函数: 2.判断文件读取结束: 🎊三、文件缓冲区&#x1f38…

Ubuntu虚拟机图文安装详细教程

Hello, 小伙伴们,大家好!今天教大家一步一步进行ubuntu虚拟机的安装。俗话说的好:“工欲善其事必先利其器”,作为一名嵌入式软件开发人员,我们必须熟悉Linux系统的操作及使用,熟练掌握Linux系统下的开发&am…

java 接口的私有方法

其实java8就已经做下伏笔了 在拥有静态和默认 两种拥有方法体的方法之后 接口出现私有方法也是一种必然 然后我们来创建一个包 包下创建一个接口 subInterface 参考代码如下 public interface subInterface {private void show2() {System.out.println("我是一个私有方…

头条权重在线查询,头条号增加权重的4个妙招

头条号权重可以简单理解为头条号指数,刚开通头条号的时候,会根据头条号的领域、介绍等等给予相应的权重。后期会根据账号使用情况进行调整权重,提高或者降低。 头条权重在线查询方法 打开“站长工具”之后,输入网站网址。…

LeetCodeday04

24. 两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例 1: 输入:head [1,2,3…

JavaScript篇.day08-DOM,节点,事件,定时器,位置及坐标

目录 1.DOM 2.DOM相关操作 (1)获取元素 (2)操作元素 (3)操作元素属性 (4)操作元素类名 (5)操作元素样式 3.节点操作 4.事件 5.事件传播 6.定时器 7.位置及坐标 1.DOM Document Object Model 文档对象模型一整套操作文档流相关内容的属性和方法可以做的操作: 修改样…

前端框架搭建(六)搭建页面框架【vite】

1.安装所需依赖 需要安装 vue-routernaive视图框架 npm npm install vue-router4 yarn yarn add vue-router4npm i -D naive-ui2.搭建naive适配框架 创建文件夹——存放通用组件 在components下创建文件夹common 全局配置常用组件 在之前创建的global.d.ts中添加Window…

枚举的应用

枚举: 在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。 [1] 是一个被命名的整型常数的集合,枚举在日常生活…

基于CAS操作的atomic原子类型

原子操作 C A S (compare And Swap)也叫比较交换,是一种无锁原子算法,映射到操作系统就是一条cmpxchg硬件汇编指令(保证原子性),其作用是让CPU将内存值更新为新值,但是有个条件,内存值必须与期望…

站长权重在线查询,怎么查询网站权重是多少?

什么是网站权重 当站长们辛辛苦苦建立起来一个网站,怎么才能知道自己的网站在搜索引擎中的权重情况呢? 对于很多人而言,权重这个词可能听到最多的场景就是淘宝京东店铺权重。淘宝或京东会根据商家网店的浏览量、好评率、转化率、是否…

4A(统一安全管控平台)解析

4A是指帐号(Account)、认证(Authentication)、授权(Authorization)和审计(Audit),4A统一安全管控平台是以身份为中心,实现帐号、认证、授权和审计统一管控的安…

Spark注意事项

一、Spark理解 数据的操作只有两种 大数据领域中对数据的操作只有两种:聚合 & 处理 无论是多华丽算法,最终都是这两个平平无奇的操作组合而成的 action理解 在spark中,一个action操作为一个jobId(在源码中可以看到runjob 是只有在action操作后才会调用) , 所以一个…

Mac内存空间不足导致无法安装Ventura?可用这些方法释放储存空间

安装Macos新版系统Ventura需要非常多的内存空间,本身我们的Mac磁盘空间就掣襟肘见,我们又该如何释放Mac磁盘空间来安装Ventura呢?今日,小编将分享一些能够释放大量Mac内存空间的方法,以便大家能够优化Mac的运行速度外还…