假设我有我的自定义损失函数,我想用我的神经网络拟合一些微分方程的解。因此,在每一次向前通过时,我都是计算我的神经网络的输出,然后用期望的方程来计算损失,这是我想要拟合我的感知器。
现在我的疑问是:我是应该使用grad(loss),还是应该使用loss.backward()进行反向传播来计算和更新渐变?
我理解在使用loss.backward()时,我必须用变量包装我的张量,并且必须为变量w.r.t设置requires_grad = True,我想取损失的梯度。
所以我的问题是:
computation?
grad(loss)是否还需要任何这样的显式参数来识别梯度grad(loss)的变量?它实际上计算gradients?如果你能解释这两种方法的实际含义会更好,因为每当我试图在网上找到它时,我就会被许多与我的项目无关的东西轰炸。
发布于 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://stackoverflow.com/questions/69148622
复制相似问题