pytorch autograd是如何工作的?

时间:2017-05-26 10:01:38

标签: deep-learning pytorch automatic-differentiation

我将此问题提交给了cycleGAN pytorch implementation,但由于没有人在那里回复我,我会在这里再次提问。

我主要感到困惑的是,在一次向后传球之前调用了多个前向传球,请参阅代码cycle_gan_model中的以下内容

# GAN loss
# D_A(G_A(A))
self.fake_B = self.netG_A.forward(self.real_A)
pred_fake = self.netD_A.forward(self.fake_B)
self.loss_G_A = self.criterionGAN(pred_fake, True)
# D_B(G_B(B))
self.fake_A = self.netG_B.forward(self.real_B)
pred_fake = self.netD_B.forward(self.fake_A)
self.loss_G_B = self.criterionGAN(pred_fake, True)
# Forward cycle loss G_B(G_A(A))
self.rec_A = self.netG_B.forward(self.fake_B)
self.loss_cycle_A = self.criterionCycle(self.rec_A, self.real_A) * lambda_A
# Backward cycle loss G_A(G_B(B))
self.rec_B = self.netG_A.forward(self.fake_A)
self.loss_cycle_B = self.criterionCycle(self.rec_B, self.real_B) * lambda_B
# combined loss
self.loss_G = self.loss_G_A + self.loss_G_B + self.loss_cycle_A + self.loss_cycle_B + self.loss_idt_A + self.loss_idt_B
self.loss_G.backward()

我看到它的方式,G_A和G_B每个都有三个前向传球,两次接受真实数据(real_Areal_B)和两次假数据(fake_B或{{ 1}})。

在张量流(我认为)中,后向传递总是在最后一个输入数据中计算出来。在这种情况下,fake_A的反向传播是错误的。一个人应该做三次向后传球,每次都是在他们的前锋传球后立即进行。

具体来说,来自loss_G的{​​{1}}渐变是w.r.t netG_A,但来自loss_G_A的渐变是w.r.t real_A

我认为这是在pytorch中以某种方式处理的。但是模型如何知道它应该计算哪些输入数据的梯度?

1 个答案:

答案 0 :(得分:4)

Pytorch使用基于磁带的系统进行自动区分。这意味着它将从它上次的操作反向传播。我认为最好的理解方法是从流程中制作一个图表。我附上一个我亲手做的enter image description here

现在您将看到某些模块“重复”。我对它们的看法与我对RNN的思考方式相同;以这种方式,只会添加渐变。