想象一座宫廷画坊。学徒小成每天都在临摹大师的肖像画,鉴定师老鉴别负责揭穿赝品。小成的目标只有一句话:画出一幅让老鉴别误认为真迹的肖像。每交一幅画,老鉴别都毫不留情地指出破绽,小成便连夜改进;老鉴别也因此练就了更强的眼力。两人在一轮轮交手中互相成就——这正是生成对抗网络(GAN)的雏形:一个生成者变着花样“造假”,一个判别者火眼金睛“打假”。 但早期 GAN 画得实在太糙:小成只会用颜料块乱堆,画面毫无结构。直到 DCGAN 出现,小成上了正规的绘画课,学会用“卷积笔触”一层层构图,还掌握了稳定的“颜料配方”(批量归一化)。而 StyleGAN 则给画坊装上了一整套“提线木偶”:拉动不同提线,就能分别控制姿态、脸型、光亮和肤色,甚至能把两位模特的风格各取一半,拼出一张全新的人脸。从 DCGAN 的“画得像”到 StyleGAN 的“既逼真又可操控”,这场画坊进化史,正是生成模型最精彩的一页。

岗位关联

对 AI 从业者而言,弄懂 DCGAN 到 StyleGAN 的演进,等于掌握了生成式模型“从能生成到可控生成”的核心方法论,也是迈向扩散模型、多模态生成等前沿方向的地基。

目录
  1. 可视化演示
  2. GAN 对抗原理
  3. DCGAN 架构革命
  4. 批量归一化
  5. StyleGAN 风格机制
  6. 渐进式训练
  7. 高保真人脸
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

\u5c55\u793a\u4e8c\u7ef4\u6570\u636e\u7ecf\u8fc7\u4e2d\u5fc3\u5316\u3001\u534f\u65b9\u5dee\u77e9\u9635\u7279\u5f81\u5206\u89e3\u6c42\u51fa\u4e3b\u6210\u5206\u65b9\u5411\uff0c\u518d\u5c06\u6570\u636e\u70b9\u6295\u5f71\u5230\u7b2c\u4e00\u4e3b\u6210\u5206\u8f74\u4e0a\u5b8c\u6210\u964d\u7ef4\u7684\u5168\u8fc7\u7a0b\u3002

本节配有交互动效(进入视口后自动加载,约 3KB)。

PCA\u964d\u7ef4\u8fc7\u7a0b \u539f\u59cb\u4e8c\u7ef4\u6570\u636e\u5206\u5e03 \u4e3b\u6210\u5206\u65b9\u5411 \u03bb=V\u1d40\u03a3V \u7279\u5f81\u503c\u5206\u89e3\u6c42\u4e3b\u6210\u5206

GAN 对抗原理

画坊给了小成和老鉴别一条新规则:小成每交一幅画,老鉴别都要盖章“真”或“假”。小成要是骗过了老鉴别,得一分;老鉴别要是识破了,也得一分。两人从不商量,只死死盯着自己的得分。日复一日,小成的画越来越像,老鉴别眼睛也越来越毒。这就是生成对抗网络(GAN)的雏形——一场“造假与打假”的零和博弈。

在技术世界里,这场博弈由两个神经网络演绎:生成器 G 扮演小成,判别器 D 扮演老鉴别。G 从一团随机噪声 z 出发,把噪声“焊接”成一张完整图像;D 则接收一张图,输出一个 0 到 1 之间的分数,表示它有多相信这是一张真图。两人目标合写成一个 min-max 博弈目标:

理想终点是纳什均衡:小成的画与真迹无法区分,老鉴别只能靠瞎猜(输出恒为 0.5)。此时的生成器,就是一台合格的“肖像造假机”。这种对抗思想随后被 DCGAN、StyleGAN 一步步发扬光大。

