正如我们在第 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 * xuz = 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相关推荐

  1. 【PyTorch】1入门——Tensor、自动微分、神经网络、PyTorch 图像分类

    PyTorch60min入门教程 1. PyTorch简介 2. 快速入门 2.1 安装与配置 2.2 PyTorch入门第一步 2.2.1 Tensor 2.2.2 自动微分 2.2.3 神经网络 ...

  2. PyTorch深度学习60分钟闪电战:02 Autograd - 自动微分

    本系列是PyTorch官网Tutorial Deep Learning with PyTorch: A 60 Minute Blitz 的翻译和总结. PyTorch概览 Autograd - 自动微 ...

  3. PyTorch 自动微分示例

    PyTorch 自动微分示例 autograd 包是 PyTorch 中所有神经网络的核心.首先简要地介绍,然后训练第一个神经网络.autograd 软件包为 Tensors 上的所有算子提供自动微分 ...

  4. PyTorch 自动微分

    PyTorch 自动微分 autograd 包是 PyTorch 中所有神经网络的核心.首先简要地介绍,然后将会去训练的第一个神经网络.该 autograd 软件包为 Tensors 上的所有操作提供 ...

  5. 只知道TF和PyTorch还不够,快来看看怎么从PyTorch转向自动微分神器JAX

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自:机器之心 说到当前的深度学习框架,我们往往绕不开 Ten ...

  6. 一文详解pytorch的“动态图”与“自动微分”技术

    前言 众所周知,Pytorch是一个非常流行且深受好评的深度学习训练框架.这与它的两大特性"动态图"."自动微分"有非常大的关系."动态图" ...

  7. 【Pytorch神经网络理论篇】 04 Variable类型与自动微分模块剖析

    1 Variable类型与自动微分模块概述 1.1 Variable类型 Variable是由Autograd模块对张量进行进一步封装实现的,具有自动求导的功能 1.2 Autograd模块(自动求导 ...

  8. 速成pytorch学习——3天自动微分机制

    神经网络通常依赖反向传播求梯度来更新网络参数,求梯度过程通常是一件非常复杂而容易出错的事情. 而深度学习框架可以帮助我们自动地完成这种求梯度运算. Pytorch一般通过反向传播 backward 方 ...

  9. pytorch基础-使用 TORCH.AUTOGRAD 进行自动微分(5)

    在训练神经网络时,最常用的算法是反向传播.PyTorch的反向传播(即tensor.backward())是通过autograd包来实现的,autograd包会根据tensor进行过的数学运算来自动计 ...

  10. 《20天吃透Pytorch》Pytorch自动微分机制学习

    自动微分机制 Pytorch一般通过反向传播 backward 方法 实现这种求梯度计算.该方法求得的梯度将存在对应自变量张量的grad属性下. 除此之外,也能够调用torch.autograd.gr ...

最新文章

  1. 《经济学人》也谈 Python:它会是我们的未来吗?
  2. selenium2与python自动化6-select下拉框
  3. java库net2.0下载_.NET Framework各版本独立下载.NET Framework 3.5下载.NET Framework 2.0下载...
  4. 美团杯2020 - 半前缀计数(后缀自动机)
  5. DDD理论学习系列(4)-- 领域模型
  6. 电脑故障扫描修复软件_非常时期不出门,自己在家修电脑,三例常见电脑故障排除方法。...
  7. 如何更好地刷题?谈谈我的一点看法
  8. 计算机系统结构自考知识点总结,自考《计算机系统结构》问答题总结(3)
  9. 电力系统如何实现时间同步
  10. 基于springboot+mysql的房地产中介管理系统
  11. Ardunio开发实例-光敏电阻光线强度检测
  12. Windows(多)操作系统启动过程
  13. java商城管理系统_带数据库_带界面化可用来毕业设计
  14. 贷款买房怎么做才划算?贷款买房注意事项
  15. 二叉树交换左右子树的递归与非递归算法
  16. 人生理解---3、不想学习的时候怎么办
  17. (C++题目)定义一个描述学生基本情况的类Student,数据成员包括姓名、学号、英语成绩和高数成绩;成员函数包括构造函数、析构函数、获取姓名、获取学号、求出平均成绩,以及显示各
  18. 【matlab教程】02、拼接矩阵或向量
  19. Android 应用A开启应用B
  20. 暖暖环游世界显示服务器异常,暖暖环游世界客服常见问题汇总

热门文章

  1. 广义pareto分布_Generalized Pareto Distribution (GPD)
  2. 工业循环冷却水处理设计规范_循环冷却水系统及其水处理
  3. Error running ‘Tomcat x.x.xx‘: Address localhost:xxxx is already in use
  4. [转]Vue Cli3 + VS Code 愉快调试
  5. Redis 之 简单备份还原
  6. RHEL 6.4 安装DNS服务(bind-9.8 )
  7. 在屏幕中间分别显示绿色、绿低红色、白底蓝色的字符串'welcome to masm!'
  8. CCIE试验备考之交换VLAN间路由
  9. SpringBoot的C2C水果商城系统
  10. mac下如何把本地项目上传到Github