计算机视觉发展到现在,由AIGC生成的内容越来越多充斥到我们的生活中,为了探究AIGC的原理,我开始研究GAN这一系列的内容,这一部分的内容不仅构思巧妙,其最终的成果也有比较高的实用性。
本着追本溯源的精神,我开始了GAN系列的学习,同时由于学习速度比不上遗忘的速度,所以权且将当下学到的内容组织成文,为后续回忆增加点调料。
1.GAN介绍
GAN,叫做生成对抗网络 (Generative Adversarial Network) 。其基本原理是生成器网络 G(Generator) 和判别器网络 D(Discriminator) 相互博弈。生成器网络 G 的主要作用是生成图片,在输入一个随机编码 (random code) z后,自动的生成假样本 G(z) 。判别器网络 D 的主要作用是判断输入是否为真实样本并提供反馈机制,真样本则输出 1 ,反之为 0 。在两个网络相互博弈的过程中,两个网络的能力都越来越高:G 生成的图片越来越像真样本,D 也越来越会判断图片的真假,然后我们在最大化 D 的前提下,最小化 D 对 G 的判断能力,这实际上就是最小最大值问题,或者说二人零和博弈,其目标函数表达式:
其中表达式中的第一项 D(G(z)) 处理的是假图像 G(z) ,我们尽量降低评分 D(G(z)) ;第二项处理的是真图像 x ,此时评分要高。
2.CycleGAN介绍
如果说GAN给我们指明了大方向,那么CycleGAN则为我们打开了实用的大门!
论文地址:https://arxiv.org/abs/1703.10593
项目地址:https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix
生成器损失
CycleGAN的原理可以概述为:将一类图片转换成另一类图片。也就是说,现在有两个样本空间,X 和 Y,我们希望把 X 空间中的样本转换成 Y 空间中的样本。因此,实际的目标就是学习从 X 到 Y 的映射(设这个映射为 F),F 就对应着 GAN 中的生成器,F 可以将 X 中的图片 x 转换为 Y 中的图片 F(x)。对于生成的图片,我们还需要 GAN 中的判别器来判别它是否为真实图片,由此构成对抗生成网络。设这个判别器为 DY。这样的话,根据这里的生成器和判别器,我们就可以构造一个 GAN 损失,表达式为:
循环一致性损失
这个损失实际上和原始的 GAN 损失是一模一样的,但单纯的使用这一个损失是无法进行训练的。原因在于,映射 F 完全可以将所有 x 都映射为 Y 空间中的同一张图片,使损失无效化。对此,作者又提出了所谓的循环一致性损失(cycle consistency loss)。再假设一个映射 G,它可以将 Y 空间中的图片 y 转换为 X 中的图片 G(y)。CycleGAN 同时学习 F 和 G 两个映射,并要求 F(G(y)) ≈ y,以及 G(F(x)) ≈ x。也就是说,将 X 的图片转换到 Y 空间后,应该还可以转换回来。这样就杜绝模型把所有 X 的图片都转换为 Y 空间中的同一张图片了。根据 F(G(y)) ≈ y 和 G(F(x)) ≈ x,循环一致性损失就定义为:
判别器损失
同时,为 G 也引入一个判别器 DX,由此可以同样定义一个 GAN 的损失 LGAN(G,DX,X,Y)。最终的损失就由三部分组成:
identity损失
实际代码中还有第四种损失函数,就是identity损失,简单理解就是在A->B的生成网络中,我们本来是要输入A生成B的,但是我们输入了B,那么生成网络应该能够判别出输入的是B,从而生成出的B不应该跟输入的B存在较大差异。
CycleGAN 的灵活性在于不需要提供从源域到目标域的配对转换例子就可以训练。
3.StarGAN介绍
CycleGAN可以帮我们实现一对一的生成,可是如果我们有多种特征需要修改,就需要多个生成器来进行处理,这样用起来很不方便,所以StarGAN就来了。
左边是 传统的GAN,右边是 starGAN。传统的域迁移 需要在不同的两个域之间相互进行特征提取,这就导致在有 k 个域的情况下需要 k(k-1) 个生成器。而 starGAN 则解决了这个问题,自始至终只需要一个生成器。
StarGAN V1网络架构
StarGAN损失函数
cGAN的标准公式:
为了使判别器能够区分不同风格的图片,判别器采用了Auxiliary Classifier GAN的结构,对应loss为:
对于公式(2),判别器是在输入的是训练数据时才使用,不对生成器生成的图片使用。同样的,生成器通过最小化公式(3)来学习生成不同风格的图片。
以上可以使生成器生成不同风格的图片,但是还不足以保证生成的图片保留了输入图片的内容信息,这里采用了CycleGAN中的cycle consistency loss。
StarGANv2网络结构
StarGANv2要解决的是生成多样性的问题,StarGANv2不再使用StarGANv1中的label信息,改用style code来控制生成的风格。另外还增加了两个模块,一个mapping network用来把高斯噪声转换成style code,类似StyleGAN中的全连接层;encoder用来提取输入图片的style code信息;为了实现多种风格,这两个模块都有多个分支的输出。
生成器输入还是图片和style code两部分,判别器则变成了多分支的输出。
StarGANv2损失函数
损失函数包括四部分,第一部分还是标准的cGAN公式:
第二部分是style重建损失,即把生成器生成的图再用encoder编码一次:
第三部分是风格多样性问题,本质是迫使不同style code的内容差异尽可能大一些:
第四部分就是保证生成图与输入图有关的问题了,依然是cycle consistency loss。