min⁡Gmax⁡DV(D,G)=Ex∼pdata[log⁡D(x)]+Ez∼pz[log⁡(1−D(G(z)))]\displaystyle \min_G \max_D V(D,G) = \mathbb{E}_{\mathbf{x}\sim p_{\text{data}}}[\log D(\mathbf{x})] + \mathbb{E}_{\mathbf{z}\sim p_{\mathbf{z}}}[\log(1 - D(G(\mathbf{z})))]
这个公式是 GAN 的“游戏规则书”:判别器想把真画判真、假画判假,所以做最大化;生成器只想让假画被当成真画,所以做最小化。
  1. 真实样本项把所有真实画像 \(\mathbf{x}\) 交给判别器 \(D\),希望输出接近 1,即“判真”。
    Ex∼pdata[log⁡D(x)]\displaystyle \mathbb{E}_{\mathbf{x}\sim p_{\text{data}}}[\log D(\mathbf{x})]
  2. 生成样本项把生成器 \(G(\mathbf{z})\) 制造的假画像交给判别器,希望输出接近 0,即“判假”。
    Ez∼pz[log⁡(1−D(G(z)))]\displaystyle \mathbb{E}_{\mathbf{z}\sim p_{\mathbf{z}}}[\log(1 - D(G(\mathbf{z})))]
  3. 判别器最大化\(D\) 让真画得分高、假画得分低,因此对整体目标取最大化。
    max⁡DV(D,G)\displaystyle \max_D V(D,G)
  4. 生成器最小化\(G\) 让假画被当成真画,因此对整体目标取最小化。
    min⁡GV(D,G)\displaystyle \min_G V(D,G)

DCGAN 架构革命

老鉴别总嫌弃小成早期作品“糊成一团,毫无结构”。名师指点后,小成开始学正统油画:先用大刷子铺色块,再用中号笔勾轮廓,最后用细笔抠细节。这种“逐层精细化”的笔法,正是 DCGAN 用卷积分层构图的雏形。

2015 年,Radford 等人提出 DCGAN(Deep Convolutional GAN),核心是把生成器和判别器里的全连接层整体换成卷积网络。生成器输入 100 维噪声,先投影成 4×4×1024 的“初始画布”,再用转置卷积逐级放大到 8×8、16×16……直到 64×64×3 的彩色图像;判别器方向相反,用普通卷积逐级下采样,最后输出真伪概率。转置卷积相当于“反向”卷积:把每个输入像素摊开成一小块,从而让特征图边长翻倍。新画布的边长由下面公式决定:

其中 \(i\) 是输入边长,\(s\) 是步长,\(k\) 是卷积核尺寸,\(p\) 是填充,\(o\) 是输出边长。

DCGAN 还立下几条“画规”:生成器中间层用 ReLU 激活,输出层用 Tanh 把像素压到 \([-1,1]\);判别器用 LeakyReLU;全连接层一概不用。从“盲画”到“会画”,小成的画第一次有了构图——五官各就其位,层次分明。DCGAN 的成功证明:卷积架构是让 GAN 从“脏乱差”走向稳定的第一级台阶。

o=(i−1)×s+k−2p\displaystyle o = (i - 1) \times s + k - 2p
  1. 输入边长\(i\) 是上一层特征图的边长,例如 4×4 特征图的 \(i=4\)。
    i\displaystyle i
  2. 步长放大\(s\) 是转置卷积的步长,通常取 2,相当于把尺寸整体翻倍。
    (i−1)×s\displaystyle (i - 1) \times s
  3. 卷积核膨胀\(k\) 是卷积核尺寸,加入后边缘长出 \(k\) 个像素。
    (i−1)×s+k\displaystyle (i - 1) \times s + k
  4. 填充修正\(p\) 是填充量,输出边长再减去 \(2p\),得到最终尺寸。
    o=(i−1)×s+k−2p\displaystyle o = (i - 1) \times s + k - 2p

批量归一化

小成还有个老毛病:颜料调得忽浓忽淡,脸一阵通红一阵惨白。师傅递来一本“标准调色手册”:每批颜料先统一调到标准浓度,再按画面需要微调。这套工序就是批量归一化(Batch Normalization,简称 BN)。

深层网络逐层堆叠时,前一层参数一更新,后一层的输入分布就会漂移(术语叫内部协变量偏移),训练就像在流沙上盖楼。BN 的解决办法很简单:在每层激活之前,把当前 mini-batch 的数据按通道拉回“零均值、单位方差”,再用可学习的 \(\gamma\)、\(\beta\) 恢复表达能力:

有了标准调色配方,小成批量作画也不再翻车。DCGAN 里除了生成器输出层外,几乎每层都装上了这道“调色工序”,训练一下子稳了许多。BN 后来也成为各类 GAN 的标配,直到 StyleGAN 时代才被更精细的归一化手段替代。

