前段时间,一个名为“幂等生成网络(Idempotent Generative Network,IGN)”的生成模型引起了一定的关注。它自称是一种独立于已有的VAE、GAN、flow、Diffusion之外的新型生成模型,并且具有单步采样的特点。也许是大家苦于当前主流的扩散模型的多步采样生成过程久矣,因此任何声称可以实现单步采样的“风吹草动”都很容易吸引人们的关注。此外,IGN名称中的“幂等”一词也增加了它的神秘感,进一步扩大了人们的期待,也成功引起了笔者的兴趣,只不过之前一直有别的事情要忙,所以没来得及认真阅读模型细节。

最近闲了一点,想起来还有个IGN没读,于是重新把论文翻了出来,但阅读之后却颇感困惑:这哪里是个新模型,不就是个GAN的变种吗?跟常规GAN不同的是,它将生成器和判别器合二为一了。那这个“合二为一”是不是有什么特别的好处,比如训练更稳定?个人又感觉没有。下面将分享笔者从GAN角度理解IGN的过程和疑问。

生成对抗 #

关于GAN(Generative Adversarial Network,生成对抗网络),笔者前几年系统地学习过一段时间(查看GAN标签可以查看到相关文章),但近几年没有持续地关注了,因此这里先对GAN做个简单的回顾,也方便后续章节中我们对比GAN与IGN之间的异同。

GAN有两个基本组件:判别器(Discriminator)和生成器(Generator),也可以形象地类别为“鉴别者”和“伪造者”,其中判别器负责区分出真实样本和生成器生成的假样本,而生成器负责将简单的随机噪声映射为目标样本,并借助判别器的信号改进自己的生成质量,在不断的“攻守对抗”之中,生成器的生成质量越来越优,直到判别器完全无法区分真假样本,达到了以假乱真的效果。

以WGAN为例,判别器$D_{\theta}$的训练目标是拉大真假样本的分数差距:
\begin{equation}\max_{\theta} D_{\theta}(G_{\varphi}(z)) - D_{\theta}(x)\label{eq:d-loss}\end{equation}
其中$x$是训练集的真样本,$z$是随机噪声,$G_{\varphi}$是生成器,$G_{\varphi}(z)$自然是生成器生成的假样本。生成器的训练目标是缩小真假样本的得分差距,即最小化上式,不过对于生成器来说,不包含参数的$x$就相当于是常数,因此可以简化为
\begin{equation}\min_{\varphi} D_{\theta}(G_{\varphi}(z))\label{eq:g-loss}\end{equation}
除此之外,还少了关于L约束的内容,但这属于细节了,这里不展开,有兴趣的读者可以进一步阅读《互怼的艺术:从零直达WGAN-GP》《从Wasserstein距离、对偶理论到WGAN》等。

一般情况下,GAN是两个Loss交替训练,有时候也可以写成单个Loss往两个方向优化——部分参数执行梯度下降,另外一部分参数则执行梯度上升。这种同时存在相反方向的训练过程(即$\min\text{-}\max$)通常不稳定,比较容易崩溃,又或者训练出来了,但存在模式坍缩(Mode Collapse)的问题,具体表现就是生成结果单一,多样性丧失。

单个损失 #

可能有读者反对:你都说GAN是两个Loss交替优化了,而IGN明明是单个Loss的呀,怎么能够说IGN是GAN的特例?

