虽然渐进式GAN(ProGAN)大幅提升了高分辨率图像的生成能力,但控制这些图像的特点仍然是一个难题。标准GAN的潜在空间$z$常存在纠缠问题,这意味着改变$z$中的一个维度可能会同时影响生成图像中多个不相关的属性。由Karras等人(NVIDIA)提出的StyleGAN,通过重新设计生成器架构来促进更解耦的风格表示,从而处理了这个问题。映射网络:从$z$到$w$StyleGAN的首个主要创新是引入了一个映射网络,记作$f$。StyleGAN没有直接将输入潜在向量$z$(通常从标准正态分布中抽取)馈入合成网络,而是首先使用非线性映射网络将$z$转换为中间潜在空间$W$:$$ w = f(z) $$这个映射网络$f$通常实现为一个多层感知器(MLP)。主要思想是$z$的分布不必遵循训练数据变化所产生的分布。映射网络学习一个变换,将$z$“解缠”到一个空间$W$中,在这个空间里,变异因素可能更容易线性分离。据称,这个中间潜在空间$w \in W$比输入空间$Z$的纠缠度更低。由于$W$是学习得到的,它不需要遵守像$Z$那样的固定分布,使其能更好地表示训练数据特征的概率密度。合成网络与自适应实例归一化(AdaIN)第二个核心组成部分是合成网络$g$,它基于中间潜在编码$w$生成图像。与在输入层接收潜在向量的传统GAN生成器不同,StyleGAN合成网络从一个学习得到的常数张量开始。源自$w$的风格信息被注入到网络的多个位置。这种注入通过**自适应实例归一化(AdaIN)**层实现。回顾一下,实例归一化独立地对每个样本和每个通道的特征图统计量(均值和标准差)进行归一化。AdaIN通过使用源自$w$的风格信息来调节归一化特征,从而扩展了这一点。具体来说,对于给定层$i$的每个特征图$x_i$,AdaIN首先按通道对其进行归一化:$$ \text{归一化}(x_i) = \frac{x_i - \mu(x_i)}{\sigma(x_i)} $$其中,$\mu(x_i)$和$\sigma(x_i)$是针对批处理中每个通道和每个样本在空间上计算得到的均值和标准差。然后,它应用从中间潜在向量$w$中得到的学习仿射变换(缩放$y_{s,i}$和偏置$y_{b,i}$)来注入风格:$$ \text{AdaIN}(x_i, w) = y_{s,i} \left( \frac{x_i - \mu(x_i)}{\sigma(x_i)} \right) + y_{b,i} $$缩放 ($y_s$) 和偏置 ($y_b$) 参数是通过将$w$通过应用于AdaIN的每一层的单独学习仿射变换(全连接层)来获得的。这种机制使得$w$能够控制合成网络$g$中不同分辨率特征图所表示的风格(如姿态、身份特征、光照、纹理)。粗分辨率(早期层)通常控制较大的结构,而细分辨率(后期层)则控制更精细的细节。通过噪声输入引入随机变化“图像包含许多随机细节(例如,毛发、雀斑、纹理的精确位置),这些细节与高层属性没有强关联。为了模拟这一点,StyleGAN将显式噪声输入直接引入合成网络。高斯噪声在每次卷积之后但在激活函数之前,以逐像素方式添加到特征图中。噪声影响的强度由学习得到的每通道缩放因子控制。”这种显式噪声注入为网络生成令人信服的非结构性变化提供了一种方式,而无需将此信息编码到潜在编码$w$中,进一步使$w$能够专注于更高层次的风格属性。风格混合中间潜在空间$W$和AdaIN的使用,使得一种强大的技术——风格混合——成为可能。我们可以使用两个不同的向量$w_1$和$w_2$(源自$z_1$和$z_2$),并在合成网络中的某个点切换它们,而不是使用单个$w$向量来控制所有AdaIN层。例如,$w_1$可能控制应用于粗分辨率层(例如,4x4到8x8层)的风格,而$w_2$控制细分辨率层(例如,16x16到1024x1024)的风格。这通常会生成一幅图像,它继承了来自$w_1$的粗糙属性(如姿态、整体形状、发型),并继承了来自$w_2$的更精细的属性(如纹理、配色方案、精细面部细节)。风格混合在训练过程中充当一种正则化形式。通过训练网络处理来自不同潜在编码的风格组合,这会促使网络避免认为相邻层在风格空间中强相关,从而进一步提升解耦效果。digraph G { rankdir=LR; node [shape=box, style=filled, fontname="Helvetica", fontsize=10]; edge [fontname="Helvetica", fontsize=9]; subgraph cluster_mapping { label = "映射网络 (f)"; bgcolor = "#e9ecef"; style = "filled,rounded"; z [label="z ~ N(0,I)", shape=ellipse, fillcolor="#a5d8ff"]; mlp [label="MLP\n(8 层)", fillcolor="#bac8ff"]; w [label="w ∈ W", shape=ellipse, fillcolor="#a5d8ff"]; z -> mlp [label="输入潜在变量"]; mlp -> w [label="中间潜在变量"]; } subgraph cluster_synthesis { label = "合成网络 (g)"; bgcolor = "#e9ecef"; style = "filled,rounded"; const [label="学习常数", fillcolor="#d8f5a2"]; noise1 [label="噪声", shape=circle, fillcolor="#ffec99", width=0.3, height=0.3, fixedsize=true]; noise2 [label="噪声", shape=circle, fillcolor="#ffec99", width=0.3, height=0.3, fixedsize=true]; noiseN [label="噪声", shape=circle, fillcolor="#ffec99", width=0.3, height=0.3, fixedsize=true]; block1 [label="合成块 1\n(例如, 4x4)", fillcolor="#b2f2bb"]; block2 [label="合成块 2\n(例如, 8x8)", fillcolor="#b2f2bb"]; blockN [label="合成块 N\n(例如, 1024x1024)", fillcolor="#b2f2bb"]; toRGB [label="到RGB", fillcolor="#ffc9c9"]; img [label="生成图像", shape=cds, fillcolor="#ffc9c9"]; const -> block1; block1 -> block2 [label="上采样"]; block2 -> blockN [label="... 上采样 ...", style=dashed]; blockN -> toRGB; toRGB -> img; A1 [label="A", shape=invhouse, fillcolor="#bac8ff", width=0.3, height=0.3, fixedsize=true]; A2 [label="A", shape=invhouse, fillcolor="#bac8ff", width=0.3, height=0.3, fixedsize=true]; AN [label="A", shape=invhouse, fillcolor="#bac8ff", width=0.3, height=0.3, fixedsize=true]; w -> A1 [style=dashed, arrowhead=none]; w -> A2 [style=dashed, arrowhead=none]; w -> AN [style=dashed, arrowhead=none]; A1 -> block1 [label="风格 (Ys, Yb)\n通过 AdaIN"]; A2 -> block2 [label="风格 (Ys, Yb)\n通过 AdaIN"]; AN -> blockN [label="风格 (Ys, Yb)\n通过 AdaIN"]; B1 [label="B", shape=house, fillcolor="#ffec99", width=0.3, height=0.3, fixedsize=true]; B2 [label="B", shape=house, fillcolor="#ffec99", width=0.3, height=0.3, fixedsize=true]; BN [label="B", shape=house, fillcolor="#ffec99", width=0.3, height=0.3, fixedsize=true]; noise1 -> B1 [style=dashed, arrowhead=none]; noise2 -> B2 [style=dashed, arrowhead=none]; noiseN -> BN [style=dashed, arrowhead=none]; B1 -> block1 [label="缩放噪声\n添加"]; B2 -> block2 [label="缩放噪声\n添加"]; BN -> blockN [label="缩放噪声\n添加"]; {rank=same; block1; A1; B1} {rank=same; block2; A2; B2} {rank=same; blockN; AN; BN} } }该图示了StyleGAN生成器架构。映射网络将输入潜在变量$z$转换为中间潜在变量$w$。合成网络利用$w$生成风格参数(通过仿射变换'A'),这些参数在每个合成块内使用AdaIN应用。学习得到的噪声(通过'B'进行缩放)也添加到每个分辨率级别。StyleGAN变体:StyleGAN2和StyleGAN3最初的StyleGAN架构影响深远,但存在一些图像伪影问题,特别是生成图像中出现的液滴状伪影。StyleGAN2通过以下方式处理了这些问题:重新设计了生成器归一化(将AdaIN移到风格块外部并简化归一化)。重新审视了渐进式增长技术(转而使用跳跃连接和残差块)。引入感知路径长度(PPL)正则化,以促使潜在空间$W$更平滑、表现更稳定。最近,StyleGAN3专注于处理传统CNN架构中固有的混叠问题。通过重新设计生成器层内的信号处理,使其无混叠,StyleGAN3在某些配置下实现了真正的旋转和平移等变性。这意味着应用于输入潜在编码$w$的变换与输出图像中的变换精确对应,从而解决了细节可能无论物体姿态如何都“固定”在图像坐标上的问题。总而言之,StyleGAN及其后续版本代表了生成模型领域的显著飞跃,特别是对于图像合成而言。通过引入映射网络、基于AdaIN的风格调制以及显式噪声输入,它们增强了生成过程的控制力,并使得生成高度真实和细致的图像成为可能。了解这些架构创新对于从事高级生成模型研究的人来说非常重要。本章稍后的实践环节将涉及实现其中一些核心组件。