x^i=xi−μBσB2+ϵ,yi=γx^i+β\displaystyle \hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}, \qquad y_i = \gamma \hat{x}_i + \beta
如果把特征图比作颜料盘,BN 就是把一整套颜料盘先“标准化”成一个统一的基准色板,再让网络自己决定往浓里调还是往淡里调。\(\epsilon\) 是防止除零的小常数。
  1. 批次均值对当前 mini-batch 的 \(m\) 个样本,在同一通道上求平均,得到基准色。
    μB=1m∑i=1mxi\displaystyle \mu_B = \frac{1}{m}\sum_{i=1}^{m} x_i
  2. 批次方差衡量这批数据在通道上的离散程度,相当于颜料浓淡的波动范围。
    σB2=1m∑i=1m(xi−μB)2\displaystyle \sigma_B^2 = \frac{1}{m}\sum_{i=1}^{m}(x_i - \mu_B)^2
  3. 标准化减去均值、除以标准差,让分布变成零均值单位方差。
    x^i=xi−μBσB2+ϵ\displaystyle \hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}
  4. 缩放平移用可学习的 \(\gamma\)、\(\beta\) 恢复网络需要的表达力。
    yi=γx^i+β\displaystyle y_i = \gamma \hat{x}_i + \beta

StyleGAN 风格机制

画坊再次升级:师傅给小成装了一套“提线木偶”。每根提线单独控制一个部位——一根管头偏的角度,一根管眼睛间距,一根管皮肤光泽。轻轻一拉,局部就变,其他纹丝不动。这正是 StyleGAN 追求的可控性。

传统 GAN 直接把随机向量 z 喂给生成网络,改 z 的任何一维都会“牵一发动全身”,像揉一团面。StyleGAN(2018 年提出)的突破在于:先让 z 通过一个映射网络(Mapping Network)变成风格向量 w,w 再像提线一样注入合成网络的每一层。注入手段叫 AdaIN(自适应实例归一化)。它不搬运像素,只搬运统计量:先把内容特征 \(\mathbf{x}\) 的标准差和均值“剥掉”,再用风格向量 w 给出的标准差和均值重新“上色”:

粗层注入的 w 控制姿态、脸型等低频结构;细层注入的 w 控制肤色、发丝等高频细节。更妙的是风格混合:用 w1 拉粗层、w2 拉细层,就能把 A 的姿态与 B 的皮肤拼到一张脸上。小成从此不再是“一个画风走到底”,而是拥有了一座可精细操控的木偶剧场。

AdaIN(x,w)=σ(w)⋅x−μ(x)σ(x)+μ(w)\displaystyle \text{AdaIN}(\mathbf{x}, \mathbf{w}) = \sigma(\mathbf{w}) \cdot \frac{\mathbf{x} - \mu(\mathbf{x})}{\sigma(\mathbf{x})} + \mu(\mathbf{w})
好比小成画好一张脸(内容),AdaIN 并不把另一张照片贴上去,而是照着风格样本的明暗与色调重新调色——只取“感觉”,不取“像素”。这里的 \(\sigma(\mathbf{w})\)、\(\mu(\mathbf{w})\) 实际由 w 经过一个小的仿射层生成。
  1. 内容标准化把内容特征 \(\mathbf{x}\) 的均值 \(\mu(\mathbf{x})\) 和标准差 \(\sigma(\mathbf{x})\) 剥掉,只保留结构。
    x−μ(x)σ(x)\displaystyle \frac{\mathbf{x} - \mu(\mathbf{x})}{\sigma(\mathbf{x})}
  2. 风格缩放乘上由 \(\mathbf{w}\) 决定的标准差 \(\sigma(\mathbf{w})\),调整对比度。
    σ(w)⋅x−μ(x)σ(x)\displaystyle \sigma(\mathbf{w}) \cdot \frac{\mathbf{x} - \mu(\mathbf{x})}{\sigma(\mathbf{x})}
  3. 风格平移加上由 \(\mathbf{w}\) 决定的均值 \(\mu(\mathbf{w})\),完成重着色。
    AdaIN(x,w)=σ(w)⋅x−μ(x)σ(x)+μ(w)\displaystyle \text{AdaIN}(\mathbf{x}, \mathbf{w}) = \sigma(\mathbf{w}) \cdot \frac{\mathbf{x} - \mu(\mathbf{x})}{\sigma(\mathbf{x})} + \mu(\mathbf{w})

渐进式训练

