首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >autograd.grad与autograd.backward的差异?

autograd.grad与autograd.backward的差异?
EN

Stack Overflow用户
提问于 2021-09-12 05:08:38
回答 1查看 3.5K关注 0票数 7

假设我有我的自定义损失函数,我想用我的神经网络拟合一些微分方程的解。因此,在每一次向前通过时,我都是计算我的神经网络的输出,然后用期望的方程来计算损失,这是我想要拟合我的感知器。

现在我的疑问是:我是应该使用grad(loss),还是应该使用loss.backward()进行反向传播来计算和更新渐变?

我理解在使用loss.backward()时,我必须用变量包装我的张量,并且必须为变量w.r.t设置requires_grad = True,我想取损失的梯度。

所以我的问题是:

computation?

  • How
  • grad(loss)是否还需要任何这样的显式参数来识别梯度grad(loss)的变量?它实际上计算gradients?
  • Which方法更好吗?
  • ,这两者在实际场景中的主要区别是什么。

如果你能解释这两种方法的实际含义会更好,因为每当我试图在网上找到它时,我就会被许多与我的项目无关的东西轰炸。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-30 22:41:58

除了Ivan的答案之外,让torch.autograd.grad不将梯度积累到.grad中可以避免多线程场景中的竞赛条件。

引用PyTorch doc https://pytorch.org/docs/stable/notes/autograd.html#non-determinism的话

--如果您同时在多个线程上调用反向(),但使用共享输入(即,Hogwild培训)。由于参数在线程之间自动共享,在跨线程的反向调用上,梯度积累可能变得不确定,因为两个反向调用可能访问并试图积累相同的.grad属性。这在技术上是不安全的,它可能会导致赛车的情况,结果可能是无效的使用。但是,如果您使用多线程方法来驱动整个培训过程,但使用共享参数,那么使用多线程的用户应该记住线程模型,并且应该期望这种情况发生。用户可以使用函数式API torch.autograd.grad()来计算梯度,而不是向后(),以避免非确定性。

实现细节https://github.com/pytorch/pytorch/blob/7e3a694b23b383e38f5e39ef960ba8f374d22404/torch/csrc/autograd/functions/accumulate_grad.h

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69148622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档