论文阅读:O-GAN: Extremely Concise Approach for Auto-Encoding Generative Adversarial Networks
GAN的简介
GAN (Generative Adversarial Network)
GAN 主要包括了两个部分:G 生成器( generator) 与D 判别器( discriminator)。生成器:主要用来学习真实图像分布从而让自身生成的图像更加真实,以骗过判别器。判别器:需要对接收的图片进行真假判别。整个过程中,生成器努力地让生成的图像更加真实,而判别器则努力地去识别出图像的真假。这个过程相当于二人博弈,随着时间的推移,生成器和判别器在不断地进行对抗,最终两个网络达到了一个动态均衡:生成器生成的图像接近于真实图像分布,判别器识别不出真假图像。
首先,有一个一代的 generator,它能生成很差的图片,然后有一个一代的discriminator,准确地对生成的图片和真实的图片进行判断,简而言之,discriminator 就是一个二分类器,对生成的图片输出 0,对真实的图片输出 1。接着,开始训练出二代的 generator,它能生成稍好一点的图片,让一代的 discriminator 认为生成的图片是真实的图片。然后会训练出一个二代的 discriminator,它能准确的识别出真实的图片和二代 generator 生成的图片。以此类推,会有n 代的 generator 和 discriminator,最后 discriminator 无法分辨生成的图片和真实图片,这个网络就拟合了。
GAN 已经越来越成熟,越做越庞大,诸如 BigGAN、StyleGAN 等算是目前最先进的 GAN 模型也已被人熟知,甚至玩得不亦乐乎。不过,这几个最先进的 GAN 模型,目前都只有生成器功能,没有编码器功能,也就是说可以源源不断地生成新图片,却不能对已有的图片提取特征。当然,带有编码器的 GAN 也有不少研究,参考BiGAN-QP:简单清晰的编码 & 生成模型。但不管有没有编码能力,大部分 GAN 都有一个特点:训练完成后,判别器都是没有用的。因为理论上越训练,判别器越退化(比如趋于一个常数)。做过 GAN 的都知道,GAN 的判别器和生成器两个网络的复杂度是相当的(如果还有编码器,那么复杂度也跟它们相当),训练完 GAN 后判别器就不要了,那实在是对判别器这个庞大网络的严重浪费!一般来说,判别器的架构跟编码器是很相似的,那么一个很自然的想法是能不能让判别器和编码器共享大部分权重?过去所有的 GAN 相关的模型中,只有 IntroVAE 做到了这一点。但相对而言 IntroVAE 的做法还是比较复杂的,而且目前网上还没有成功复现 IntroVAE 的开源代码。
而本文的方案则极为简单——通过稍微修改原来的GAN模型,就可以让判别器转变为一个编码器,不管是复杂度还是计算量都几乎没有增加。
模型
一般GAN的写法:
其中x∈Rnx,z∈Rnz, p(x)是真实图片集的“证据分布”,q(z)是噪声的分布(在本文中,它是nz元标准正态分布);而G:Rnz→Rnx和D:Rnx→R自然就是生成器和判别器了,f,g,h则是一些确定的函数,不同的GAN对应着不同的f,h,g。
定义几个向量运算符:
当nz≥3时(真正有价值的GAN都满足这个条件),[avg(z),std(z),N(z)]是函数无关的,也就是说它相当于是原来向量z的一个“正交分解”。
判别器的结构与编码器结构相似:判别器生成一个标量,编码器生成一个向量
把判别器分解:
E是Rnx→Rnz的映射,而T是Rnz→R的映射。E的参数量会远远多于T的参数量,目的是希望E(x)具有编码功能。
解决方法:加入一个相关系数(Person系数)−ρ(z, E(G(z)))(用于D与G之间
如果 λ=0,那么就是普通的 GAN 而已(只不过判别器被分解为两部分 E 和 T 两部分)。加上了这个相关系数,直观上来看,就是希望 z 和 E(G(z)) 越线性相关越好。显然这个相关系数可以嵌入到任意现成的 GAN 中,改动量显然也很小(拆分一下判别器、加一个 loss),在上述公式里,Person系数是用来衡量是否在一条线上即是否线性相关。
这样一来,GAN的判别器D分解为了E和T两部分,E变成了编码器,也就是说,判别器的大部分参数已经被利用上了。但是还剩下T,训练完成后T也是没用的,T可否省去?方法是直接用avg(E(x))做判别器
这样一来整个模型中已经没有 T 了,只有纯粹的生成器 G 和编码器 E,整个模型没有丝毫冗余的地方。
实验
注意,理论上来讲,本文引入的相关系数项并不能提高生成模型的质量,所以实验的目标主要有两个:1)这个额外的 loss 会不会有损原来生成模型的质量;2)这个额外的 loss 是不是真的可以让 E 变成一个有效的编码器?
数据集上,这次的实验做得比较完整,在 CelebA HQ、FFHQ、LSUN-churchoutdoor、LSUN-bedroom 四个数据集上都做了实验,分辨率都是 128 × 128 (其实还做了一点 256 × 256 的实验,结果也不错,但是没放到论文上)。模型架构跟以往一样都是DCGAN,其余细节直接看论文或者代码吧。
1. 随机生成效果还不错,说明新引入的相关系数项没有降低生成质量;
2. 重构效果还不错,说明 E(x) 确实提取到了 x 的主要特征;
3. 线性插值效果还不错,说明 E(x) 确实学习到了接近线性可分的特征。
论据(原理)
很明显,这个额外的重构项的作用就是让 z 尽可能与 E(G(z)) “相关”,对于它,相信大多数读者的第一想法应该是 mse (均方方差)损失,而非本文用的 ρ(z,E(G(z)))。但事实上,如果加入那么训练基本上都会失败。那为什么 ρ(z,E(G(z))) 又会成功呢?根据前面的定义,E(x) 输出一个 维的向量,但是 T(E(x)) 只输出一个标量,也就是说,E(x) 输出了个自由度,而作为判别器,T(E(x)) 至少要占用一个自由度(当然,理论上它也只需要占用一个自由度)。如果最小化,那么训练过程会强迫E(G(z)) 完全等于 z,也就是说个自由度全部被它占用了,没有多余的自由度给判别器来判别真假了,所以加入大概率都会失败。但是 ρ(z,E(G(z))) 不一样,ρ(z,E(G(z))) 跟 avg(E(G(z))) 和 std(E(G(z))) 都没关系(只改变向量 E(G(z)) 的 avg 和 std,不会改变 ρ(z,E(G(z))) 的值,因为 ρ 本身就先减均值除标准差了),这意味着就算我们最大化 ρ(z,E(G(z))),我们也留了至少两个自由度给判别器。这也是为什么在上文中我们甚至可以直接用 avg(E(x)) 做判别器,因为它不会被 ρ(z,E(G(z))) 的影响的。
一个相似的例子是 InfoGAN。InfoGAN 也包含了一个重构输入信息的模块,这个模块也和判别器共享大部分权重(编码器),而因为 InfoGAN 事实上只重构部分输入信息,因此重构项也没占满编码器的所有自由度,所以 InfoGAN 那样做是合理的——只要给判别器留下至少一个自由度。
另外还有一个事实也能帮助我们理解。因为我们在对抗训练的时候,噪声是z ~ 的,当生成器训练好之后,那么理论上对所有的 z ~ ,G(z) 都会是一张逼真的图片,事实上,反过来也是成立的,如果 G(z) 是一张逼真的图片,那么应该有z ~ (即位于 N(0,Inz) 的高概率区域)。进一步推论下去,对于z ~ ,我们有 avg(z)≈0 以及 std(z)≈1。那么,如果 G(z) 是一张逼真的图片,那么必要的条件是 avg(z)≈0 以及 std(z)≈1。应用这个结论,如果我们希望重构效果好,也就是希望 G(E(x)) 是一张逼真的图片,那么必要的条件是 avg(E(x))≈0 以及 std(E(x))≈1。这就说明,对于一个好的 E(x),我们可以认为 avg(E(x)) 和 std(E(x)) 都是已知的(分别等于 0 和 1),既然它们是已知的,我们就没有必要拟合它们,换言之,在重构项中可以把它们排除掉。而事实上:
也就是说在 mse 损失中排除掉 avg(E(x)) 和 std(E(x)) 的话,然后省去常数,它其实就是 −ρ(z,E(G(z))),这再次说明了 ρ(z,E(G(z))) 的合理性。并且由这个推导,重构过程并不是 G(E(x)) 而是:
最后,这个额外的重构项理论上还能防止 mode collapse 的出现。其实很明显,因为重构质量都不错了,生成质量再差也差不到哪里去,自然就不会怎么 mode collapse 了。
非要说数学依据的话,我们可以将 ρ(z, E(G(z))) 理解为 Z 和 G(Z) 的互信息上界,所以最小化 −ρ(z, E(G(z))) 事实上在最大化 Z 与 G(Z) 的互信息,这又等价于最大化 G(Z) 的熵。而 G(Z) 的熵大了,表明它的多样性增加了,也就远离了 mode collapse。类似的推导可以参考能量视角下的GAN模型(二):GAN=“分析”+“采样”。
结语
本文介绍了一个方案,只需要对原来的 GAN 进行简单的修改,就可以将原来 GAN 的判别器转化为一个有效的编码器。多个实验表明这样的方案是可行的,而对原理的进一步思考得出,这其实就是对原始判别器(编码器)的一种正交分解,并且对正交分解后的自由度的充分利用,所以模型也被称为“正交 GAN(O-GAN)”。
对了,除了 IntroVAE,对我启发特别大的还有 Deep Infomax 这篇论文,Deep Infomax 最后的附录里边提供了一种新的做 GAN 的思路。
参考文献:https://zhuanlan.zhihu.com/p/58812352
https://www.jianshu.com/p/40feb1aa642a
https://www.jianshu.com/p/8f03e56e406d
https://kexue.fm/archives/6409
https://www.cnblogs.com/bonelee/p/9166084.html