老鉴别又提意见:“你总想一步画出睫毛,结果整张脸都歪了。”师傅定下规矩:先画 4×4 的模糊草稿,再放大到 8×8 补轮廓,16×16 加五官……每翻一倍分辨率,才允许长出一层新细节。

这就是渐进式训练(Progressive Growing)。在高分辨率上直接训练 GAN 极易崩盘:判别器一眼就能看穿低质量的生成图,梯度信号形同虚设。让生成器与判别器从 4×4 起步、同步“生长”,每层任务都足够简单,训练自然稳定。新层加入时不能“硬插”,否则旧层学到的东西会被瞬间抹掉。于是用 \(\alpha\) 淡入过渡:

小成从此先打型、再上色、后抠发丝,每一步都稳稳当当。渐进式训练不仅提速,更重要的是让 1024×1024 的高分辨率生成第一次变得可行——这正是初版 StyleGAN 的基石。

xmerged=(1−α)⋅upsample(xlow)+α⋅xnew\displaystyle \mathbf{x}_{\text{merged}} = (1 - \alpha) \cdot \text{upsample}(\mathbf{x}_{\text{low}}) + \alpha \cdot \mathbf{x}_{\text{new}}
新旧两张图按权重“叠画”:刚开始几乎全是低分辨率的旧结果,随着 \(\alpha\) 从 0 走到 1,新层的细节逐渐掌权。
  1. 旧层结果\(\mathbf{x}_{\text{low}}\) 是当前网络在低分辨率上学到的图像。
    xlow\displaystyle \mathbf{x}_{\text{low}}
  2. 上采样放大把低分辨率结果放大到新层分辨率,例如从 4×4 放大到 8×8。
    upsample(xlow)\displaystyle \text{upsample}(\mathbf{x}_{\text{low}})
  3. 新层输出\(\mathbf{x}_{\text{new}}\) 是新增分支直接生成的高分辨率图像。
    xnew\displaystyle \mathbf{x}_{\text{new}}
  4. 淡入权重\(\alpha\) 从 0 平稳走到 1,新旧图像按权重混合,平滑交接。
    xmerged=(1−α)⋅upsample(xlow)+α⋅xnew,0≤α≤1\displaystyle \mathbf{x}_{\text{merged}} = (1 - \alpha) \cdot \text{upsample}(\mathbf{x}_{\text{low}}) + \alpha \cdot \mathbf{x}_{\text{new}}, \quad 0 \le \alpha \le 1

高保真人脸

画坊拿到了皇家档案馆的七万张高清宫廷肖像(FFHQ 数据集)。参照物齐了,小成还掌握了一项绝技:转动提线旋钮,人脸的嘴角会一点点上扬,年龄会一点点增加——属性连续可调。

FFHQ 数据集包含 7 万张 1024×1024 的真人脸部图像,经过对齐、裁剪等预处理,质量远超此前的 CelebA 数据集。StyleGAN 精心设计的映射网络与风格注入,让 w 空间呈现“解耦”性质:沿着某个方向移动 w,只改变单一属性(笑容、年龄、发型),这正是“旋钮”手感好的原因。最终像素由合成网络一条条“流水线”产出:每一层先上采样,再做 AdaIN 风格注入,再用卷积精修:

9 个模块走完,4×4 的内容一路被放大成 1024×1024 的精细人脸。每采样一次 z,就是一张从未存在过的新面孔;风格混合还能产出“跨界”容貌。从“画得像”到“画得美且可控”,小成终于成为宫廷画坊的第一画师——DCGAN 让 GAN 学会了结构,StyleGAN 让 GAN 学会了控制。

xi+1=Conv(AdaIN(Up(xi),wi))\displaystyle \mathbf{x}_{i+1} = \text{Conv}\big(\text{AdaIN}(\text{Up}(\mathbf{x}_i), \mathbf{w}_i)\big)
从 4×4 的抽象特征到 1024×1024 的清晰人脸,每一步都只做一件小事:放大、调风格、磨细节。九层流水线走完,一张以假乱真的高清肖像就此诞生。
  1. 当前特征图\(\mathbf{x}_i\) 保存第 \(i\) 层“画到一半”的内容。
    xi\displaystyle \mathbf{x}_i
  2. 上采样\(\text{Up}(\cdot)\) 先把特征图的宽高各翻一倍。
    Up(xi)\displaystyle \text{Up}(\mathbf{x}_i)
  3. 风格注入\(\text{AdaIN}\) 用本层的风格向量 \(\mathbf{w}_i\) 给放大后的特征重着色。
    AdaIN(Up(xi),wi)\displaystyle \text{AdaIN}(\text{Up}(\mathbf{x}_i), \mathbf{w}_i)
  4. 卷积精修\(\text{Conv}(\cdot)\) 用 3×3 卷积细化边缘与纹理,得到下一层。
    xi+1=Conv(AdaIN(Up(xi),wi))\displaystyle \mathbf{x}_{i+1} = \text{Conv}\big(\text{AdaIN}(\text{Up}(\mathbf{x}_i), \mathbf{w}_i)\big)

