WGAN与WGAN-GP生成器损失反向传播one、mone参数差异原因问询
WGAN与WGAN-GP生成器反向传播参数差异原因
首先明确PyTorch中loss.backward(grad_outputs)的作用:grad_outputs为链式求导的上游梯度系数,最终参数得到的梯度值等于该系数乘以损失对参数的导数,默认值为1,适配常规的损失最小化场景。
生成器的统一优化目标
不管是WGAN还是WGAN-GP,生成器的核心目标都是提升判别器对生成假图的打分D(fake_images),本质是对目标E[D(G(z))](生成假图判别打分的期望)做梯度上升。
PyTorch优化器默认执行梯度下降,参数更新规则为:参数 = 参数 - 学习率 * 梯度
要实现梯度上升有两种完全等价的代码写法:
- 写法1:损失取为
-E[D(G(z))],调用loss.backward()(默认系数1):此时计算得到的梯度为d(-E[D(G(z))])/dθ_G,代入更新规则可得θ_G = θ_G + lr * dE[D(G(z))]/dθ_G,符合梯度上升要求。 - 写法2:损失取为
E[D(G(z))],调用loss.backward(torch.tensor(-1)):此时梯度为-1 * d(E[D(G(z))])/dθ_G,代入更新规则得到的最终参数更新效果和写法1完全一致。
两段代码的对应逻辑
WGAN-GP的实现逻辑
对应上述写法2:
g_loss = self.D(fake_images).mean()就是直接计算生成假图的判别打分期望E[D(G(z))]- 反向传播时传入
mone=-1作为梯度系数,直接实现梯度上升的优化目标,符合WGAN-GP的标准实现习惯。
WGAN的实现逻辑
对应上述写法1的变种:
- 该实现的判别器训练逻辑直接对
E[D(real)] - E[D(fake)]做梯度上升,因此生成器侧需要最小化-E[D(fake)] - 反向传播时传入
one=1作为梯度系数,配合后续g_cost = -g_loss的损失统计逻辑,最终得到的参数更新效果和WGAN-GP完全等价,只是实现时的梯度方向定义不同。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

