本文翻译自这个博客,已获得作者授权,翻译的不好还请指教。
Boundary Seeking GAN (BGAN)是最近发表的GAN改进方法。在这片博文中我们将探讨BGAN的原理以及代码实现,相对于原始GAN只改动了一行代码。
BGAN原理
回顾一下,在GAN中我们要最优化下面的式子:
正如原始GAN论文中表示的,最优的判别器D*G(x)是:
因此如果我们知道每个生成器对应的最优判别器就可以重新整理上面的方程,最终变成下面这样:
从这个方程我们可以看出,即使我们没有得到最优的生成器G,仍然可以通过调整p_g(x)、生成器的分布、生成器与判别器的比例,得到真实数据的分布。
不幸的是,我们很难得到最优的判别器。但我们可以使用D(x)来近似它。假设我们反复的训练D(x),那么它会越来越接近D*G(x),我们的GAN训练也会越来越好。
进一步的理解上面的方程,当判别器的比例等于1时,我们得到p_{data}(x)=p_g(x)。如果判别器的比例等于1,则D(x)一定等于0.5。因此最优的生成器就是能使判别器处处都为0.5的那个。这里D(x)=0.5就是决策边界。因此,我们希望生成x~G(x)使D(x)接近决策边界。所以作者称这个方法是Boundary Seeking GAN (BGAN)。
直白地说,如果我们使生成器足够完美,那么D(x)就分辨不出真实和伪造的数据,也就是真实数据与伪造数据很相似。因为D(x)有两个输出,则输出是0.5.
现在我们调整生成器函数来是判别器输出都是0.5.一种方法是最小化D(x)和1-D(x)的距离。如果这样做,我们就得到D(x)=1-D(x)=0.5.
因此,新的生成器函数是:
这个也是L2损失。
实现
这可能是最简单的实现了。
我们只需要把原始GAN的G
G_loss = -torch.mean(log(D_fake))
改为
G_loss = 0.5 * torch.mean((log(D_fake) - log(1 - D_fake))**2)
这样就好了。所有的代码可以在这里找到https://github.com/wiseodd/generative-models
参考
Hjelm, R. Devon, et al. “Boundary-Seeking Generative Adversarial Networks.” arXiv preprint arXiv:1702.08431 (2017). arxiv
Goodfellow, Ian, et al. “Generative adversarial nets.” Advances in Neural Information Processing Systems. 2014. arxiv