条件 GAN(cGAN)把条件信息 y(类别标签、属性、甚至另一张图)同时喂给生成器与判别器:生成器按 y 造假,判别器按 y 验货,从而实现"要什么生成什么"。 它是可控生成的起点,Pix2Pix、StyleGAN 的条件化用法都从这里发源。
翻案第三桩:失控罪。初代与 DCGAN 的造假者"出货随缘"——采样哪个噪声、出什么图,全凭天意。可产业要的是"给我画一只猫"这种委托合同。条件 GAN 的解法直接:把委托条款写进双方的输入。
条件信息接入网络有两种主流接法。拼接法:把 y 的嵌入向量与噪声(或特征图)沿通道拼在一起送入网络,最简单,通用性强;嵌入加法:把 y 的嵌入作为额外特征图加到中间层(Pix2Pix 的做法),条件作用更深。先用最小代码把嵌入这一环做实:
import numpy as np rng = np.random.default_rng(5) # 类别嵌入表: 10 类 x 128 维, 这就是条件信息进入网络的第一站 num_classes, emb_dim = 10, 128 emb_table = rng.normal(0, 0.02, (num_classes, emb_dim)) y = np.array([3, 7, 3]) z = rng.normal(0, 1, (3, 100)) # 拼接法: 嵌入拼在噪声后面 gz = np.concatenate([z, emb_table[y]], axis=1) print(f"噪声 {z.shape} + 嵌入 {emb_table[y].shape} -> 生成器输入 {gz.shape}") # 输出: 噪声 (3, 100) + 嵌入 (3, 128) -> 生成器输入 (3, 228) print(f"嵌入表参数量: {num_classes} x {emb_dim} = {num_classes*emb_dim}") # 输出: 嵌入表参数量: 10 x 128 = 1280 # 同类委托拿到相同嵌入: 类别 3 的两次采样嵌入完全一致 print("类别3两次嵌入一致:", np.allclose(emb_table[3], emb_table[3])) # 输出: 类别3两次嵌入一致: True
判别器这边同样吃条件:输入从"样本 x"变成"样本 x + 条件 y",鉴定的问题从"这是真的吗"变成"这是符合委托 y 的真品吗"。合同因此双向生效——造假者按条款造,鉴定师按条款验。
用一个三类一维数据的最小实验展示条件的威力。真实数据三类,各自中心在 −3、0、3。条件生成器为每类学一对(均值、尺度),生成时按委托类别取样;对照的无条件生成器只能学全局分布:
# 三类一维数据 mus = np.array([-3.0, 0.0, 3.0]) y = rng.integers(0, 3, 1500) x = mus[y] + rng.normal(0, 0.5, 1500) print("== 条件生成器: 每类各自拟合 ==") for c in range(3): xc = x[y == c] print(f"委托类别{c}: 拟合中心={xc.mean():+.3f} 拟合宽度={xc.std():.3f} (真实中心 {mus[c]:+.1f})") # 输出: # 委托类别0: 拟合中心=-2.983 拟合宽度=0.494 (真实中心 -3.0) # 委托类别1: 拟合中心=+0.044 拟合宽度=0.490 (真实中心 +0.0) # 委托类别2: 拟合中心=+3.004 拟合宽度=0.499 (真实中心 +3.0) print("== 无条件生成器: 只能学全局 =="") print(f"全局拟合: 中心={x.mean():+.3f} 宽度={x.std():.3f}") # 输出: 全局拟合: 中心=-0.020 宽度=2.476 # 无条件模型的三类信息混成一锅, 委托"类别0"时它无法定向出货
对比一目了然:条件生成器三类中心各自命中(−2.983 / +0.044 / +3.004,误差均在 0.05 内);无条件模型的"宽度 2.476"是三类混合的方差,等于把委托信息扔掉。条件不是锦上添花,是把生成器从"批发"改造成"定做"的结构性改动。
接线上有三个高频决策点。其一,条件嵌入维度取多少:小数据集 50~128 维够用,过大易过拟合(1280 个参数已经能管住 10 类)。其二,判别器要不要条件:必须要,否则生成器可以无视委托(造假者发现"画什么都算数"后,条件通道立刻退化)。其三,条件 dropout:训练时随机丢弃部分条件能让模型在"有委托"与"无委托"之间平滑切换,附带提升鲁棒性。
| 变体 | 条件形式 | 代表用途 |
|---|---|---|
| cGAN 原版 | 类别标签 | 指定类别的手写数字生成 |
| Pix2Pix | 输入图像 | 成对图像翻译(3.5 节) |
| pix2pixHD / SPADE | 语义分割图 | 高清语义合成 |
| BigGAN 类条件版 | 类别嵌入 + 共享嵌入 | ImageNet 规模类条件生成 |
💡 关键直觉:条件的本质是给博弈加"验收标准"。原版 GAN 的验收标准只有"像真品"一条,条件化把它升级为"既像真品、又符合委托"。后文一切可控生成(样式控制、属性编辑)都是在往验收标准里加条款。
条件 GAN 与"先无条件生成再分类筛选"比,强在哪? 效率与覆盖率。筛方案要生成大量样本才能凑齐目标类,且稀缺类命中率低;条件生成直击目标。更关键的是覆盖:条件模型每类独立拟合(本节实验三类中心各自命中),筛方案受制于无条件模型的类分布偏差。
条件信息除了类别还能是什么? 几乎任何可编码的东西:文本嵌入(早期文生图)、分割图(Pix2Pix/SPADE)、参考图的风格向量。判断某个条件好不好用,看两点——判别器能否验"样本与条件是否匹配",以及条件与目标属性的因果强度。
条件会不会被生成器无视? 会,叫条件泄漏的反面——训练初期生成器发现"不管条件、只造最像的"就能得分,条件通道闲置。对策:判别器必须带条件验货(本节正文),或给条件预测加辅助损失(InfoGAN 的互信息思路,第 3.7 节)。
十类、嵌入 128 维的场景:嵌入表参数量是多少?答案:10 乘 128 等于 1280。若改成拼接法送入 100 维噪声的生成器,第一层输入维度是多少?答案:228。这两个小算术是条件接线的"体检指标",面试与排查时都常用。