AI 应用场景

人脸识别训练集扩充

阶段:数据准备与增强

解决的问题:真实人脸数据涉及隐私、采集成本高且类别不平衡。传统做法靠人工收集,难以覆盖罕见姿态与光照。用 StyleGAN 生成高保真人脸作为补充样本,可以低成本扩充数据集,让模型见过更多“刁钻角度”。

具体案例:某安防团队的训练集缺少侧脸样本,识别误报率偏高。团队用预训练 StyleGAN 生成 5 万张带侧脸的合成肖像,与真实样本混合训练后,侧脸场景误报率明显下降。

数字人与游戏角色设计

阶段:AI 内容生成(AIGC)

解决的问题:原画师逐张手绘 NPC 头像成本高,风格还难以统一。传统流程需要大量人工修改。利用 StyleGAN 的 w 空间旋钮,可以批量拉出不同年龄、发型、脸型的候选面孔,把“从零起稿”变成“从草稿中挑”。

具体案例:某游戏团队把 StyleGAN 生成结果直接当头像草稿,设计师在生成图上微调细节,单角色头像从半天缩短到 10 分钟。

人脸属性编辑与年龄变换

阶段:推理与后处理

解决的问题:传统修图软件改年龄或表情需要手工精修,且结果不自然。通过 GAN 反演把真实照片映射到 w 空间,再沿特定方向移动 w,就能平滑改变属性,效果接近专业修图师。

具体案例:影视后期团队把演员照片沿“变老”方向移动,生成老年妆底稿,交化妆师作为参考,大大缩短了试妆沟通周期。

Python 演示

python65 行
import mathimport torchimport torch.nn as nnimport torch.nn.functional as F  class AdaIN(nn.Module):    # StyleGAN 风格注入核心: 标准化内容, 再按风格重着色.    def __init__(self, channels, style_dim):        super().__init__()        self.norm = nn.InstanceNorm2d(channels, affine=False)        self.style_layer = nn.Linear(style_dim, channels * 2)     def forward(self, x, w):        s = self.style_layer(w)        s = s.view(s.size(0), 2, -1)        gamma = s[:, 0].unsqueeze(2).unsqueeze(3)        beta = s[:, 1].unsqueeze(2).unsqueeze(3)        return gamma * self.norm(x) + beta  class StyleBlock(nn.Module):    # 合成网络中的一层: 3x3 卷积 + AdaIN + 激活.    def __init__(self, in_ch, out_ch, style_dim):        super().__init__()        self.conv = nn.Conv2d(in_ch, out_ch, 3, padding=1)        self.adain = AdaIN(out_ch, style_dim)        self.act = nn.LeakyReLU(0.2)     def forward(self, x, w):        return self.act(self.adain(self.conv(x), w))  class MiniStyleGAN(nn.Module):    # 迷你 StyleGAN: 映射网络 + 一个风格块 + 上采样 + 输出层.    def __init__(self, style_dim=8):        super().__init__()        self.map_net = nn.Sequential(            nn.Linear(2, style_dim),            nn.ReLU(),            nn.Linear(style_dim, style_dim),        )        self.block = StyleBlock(1, 4, style_dim)        self.out = nn.Conv2d(4, 1, 1)     def forward(self, z):        w = self.map_net(z)        x = torch.randn(z.size(0), 1, 4, 4)        x = self.block(x, w)        x = F.interpolate(x, scale_factor=2, mode='bilinear', align_corners=False)        return self.out(x)  if __name__ == '__main__':    torch.manual_seed(0)    net = MiniStyleGAN()    z1 = torch.randn(4, 2)    z2 = torch.randn(4, 2)    net.eval()    with torch.no_grad():        img_a = net(z1)        img_b = net(z2)        img_mix = net(0.5 * z1 + 0.5 * z2)    print('z 空间混合生成的图像尺寸:', tuple(img_mix.shape))    print('两张脸风格角度差异:', float((img_a - img_b).abs().mean()))
目的:用 PyTorch 实现一个迷你版 StyleGAN,包含映射网络、AdaIN 风格注入、上采样放大,演示风格向量 w 如何逐层控制生成内容。
  1. self.style_layer = nn.Linear(style_dim, channels * 2)从风格向量 w 预测每个通道的缩放 γ 和偏移 β。
  2. s = s.view(s.size(0), 2, -1)把 2C 维的输出拆成两组:一组管缩放,一组管偏移。
  3. gamma = s[:, 0].unsqueeze(2).unsqueeze(3)转为 (B, C, 1, 1) 形状,方便对每个通道广播。
  4. return gamma * self.norm(x) + betaAdaIN 的完整一步:内容标准化 + 风格重着色。
  5. self.conv = nn.Conv2d(in_ch, out_ch, 3, padding=1)3×3 卷积负责精修特征纹理。
  6. w = self.map_net(z)映射网络把随机 z 转成可解释性更强的风格向量 w。
  7. x = F.interpolate(x, scale_factor=2, mode='bilinear', align_corners=False)上采样翻倍,模拟渐进式训练的单步放大。
  8. img_mix = net(0.5 * z1 + 0.5 * z2)在 z 空间做加权混合,近似两组风格的融合。
  9. torch.manual_seed(0)固定随机种子,让实验结果可复现。

