O-GAN:简单修改,让GAN的判别器变成一个编码器!
By 苏剑林 | 2019-03-06 | 250074位读者 |本文来给大家分享一下笔者最近的一个工作:通过简单地修改原来的GAN模型,就可以让判别器变成一个编码器,从而让GAN同时具备生成能力和编码能力,并且几乎不会增加训练成本。这个新模型被称为O-GAN(正交GAN,即Orthogonal Generative Adversarial Network),因为它是基于对判别器的正交分解操作来完成的,是对判别器自由度的最充分利用。
背景 #
笔者掉进生成模型的大坑已经很久时间了,不仅在博客中写了多篇有关生成模型的博文,而且还往arxiv上也提交了好几篇跟生成模型相关的小paper。自掉坑以来,虽然说对生成模型尤其是GAN的理解渐深,有时也觉得自己做出了一点改进工作(所以才提交到arxiv上),但事实上那些东西都是无关痛痒的修修补补,意义实在不大。
而本文要介绍的这个模型,自认为比以往我做的所有GAN相关工作的价值总和还要大:它提供了目前最简单的方案,来训练一个具有编码能力的GAN模型。
现如今,GAN已经越来越成熟,越做越庞大,诸如BigGAN、StyleGAN等算是目前最先进的GAN模型也已被人熟知,甚至玩得不亦乐乎。不过,这几个最先进的GAN模型,目前都只有生成器功能,没有编码器功能,也就是说可以源源不断地生成新图片,却不能对已有的图片提取特征。
当然,带有编码器的GAN也有不少研究,甚至本博客中就曾做过(参考《BiGAN-QP:简单清晰的编码&生成模型》)。但不管有没有编码能力,大部分GAN都有一个特点:训练完成后,判别器都是没有用的。因为理论上越训练,判别器越退化(比如趋于一个常数)。
做过GAN的读者都知道,GAN的判别器和生成器两个网络的复杂度是相当的(如果还有编码器,那么复杂度也跟它们相当),训练完GAN后判别器就不要了,那实在是对判别器这个庞大网络的严重浪费!一般来说,判别器的架构跟编码器是很相似的,那么一个很自然的想法是能不能让判别器和编码器共享大部分权重?据笔者所知,过去所有的GAN相关的模型中,只有IntroVAE做到了这一点。但相对而言IntroVAE的做法还是比较复杂的,而且目前网上还没有成功复现IntroVAE的开源代码(笔者也尝试复现过,但也失败了。)。
而本文的方案则极为简单——通过稍微修改原来的GAN模型,就可以让判别器转变为一个编码器,不管是复杂度还是计算量都几乎没有增加。
模型 #
事不宜迟,马上来介绍这个模型。首先引入一般的GAN写法
\begin{equation}\begin{aligned}D =& \mathop{\text{argmin}}_{D} \mathbb{E}_{x\sim p(x), z\sim q(z)}\Big[f(D(x)) + g(D(G(z)))\Big]\\
G =& \mathop{\text{argmin}}_{G} \mathbb{E}_{z\sim q(z)}\Big[h(D(G(z)))\Big]
\end{aligned}\end{equation}
为了不至于混淆,这里还是不厌其烦地对符号做一些说明。其中$x\in \mathbb{R}^{n_x},z\in \mathbb{R}^{n_z}$, $p(x)$是真实图片集的“证据分布”,$q(z)$是噪声的分布(在本文中,它是$n_z$元标准正态分布);而$G: \mathbb{R}^{n_z} \to \mathbb{R}^{n_x}$和$D: \mathbb{R}^{n_x} \to \mathbb{R}$自然就是生成器和判别器了,$f,g,h$则是一些确定的函数,不同的GAN对应着不同的$f,h,g$。有时候我们会加一些标准化或者正则化手段上去,比如谱归一化或者梯度惩罚,简单起见,这些手段就不明显地写出来了。
然后定义几个向量算符:
\begin{equation}\text{avg}(z)=\frac{1}{n_z}\sum_{i=1}^{n_z} z_i,\quad \text{std}(z)=\sqrt{\frac{1}{n_z}\sum_{i=1}^{n_z} (z_i-\text{avg}(z))^2}, \quad \mathcal{N}(z)=\frac{z - \text{avg}(z)}{\text{std}(z)}\end{equation}
写起来貌似挺高大上的,但其实就是向量各元素的均值、方差,以及标准化的向量。特别指出的是,当$n_z \geq 3$时(真正有价值的GAN都满足这个条件),$\left[\text{avg}(z), \text{std}(z), \mathcal{N}(z)\right]$是函数无关的,也就是说它相当于是原来向量$z$的一个“正交分解”。
接着,我们已经说了判别器的结构其实和编码器有点类似,只不过编码器输出一个向量而判别器输出一个标量罢了,那么我可以把判别器写成复合函数:
\begin{equation}D(x)\triangleq T(E(x))\end{equation}
这里$E$是$\mathbb{R}^{n_x} \to \mathbb{R}^{n_z}$的映射,而$T$是$\mathbb{R}^{n_z} \to \mathbb{R}$的映射。不难想象,$E$的参数量会远远多于$T$的参数量,我们希望$E(x)$具有编码功能。
怎么实现呢?只需要加一个loss:Pearson相关系数!
\begin{equation}\begin{aligned}T,E =& \mathop{\text{argmin}}_{T,E} \mathbb{E}_{x\sim p(x), z\sim q(z)}\Big[f(T(E(x))) + g(T(E(G(z)))) - \lambda \rho(z, E(G(z)))\Big]\\
G =& \mathop{\text{argmin}}_{G} \mathbb{E}_{z\sim q(z)}\Big[h(T(E(G(z)))) - \lambda \rho(z, E(G(z)))\Big]
\end{aligned}\end{equation}
其中
\begin{equation}\rho(z, \hat{z})=\frac{\sum\limits_{i=1}^{n_z} (z_i - \text{avg}(z))(\hat{z}_i - \text{avg}(\hat{z}))/n_z}{\text{std}(z)\times \text{std}(\hat{z})}=\cos(\mathcal{N}(z), \mathcal{N}(E(G(z))))\end{equation}
如果$\lambda=0$,那么就是普通的GAN而已(只不过判别器被分解为两部分$E$和$T$两部分)。加上了这个相关系数,直观上来看,就是希望$z$和$E(G(z))$越线性相关越好。为什么要这样加?我们留到最后讨论。
显然这个相关系数可以嵌入到任意现成的GAN中,改动量显然也很小(拆分一下判别器、加一个loss),笔者也做了多种GAN的实验,发现都能成功训练。
这样一来,GAN的判别器$D$分为了$E$和$T$两部分,$E$变成了编码器,也就是说,判别器的大部分参数已经被利用上了。但是还剩下$T$,训练完成后$T$也是没用的,虽然$T$的参数量比较少,这个浪费量是很少的,但对于有“洁癖”的人(比如笔者)来说还是很难受的。
能不能把$T$也省掉?经过笔者多次试验,结论是:还真能!因为我们可以直接用$\text{avg}(E(x))$做判别器:
\begin{equation}\begin{aligned}E =& \mathop{\text{argmin}}_{E} \mathbb{E}_{x\sim p(x), z\sim q(z)}\Big[f(\text{avg}(E(x))) + g(\text{avg}(E(G(z)))) - \lambda \rho(z, E(G(z)))\Big]\\
G =& \mathop{\text{argmin}}_{G} \mathbb{E}_{z\sim q(z)}\Big[h(\text{avg}(E(G(z)))) - \lambda \rho(z, E(G(z)))\Big]
\end{aligned}\label{eq:simplest}\end{equation}
这样一来整个模型中已经没有$T$了,只有纯粹的生成器$G$和编码器$E$,整个模型没有丝毫冗余的地方~(洁癖患者可以不纠结了)
实验 #
这样做为什么可以?我们放到最后再说。先看看实验效果,毕竟实验不好的话,原理说得再漂亮也没有意义。
注意,理论上来讲,本文引入的相关系数项并不能提高生成模型的质量,所以实验的目标主要有两个:1、这个额外的loss会不会有损原来生成模型的质量;2、这个额外的loss是不是真的可以让$E$变成一个有效的编码器?
刚才也说,这个方法可以嵌入到任意GAN中,这次实验用的是GAN是我之前的GAN-QP的变种:
\begin{equation}\begin{aligned}E =& \mathop{\text{argmin}}_{E} \mathbb{E}_{x\sim p(x), z\sim q(z)}\Big[\text{avg}(E(x)) - \text{avg}(E(G(z))) + \lambda_1 R_{x,z} - \lambda_2 \rho(z, E(G(z)))\Big]\\
G =& \mathop{\text{argmin}}_{G} \mathbb{E}_{z\sim q(z)}\Big[\text{avg}(E(G(z))) - \lambda_2 \rho(z, E(G(z)))\Big]
\end{aligned}\label{eq:simplest-2}\end{equation}
其中
\begin{equation}R_{x,z} = \frac{[\text{avg}(E(x)) - \text{avg}(E(G(z)))]^2}{\Vert x - G(z)\Vert^2}\end{equation}
数据集上,这次的实验做得比较完整,在CelebA HQ、FFHQ、LSUN-churchoutdoor、LSUN-bedroom四个数据集上都做了实验,分辨率都是$128\times 128$(其实还做了一点$256\times 256$的实验,结果也不错,但是没放到论文上)。模型架构跟以往一样都是DCGAN,其余细节直接看论文或者代码吧。
上图:
不管你们觉得好不好,反正我是觉得还好了~
1、随机生成效果还不错,说明新引入的相关系数项没有降低生成质量;
2、重构效果还不错,说明$E(x)$确实提取到了$x$的主要特征;
3、线性插值效果还不错,说明$E(x)$确实学习到了接近线性可分的特征。
原理 #
好,确认过眼神,哦不对,是效果,就可以来讨论一下原理了。
很明显,这个额外的重构项的作用就是让$z$尽可能与$E(G(z))$“相关”,对于它,相信大多数读者的第一想法应该是mse损失$\Vert z - E(G(z))\Vert^2$而非本文用的$\rho(z, E(G(z)))$。但事实上,如果加入$\Vert z - E(G(z))\Vert^2$那么训练基本上都会失败。那为什么$\rho(z, E(G(z)))$又会成功呢?
根据前面的定义,$E(x)$输出一个$n_z$维的向量,但是$T(E(x))$只输出一个标量,也就是说,$E(x)$输出了$n_z$个自由度,而作为判别器,$T(E(x))$至少要占用一个自由度(当然,理论上它也只需要占用一个自由度)。如果最小化$\Vert z - E(G(z))\Vert^2$,那么训练过程会强迫$E(G(z))$完全等于$z$,也就是说$n_z$个自由度全部被它占用了,没有多余的自由度给判别器来判别真假了,所以加入$\Vert z - E(G(z))\Vert^2$大概率都会失败。但是$\rho(z, E(G(z)))$不一样,$\rho(z, E(G(z)))$跟$\text{avg}(E(G(z)))$和$\text{std}(E(G(z)))$都没关系(只改变向量$E(G(z))$的$\text{avg}$和$\text{std}$,不会改变$\rho(z, E(G(z)))$的值,因为$\rho$本身就先减均值除标准差了),这意味着就算我们最大化$\rho(z, E(G(z)))$,我们也留了至少两个自由度给判别器。
这也是为什么在$\eqref{eq:simplest}$中我们甚至可以直接用$\text{avg}(E(x))$做判别器,因为它不会被$\rho(z, E(G(z)))$的影响的。
一个相似的例子是InfoGAN。InfoGAN也包含了一个重构输入信息的模块,这个模块也和判别器共享大部分权重(编码器),而因为InfoGAN事实上只重构部分输入信息,因此重构项也没占满编码器的所有自由度,所以InfoGAN那样做是合理的——只要给判别器留下至少一个自由度。
另外还有一个事实也能帮助我们理解。因为我们在对抗训练的时候,噪声是$z\sim \mathcal{N}(0,I_{n_z})$的,当生成器训练好之后,那么理论上对所有的$z\sim \mathcal{N}(0,I_{n_z})$,$G(z)$都会是一张逼真的图片,事实上,反过来也是成立的,如果$G(z)$是一张逼真的图片,那么应该有$z\sim \mathcal{N}(0,I_{n_z})$(即位于$\mathcal{N}(0,I_{n_z})$的高概率区域)。进一步推论下去,对于$z\sim \mathcal{N}(0,I_{n_z})$,我们有$\text{avg}(z)\approx 0$以及$\text{std}(z)\approx 1$。那么,如果$G(z)$是一张逼真的图片,那么必要的条件是$\text{avg}(z)\approx 0$以及$\text{std}(z)\approx 1$。
应用这个结论,如果我们希望重构效果好,也就是希望$G(E(x))$是一张逼真的图片,那么必要的条件是$\text{avg}(E(x))\approx 0$以及$\text{std}(E(x))\approx 1$。这就说明,对于一个好的$E(x)$,我们可以认为$\text{avg}(E(x))$和$\text{std}(E(x))$都是已知的(分别等于0和1),既然它们是已知的,我们就没有必要拟合它们,换言之,在重构项中可以把它们排除掉。而事实上:
\begin{equation}-\rho(z, E(G(z)))\sim \left\Vert \mathcal{N}(z) - \mathcal{N}(E(G(z)))\right\Vert^2\end{equation}
也就是说在mse损失中排除掉$\text{avg}(E(x))$和$\text{std}(E(x))$的话,然后省去常数,它其实就是$-\rho(z, E(G(z)))$,这再次说明了$\rho(z, E(G(z)))$的合理性。并且由这个推导,重构过程并不是$G(E(x))$而是
\begin{equation}\hat{x}=G(\mathcal{N}(E(x)))\end{equation}
最后,这个额外的重构项理论上还能防止mode collapse的出现。其实很明显,因为重构质量都不错了,生成质量再差也差不到哪里去,自然就不会怎么mode collapse了~非要说数学依据的话,我们可以将$\rho(z, E(G(z)))$理解为$Z$和$G(Z)$的互信息下界,所以最小化$-\rho(z, E(G(z)))$事实上在最大化$Z$与$G(Z)$的互信息,这又等价于最大化$G(Z)$的熵。而$G(Z)$的熵大了,表明它的多样性增加了,也就远离了mode collapse。类似的推导可以参考《能量视角下的GAN模型(二):GAN=“分析”+“采样”》。
结语 #
本文介绍了一个方案,只需要对原来的GAN进行简单的修改,就可以将原来GAN的判别器转化为一个有效的编码器。多个实验表明这样的方案是可行的,而对原理的进一步思考得出,这其实就是对原始判别器(编码器)的一种正交分解,并且对正交分解后的自由度的充分利用,所以模型也被称为“正交GAN(O-GAN)”。
小改动就收获一个编码器,何乐而不为呢?欢迎大家试用~
后记:
事后看,本文模型的思想其实本质上就是“直径和方向”的分解,并不难理解,但做到这件事情不是那么轻松的。
最开始我也一直陷入到$\Vert z - E(G(z))\Vert^2$的困境中,难以自拔,后来我想了很多技巧,终于在$\Vert z - E(G(z))\Vert^2$的重构损失下也稳定住了模型(耗了几个月),但模型变得非常丑陋(引入了三重对抗GAN),于是我着手简化模型。后来我尝试用$\cos$值用重构损失,发现居然能够简单地收敛了,于是我思考背后的原理,这可能涉及到自由度的问题。
接着我尝试将$E(x)$分解为模长和方向向量,然后用模长$\Vert E(x)\Vert$做判别器,用$\cos$做重构损失,判别器的loss用hinge loss。这样做其实几何意义很明显,说起来更漂亮些,部分数据集是work的,但是通用性不好(CelebA还行,LSUN不行),而且还有一个问题是$\Vert E(x)\Vert$非负,无法嵌入到一般的GAN,很多稳定GAN的技巧都不能用。
然后我想怎么把模长变成可正可负,开始想着可以对模长取对数,这样小于1的模长取对数后变成负数,大于1的模长取对数变成正数,思然达成了目的。但是很遗憾,效果还是不好。后来陆续实验了诸多方案都不成功,最后终于想到可以放弃模长(对应于方差)做判别器的loss,直接用均值就行了~~所以后来转换成$\text{avg}(E(x))$,这个转变经历了相当长的时间。
还有,重构损失一般认为要度量$x$和$G(E(x))$的差异,而我发现只需要度量$z$和$E(G(z))$的差异,这是最低成本的方案,因为重构是需要额外的时间的。最后,我还做过很多实验,很多想法哪怕在CelebA上都能成功,但LSUN上就不行。所以,最后看上去简单的模型,实际上是艰难的沉淀。
整个模型源于我的一个执念:判别器既然具有编码器的结构,那么就不能被浪费掉。加上有IntroVAE的成功案例在先,我相信一定会有更简单的方案实现这一点。前前后后实验了好几个月,跑了上百个模型,直到最近终于算是完整地解决了这个问题。
对了,除了IntroVAE,对我启发特别大的还有Deep Infomax这篇论文,Deep Infomax最后的附录里边提供了一种新的做GAN的思路,我开始也是从那里的方法着手思考新模型的。
转载到请包括本文地址:https://kexue.fm/archives/6409
更详细的转载事宜请参考:《科学空间FAQ》
如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。
如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!
如果您需要引用本文,请参考:
苏剑林. (Mar. 06, 2019). 《O-GAN:简单修改,让GAN的判别器变成一个编码器! 》[Blog post]. Retrieved from https://kexue.fm/archives/6409
@online{kexuefm-6409,
title={O-GAN:简单修改,让GAN的判别器变成一个编码器!},
author={苏剑林},
year={2019},
month={Mar},
url={\url{https://kexue.fm/archives/6409}},
}
March 6th, 2019
老师您好!这篇文章非常新颖,从将GAN和AE结合的角度来说确实很有意义。但是我有个小问题,您在GAN中通过对判别器的划分来引入了编码网络E,但是由于自由度的问题,这一引入反而会干扰原本的GAN训练(如果我们直接使用呢MSE)。于是,您通过Pearson系数来处理,我可以把这一操作看作对重整化后的q(z)和E(G(z))来做MSE,这可以保护至少两个自由度(avg和std)。我其实认为这个思路本身上就有矛盾,由于自由度的限制,判别和编码实际上不能同时处理,或者由E(x)和T(E(x))来分别处理,因为在E的输出处的自由度严重受限。
等于说这是在有限的自由度里完成两个冲突的任务。而且您说至少剩下两个自由度,那么最坏的时候这两个自由度+z就需要完成判别,这实在是强网络所难(可以类似于在隐藏空间上,辅助上两个额外参数就直接计算判别函数,这是非常难的)。
也许您会觉得上述说法牵强,但是对比VAE。VAE中的编码恰好可以帮助模型训练。如果按照这个逻辑来说,在下窃以为应该各自独立的判别网络和编码网络来避免自由度上的冲突(E(x)和D(x),而不是将D(x)表示成T(E(x)))的形式。
当然这只是一时之见,可能有很多考虑不周的地方。还望海涵~
我不确定你有没有看原文,其实原文还进一步分析了,一般情况下的GAN,判别器到达理想状态后其实是严重退化的,比如对于原始GAN,如果真的能达到$p(x)=q(x)$的理想状态,那么$D(x)$是一个常数。
换句话说,其实GAN在训练过程中,判别器网络会变得越来越平凡化。因此,判别器只需要一定的自由度,来维持这个判别能力,为$G$提供关于“真假”的梯度信息,越到后面判别器对拟合能力的要求越来越低。再因此,只要一开始不要过猛地锁死$z$的全部自由度,那么是可以用$z$的剩下的自由度做一些其他事情(编码或重构),至于训练到最后,可能全部的拟合能力都给了编码网络,判别器完全没有拟合能力了,这也没毛病,因为还是刚才说的,最优的$D(x)$本身就是个常数而已。
还有一个类似例子,就是如果我们训练cGAN,目前最主流的方法是《cGANs with Projection Discriminator》,这其实也就是将判别器和分类器共用了,因为分类器的loss也不会占满$E(x)$所有的自由度,所以这种公用也是允许的。
另外,要说有价值的话,这篇文章价值不在于将GAN和AE结合起来(这早就有很多工作了),而在于提供了最简单的一种方案来做到这个事情。
谢谢老师您耐心的解释!感觉上是判别网络前期正常完成一般的GAN的工作,等到它的趋于平凡化后,它的一部分慢慢转化为编码网络了。废物利用了的感觉!
之前没注意到D(x)的平凡化是我失误了(之前没看原文抱歉了)。那么我还有一个进一步的问题,是不是$\lambda$需要annealing呢?在前期为0,后面慢慢增加。因为如果$\lambda$在最开始不是0,那么$D$最优解就不会是平凡的(带入了Pearson系数项),那么就会残存一部分拟合能力(即使训练很久)。从分析上来讲是不妥的。请问是不是需要anealing,这样才不会影响D的平凡化过程呢?
其实假如GAN训练过程真的如想象中那么理想的话,那么就算$\lambda=0$,$D$也是退化到常数的。因为$D=0$就是$D$理论上的终极最优解(对应于判别器的loss越来越大)。
当然,实际训练中没那么理想,事实上$D$不会明显退化(判别器的loss会越来越小)。如果$\lambda > 0$,而且由于$\rho$所占用的自由度多于$D$,所以就算$\lambda$很小,最终$D$的竞争力都很难超过$\rho$,编码能力最终都会训练好,不用担心。
就实验结果来看,也说明不需要慢慢增加$\lambda$效果就不错了。
了解~看来这些细节都需要多多实际实验,理论很丰满,现实很复杂!
March 6th, 2019
真实图像x0输入E,得到的z1=E(x0),重新经过G生成x1=G(z1),同时随机一个z2经过G,生成x2=G(z2),构建D步的损失=f(T(z1))+g(T(E(x2)))+λ*mse(x0, x1)难道不能同时得到一个编码器?楼主的做法虽然很有启发,但是未免太麻烦
看你这样写的意思,大概是直接在原来的GAN上面加个重构的mse损失$\lambda\times\text{mse}(x_r, G(E(x_r)))$吧($x_r$是真实图片)。我不知道你试验过没有,这种方案我早就考虑过了,在我的实验中完全失败(是完全失败,连GAN本身都弄崩了,而不是效果不好)。
其实原因跟本文所描述的一样,$\lambda\times\text{mse}(x_r, G(E(x_r)))$同样霸占了$E(x_r)$的所有自由度,没有留给判别器,所以就崩了。
出于自由度的考虑,事实上我还试验过$\lambda\times\text{mse}(x_r, G(\mathcal{N}(E(x_r))))$,也就是把$E(x_r)$归一化之后再传给生成器然后才mse,这样一来就留了两个自由度给判别器了。不出意料,这样做确实成功了,但是有点模糊~所以,自由度的分解是非常重要的。
至于你说的“未免太麻烦”,我看不出本文的方案会比你说的方案要麻烦呀,你说加一个$\lambda\times\text{mse}(x_r, G(E(x_r)))$,我也要加一个$\rho(z,E(G(z)))$,不是差不多吗?而且我加的这个,因为不需要重新算一次重构图片,计算量还比你的要低呢~
额,是我想太简单了,多谢指教
March 8th, 2019
Z1 = random_vector() # a random vector in standard normal distribution
Z2 = random_binizized_vector() # a random vector ONLY contains 0 or 1
Z = concat([Z1, Z2]) # concat Z1 and Z2
EGZ = E(G(Z)) # reconstructed latent vector
EGZ1 = EGZ[:, :h] # the first part of EGZ (h is the node quantity of Z1)
EGZ2 = EGZ[:, h:] # the second part of EGZ (h is the node quantity of Z1)
loss = sigmoid_cross_entropy(logist=EGZ2, label=Z2)
Why not use some losses like this?
your approach is just InfoGAN, which can not reconstruct all input information.
March 13th, 2019
您好,拜读您的文章,学习了很多。想请教一个问题:在我看来,OGAN往简单说就是加入了一个辅助Pearson 系数loss,文中也提到了infoGAN和互信息,infoGAN简单的说也是加入了一个辅助的互信息loss,只不过infoGAN多使用了一个label信息c,互信息那一项计算的是c和G(Z)的互信息I(c,G(Z,c)),那么能否请您解释下这两种额外loss项的异同,优劣呢?如果不用Pearson,改用互信息,并且互信息计算改成I(Z,G(Z)),是否也能达到Pearson一样的效果呢?个人认为这两个算法有着不小的联系,如果写论文,大概是要写“The closest work is infoGAN” 这一类的话吧。。。
谢谢!
本文已经说了,Pearson实际上可以认为是$I(Z,G(Z))$的一个上界,就相当于InfoGAN中,直接把整个$z$看成是$c$,然后用同样的方法推导出的信息上界。
谢谢您的回复,那么有无简单实验比较过infoGAN和OGAN的性能差异呢?以及,从直觉上来说什么情况下,为什么要选择使用OGAN而不是infoGAN呢?(仅考虑解决的问题相同的情况下,以及刨去infoGAN需要额外标签的劣势,因为小的改动就可以同样做到不使用标签)
谢谢!
InfoGAN跟OGAN解决的是不同问题,哪里有“仅考虑解决的问题相同的情况下“的说法?
如果你也用InfoGAN重构原来的$z$,那基本就是OGAN了。
请问为什么Pearson是$I(Z,G(Z))$的下界呢?能麻烦您详细解释一下吗?
谢谢
https://kexue.fm/archives/6331#%E4%BA%92%E4%BF%A1%E6%81%AF%E4%B8%8E%E4%BF%A1%E6%81%AF%E4%B8%8B%E7%95%8C
这一节已经证明了“$z$和$G(z)$的mse的相反数”可以看成是$I(Z,G(Z))$的下界(对应于高斯分布假设),至于Pearson系数只不过是另一种loss形式,你构造另一种分布代入计算即可。
March 22nd, 2019
用编码器输出的均值做判别器结果是否冲突,也就是说编码器输出的均值的期望和判别器的输出的期望是否是相同方向的,会不会影响网络的收敛方向?
正因为担心冲突,所以才有正交分解呀。用$\text{avg}$做判别,然后重构的度量是相关系数,跟$\text{avg}$和$\text{std}$都没关系,两者互不相关。
March 27th, 2019
老师您好,非常清爽的文章,目标方法非常明确,但是我有个疑问,当达到平衡时(或者local convergence),对于真实图片X输入到Encoder,其输出如何能保证均值为0,方差为1,因为pearson并没有比较E输出和z的均值方差,即对均值方差未作限制,倘若E(X)均值方差不为0,1,那么如何保证重构图片G(E(X))与X的相近度,因为文章也指出if G(E(x)) is high-quality reconstruction of x, the necessary condition is avg(E(x)) ≈ 0 and std(E(x)) ≈ 1,是否存在矛盾?
其实不能保证,所以最后重构之前,还要做一下归一化,也就是说真正的encoder是$\mathcal{N}(E(x))$。
谢谢,是我看文章的时候忽略了~
April 3rd, 2019
您的思路很赞!
我比较关心的问题是关于隐空间语义的研究,把这个编码器和条件生成结合起来。
现在有没有什么比较好的工作,或者您有什么思路?
基于o-gan的条件生成我已经做过了,完全可行,只不过我还没有时间整理~再过一阵子吧。
请问您的o-gan条件生成是怎么做的呢? 可否分享您的做法呢?谢谢您。
好久没搞了~就是常规的Conditional Batch Normalization的做法。
April 21st, 2019
苏神您好,代码里面是直接把loss合起来作为train model训练了是么,如果分开写的话,按照我的理解g_loss是-t2_loss - 0.5*z_corr,不知道对不对?
额,我看到巧断梯度那篇博文了。。。看来文章都是相关的
是的(^_^)
1.请问一下sample_ae的采样函数里面为什么重构之前z_sample需要乘以0.9?这是一个trick么还是有什么理论?
2.使用RMSprop而非Adam,是因为前者更合适么,还是都可以?
1. 这是退火技术。说白了,让方差更小一些,能得到更高质量的生成图片。在flow based模型中也用到过。当然方差小会损失多样性,这就是牺牲多样性来换取真实性了。虽然这里是重构而不是随机生成,但是原理是通用的,因为降低$z$的方差也相当于降低$z$的模长,所以这里稍微降低一下$\mathcal{N}(E(x))$的模长。
2. 事实上GAN不宜用动量加速,目前主流的GAN模型用都用RMSprop居多,就算用Adam也是将$\beta_1$(动量)设得很小甚至为0。至于为什么不宜用动量加速,可以参考:https://kexue.fm/archives/6316
好的,谢谢,帮助很大!
April 22nd, 2019
E(z)与Z具体是什么样的关心呢,能否有E(z)得到Z呢?
哪来的$E(z)$?是$E(x)$?你可以理解为$z_{|x} = \mathcal{N}(E(x))$
April 23rd, 2019
我们知道一般的GAN,最后判别器会退化收敛到0.5,代表判别器判断不出真假。而你这里提到用ave(E(x))也可以说用ave(z^)作为判别结果,同时你又说z和z^的均值应当为0。那么这里这个0.5和0的冲突如何解决?
一个好的编码器均值应该为0,方差应该为1,既然我们已经知道了这个事实,那么为什么还要去拟合它呢?我们干脆写死均值和方差就行了,换句话说,最终的编码器是$\mathcal{N}(E(x))$。
而$\mathcal{N}(E(x))$跟均值方差都没关系,所以$E(x)$的均值和方差都可以用来做其他事情。