StyleGAN 技术脉络:从风格空间到无混叠生成
StyleGAN 技术脉络:从风格空间到无混叠生成
StyleGAN 最有意思的地方,不是它能生成多漂亮的人脸。真正改变后续工作的,是它把 GAN 生成器从一个黑箱卷积网络,拆成了几个可以讨论、可以控制、也可以诊断的部件:映射网络、风格调制、逐层噪声、权重去调制、ADA,以及后来的 alias-free 设计。
如果只把 StyleGAN 当作“高清人脸生成模型”,会漏掉它最核心的贡献。它把“潜变量怎么进入生成器”这件事重新设计了一遍。传统 GAN 通常把zzz喂进网络开头,然后让卷积层一路把它变成图像;StyleGAN 先把zzz映射到中间空间WWW,再让WWW逐层控制合成网络。这个小改动带来的影响很大:属性编辑、风格混合、图像反演、少样本微调、视频一致性,后面很多工作都绕不开这条线。
下面按技术演化讲 StyleGAN,而不是按论文摘要复述。读完应该能回答三个问题:StyleGAN 到底把“风格”放在了哪里;StyleGAN2 为什么要删掉 AdaIN;StyleGAN3 为什么突然开始谈信号处理和混叠。
一条主线:把潜变量从输入改成逐层控制信号
最早的 StyleGAN 论文《A Style-Based Generator Architecture for Generative Adversarial Networks》借用了风格迁移里的 AdaIN 思路。它没有大改判别器,也没有提出新的 GAN loss,而是重写生成器:
z → mapping network f → w ↓ constant input → synthesis network g → image ↑ ↑ ↑ style style noise这里的zzz是输入 latent code,fff是一个 8 层 MLP,把zzz映射到w∈Ww \in Ww∈W。合成网络不再从zzz开始,而是从一个 learned constant 开始逐步上采样。每一层卷积之后,www经过 learned affine transform 变成该层的 style 参数,再用 AdaIN 调制特征图。
AdaIN 可以写成:
AdaIN(xi,y)=ys,ixi−μ(xi)σ(xi)+yb,i \mathrm{AdaIN}(x_i, y) = y_{s,i}\frac{x_i - \mu(x_i)}{\sigma(x_i)} + y_{b,i}AdaIN(xi,y)=ys,iσ(xi)xi−μ(xi)+yb,i
其中xix_ixi是第iii个通道的特征图,ysy_sys和yby_byb来自www的仿射变换。直觉上,它先把通道统计量归一化,再用当前样本自己的 style 参数把均值和方差设回去。这样,www不是被塞进网络开头,而是变成每个分辨率层的控制旋钮。
这解释了 StyleGAN 的“风格混合”为什么有效。低分辨率层更影响姿态、脸型、整体布局;高分辨率层更影响皮肤纹理、头发细节、颜色微结构。把两个 latent 的 style 在某个分辨率处分段替换,就能得到比较自然的属性拼接。论文还引入 perceptual path length 和 linear separability 来衡量插值平滑性与解耦性,而不是只看 FID。
另一个容易被低估的设计是逐层噪声。StyleGAN 给每个卷积层注入独立高斯噪声,并让网络学习每个通道的缩放系数。这个噪声主要控制随机微结构:雀斑、发丝、毛孔、背景小纹理。它不太应该改变身份或姿态。也就是说,StyleGAN 把生成因素拆成了两类:www负责相对稳定、可编辑的语义属性;noise 负责无法精确预测的随机细节。
StyleGAN1 的问题:AdaIN 也给了网络钻空子的机会
StyleGAN1 的图像质量很强,但它有一类典型 artifact:水滴状、斑点状的局部异常。StyleGAN2 论文《Analyzing and Improving the Image Quality of StyleGAN》做的第一件事就是追这个问题的来源。
关键观察是:instance normalization 会擦掉特征图的整体幅度信息。生成器如果想把某些幅度信息传给下一层,就可能制造局部极大的激活尖峰,让这些尖峰在归一化统计中占主导。结果就是图像里出现像“水滴”的异常纹理。这个解释很漂亮,因为它不是说“网络不够大”或“训练不稳定”,而是指出了归一化本身改变了信息流。
StyleGAN2 的修正是把 AdaIN 改成 weight modulation / demodulation。它不再先卷积、再对 feature 做 AdaIN,而是让 style 去调制卷积权重。简化地说,对每个样本和每一层,stylesis_isi会缩放输入通道对应的卷积权重:
wijk′=si⋅wijk w'_{ijk} = s_i \cdot w_{ijk}wijk′=si⋅wijk
但只做 modulation 会让输出特征的方差不稳定,于是再做 demodulation:
wijk′′=wijk′∑i,k(wijk′)2+ϵ w''_{ijk} = \frac{w'_{ijk}}{\sqrt{\sum_{i,k} (w'_{ijk})^2 + \epsilon}}wijk′′=∑i,k(wijk′)2+ϵwijk′
这一步保留了“style 控制每层”的核心思想,同时避免用 instance normalization 去强行重置 feature statistics。StyleGAN2 论文报告,在 FFHQ 1024×1024 上,baseline StyleGAN 的 FID 为 4.40,加入 weight demodulation、大幅调整 progressive growing、path length regularization 和更大网络之后,StyleGAN2 配置达到 2.84;在 LSUN Car 512×384 上,对应 FID 从 3.27 到 2.32。数字不只是更低,它说明 artifact 修复并没有靠牺牲分布质量换来。
StyleGAN2 还重新审视了 progressive growing。Progressive GAN 和 StyleGAN1 都用过逐步提高分辨率的训练策略:先训低分辨率,再逐渐加入高分辨率层。这个策略能让早期训练稳定,但也会留下“相位”和层级之间的痕迹。StyleGAN2 倾向于使用固定网络结构训练,通过更好的 normalization、regularization 和残差式判别器解决稳定性,而不是让网络结构在训练中变化。
这里还有一个对实际应用很重要的结果:path length regularization 让生成器更容易反演。反演就是给定一张真实图像,找一个 latent code 让生成器重建它。StyleGAN 生态里大量编辑工具都依赖 inversion;如果 latent 到图像的映射局部尺度太乱,优化会变难,编辑也会变脏。StyleGAN2 把这个问题往前推了一步。
ADA 解决的不是画质,而是数据量
StyleGAN2 很强,但它仍然是大数据模型。GAN 在小数据上最容易出的问题是判别器过拟合:判别器很快记住训练集,生成器拿不到有用梯度,训练开始漂。StyleGAN2-ADA 论文《Training Generative Adversarial Networks with Limited Data》把问题直接放在判别器上处理。
普通数据增强对 GAN 不总是安全。判别器看到增强后的真实图像,生成器也会被迫生成“带增强痕迹”的图像,这就是 augmentation leakage。ADA 的目标是让增强帮助判别器泛化,但不要把增强变成生成分布的一部分。
它的做法是自适应调节增强概率ppp。训练过程中监控判别器对真实图像的符号统计量,如果判别器开始过拟合,就增大增强强度;如果还没有明显过拟合,就降低或保持增强。增强管线本身包括几何、颜色、滤波和 corruption 等多类变换,并且在 GPU 上可微实现。
这篇论文的实用价值很高。作者报告,用几千张训练图像也能得到可用结果,很多情况下用少一个数量级的数据接近 StyleGAN2 的效果;在 CIFAR-10 上,论文把当时记录 FID 从 5.59 降到 2.42。官方 PyTorch 版 README 也强调,它是 TensorFlow 版 StyleGAN2-ADA 的 faithful reimplementation,并在 NVIDIA Tesla V100 上训练通常快 5% 到 30%,高分辨率推理最高快 35%。
如果你真的要训练自己的 StyleGAN,今天更常见的入口也是 StyleGAN2-ADA PyTorch。最基本的训练命令长这样:
python dataset_tool.py--source=/path/to/images--dest=~/datasets/mydataset.zip python train.py\--outdir=~/training-runs\--data=~/datasets/mydataset.zip\--gpus=1\--dry-run python train.py\--outdir=~/training-runs\--data=~/datasets/mydataset.zip\--gpus=1--dry-run值得先跑一次,它会打印训练配置并检查参数。训练过程中会保存network-snapshot-<INT>.pkl、样例图和 metric 日志。常用指标包括fid50k_full、kid50k_full、pr50k3_full和 perceptual path length。CSDN 上很多复现实验失败,不是因为模型写错,而是数据 zip 格式、分辨率、镜像增强、batch 和 gamma 没对齐。
StyleGAN3 的问题更底层:细节被粘在像素坐标上
StyleGAN3 的论文题目叫《Alias-Free Generative Adversarial Networks》。这不是常见的“加模块提升指标”论文,它讨论的是生成器的信号处理问题。
作者观察到,典型卷积生成器虽然看起来是层级合成,但内部过程会不健康地依赖绝对像素坐标。现象是:图像里的细节像是粘在屏幕坐标上,而不是粘在物体表面。做人脸插值或视频生成时尤其明显,头部在动,但毛孔、发丝纹理、局部噪声的运动不完全跟着面部几何走。
StyleGAN3 把根因追到 aliasing。生成器里有上采样、非线性、卷积、下采样。如果把特征图当作连续信号的离散采样,那么点态非线性会制造更高频率;如果这些频率没有在重新采样前被正确低通滤掉,就会折叠回低频,泄漏出与采样网格相关的信息。网络学会利用这些泄漏信息,就会把细节绑定到像素坐标。
它的改法包括:把网络信号解释为连续域信号;在上采样、非线性和下采样之间加入更严格的低通滤波;使用 Fourier features 提供输入坐标;去掉一些会破坏等变性的设计;提供 StyleGAN3-T 和 StyleGAN3-R 两类配置,分别偏向平移等变和平移加旋转等变。官方 README 也把 equivariance metrics 作为新工具列出来,包括eqt50k_int、eqt50k_frac和eqr50k。
论文在 FFHQ-U 256×256 的配置实验中报告,StyleGAN2 baseline FID 为 5.14;StyleGAN3-T 为 4.62,EQ-T 达到 63.01 dB;StyleGAN3-R 为 4.50,EQ-T 为 66.65 dB,EQ-R 为 40.48 dB。FID 没有发生夸张跳跃,重点在内部表示和运动一致性。换句话说,StyleGAN3 的价值不主要体现在静态图像排行榜,而体现在动画、视频和需要稳定几何绑定的编辑场景。
这也解释了为什么很多只做单张图像生成的人,对 StyleGAN3 的体感提升不如 StyleGAN2 明显。StyleGAN3 修的是“连续变化时细节应该怎么动”。如果任务只看一张静态图,FID 可以相近;如果看插值视频,差异会变得肉眼可见。
四代设计可以放在一张表里看
| 版本 | 主要问题 | 核心改动 | 更适合的场景 |
|---|---|---|---|
| StyleGAN | 传统 GAN latent 控制太粗 | Z→WZ \to WZ→W映射网络、逐层 AdaIN、逐层噪声 | 可控人脸生成、风格混合、latent 编辑 |
| StyleGAN2 | AdaIN/渐进训练带来 artifact 和反演困难 | 权重 modulation/demodulation、path length regularization、固定结构训练 | 高质量静态图生成、图像反演、编辑 |
| StyleGAN2-ADA | 小数据训练时判别器过拟合 | 自适应判别器增强,动态调节增强概率 | 少样本数据集、迁移训练、个人数据集生成 |
| StyleGAN3 | 细节绑定到像素坐标,运动不自然 | alias-free generator、连续信号视角、等变指标 | 视频、动画、连续插值、需要几何稳定的生成 |
这张表也能帮助判断该用哪个版本。想做静态头像生成或图片编辑,StyleGAN2-ADA 往往是最稳的起点;想研究插值视频、动态头像或运动一致性,StyleGAN3 更值得看;想理解 latent editing 的源头,必须读 StyleGAN1 的WWW空间和 style mixing。
实现细节里最容易踩的坑
第一,WWW空间不是魔法。它更解耦,是因为 mapping network 允许输入分布被重新弯折,让合成网络看到一个更适合控制的中间空间。但这不保证每个方向都有干净语义。很多所谓“年龄方向”“微笑方向”仍然依赖数据集偏差和线性近似。
第二,truncation trick 会改善平均观感,也会降低多样性。StyleGAN 常用w′=wˉ+ψ(w−wˉ)w' = \bar{w} + \psi(w - \bar{w})w′=wˉ+ψ(w−wˉ)把 latent 拉向均值。ψ\psiψ小的时候,人脸更“安全”、更像训练集中心区域;但少数族裔、极端姿态、罕见配饰等尾部分布可能被压掉。做数据生成时不能只看样例图漂亮。
第三,FID 不是万能指标。StyleGAN3 就是典型例子:它可以在 FID 接近 StyleGAN2 的同时,内部表示完全不同,等变性和视频一致性更好。反过来,一个模型 FID 更低,也不代表更适合编辑或反演。
第四,数据预处理比很多人想象得更重要。FFHQ 之所以成为 StyleGAN 时代的标志数据集,不只是因为图片多,还因为对齐、裁剪、质量控制都比较规范。自己训练头像模型时,如果人脸框、分辨率、背景和压缩质量很乱,模型会把这些混乱也学进去。
第五,官方 pickle 和代码版本要对齐。StyleGAN3 README 说明它兼容旧 StyleGAN2-ADA pickle,但旧模型在新代码里运行不会自动获得 StyleGAN3 架构收益。要得到 alias-free 生成器,需要按 StyleGAN3 配置重新训练或微调。
一个更短的理解方式
StyleGAN 的演化其实很连贯:
StyleGAN1: 让 latent 逐层控制图像,而不是只进网络开头 StyleGAN2: 保留逐层控制,但把归一化造成的 artifact 修掉 StyleGAN2-ADA: 保留架构,把小数据下的判别器过拟合压住 StyleGAN3: 保留画质,把生成过程里的采样网格泄漏压住它不是一条单纯刷 FID 的路线。StyleGAN1 让人们开始认真操作WWW空间;StyleGAN2 让高质量反演和编辑更可靠;StyleGAN2-ADA 让普通规模数据集也能训练;StyleGAN3 则把问题推进到连续信号和等变性。扩散模型流行之后,StyleGAN 不再是图像生成的唯一中心,但它在可控生成、latent editing、数据集蒸馏和人脸/头像类任务里仍然有很高参考价值。
如果只读一篇论文,读 StyleGAN2;如果要训练自己的数据集,从 StyleGAN2-ADA PyTorch 开始;如果要做连续动画或视频一致性,再认真读 StyleGAN3。这个顺序比按年份硬啃四篇论文更省时间。
资料链接
- StyleGAN 论文:A Style-Based Generator Architecture for Generative Adversarial Networks,https://arxiv.org/abs/1812.04948
- StyleGAN2 论文:Analyzing and Improving the Image Quality of StyleGAN,https://arxiv.org/abs/1912.04958
- StyleGAN2-ADA 论文:Training Generative Adversarial Networks with Limited Data,https://arxiv.org/abs/2006.06676
- StyleGAN3 论文:Alias-Free Generative Adversarial Networks,https://arxiv.org/abs/2106.12423
- StyleGAN2-ADA PyTorch 官方仓库:https://github.com/NVlabs/stylegan2-ada-pytorch
- StyleGAN3 官方仓库:https://github.com/NVlabs/stylegan3
