DCGAN训练时更新生成器前不清零判别器梯度的原因咨询
问题结论
你的猜测完全正确,PyTorch中不同网络的梯度独立存储、优化器更新范围限定的特性,决定了更新生成器前不需要清零判别器的梯度。
具体原因拆解
- 梯度存储独立:PyTorch中每个可学习参数的梯度都保存在自身的
.grad属性中,netD和netG是两个完全独立的网络,参数互不关联,判别器参数上的梯度不会写入生成器的参数梯度中。 - 优化器更新范围限定:你用到的
optimizerG在初始化时就只绑定了netG的可学习参数,调用optimizerG.step()时,它只会读取并更新netG的参数,完全不会操作netD的参数和对应梯度,哪怕判别器的梯度还残留在参数上,也不会对生成器的更新产生任何影响。 - 冗余操作无意义:就算你在该位置加上
netD.zero_grad()也不会导致训练出错,只是属于没有实际作用的冗余操作,官方示例去掉它只是为了减少不必要的计算开销。
补充说明
你可能会疑惑:更新G阶段执行errG.backward()时,也会计算netD参数的梯度,会不会影响后续判别器的训练?这也不会有问题,因为下一轮训练的第一步就是执行netD.zero_grad(),会把所有旧的、临时计算的判别器梯度全部清零,这些临时梯度根本不会被用到optimizerD.step()的更新过程中。
内容的提问来源于stack exchange,提问作者mrgloom
相关产品推荐
相关产品推荐

