注:拉到最后有视频版哦~
GAN
GAN 的介绍
GANs 简单的想法就是用两个模型,一个生成模型,一个判别模型
判别模型用于判断一个给定的图片是不是真实的图片,生成模型的任务是去创造一个看起来像真的一样的图片。
而在开始的时候这两个模型都是没有经过训练的,这两个模型一起对抗训练,生成模型产生一张图片去欺骗判别模型,然后判别模型去判断这张图片是真是假,最终在这两个模型训练的过程中,两个模型的能力越来越强,最终达到稳态。
举个例子,想要成为一名优秀的伪钞制造者,也就是生成器,需要使用原材料,也就是噪声,产生蒙骗得了警察的假钞,使得警察无法区分出哪张是真实的钞票,哪张是伪造的钞票;但警察,也就是判别器,需要尽可能高效地发现哪些是假钞。这是一个极大极小博弈,双方互相促进,最终警察的鉴别能力会很强,伪钞制造者制造假钞以混淆真伪的能力也会很强
从图中部分可以看到,真实图片(绿色)分布难以拟合,故需要使用对抗的思想
一般来说,GAN 的输入都是随机向量,但是也有一些 gan,输入会添加一些条件,这里只考虑随机向量的输入
两个方向
- div
- 网络结构
今天只讨论网络结构
GAN
NIPS 2014
14 年的 GAN 用的多层感知机,论文中没有结构
- 主要贡献:提出了 GAN 的优化函数
最大化 D 的能力的前提下,最小化 D 对 G 的判断能力,前面的例子也是这个意思
其中 z 是随机输入,G()是生成器,D 是判别器
训练时候先固定住 G,训练 D;再固定住 D,训练 G - 实验
只看人脸,又小又模糊
这个是最早的 GAN 出来的效果
DCGAN
ICLR 2016
我们知道对图像处理应用最好的方法是深度学习
DCGAN 就是 CNN 和 GAN 的第一次结合,它只是把上述的 G 和 D 换成了两个卷积神经网络
可以看出,生成器的输入是一个 100 维的噪声,中间会通过 4 个卷积层,每通过一个卷积层通道数减半,长宽扩大一倍,最终产生一个 64x64x3 大小的图片输出。
值得说明的是,这 4 个卷积并不是反卷积,而是微步幅度卷积,二者的差别如下图所
上图左边是反卷积,用 3x3 的卷积核把 2x2 的矩阵反卷积成 4*4 的矩阵;而右边是微步幅度卷积,用 3x3 的卷积核把 3x3 的矩阵卷积成 5x5 的矩阵,二者的差别在于,反卷积是在整个输入矩阵周围添 0,而微步幅度卷积会把输入矩阵拆开,在每一个像素点的周围添 0。优点是更好的学习自己的空间上采样
DCGAN 的 D 结构论文中没说,下图是其他人复现的 D 结构(简单的分类器)
-
实验
- 矢量计算
这些图片都是生成的图片
某一些噪声对应的风格特点是一样的,比如性别,微笑,眼镜
把这些噪声收集起来,在噪声上平均后,进行加减,就可以做一个矢量运算
如果只是在图像层面做平均,效果很糟糕
- 矢量计算
PGGAN
ICLR 2018
在讲 PGGAN 之前,我先提一下 StackGAN,StackGAN 是港中文提出的生成较高清图片的网络
这个 GAN 分为两步
第一步的对抗生成网络生成一个低分辨率的 64x64 的图片。第二阶段的将第一阶段的生成结果作为输入,用第二个对抗生成网络生成高分辨率的 256x256 的图片
如果现在我们想生成超高分辨率的图像,譬如 1024×1024 图片,之前的 StackGAN 是级联的,需要用到的 GAN 结构会非常多,网络深度巨大。为了解决这一问题, PGGAN 提出的是,我们只需要一个 GAN 就能产生 1024×1024 图片。一开始的时候 GAN 的网络非常浅,只能学习低分辨率(4×4)的图片生成,随着训练进行,我们会把 GANs 的网络层数逐渐加深,进而去学习更高分辨率的图片生成,最终不断的更新 GANs 从而能学习到 1024×1024 分辨率的图片生成。
也就是说, PGGAN 与 StackGAN 最大不同在于,后两者的网络结构是固定的,但是 PGGAN 随着训练进行网络会不断加深,网络结构是在不断改变的。
下图是 PGGAN 的网络结构
随机向量进去,生成器按当前的分辨率生成图像,现在在训多少的分辨率,就是多少的分辨率,判别器也在当前的分辨率判别图像,
值得一提的是,图中看起来是一起优化的,但其实还是分开来的,和传统的 GAN 优化一样,先 D,再 G
我具体讲一下网络是怎么动态变化的
不过, PGGAN 网络结构的动态变化是如很困难的。
因为如果从一个分辨率直接变为另外的分辨率的输出的话,网络层数的突变会造成 GANs 原有参数失效,导致急剧不稳定,这会影响模型训练的效率。为了解决这一问题,PGGAN 提出了一种平滑过渡技术。
宏观来说,就是训练的时候,把高层融合进低层,其中高层的比例渐渐变大,低层的比例渐渐减小
如上图所示,当把生成器和判别器的分辨率加倍时,会平滑的增强新的层。这里的 G 和 D 并不是为了结构的对称,而是网络需要逐级训练的原因。我们以从 16×16 像素的图片转换到 32×32 像素的图片为例。在转换(b)过程中,把在更高分辨率的层视为一个残缺块,权重 α 从 0 到 1 线性增长。当 α 为 0 的时候,相当于图 a,当 α 为 1 的时候,相当于图 c。
在训练过程中,α\alphaα 是从小变大的,即真实样本和生成样本都是:x=x16pixel×(1−α)+x32pixel×αx=x_{16pixel}\times(1-\alpha)+x_{32pixel}\times \alphax=x16pixel×(1−α)+x32pixel×α
也就是前面提到的,高层融合进低层,高层的比例渐渐变大,以达到更高的分辨率
上图中的 2x 和 0.5x 指利用最近邻卷积和平均池化分别对图片分辨率加倍和折半
toRGB 表示将一个层中的特征向量投射到 RGB 颜色空间中,fromRGB 正好是相反的过程;这两个过程都是利用 1×1 卷积。
PGGAN 的主要优点就是能生成高质量的样本。
Stylegan
cvpr 2019
我们先来反思一下上一节介绍的 PGGAN 有什么缺陷,由于 PGGAN 是逐级直接生成图片,我们没有对其增添控制,进去是一个随机的噪声,直接出来一张图片,我们也就无法获知它在每一级的分辨率上学到的是什么,这就导致了它对生成图像的控制非常有限。换句话说,这些特性是互相关联的,因此尝试调整一下输入,哪怕是一个值,通常也会同时影响多个特性。
我们希望有一种更好的模型,能让我们控制住输出的图片是长什么样的,类似于之前 DCGAN 的矢量运算实验,提高 GAN 对生成图像的精确控制能力,如何控制?通过 mapping 和样式模块来处理,这个在后面细讲
整体架构不变,只修改生成器
先大致介绍下 Stylegan 的结构,Stylegan 的生成器包括两部分,映射网络和合成网络,映射网络的输入是随机向量,输出是中间向量
可以看到 PGGAN 和 Stylegan 之间的对比,Stylegan 合成网络和 PGGAN 结构差不多,在每个分辨率的层替换 Norm 为样式模块 AdaIN,A 模块是一个 FC 组成的模块,输出是这一层对应的 style 样式,其中样式模块起到一个 style 特征融合的作用,这里的 style 不是从图像中得到的,而是从中间向量变换后得到的
值得一提的是,传统的特征是图片通过卷积得到的,这篇文章提出的特征是从一个变换后的向量得到的,打破了传统思维,是一个不错的创新
此外,b 模块是噪声模块
输入常量矩阵:使得网络更加容易学习
映射网络
映射网络的目标是将输入向量编码为中间向量。
这是一个非常重要的过程,因为使用输入向量来控制视觉特征的能力是非常有限的,从宏观来看,输入的随机向量一定会去遵循训练集的概率分布,从左下角的图中可以看到
例如,如果黑头发的人的图像在数据集中更常见,那么更多的输入值将会被映射到该特征,这一现象被称为特征纠缠。
然而,通过使用另一个神经网络,该模型可以生成不必遵循训练数据分布的中间向量,并且可以减少特征之间的相关性。
在图中可以看到,我们希望中间向量是这样的
这个叫解耦合
映射网络由 8 个全连接层组成,它的输出 W 与输入层(512×1)的大小相同。
样式模块(AdaIN)
AdaIN 的意思是:自适应实例标准化
模块将映射网络创建的编码信息 w 传输到生成的图像中
不同层的模块所融合的特征都不同,有点类似于通道的 attention,突出这一层应该学习的 style,抑制不该学习的 style
举例子,这个 4x4 的,应该学习到皮肤的颜色,那么这个模块就会给对应的维度比较大的值,比如 8x8 学的是眼镜,那么眼镜这个特征在 4x4 的这个模块中就会得到抑制
这种方法使得每一种 style 产生的影响都是局部的
具体到公式
1、卷积层输岀的毎个通道首先进行标准化
2、中间向量 w 使用另一个全连接的网络层(标记为 A)转换为每个通道的比例和偏差(圈)
3、比例和偏差作用于卷积输出的每个通道,(强调和抑制),类似一个通道的 attention
前面说的每一种 style 的影响都是局部的,从这张图中可以看到,某一些分辨率固定的控制一些人脸的样式,比如眼镜,肤色等,这个图在后面的实验中细讲
随机变化
人们的脸上有许多小的特征,可以看作是随机的,例如:雀斑、发髻线的准确位置、皱纹
StyleGAN 中的噪声以类似于 AdaN 机制的方式添加,在 AdaN 模块之前向每个通道添加噪声
同时,使得噪声的影响都是局部的
样式混合
上图,第一排是 source 图像,第一列是目标的图像
简单的来说,就是将 source 的 style 迁移到目标图像上
我们可以看到输入 A 的向量一共是 18 维,按分辨率分为 9 个层,每层两个
这些效果是在生成图像时用生成 source 的中间向量集合按分辨率
覆盖掉生成目标图像的对应中间向量集合产生的样式变化
- 在粗糙分辨率(4-8)产生的图像的高级特征(姿势、头发样式、脸的形状和眼镜)从 source 图像中复制,而目标图像的颜色(眼睛、头发、光线)和面部细节被保留下来,说明该尺度的样式控制了生成图像的高级特征
- 在中间层(16-32)合成的图像将会从 source 中继承较小尺度的面部特征(头发的样式、眼睛的闭合),而目标图像的姿势、脸的形状、眼镜等被保留。说明该尺度的样式控制了生成图像的较小尺度的面部特征
- 在精细分辨率(64 - 1024)主要复制了 source 中的颜色。
说明该尺度的样式控制了生成图像的更低尺度的特征-颜色
截断
在生成模型中的一个挑战,是处理在训练数据中表现不佳的地方,即低密度区域表现不佳。
简单来说就是不是输入是随机的码,就怕他随机到一个网络没见过的值,这样生成出来的图片肯定效果不佳,于是我们希望有一个先验,使得生成的图片在这个先验的附近变化,使得生成的图片质量不要太差
具体来说,
对模型进行训练之后,通过选择多个随机的输入,用映射网络生成它们的中间向量,并计算这些向量的平均值,从而生成平均值 w。
当生成新的图像时,不用直接使用映射网络的输出,而是将值 w 转换为 wnew=warg+ψ(w−warg)w_{new}=w_{arg}+\psi(w-w_{arg})wnew=warg+ψ(w−warg)。其中 ψ 的值定义了图像与“平均”图像的差异量
- 上下两行不同的中间向量
可以看到系数等于 1 时候,没有平均脸这个先验,等于 0 时候完全是平均脸,可以看到没有平均脸这个先验的时候,图片生成质量比有平均脸的要差,姿态都歪了,脸的颜色也不自然
系数等于-1,表情变得奇怪,丧失了原本向量的特征
根据经验,取 0.7
量化隐空间耦合度
这个提出是为了量化耦合程度,其实就是加了映射网络的效果
所以本文提出了两种新的量化解耦的方法
- 感知路径长度(Perceptual path length)
- 线性可分性(linear separability)
感知路径长度
使用该指标分别衡量 Z 和 W 向量的解耦合性
原理:(以 Z 向量为例)
先随机选择两个 Z 向量 z1, z2,它们在空间中表现为两个点
将两个向量的连线分为极小段
在这两个向量的连线上选择待测试的向量 x
然后对向量 x 在同方向上做一个微小扰动得到向量 y
所以我们当我们再将 x 和 y 作为生成器 G(对应向量 W 来讲就是生成网络 f)的输入时,生成的图片之间的距离应该会很小
线性可分
首先,有一个共识,如果一个隐空间是充分解耦的,一定特征线性可分
比如我在高维空间中有很多点,每个点输入生成器中都会有一个输出图片,每张图片都会有一个 label,现在要找到一个超平面把这些 label 一一分开
用条件熵 H(Y|X)度量超平面将点划分为正确类别的能力,越小,特征分的越开,越大,越分不开
越小越好
实验
样式混合
StyleGAN 生成器在合成网络的每个分辨率的级别都使用了同一个中间向量,这有可能导致网络学习到这些级别是相关的。为了降低相关性,模型随机选择两个输入向量,并为它们分别生成了中间向量 W。然后,它用第一个输入向量来训练一些网络级别,然后在一个随机选中的点中换到另个输入向量来训练其余的级别。其实就是打乱中间向量,确保了网络不会学习并依赖于合成网络级别之间的相关性。
FID:计算真实样本与生成样本在特征空间之间的距离。
实验目的
- 探究训练过程中混合正则化应用的样本的比例对生成图像质量的影响
实验结果
- 竖着看:0-100% 表示训练过程中混合正则化应用的样本的比例,使用相同数目的隐码,随着混合正则化应用的样本的比例的增加(同一列从上到下),FID 值降低,但在
- 随机化 1-4 个中间向量和它们之间的交点对网络进行压力测试
实验结论
- 相同测试向量情况下,增加混合正则化应用的样本的比例,图像质量得到提高
- 测试的中间向量越多,混合正则化的优点越明显,说明混合正则化是有效的
图像质量
这些都是生成图,比之前的质量高
FID:计算真实样本与生成样本在特征空间之间的距离。
实验目的
- 探究模块是否能够起到提高图片真实度的作用
- 在 CelebA-HQ 和 FFHQ 上测试
实验结果
-
在 baseline 上加入
- tuning 就是双线性上/下采样,在训练时候使用,这里不细说
- 映射网络、样式模块
- 固定化输入:更好的学习,靠样式模块已经能生成多样式的图片了
- 增加噪声
- 加混合正则化的比例
都提高了生成图像的质量,降低了 FID
实验结论
- 文章提出的这些 trick 是有效的
随机变化
实验目的
- 两个实验都是探究加噪声能得到什么结果
实验结果
- b 使用相同 latent code,不同噪声作为输入;细节比如头发的形状有较大的不同;c 是 100 个不同的随机噪声输入产生的图像的标准差,较亮部分是标准差较大的部分(受噪声输入影响较大的部分,头发等部分),而面部、姿势等高级特征不受随机变化的影响。
- 上图说明了将随机变化应用于不同的层的效果(将噪声输入不同层)。a 噪声加入了所有层;b 没有噪声;c 在精细层(fine layers,64-1024)加入噪声;d 在粗糙层(coarse layer,4-32)加入噪声。粗糙的噪声导致头发大规模卷曲,背景特征更大,而细小的噪声则使头发卷曲更细,皮肤毛孔更细。
实验结论
- 加噪声可以有效改变生成图片的一些低级特征
隐空间的解耦效果
实验目的
- 探究隐空间的解耦效果
实验结果
- Z 是输入向量,w 是中间
- path length 是感知路径长度,其中感知路径长度的度量分为两种,一种是端点到端点的度量,直接计算两个端点对应图像的相似度;一种是插值全路径的度量,感知总长度定义为每段感知差异的总和
- Separa 是线性可分性的条件熵,
- 0-8 是映射网络的深度
- 表 3 说明对于具有噪声输入的 stylegan 的生成器 感知路径长度比传统生成器短,其他的 trick 如改变正则化应用的比例,也有一定的提升,但不是最佳。这表明中间隐空间 W 比隐空间 Z 更线性,即 W 是 Z 的解耦映射
- 表 3 和表 4 显示,中间隐空间 W 始终比输入隐空间 Z 更易于分离(Separability 更小),这表明纠缠的表示更少。
- 此外,表 4 显示 stylegan 增加映射网络的深度可以同时提高 W 生成图像的质量(FID)和可分性,但对 Z 的作用不明显
实验结论
- 中间隐空间 W 比隐空间 Z 更线性,且增加映射网络深度可以提高效果
GAN简单综述