BiGAN的算法思想:这里把将编码器和解码器分开,不再一起训练,但是额外加一个判别器,将编码器和解码器的输入和输出(Z和X)同时作为判别器的输入,然后让判别器区分输入数据是来自编码器还是解码器,但是encoder和decoder会尽量不让D做出正确的判别,如果有朝一日,判别器D无法分别输入的数据到底是来自哪个,就说明编码器的输入图片和解码器生成的图片很接近,编码器输出的z和解码器输入的z很接近,就成功了呢。
简单的原理就是将编码器看成一个P(x,z)分布,将解码器看成Q(x,z)分布,通过判别器,让他们的差异越来越小。
理想情况下,我们希望最后encoder和decoder达到这样的效果。
X输入到encoder,得到的code Z输入到decoder,就还原出X。
Z输入到decoder,得到的X输入到encoder,就能还原出Z。
也就是形成了一个AE。
算法如下:
P(Z)就是一个既定的输入,可以是正态分布。
判别器D希望能正确地分清楚输入数据的来源,那么encoder和decoder的目标就反着来,对着干,我就是不让你D分清楚。encoder目标让判别器D把来自自己的数据判别为是decoder的,decoder目标让判别器D把来自自己的数据判别为是encoder的。
说到这里,BiGAN的意思就是用GAN的判别器去训练出一个可以对接的encoder和decoder。除此之外,完了后呢,decoder就能拿来使用了,因为decoder就是GAN的generator。
感觉和VAEGAN有着异曲同工之妙啊,虽然设计上不同,D的目标上也是不同,但是都是借助AE和D来形成一个latent code的分布这样一来我们就可以既得到了AE,又得到了GAN。
那么BiGAN的结构是否是好像也可以改成训练两个自编码器?
因为我们期望最佳最理想的情况下,encoder和decoder二者是可以拼接起来的。
实际上还是有区别的,BiGAN在实际情况不可能最优,只能近似最优,而且这两个出来的图的特性不一样,自编码器出来还是跟输入的图一样,输入和输出可能没啥大差别哈,但是BiGAN计算出来的可能不是同一张图,但是还是原来图的内容,比如输入是一只鸟,输出可能是另一只鸟,鸟还是鸟,不会变别的,这个可能就是GAN的特性吧,BiGAN更具有创造特性。这种创造性可能是来自于评判标准的不一致。BiGAN没有重建损失,只是判别是来自哪个分布,这样的话要求就降低了,当然这是我猜的。。。