常见误区

误区我一直以为 BN 是把每张图片自己拉成标准分布,让单张图变得更“规整”。

正解BN 用的是“当前 mini-batch 内所有样本”的均值与方差,它正则化的是整批数据的分布,而不是单张图。类比:小成不是单独调一碗颜料,而是看这一批画的整体色温来统一配方。批越小,统计量越抖,这也是后面风格类任务更偏爱 Instance Norm 的原因。

为何常见:BN 名字里带“归一化”,教科书又常画“单张特征图”的示意图,很容易让人忽略统计量其实来自整个 batch。

误区我以为训练 GAN 就像训练分类器,生成器损失降到接近 0,就说明模型成功了。

正解GAN 是博弈而不是拟合。生成器损失很低,可能意味着判别器太弱、被瞬间骗过(就像小成糊弄外行的观众),生成质量未必好;反过来损失高也可能是判别器太强。真正要看的指标是生成图像的视觉质量与多样性,以及两者之间的平衡。

为何常见:监督学习里“损失单调下降”的观念根深蒂固,容易把“对抗”误解成“被监督”。

误区生成人脸时,我直接改动 z 向量的某些维度,就能单独改变年龄或笑容。

正解z 是从球状高斯分布采样的,维度高度耦合,改动 z 的任一维度都会“牵一发动全身”。StyleGAN 专门设计了映射网络,把 z 变成 w,在 w 空间里属性才相对解耦——所以“旋钮”装在 w 上,而不是 z 上。

为何常见:很多教程用 z 画示意图,容易让人把 z 误当成可解释的属性编码。

误区我理解的风格迁移就是把莫奈的画直接叠到照片上,AdaIN 应该也是类似的贴图操作。

正解AdaIN 不碰像素,只搬运统计量:先把内容特征标准化,丢掉自身的色彩与纹理,再把风格特征的均值、方差赋给它。类比:不是把 A 的布料缝到 B 身上,而是照着 A 的色板重新染 B 的布料。

为何常见:名字里带“自适应”和“归一化”,再加上风格迁移成品图给人“叠图”的直觉,容易产生贴图式误解。

面试题

Q1. DCGAN 生成器扩大特征图尺寸主要依靠什么操作?

单选题 · easy

  • A.标准卷积直接采样
  • B.空洞卷积扩视野
  • C.转置卷积上采样← 正确答案
  • D.深度可分离卷积

答案:C。DCGAN 用转置卷积(又称反卷积)把 4×4 特征图逐级放大到 64×64。标准卷积通常保持或缩小尺寸,空洞卷积只扩大感受野,深度可分离卷积主要用于压缩计算量,都不是上采样的主力。

Q2. DCGAN 生成器输出层在输出图像前使用哪个激活函数?

