发布时间:2024-12-17 08:01
生成对抗网络(GAN)由2个重要的部分构成:
生成器(Generator):通过机器生成数据(大部分情况下是图像),目的是“骗过”判别器
判别器(Discriminator):判断这张图像是真实的还是机器生成的,目的是找出生成器做的“假数据”
第一阶段:固定「判别器D」,训练「生成器G」
我们使用一个还 OK 判别器,让一个「生成器G」不断生成“假数据”,然后给这个「判别器D」去判断。
一开始,「生成器G」还很弱,所以很容易被揪出来。
但是随着不断的训练,「生成器G」技能不断提升,最终骗过了「判别器D」。
到了这个时候,「判别器D」基本属于瞎猜的状态,判断是否为假数据的概率为50%。
第二阶段:固定「生成器G」,训练「判别器D」
当通过了第一阶段,继续训练「生成器G」就没有意义了。这个时候我们固定「生成器G」,然后开始训练「判别器D」。
「判别器D」通过不断训练,提高了自己的鉴别能力,最终他可以准确的判断出所有的假图片。
到了这个时候,「生成器G」已经无法骗过「判别器D」。
循环阶段一和阶段二
通过不断的循环,「生成器G」和「判别器D」的能力都越来越强。
最终我们得到了一个效果非常好的「生成器G」,我们就可以用它来生成我们想要的图片了。
3个优势
能更好建模数据分布(图像更锐利、清晰)
理论上,GANs 能训练任何一种生成器网络。其他的框架需要生成器网络有一些特定的函数形式,比如输出层是高斯的。
无需利用马尔科夫链反复采样,无需在学习过程中进行推断,没有复杂的变分下界,避开近似计算棘手的概率的难题。
2个缺陷
难训练,不稳定。生成器和判别器之间需要很好的同步,但是在实际训练中很容易D收敛,G发散。D/G 的训练需要精心的设计。
模式缺失(Mode Collapse)问题。GANs的学习过程可能出现模式缺失,生成器开始退化,总是生成同样的样本点,无法继续学习。
GAN基于零和非合作博弈。简而言之,如果一个人赢了另一个人。零和博弈也称为minimax。你的对手希望最大化其行动,你的行动是最小化它们。在博弈论中,当鉴别器和发生器达到纳什均衡时,GAN模型收敛。这是下面的minimax方程的最佳点。但是不难证明最大最小值是不收敛的。具体证明见「详解GAN」为什么训练生成对抗网络如此困难!
cycle-GAN的主要原理在于,借助GAN,应该有两个domain的discriminator,每个discriminator单独判断各自domain的数据是否是真实数据。至于generator,图像的翻译需要将domain A的图像翻成domain B的图像,所以generator有点像autoencoder结构,只是decoder的输出不是domain A的图像,而是domain B的图像。为了充分利用两个discriminator,还应该有一个翻译回去的过程,也就是说,还有一个generator,它将domain B的数据翻译到domain A。
对于单独的generator,其内部流程如下所示:
由流程可以写出目标函数:
genertor中添加的称作重构误差,能够引导两个generator更好地完成encode和decode的任务。而两个D则起到纠正编码结果符合某个domain的风格的作用。结构很简单,但是很有效。并且并不需要成对的数据。
NVIDIA在2017年提出的ProGAN解决了生成高分辨率图像(如1024×1024)的问题。ProGAN的关键创新之处在于渐进式训练——从训练分辨率非常低的图像(如4×4)的生成器和判别器开始,每次都增加一个更高的分辨率层。
存在的问题:与多数GAN一样,ProGAN控制生成图像的特定特征的能力非常有限。这些属性相互纠缠,即使略微调整输入,会同时影响生成图像的多个属性。所以如何将ProGAN改为条件生成模型,或者增强其微调单个属性的能力,是一个可以研究的方向。
解决方法:StyleGAN是NVIDIA继ProGAN之后提出的新的生成网络,其主要通过分别修改每一层级的输入,在不影响其他层级的情况下,来控制该层级所表示的视觉特征。
这是proGAN的结构模型示意图。上图是 ProGAN 的网络结构图。这项技术首先通过学习即使在低分辨率图像中也可以显示的基本特征,来创建图像的基本部分,并且随着分辨率的提高和时间的推移,学习越来越多的细节。低分辨率图像的训练不仅简单、快速,而且有助于更高级别的训练,因此,整体的训练也就更快。
StyleGAN 的网络结构包含两个部分,第一个是Mapping network,即下图 (b)中的左部分,由隐藏变量 z 生成 中间隐藏变量 w的过程,这个 w 就是用来控制生成图像的style,即风格,为什么要多此一举将 z 变成 w 呢,后面会详细讲到。 第二个是Synthesis network,它的作用是生成图像,创新之处在于给每一层子网络都喂了 A 和 B,A 是由 w 转换得到的仿射变换,用于控制生成图像的风格,B 是转换后的随机噪声,用于丰富生成图像的细节,即每个卷积层都能根据输入的A来调整\"style\",通过B来调整细节。整个网络结构还是保持了 PG-GAN (progressive growing GAN) 的结构。最后论文还提供了一个高清人脸数据集FFHQ。
此外,传统的GAN网络输入是一个随机变量或者隐藏变量 z,但是StyleGAN 将 z 单独用 mapping网络将z变换成w,再将w投喂给 Synthesis network的每一层,因此Synthesis network中最开始的输入变成了常数张量,见下图b中的Const 4x4x512。
1.增加映射网络Mapping Network==》为输入向量的特征解缠提供一条学习的通路
Mapping network 要做的事就是对隐藏空间(latent space)进行解耦
首先理解一些概念:
latent code 简单理解就是,为了更好的对数据进行分类或生成,需要对数据的特征进行表示,但是数据有很多特征,这些特征之间相互关联,耦合性较高,导致模型很难弄清楚它们之间的关联,使得学习效率低下,因此需要寻找到这些表面特征之下隐藏的深层次的关系,将这些关系进行解耦,得到的隐藏特征,即latent code。由 latent code组成的空间就是 latent space。
StyleGAN的第一点改进是,给Generator的输入加上了由8个全连接层组成的Mapping Network,并且 Mapping Network 的输出W′与输入层(512×1)的大小相同。
1.添加 Mapping Network 的目标是将输入向量编码转为中间向量,并且中间向量后续会传给生成网络得到 18 个控制向量,使得该控制向量的不同元素能够控制不同的视觉特征。
2.为何要加 Mapping Network 呢?因为如果不加这个 Mapping Network 的话,后续得到的 18个控制向量之间会存在特征纠缠的现象——比如说我们想调节 88 分辨率上的控制向量(假 设它能控制人脸生成的角度),但是我们会发现 3232 分辨率上的控制内容(譬如肤色)也被改变了,这个就叫做特征纠缠。所以 Mapping Network 的作用就是为输入向量的特征解缠提供一条学习的通路。
3.为何 Mapping Network 能够学习到特征解缠呢?简单来说,如果仅使用输入向量来控制视觉特征,能力是非常有限的,因此它必须遵循训练数据的概率密度。例如,如果黑头发 的人的图像在数据集中更常见,那么更多的输入值将会被映射到该特征上。因此,该模型无法将部分输入(向量中的元素)映射到特征上,这就会造成特征纠缠。然而,通过使用另一个神经网络,该模型可以生成一个不必遵循训练数据分布的向量,并且可以减少特征之间的相关性。
2.样式模块(AdaIN)==》使得精确控制样式信息,而保留图片的关键信息
W通过每个卷积层的AdaIN输入到生成器的每一层中。图中的A代表一个可学习的仿射变换。
计算方法:
①首先每个特征图xi(feature map)独立进行归一化。特征图中的每个值减去该特征图的均值然后除以方差
②一个可学习的仿射变换A(全连接层)将w转化为style中AdaIN的平移和缩放因子y =(ys,i,yb,i),
③然后对每个特征图分别使用style中学习到的的平移和缩放因子进行尺度和平移变换。
注意:这里的仿射变换与cv中的仿射变换有一定的区别,在于其值是可学习的。
3.随机变化(通过引入噪声为生成器生成随机细节)
人的脸有很多可以看作是随机的,比如头发的精确位置,使图像更真实,增加了输出的多样性。将这些小特征插入GAN图像的常用方法是向输入向量添加随机噪声,然后通过输入层输入生成器。然而,在很多情况下,控制噪声效果是很棘手的,因为特征纠缠现象,略微改变噪声会导致图像的其他特征受到影响。
该架构通过在合成网络的每个分辨率级上增加尺度化的噪声来回避这些问题。噪声是由高斯噪声组成的单通道图像,将一个噪声图像提供给合成网络的一个特征图。在卷积之后、AdaIN之前将高斯噪声加入生成器网络中。B使用可学习的缩放参数对输入的高斯噪声进行变换,然后将噪声图像广播到所有的特征图中(分别加到每个特征图上,每个特征图对应一个可学习的scale参数)。