今天之前,你大概会觉得,英伟达的StyleGAN已经是效果最震撼的GAN吧。
它既能生成逼真的人脸:
也能生成可爱的老婆:
还有逼真的猫咪、卧室、汽车……投喂哪种数据集,就吐出哪种图像。
但英伟达并不过度骄傲,自StyleGAN发表以来,团队就一直研究它的弱点,然后想办法拯救。
现在,升级版StyleGAN2诞生了,它弥补了第一代的各种缺陷。
先举个例子。初代StyleGAN生成人像,周围总是出现水滴状不明物体:
如今,StyleGAN2生成的图像里,看不到奇怪的水滴了:
不要急着惊讶,这只是其中一处,StyleGAN2解锁的新技能还有不少。
更美好的是,英伟达已经把算法开源了。
所以,先来观察一下它到底是怎样进化的吧。
水滴是如何消除的?
初代StyleGAN的第一个缺陷,就是刚刚提到的“水滴”。严重的时候,甚至会破人脸的完整:
论文说,水滴有时候很明显,有时候肉眼不易察觉,但如果从特征图 (Feature Map) 上看,其实问题一直都在:
△ 右边是特征图
想去除水滴,首先要知道它从哪里来,才好对症下药。
从生成64×64的图像开始就有了,分辨率越高,水滴现象就越严重。
团队起初对这种缺陷的存在感到费解,因为按常理说判别器应该能发现才对啊?
但很快,他们就把矛头指向了生成器的实例归一化 (Instance Normalization),上代StyleGAN用的方法是AdaIN (自适应实例归一化) 。
因为,是这个部分负责把每张特征图的均值 (Mean) 和方差 (Variance) 分开归一化,很可能是这种做法破坏了特征信息。
于是一种假设诞生了:
水滴形成的原因是,生成器故意让信号强度信息 (Signal Strength) 绕过实例归一化,它会创建一个强大的局部化 (Localized) 的信号峰,来支配统计数据,有效缩放信号强度。(欺上瞒下的骚套路啊。)
假设轻松得到了验证。只要把实例归一化拿掉,水滴就完全消失了。
但真的拿掉之后,又会导致每一种风格的效果累积起来 (Cumulative) ,没办法保留在特定的尺度上,这样就很难控制GAN的生成了。所以,团队重新设计了实例归一化的过程。
说到重新设计,就简单介绍一下初代StyleGAN。它的生成器是从风格迁移算法上借鉴而来,能在粗糙到精细的不同尺度上操控GAN的生成,再把各种尺度的风格 (Style) 结合起来:
△ 尺度越细调整越小:最精细尺度只调配色,不改姿势发型五官
初代StyleGAN的生成器,是在风格块里加了偏置 (Bias) 和噪声 (Noise) 。就如下图,(a)是整体架构,(b) 是细节:
△ 灰色框是风格块
团队发现,如果把偏置和噪音挪到风格块之外,直接加在已经归一化的数据上,就能得到更加可预测的结果。
(除此之外,这样改动过后,只要对标准差做归一化和调制就足够,不用再处理均值了。)
这也是重新设计的第一步,迈出这一步之后架构长这样:
在此基础之上,团队又走了第二步:
原本每个风格块由三部分组成,一是调制,二是卷积,三是归一化。
团队把归一化这个部分,用一个新的“解调 (Demodulation) ”代替了。
此处隐去数学过程,只说中心思想:与原本的归一化相比,“解调”不是基于特征图的实际内容 ,而是基于假设 (Assumptions/Expected Statistics) 。也就是说,比从前的操作更温和了。
修改完毕,变成了下图的样子。是调制后直接解调,把解调结果交给卷积:
实验也证明,新的实例归一化方法可以有效去除水滴现象。不论是在生成的图像上,还是在特征图上,都没有奇怪的斑点了:
从一张图到另一张图的变化过程中,也没有出现水滴:
与此同时,“解调”也让各个尺度的风格,保留在原本的尺度上。团队说,StyleGAN2在不同尺度风格的混合方面,比上一代更自如了:
(来源A和来源B,就是不同尺度的风格。)
这样,一个缺陷就补好了。
但还有下一个。
五官姿势不同步怎么破?
初代StyleGAN,用的是渐进式增大 (Progressive Growing) 的训练方法。
就是从4×4的图像开始生成,到8×8,到16×16,一步一步增大生成的分辨率,最终炼成1024×1024的高清图像生成技能。
这种方法能把GAN的训练过程变得更加稳定,是从大前辈PG-GAN那里沿用下来的。英伟达第一次以生成逼真人脸闻名于世,靠的就是PG-GAN。
只不过,这种方法有一个明显的弱点,就是对牙齿、眼睛等等细节,有很强的位置偏好。也就是说,这些细节特征每移动到一个位置,都会在那里停留很久,才移去下一个位置:
这样一来,脸上各个部位的姿势很容易不匹配。
如果你没看出破绽,观察下面这张图吧。脸转了方向之后,牙齿没有及时跟着走,门牙一直朝着正前方:
这不科学。
团队用一种新的方法取代了渐进式增大。疗效显著,人脸转动的时候,牙齿的朝向也随着改变了:
原本StyleGAN的生成器和判别器都只用了简单的前馈设计,所以团队探索了更科学的结构。
他们借鉴了MSG-GAN的架构 (图a) ,这位前辈是把生成器和判别器的分辨率,用多个跳层连接 (Skip Connections) 匹配起来:
研究人员在这基础上做了简化,生成器用了上采样 (Upsampling) 与求和 (Summing) 来处理每一种分辨率下RGB输出的贡献 (图b上方) 。
判别器 (图b下方) 也是同理,利用了降采样 (Downsampling) 。
然后,就是用残差连接 (Residual Connections) 进一步改造网络。不过,ResNet里面两条路径相加会让信号的方差加倍,所以这里乘以1/√2来解决这个问题。
这一步很重要,因为在分类用的ResNet上,这个问题通常会被批量归一化隐藏起来。
实验表明,跳层连接可以大大提升PPL,残差连接又对FID有利。
最终,团队最终选择了跳层生成器,以及残差判别器。
结果,得到了五官姿势同步变化的人脸:
还能这样玩
论文提到,把生成器的工作“颠倒过来 (Inverting) ”,也是个很有趣且很重要的课题。
也就是说,输入一张图,如果能够复现,就可以判断它是这只GAN生成的。
这就需要把图片投射进潜在空间里,找到它对应的潜在向量,来复现这张图。
迭代1000次之后,得到图片和原图几乎无差的话,原图就是StyleGAN2生成的 (下图左) ;得到的图片和原图有明显差别的话,原图就不是StyleGAN2生成的 (下图右) :
虽然类似的操作从前也出现过,但团队提出了与前辈不同的方法,来找到复现需要的潜码 (Latent Code) :
不去扩展潜在空间,只在原本的潜在空间里找潜码,这样不会匹配到无关的图像,而是会对应到生成过的图像上;
给潜码加上了缓步下降的噪音,这样能更充分地挖掘潜在空间;
另外,还优化了StyleGAN2生成器的随机噪音,就是把它们正则化,避免携带相关信号。
科学家说,随着GAN生成的图像越来越逼真,也就更需要检测一张图是不是GAN生成的。
这当然是正经用途。但在算法开源之后,已经被小伙伴们玩坏了:
得到这些鬼畜的表情包,就是说史莱克和阿凡达,果然不是StyleGAN的作品啊。
开源了
既然代码已经放出来,你也要试着玩坏一下StyleGAN2吧。
不然就先看看论文,那里讲到的进化之处比本文要全面,看完之后你就会有更大胆的想法了。
论文传送门:
https://arxiv.org/abs/1912.04958
代码传送门:
https://github.com/NVlabs/stylegan2
“