事实上,IGN的单个Loss的写法是有点“耍无赖”的,照它的写法,GAN同样可以写成单个Loss的形式。具体怎么做呢?很简单,假设$\theta',\varphi'$是$\theta,\varphi$的权重副本,即$\theta'\equiv\theta,\varphi'\equiv\varphi$,但是它们不求梯度,于是式$\eqref{eq:d-loss}$和式$\eqref{eq:g-loss}$可以合并起来写成:
\begin{equation}\min_{\theta,\varphi} D_{\theta}(x) - D_{\theta}(G_{\varphi'}(z)) + D_{\theta'}(G_{\varphi}(z))\label{eq:pure-one-loss}\end{equation}
此时它关于$\theta,\varphi$的梯度跟分开两个Loss时所求的一样,因此是等价实现。可为什么说这种写法是“耍无赖”呢?因为它没有一丁点的技巧,就纯粹将原本的$\min\text{-}\max$换了个记号,真的按照上式实现的话,需要不断地克隆$D_{\theta'},G_{\varphi'}$出来然后停止梯度,非常影响训练效率。

事实上,要想将GAN写成单个Loss的训练形式并保持实用性,可以参考笔者之前写的《巧断梯度:单个loss实现GAN模型》,通过框架自带stop_gradient算子,加上一些梯度运算技巧,就可以实现这一目的。具体来说,stop_gradient就是强制模型某一部分的梯度为0,比如
\begin{equation}\nabla_{\theta,\varphi} D_{\theta}(G_{\varphi}(z)) = \left(\frac{\partial D_{\theta}(G_{\varphi}(z))}{\partial\theta},\frac{\partial D_{\theta}(G_{\varphi}(z))}{\partial\varphi}\right)\label{eq:full-grad}\end{equation}
加了stop_gradient算子(简写为$\color{skyblue}{\text{sg}}$)后,就有
\begin{equation}\nabla_{\theta,\varphi} D_{\theta}(\color{skyblue}{\text{sg}(}G_{\varphi}(z)\color{skyblue}{)}) = \left(\frac{\partial D_{\theta}(G_{\varphi}(z))}{\partial\theta},0\right)\label{eq:stop-grad}\end{equation}
所以通过stop_gradient算子,我们可以很容易屏蔽嵌套函数内层梯度(即$\varphi$的梯度)。那么像生成器那样,需要屏蔽嵌套函数外层梯度(即$\theta$的梯度)呢?没有直接的办法,但我们可以用一个技巧实现:将式$\eqref{eq:full-grad}$和式$\eqref{eq:stop-grad}$相减,就得到
\begin{equation}\nabla_{\theta,\varphi} D_{\theta}(G_{\varphi}(z)) - \nabla_{\theta,\varphi} D_{\theta}(\color{skyblue}{\text{sg}(}G_{\varphi}(z)\color{skyblue}{)}) = \left(0,\frac{\partial D_{\theta}(G_{\varphi}(z))}{\partial\varphi}\right)\end{equation}
这就达到了屏蔽嵌套函数外层梯度。于是将两个式子结合起来,我们就得到单个Loss训练GAN的一种方式
\begin{equation}
\min_{\theta,\varphi} \underbrace{D_{\theta}(x) - D_{\theta}(\color{skyblue}{\text{sg}(}G_{\varphi}(z)\color{skyblue}{)})}_{\text{去掉了}\varphi\text{的梯度}} + \underbrace{D_{\theta}(G_{\varphi}(z)) - D_{\theta}(\color{skyblue}{\text{sg}(}G_{\varphi}(z)\color{skyblue}{)})}_{\text{去掉了}\theta\text{的梯度}} = D_{\theta}(x) - 2 D_{\theta}(\color{skyblue}{\text{sg}(}G_{\varphi}(z)\color{skyblue}{)}) + D_{\theta}(G_{\varphi}(z))\end{equation}

这样就不需要反复克隆模型,也在单个Loss中实现了梯度的等价性。

幂等生成 #

说了那么多,总算可以邀请本文的主角——幂等生成网络IGN登场了。不过在正式登场之前,还请大家再等一会,我们先来谈谈IGN的动机。

GAN有一个明显的特点,就是当GAN训练成功后,往往只保留其中的生成器,判别器大多数是“弃之不用”的。然而,一个合理的GAN,生成器和判别器通常具有同等数量级的参数,判别器弃之不用,意味着一半参数量被浪费了,这是比较可惜的。为此,有些工作尝试过往GAN里边加入编码器,并共享判别器与编码器的部分参数,提高参数利用率。其中,最极简的工作是笔者提的O-GAN,它仅微改了判别器的结构,然后添加一项额外的Loss,就可以将判别器变成编码器,并且不增加参数和计算量,它是笔者比较满意的作品。

本文标题就开门见山,IGN是一个试图将判别器和生成器合二为一的GAN,生成器“既当选手,又当裁判”,所以从这个角度来看,IGN也可以视为提高参数利用率的一种方式。首先,IGN假设$z$和$x$的大小一样,那么生成器$G_{\varphi}$的输出输入的大小都一样,这跟一般的GAN中$z$的维度通常要比$x$的维度小不一样;在输入输出同大小的设计之下,图片本身也可以当成输入,传入到生成器中做进一步运算,于是IGN将判别器设计为重构损失:
\begin{equation}\delta_{\varphi}(x) = \Vert G_{\varphi}(x) - x\Vert^2\label{eq:ign-d}\end{equation}
$\delta_{\varphi}$是重用了IGN论文原本的记号,没有特殊的含义。这样的设计完全重用了生成器的参数,且没有增加额外的参数,看上去确实是一种很优雅的设计。现在我们将上述判别器代入式$\eqref{eq:pure-one-loss}$,得到
\begin{equation}\min_{\varphi}\underbrace{\delta_{\varphi}(x) - \delta_{\varphi}(G_{\varphi'}(z))}_{\text{判别器损失}} + \underbrace{\delta_{\varphi'}(G_{\varphi}(z))}_{\text{生成器损失}}\end{equation}
这不就跟IGN原论文的Final optimization objective如出一辙?当然原论文还多了两个可调的系数,事实上式$\eqref{eq:pure-one-loss}$的每一项系数也是可调的,这不是什么特殊的地方。所以很显然,IGN完全可以从GAN推出,它就是GAN的一个特例——尽管作者说他并不是GAN的角度思考IGN的。

“幂等”一词,源于作者认为IGN在训练成功时,判别器对于真实样本的打分为0,此时$G_{\varphi}(x) = x$,那么可以继续推出
\begin{equation}G_{\varphi}(\cdots G_{\varphi}(x)) = \cdots = G_{\varphi}(G_{\varphi}(x)) = G_{\varphi}(x) = x\end{equation}
也就是说,对真实样本$x$多次应用$G_{\varphi}$,结果仍然保持不变,这正是数学上“幂等”的含义。然而,从理论上来说,我们并没办法保证GAN的判别器(对于真实样本的)损失是零,所以很难做到真正意义上的幂等,原论文的实验结果也表明了这一点。

个人分析 #

一个非常值得思考的问题是:重构损失$\eqref{eq:ign-d}$为什么可以成功作为判别器呢?或者说,基于$G_{\varphi}(x)$和$x$可以构建的表达式非常多,任意一个都可以作为判别器吗?

单从“重构损失作为判别器”这一点来看,IGN跟EBGAN很相似,可这不意味着EBGAN的成功就能解释IGN的成功,因为EBGAN的生成器是独立于判别器之外的,并没有完全共享参数的约束,所以EBGAN的成功是“情理之中”,符合GAN的原始设计。但IGN却不一样,因为它的判别器和生成器完全共享了参数,并且GAN本身训练存在很大的不稳定因素,所以很容易“一损俱损”,让两者一起训崩。

在笔者看来,IGN能有机会不训崩,是因为刚好满足了“自洽性”。首先,GAN的根本目标,是希望对于输入噪声$z$,$G_{\varphi}(z)$能够输出一张真实图片;而对于IGN中“重构损失作为判别器”的设计,即便判别器的最优损失不是零,也可能是大差不差,即$G_{\varphi}(x)\approx x$是近似满足的,于是它同时满足了“对于输入图片$x$,$G_{\varphi}(x)$能够输出一张真实图片”的条件。也就是说,不管输入如何,输出的空间都是真实样本,这一点自洽性非常重要,否则生成器可能因为需要往两个方向进行生成而“分崩离析”。

既然如此,IGN相比于一般的GAN,有什么实质的改进呢?请恕在下愚钝,笔者实在是看不出IGN的好处所在。就拿参数利用率来说,看上去IGN的参数共享确实提高了参数利用率,但事实上为了保证生成器$G_{\varphi}$的输入输出一样,IGN使用了自编码器结构,其参数量和计算量,就等于一般GAN的判别器和生成器之和!换句话说,IGN非但没有降低参数量,反而因为增大了生成器的体积而增加了总的计算量。

笔者也简单实验了一下IGN,发现IGN的训练同样有不稳定的问题,甚至可以说更不稳定,因为“参数贡献+欧氏距离”这种硬约束更容易放大这种不稳定性,导致“一损俱损”而不是“一荣俱荣”。此外,IGN的生成器输入输出同大小的特点,也失去了一般GAN的生成器从低维流形投影到高维数据的优点,以及IGN同样容易模式坍缩,并且由于欧式距离的问题,生成的图片更像VAE那样偏模糊。

文章小结 #

本文从GAN的角度介绍了前段时间引起了一定关注的幂等生成网络IGN,对比了它与GAN的联系与区别,并分享了自己对IGN的分析。

转载到请包括本文地址:https://kexue.fm/archives/9969

更详细的转载事宜请参考:《科学空间FAQ》

如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。

如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!

如果您需要引用本文,请参考:

苏剑林. (Jan. 31, 2024). 《幂等生成网络IGN:试图将判别和生成合二为一的GAN 》[Blog post]. Retrieved from https://kexue.fm/archives/9969

@online{kexuefm-9969,
        title={幂等生成网络IGN:试图将判别和生成合二为一的GAN},
        author={苏剑林},
        year={2024},
        month={Jan},
        url={\url{https://kexue.fm/archives/9969}},
}