单选题 · easy

  • A.Sigmoid 函数
  • B.Tanh 激活函数← 正确答案
  • C.ReLU 激活函数
  • D.LeakyReLU 函数

答案:B。DCGAN 生成器输出层用 Tanh 把像素值限制在 [-1,1],与图像的归一化范围一致。ReLU 用在生成器中间层,LeakyReLU 多用于判别器,Sigmoid 则用于判别器输出真假概率。

Q3. 批量归一化统计的均值与方差来自哪里?

单选题 · mid

  • A.当前样本自身统计
  • B.整个训练集统计
  • C.当前小批量的统计← 正确答案
  • D.历史上全部样本统计

答案:C。BN 使用当前 mini-batch 内所有样本的均值与方差做标准化,这正是它依赖 batch size 的原因。单样本统计对应 Instance Norm,全局统计则对应推理阶段使用的滑动平均。

Q4. AdaIN 用风格向量的什么信息给内容重新着色?

单选题 · mid

  • A.风格图像的像素值
  • B.特征图的整体尺寸
  • C.卷积核的权重大小
  • D.通道统计的均值方差← 正确答案

答案:D。AdaIN 只搬运通道的均值与方差:内容先标准化,再用风格均值、方差重新缩放平移。像素值、特征尺寸、卷积权重都不参与统计量传递,这正是“只取风格、不取像素”的体现。

Q5. StyleGAN 中随机向量 z 要变成风格向量 w,需要经过什么?

单选题 · mid

  • A.多层的卷积网络
  • B.多层的映射网络← 正确答案
  • C.多层的判别网络
  • D.多层的循环网络

答案:B。映射网络由一系列全连接层组成,负责把服从高斯分布的 z 映射到解耦性更好的 w 空间。卷积网络属于合成网络部分,判别网络负责打分,循环网络则是 RNN 家族的结构。

Q6. 风格混合时粗层用 w1、细层用 w2,主要影响人脸哪个方面?

单选题 · hard

  • A.姿态与整体脸型← 正确答案
  • B.颜色与皮肤纹理
  • C.背景与整体亮度
  • D.光照与阴影细节

答案:A。粗层 AdaIN 注入的是低分辨率信息,主要控制姿态、脸型、发型轮廓等全局结构;颜色、皮肤纹理等高频细节由细层决定,光照效果则横跨多个层级,无法完全归到单一层。

Q7. 渐进式训练中新增的一层网络如何融入已有网络?

单选题 · hard

  • A.直接拼接替换旧层
  • B.随机丢弃新层输出
  • C.alpha 权重淡入过渡← 正确答案
  • D.同时并联训练两层

答案:C。新层通过淡入(fade-in)方式加入:输出 = (1-α)×上采样旧结果 + α×新结果,α 从 0 平滑走到 1。这样旧层学到的知识不会被瞬间破坏,训练过程也更稳定。

Q8. 下列哪些属于 DCGAN 的架构改进?

多选题 · easy

  • A.引入批量归一化层← 正确答案
  • B.使用循环网络结构
  • C.使用转置卷积上采样← 正确答案
  • D.移除全连接网络← 正确答案

答案:ACD。DCGAN 的三大改进是:处处使用批量归一化(输出层除外)、用转置卷积上采样、移除全连接层。循环网络是处理序列数据的结构,与 DCGAN 的卷积图像生成无关。

Q9. 训练 GAN 时常见的困难有哪些?

多选题 · mid

  • A.训练过程必然收敛
  • B.模式坍塌导致单一← 正确答案
  • C.训练过程持续震荡← 正确答案
  • D.判别器过强梯度消失← 正确答案

答案:BCD。GAN 是零和博弈,模式坍塌(生成样本单一)、训练震荡、判别器过强导致生成器梯度消失都是常见难题。“必然收敛”是错误的认知——GAN 的收敛需要精心平衡双方能力。

Q10. 关于 StyleGAN 的说法正确的有哪些?

多选题 · hard

  • A.使用 AdaIN 注入风格← 正确答案
  • B.完全不需要卷积结构
  • C.采用渐进式训练← 正确答案
  • D.使用映射网络产生 w← 正确答案

答案:ACD。StyleGAN 用 AdaIN 把风格向量 w 逐层注入合成网络,w 由映射网络从 z 变换而来,初版还采用了渐进式训练逐步提升分辨率。合成网络本身完全由卷积层构成,选项 B 说反了。