翻译: 2.5. 自动微分 深入神经网络 pytorch
正如我们在第 2.4 节中所解释的,微分是几乎所有深度学习优化算法中的关键步骤。虽然获取这些导数的计算很简单,只需要一些基本的微积分,但对于复杂的模型,手动计算更新可能会很痛苦(而且通常容易出错)。
深度学习框架通过自动计算导数来加速这项工作,即自动微分。在实践中,基于我们设计的模型,系统构建了一个计算图,跟踪哪些数据通过哪些操作组合以产生输出。自动微分使系统能够随后反向传播梯度。在这里,反向传播只是意味着跟踪计算图,填充关于每个参数的偏导数。
2.5.1 一个简单的例子
import torchx = torch.arange(4.0)
x
tensor([0., 1., 2., 3.])
在我们计算梯度之前y关于x ,我们需要一个地方来存放它。重要的是,我们不要在每次对参数求导时分配新内存,因为我们经常会更新相同的参数数千或数百万次,并且可能会很快耗尽内存。请注意,标量值函数相对于向量的梯度 x本身是向量值的并且具有相同的形状x .
x.requires_grad_(True) # Same as `x = torch.arange(4.0, requires_grad=True)`
x.grad # The default value is None
现在让我们计算y.
y = 2 * torch.dot(x, x)
y
tensor(28., grad_fn=<MulBackward0>)
由于x是长度为 4 的向量,因此执行x和的点积x ,产生我们分配给 的标量输出y。接下来,我们可以通过调用反向传播函数并打印梯度来自动计算y相对于每个分量的梯度。
y.backward()
x.grad
tensor([ 0., 4., 8., 12.])
x.grad == 4 * x
tensor([True, True, True, True])
现在让我们计算 的另一个函数x。
# PyTorch accumulates the gradient in default, we need to clear the previous
# values
x.grad.zero_()
y = x.sum()
y.backward()
x.grad
tensor([1., 1., 1., 1.])
2.5.2. 非标量变量的反向传播
从技术上讲,当y不是标量时,向量y对向量的微分最自然的解释x 是矩阵。对于高阶和高维y和x,微分结果可能是高阶张量。
然而,虽然这些更奇特的对象确实出现在高级机器学习(包括深度学习)中,但更常见的是,当我们对向量进行反向传播调用时,我们会尝试计算批次中每个组成部分的损失函数的导数。训练示例。在这里,我们的目的不是计算微分矩阵,而是为批处理中的每个示例单独计算的偏导数之和。
# Invoking `backward` on a non-scalar requires passing in a `gradient` argument
# which specifies the gradient of the differentiated function w.r.t `self`.
# In our case, we simply want to sum the partial derivatives, so passing
# in a gradient of ones is appropriate
x.grad.zero_()
y = x * x
# y.backward(torch.ones(len(x))) equivalent to the below
y.sum().backward()
x.grad
tensor([0., 2., 4., 6.])
2.5.3. 分离计算
有时,我们希望将一些计算移到记录的计算图之外。例如,假设y是作为 的函数计算的x,并且随后z是作为 和 的函数计算y的x。现在,假设我们想计算z相对于的梯度x,但出于某种原因想将y其视为一个常数,并且只考虑计算x后y所起的作用。
在这里,我们可以分离y以返回一个新变量u,该变量具有相同的值,y但会丢弃有关如何y在计算图中计算的任何信息。换句话说,梯度不会倒流u到x。因此,以下反向传播函数计算 相对于的偏导数,同时将其视为常数,而不是相对于 的偏导数。z = u * x
, uz = x * x * x
x.grad.zero_()
y = x * x
u = y.detach()
z = u * xz.sum().backward()
x.grad == u
tensor([True, True, True, True])
由于y记录了 的计算,我们随后可以调用反向传播y来获得 的导数,即。y = x * x
x.grad.zero_()
y.sum().backward()
x.grad == 2 * x
tensor([True, True, True, True])
2.5.4。计算 Python 控制流的梯度
使用自动微分的一个好处是,即使构建函数的计算图需要通过 Python 控制流的迷宫(例如,条件、循环和任意函数调用),我们仍然可以计算结果变量的梯度。在下面的代码片段中,请注意 while循环的迭代次数和语句的评估if都取决于 input 的值a。
def f(a):b = a * 2while b.norm() < 1000:b = b * 2if b.sum() > 0:c = belse:c = 100 * breturn c
让我们计算梯度。
a = torch.randn(size=(), requires_grad=True)
d = f(a)
d.backward()
我们现在可以分析f上面定义的函数。请注意,它的输入是分段线性的a。换句话说,对于任何a存在一些常数标量k这样,其中 的值取决于输入。因此,我们可以验证梯度是否正确。f(a) = d / a
a.grad == d / a
tensor(True)
2.5.5 概括
深度学习框架可以自动计算导数。为了使用它,我们首先将梯度附加到我们希望偏导数的那些变量上。然后我们记录目标值的计算,执行它的反向传播函数,并访问结果梯度。
2.5.6。练习
参考
https://d2l.ai/chapter_preliminaries/autograd.html
翻译: 2.5. 自动微分 深入神经网络 pytorch相关推荐
- 【PyTorch】1入门——Tensor、自动微分、神经网络、PyTorch 图像分类
PyTorch60min入门教程 1. PyTorch简介 2. 快速入门 2.1 安装与配置 2.2 PyTorch入门第一步 2.2.1 Tensor 2.2.2 自动微分 2.2.3 神经网络 ...
- PyTorch深度学习60分钟闪电战:02 Autograd - 自动微分
本系列是PyTorch官网Tutorial Deep Learning with PyTorch: A 60 Minute Blitz 的翻译和总结. PyTorch概览 Autograd - 自动微 ...
- PyTorch 自动微分示例
PyTorch 自动微分示例 autograd 包是 PyTorch 中所有神经网络的核心.首先简要地介绍,然后训练第一个神经网络.autograd 软件包为 Tensors 上的所有算子提供自动微分 ...
- PyTorch 自动微分
PyTorch 自动微分 autograd 包是 PyTorch 中所有神经网络的核心.首先简要地介绍,然后将会去训练的第一个神经网络.该 autograd 软件包为 Tensors 上的所有操作提供 ...
- 只知道TF和PyTorch还不够,快来看看怎么从PyTorch转向自动微分神器JAX
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自:机器之心 说到当前的深度学习框架,我们往往绕不开 Ten ...
- 一文详解pytorch的“动态图”与“自动微分”技术
前言 众所周知,Pytorch是一个非常流行且深受好评的深度学习训练框架.这与它的两大特性"动态图"."自动微分"有非常大的关系."动态图" ...
- 【Pytorch神经网络理论篇】 04 Variable类型与自动微分模块剖析
1 Variable类型与自动微分模块概述 1.1 Variable类型 Variable是由Autograd模块对张量进行进一步封装实现的,具有自动求导的功能 1.2 Autograd模块(自动求导 ...
- 速成pytorch学习——3天自动微分机制
神经网络通常依赖反向传播求梯度来更新网络参数,求梯度过程通常是一件非常复杂而容易出错的事情. 而深度学习框架可以帮助我们自动地完成这种求梯度运算. Pytorch一般通过反向传播 backward 方 ...
- pytorch基础-使用 TORCH.AUTOGRAD 进行自动微分(5)
在训练神经网络时,最常用的算法是反向传播.PyTorch的反向传播(即tensor.backward())是通过autograd包来实现的,autograd包会根据tensor进行过的数学运算来自动计 ...
- 《20天吃透Pytorch》Pytorch自动微分机制学习
自动微分机制 Pytorch一般通过反向传播 backward 方法 实现这种求梯度计算.该方法求得的梯度将存在对应自变量张量的grad属性下. 除此之外,也能够调用torch.autograd.gr ...
最新文章
- 《经济学人》也谈 Python:它会是我们的未来吗?
- selenium2与python自动化6-select下拉框
- java库net2.0下载_.NET Framework各版本独立下载.NET Framework 3.5下载.NET Framework 2.0下载...
- 美团杯2020 - 半前缀计数(后缀自动机)
- DDD理论学习系列(4)-- 领域模型
- 电脑故障扫描修复软件_非常时期不出门,自己在家修电脑,三例常见电脑故障排除方法。...
- 如何更好地刷题?谈谈我的一点看法
- 计算机系统结构自考知识点总结,自考《计算机系统结构》问答题总结(3)
- 电力系统如何实现时间同步
- 基于springboot+mysql的房地产中介管理系统
- Ardunio开发实例-光敏电阻光线强度检测
- Windows(多)操作系统启动过程
- java商城管理系统_带数据库_带界面化可用来毕业设计
- 贷款买房怎么做才划算?贷款买房注意事项
- 二叉树交换左右子树的递归与非递归算法
- 人生理解---3、不想学习的时候怎么办
- (C++题目)定义一个描述学生基本情况的类Student,数据成员包括姓名、学号、英语成绩和高数成绩;成员函数包括构造函数、析构函数、获取姓名、获取学号、求出平均成绩,以及显示各
- 【matlab教程】02、拼接矩阵或向量
- Android 应用A开启应用B
- 暖暖环游世界显示服务器异常,暖暖环游世界客服常见问题汇总
热门文章
- 广义pareto分布_Generalized Pareto Distribution (GPD)
- 工业循环冷却水处理设计规范_循环冷却水系统及其水处理
- Error running ‘Tomcat x.x.xx‘: Address localhost:xxxx is already in use
- [转]Vue Cli3 + VS Code 愉快调试
- Redis 之 简单备份还原
- RHEL 6.4 安装DNS服务(bind-9.8 )
- 在屏幕中间分别显示绿色、绿低红色、白底蓝色的字符串'welcome to masm!'
- CCIE试验备考之交换VLAN间路由
- SpringBoot的C2C水果商城系统
- mac下如何把本地项目上传到Github