自编码器通过「压缩再重建」学到了数据的低维表示,VAE 更进一步让瓶颈服从先验分布从而能随机采样生成。但 2014 年 Goodfellow 提出了一种截然不同的思路——不需要显式的编码器,不需要重建损失,只需要两个网络互相博弈。
这就是 GAN(Generative Adversarial Network)。核心思想极其直觉:
- 生成器 G:从随机噪声 z∼pz 生成假样本 G(z),目标是「骗过判别器」。
- 判别器 D:接收真样本 x 或假样本 G(z),输出一个概率 D(⋅)∈[0,1],判断输入是真还是假。
类比:G 是造假画家,D 是鉴定师。造假画家不断提升技艺,鉴定师不断提升鉴别力——两者在对抗中共同进步,直到假画和真画分不开。
GAN 的训练是一个 minimax 博弈。目标函数:
GminDmaxV(D,G)=Ex∼pdata[logD(x)]+Ez∼pz[log(1−D(G(z)))]
拆开看两部分:
- E[logD(x)]:判别器看到真数据时希望输出高(接近 1),取 log 后尽量大。
- E[log(1−D(G(z)))]:判别器看到假数据时希望输出低(D(G(z))→0),所以 log(1−D)→0 最大化。
训练过程是交替优化:
- 固定 G,优化 D:让 D 更准确地区分真假。
- 固定 D,优化 G:让 G 生成的样本骗过当前的 D(最小化 V)。
理论结果:当 G 达到最优时,pG=pdata,判别器对所有输入输出 21——彻底分不出真假。
GAN 的想法优美,但训练出了名地困难。三大核心问题:
模式坍塌(Mode Collapse):生成器找到几个能骗过判别器的「安全模式」后,就只生成这几种样本,忽略数据分布的其他部分。比如在人脸生成中只产出几张类似的面孔。
梯度消失:如果判别器太强(D 一眼就看出假的),log(1−D(G(z))) 饱和在接近 log1=0 的位置,生成器收不到有意义的梯度——不知道往哪个方向改进。
训练不稳定:G 和 D 的能力需要同步增长。一方太强则另一方崩溃,训练过程振荡甚至发散。实践中需要精心调节学习率、网络容量、训练比例。
后续工作(WGAN、Spectral Normalization、StyleGAN 等)大量精力花在稳定训练上——但问题从未彻底消失。这正是扩散模型兴起的背景。
扩散模型(Diffusion Model)的核心直觉完全不同:
把「生成」拆成很多很小的去噪步骤——每一步只做一点点事,但叠加起来就能从纯噪声变出真实数据。
前向过程(Forward / Diffusion Process) 是一条固定的马尔可夫链,逐步往数据上加高斯噪声:
q(xt∣xt−1)=N(xt;1−βtxt−1,βtI)
其中 β1,β2,…,βT 是预设的噪声调度(schedule)。经过 T 步后,xT 几乎是标准高斯噪声。
一个关键性质:可以直接从 x0 跳到任意 xt(不用逐步算):
q(xt∣x0)=N(xt;αˉtx0,(1−αˉt)I)
其中 αˉt=∏s=1t(1−βs)。这让训练可以直接随机采一个 t,不用跑完整条链。
下面可以拖动滑块观察前向和反向过程:
噪声 0%
t=0t=20
原始分布 x₀拖动滑块观察纯噪声 x_T
扩散的前向过程逐步加噪把数据变为高斯噪声;反向过程学习去噪,从噪声中恢复数据结构。 点击 Forward / Reverse 或拖动滑块观察。
反向过程(Reverse Process) 是我们要学的:从 xT∼N(0,I) 逐步去噪回 x0。参数化为:
pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),σt2I)
DDPM(Ho et al. 2020)的关键简化:不直接预测均值 μ,而是预测噪声 ϵ。网络 ϵθ(xt,t) 的训练目标:
Lsimple=Et,x0,ϵ[∥ϵ−ϵθ(xt,t)∥2]
翻译成人话:随机采一个时间步 t,往 x0 加噪声 ϵ 得到 xt,让网络猜「加了什么噪声」——猜对就行。这个损失极其简洁,训练稳定。
采样时从 xT∼N(0,I) 开始,逐步用网络预测噪声并减去:
xt−1=αt1(xt−1−αˉtβtϵθ(xt,t))+σtz
每一步只去掉一点噪声,T 步后得到干净的生成样本。
| 维度 | GAN | 扩散模型 |
|---|
| 训练方式 | 对抗博弈(minimax) | 去噪回归(MSE) |
| 训练稳定性 | 困难,需精心调参 | 稳定,损失单调下降 |
| 生成质量 | 高(尤其 StyleGAN) | 更高(FID 更优) |
| 多样性 | 易模式坍塌 | 天然覆盖全部模式 |
| 采样速度 | 极快(一次前向) | 慢(需 T 步迭代) |
| 可控性 | 需额外条件机制 | 天然支持 classifier-free guidance |
扩散模型的主要代价是采样慢——需要数十到数百步迭代。后续工作(DDIM、DPM-Solver、Consistency Model、蒸馏)都在解决这个问题,已经把步数压到 1-4 步。