从“左右互搏”到“字斟句酌”:AI 图像生成的进化之路 (GAN 到 Diffusion 全面解析)

引言:如果你在两年前关注过 AI 绘画,你可能会惊叹于 GAN(生成对抗网络)创造的逼真人脸;而今天,当你看到 Midjourney、Stable Diffusion 或是 DALL-E 3 仅凭几句简短的提示词就能生成大师级别的艺术作品时,你是否想过,这背后究竟发生了什么?

从 GAN 的“左右互搏”,到 VAE 的“意念压缩”,再到 Diffusion Model 的“字斟句酌”(去噪),AI 图像生成经历了一场范式级的革命。本文将带你深入浅出地剖析这条进化之路背后的核心逻辑、数学原理以及代码实现。


一、 开天辟地:生成对抗网络 (GAN)

在 2014 年之前,AI 生成图像的效果往往模糊不清,缺乏细节。直到 Ian Goodfellow 提出了 生成对抗网络,这一切才被彻底改变。

1. 核心思想:伪造者与鉴定师的猫鼠游戏

GAN 的核心思想非常直观:零和博弈。模型内部包含两个神经网络:

  • 生成器:相当于“伪造者”,负责从随机噪声中生成逼真的图像,试图骗过鉴定师。
  • 判别器:相当于“鉴定师”,负责判断输入的图像是真实的(来自训练集)还是伪造的(来自生成器)。

两者在训练过程中不断博弈:生成器越来越擅长造假,判别器越来越火眼金睛。最终,生成器生成的图像达到了“以假乱真”的境界。

2. 数学原理与目标函数

GAN 的训练是一个极小极大博弈问题,其目标函数如下:

minGmaxDV(D,G)=Expdata(x)[logD(x)]+Ezpz(z)[log(1D(G(z)))]\min_G \max_D V(D, G) = \mathbb{E}_{x \sim p_{data}(x)}[\log D(x)] + \mathbb{E}_{z \sim p_z(z)}[\log(1 - D(G(z)))]

3. 代码示例:PyTorch 极简 GAN

为了直观感受,我们用一段极简的 PyTorch 代码展示 GAN 的训练循环:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import torch
import torch.nn as nn
import torch.optim as optim

# 假设我们已经定义了 Generator 和 Discriminator 类
generator = Generator()
discriminator = Discriminator()

# 二元交叉熵损失
criterion = nn.BCELoss()
optim_G = optim.Adam(generator.parameters(), lr=0.0002)
optim_D = optim.Adam(discriminator.parameters(), lr=0.0002)

for epoch in range(num_epochs):
for i, (real_imgs, _) in enumerate(dataloader):

# ==================== 训练判别器 ====================
optim_D.zero_grad()

# 真实图像的损失
real_labels = torch.ones(batch_size, 1)
output_real = discriminator(real_imgs)
loss_real = criterion(output_real, real_labels)

# 生成图像的损失
noise = torch.randn(batch_size, latent_dim)
fake_imgs = generator(noise)
fake_labels = torch.zeros(batch_size, 1)
output_fake = discriminator(fake_imgs.detach()) # detach() 避免梯度传回G
loss_fake = criterion(output_fake, fake_labels)

loss_D = loss_real + loss_fake
loss_D.backward()
optim_D.step()

# ==================== 训练生成器 ====================
optim_G.zero_grad()

# 生成器希望判别器将假图判定为 1
output = discriminator(fake_imgs)
loss_G = criterion(output, real_labels)
loss_G.backward()
optim_G.step()

4. GAN 的痛点:为什么它不是最终答案?

尽管 GAN 创造了辉煌,但它存在几个致命的结构性缺陷

  1. 模式崩塌:生成器可能发现只要生成某几种特定的图像就能骗过判别器,于是丧失了多样性(例如,让它生成动物,它只生成狗,不生成猫)。
  2. 训练极度不稳定:由于两个网络需要完美同步,一旦判别器太强,生成器的梯度就会消失,导致根本学不到东西。超参数调优宛如“炼丹”。
  3. 缺乏多样性控制:GAN 将一个随机噪声直接映射为图像,这个隐空间往往是不连续的,导致我们很难对生成结果进行精细编辑。

二、 承上启下:变分自编码器 (VAE)

为了解决 GAN 隐空间不连续、难以控制的问题,研究者们将目光投向了变分自编码器

核心思想:规范化隐空间

传统的自编码器将图像压缩为一段代码,再从代码还原图像。但这种代码往往是毫无规律的离散点。

VAE 的巧妙之处在于,它不再将图像压缩为固定的向量,而是压缩为一个概率分布(通常用均值 μ\mu 和方差 σ2\sigma^2 表示的高斯分布)。在生成时,我们从该分布中采样,并引入了 KL 散度 来约束这个分布,使其尽量贴近标准正态分布。

VAE 的贡献:它为 AI 图像生成提供了一个连续、平滑且结构化的隐空间。你可以在这个空间里做向量运算(例如:国王向量男人向量+女人向量女王向量国王向量 - 男人向量 + 女人向量 \approx 女王向量)。

局限性:VAE 由于使用均方误差(MSE)或类似的重构损失,往往倾向于生成模糊的图像。它过于追求整体的像素级正确,而丢失了高频细节。


三、 异军突起:扩散模型

2020 年,Jonathan Ho 等人发表了奠基性论文 Denoising Diffusion Probabilistic Models (DDPM),标志着 Diffusion 时代的到来。Stable Diffusion、DALL-E、Midjourney 背后的底层技术,统统属于扩散模型。

1. 核心思想:破坏与重建

如果说 GAN 是造假者,那么 Diffusion 就是雕刻家

扩散模型分为两个阶段:

  • 前向过程(加噪):类似于墨水滴入水中。我们逐步向一张清晰的原始图片中加入高斯噪声,经过 TT 步之后,这张图片变成了一张完全看不出原图的纯噪声图。
  • 逆向过程(去噪):这是 Diffusion 的核心。我们训练一个神经网络(通常是 U-Net),让它学习如何把第 tt 步的噪声图,还原为第 t1t-1 步的稍微干净一点的图。经过 TT 步的“字斟句酌”,纯噪声被一步步雕刻成了清晰的图像。

2. 数学原理简述

在前向过程中,由于马尔可夫链的性质,我们可以直接通过重参数化技巧,从原图 x0x_0 直接得到第 tt 步的加噪图 xtx_t

xt=αˉtx0+1αˉtϵx_t = \sqrt{\bar{\alpha}_t}x_0 + \sqrt{1 - \bar{\alpha}_t}\epsilon

其中 ϵN(0,I)\epsilon \sim \mathcal{N}(0, I) 是纯高斯噪声。

在逆向过程中,模型并不直接预测图像,而是预测当前步骤中加入的噪声 ϵθ\epsilon_\theta。其简化的损失函数非常优雅:

Lsimple(θ)=Et,x0,ϵ[ϵϵθ(xt,t)2]L_{simple}(\theta) = \mathbb{E}_{t, x_0, \epsilon} \left[ ||\epsilon - \epsilon_\theta(x_t, t)||^2 \right]

(即:让模型预测的噪声,与实际加入的真实噪声越接近越好。)

3. 为什么 Diffusion 能打败 GAN?

  1. 训练极其稳定:不需要两个网络对抗,只需要一个网络拟合噪声(单纯的回归问题)。
  2. 极高的多样性:由于是基于概率模型生成,它不容易发生模式崩塌,生成的图像覆盖面更广。
  3. 完美契合文本控制:这为后来的文本生成图像(Text-to-Image,即 CLIP + Diffusion)奠定了基础。

4. 代码示例:PyTorch 极简 Diffusion 训练步骤

以下代码展示了 Diffusion 模型训练的核心逻辑,你会发现它比 GAN 简单得多:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import torch
import torch.nn as nn

# 假设 model 是一个 U-Net,能够接收图像和 timestep 作为输入
model = UNet()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)

# 预定义的噪声调度器的超参数
alpha_bar_t = get_alpha_bar_schedule(timesteps=1000)

for epoch in range(num_epochs):
for clean_images, _ in dataloader: # clean_images 就是 x_0
batch_size = clean_images.shape[0]

# 1. 随机采样 timestep (比如在 0 到 1000 之间随机选一个时间点)
t = torch.randint(0, 1000, (batch_size,), device=device).long()

# 2. 生成与图像尺寸相同的纯随机噪声 (即 epsilon)
noise = torch.randn_like(clean_images)

# 3. 根据 DDPM 公式,直接生成第 t 步的加噪图像 (前向过程)
# x_t = sqrt(alpha_bar_t) * x_0 + sqrt(1 - alpha_bar_t) * noise
sqrt_alpha_bar_t = extract(alpha_bar_t, t, clean_images.shape)
sqrt_one_minus_alpha_bar_t = extract(1.0 - alpha_bar_t, clean_images.shape)
noisy_images = sqrt_alpha_bar_t * clean_images + sqrt_one_minus_alpha_bar_t * noise

# 4. 让模型预测噪声 (逆向过程)
predicted_noise = model(noisy_images, t)

# 5. 计算 MSE 损失 (真实噪声 vs 预测噪声)
loss = nn.MSELoss()(predicted_noise, noise)

# 6. 优化模型
optimizer.zero_grad()
loss.backward()
optimizer.step()

四、 终极进化:潜在扩散模型

虽然基础的 Diffusion Model 效果很好,但它有一个致命的缺点:太慢了,太吃显存了
因为在像素级别上做长链路的去噪计算量极大(比如一张 512×512512 \times 512 的图片有近 78 万个像素点)。

2021 年底,慕尼黑大学的研究人员提出了 潜在扩散模型 (LDM),这也就是后来引爆全球的开源项目 Stable Diffusion 的底层架构。

1. LDM 的三剑客

LDM 的核心思想是:不要在像素空间里做扩散,在潜空间里做!

  • VAE (变分自编码器)
    • Encoder(编码器):将 512×512×3512 \times 512 \times 3 的高清图片压缩为 64×64×464 \times 64 \times 4 的隐空间特征图。维度缩小了 48 倍!
    • Decoder(解码器):将生成好的 64×64×464 \times 64 \times 4 的特征图还原为 512×512×3512 \times 512 \times 3 的高清图片。
  • U-Net (扩散模型本体)
    • 64×6464 \times 64 的低维潜空间中进行我们前面提到的加噪和去噪操作,极大降低了计算量。
  • CLIP (文本编码器)
    • 由 OpenAI 提出的多模态模型。它可以将人类输入的文本(如“一只戴墨镜的猫”)转化为一段连续的语义向量。
    • 通过 交叉注意力机制 注入到 U-Net 中,指导 U-Net 在去噪时不要乱画,要朝着“猫”和“墨镜”的方向去噪。

2. 实战代码:使用 Hugging Face diffusers 生成图像

如今,我们可以用几行代码就调用强大的 Stable Diffusion 模型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 需要安装: pip install diffusers transformers accelerate torch
import torch
from diffusers import StableDiffusionPipeline

# 加载预训练模型 (这里使用 Stable Diffusion v1.5)
model_id = "runwayml/stable-diffusion-v1-5"
pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16)

# 如果有 GPU,将模型转移到 GPU 上运行
pipe = pipe.to("cuda")

# 输入提示词
prompt = "A futuristic cyberpunk city street at night, neon lights, highly detailed, 8k, cinematic lighting"

# 生成图像
# num_inference_steps 是去噪步数,通常 20-50 步效果就很好
image = pipe(prompt, num_inference_steps=30, guidance_scale=7.5).images[0]

# 保存图像
image.save("cyberpunk_city.png")
print("图像已生成并保存!")

3. 进阶优化:ControlNet 与 LoRA

纯粹通过文本控制图像仍然不够精准,于是生态圈衍生出了强大的控制插件:

  • ControlNet:在原始 U-Net 旁并联一个网络。它可以让用户通过线稿、人体姿态骨架、深度图、边缘图来严格控制 Diffusion 模型生成的图像结构,彻底解决了 AI 绘画“抽卡靠运气”、“不可控”的难题。
  • LoRA (Low-Rank Adaptation):一种微调技术。你可以用几十张特定风格(比如水彩风)或特定人物的照片,训练出几十 MB 的 LoRA 权重,然后随时插拔到庞大的 SD 基础模型中,实现风格的完美复刻。

五、 总结与展望

从 GAN 到 VAE,再到如今大放异彩的 Diffusion Model,AI 图像生成经历了一次次范式跃迁。

模型架构 核心机制 优点 缺点 代表应用
GAN 对抗博弈 (生成器 vs 判别器) 生成速度快,图像清晰 训练难,多样性差,不可控 StyleGAN
VAE 编码重构 + 概率分布映射 隐空间连续,易于插值 图像往往模糊 VQ-VAE
Diffusion 迭代去噪 (破坏与重建) 训练稳定,质量极高,多样性极强 生成步骤多,速度较慢 DDPM
LDM 潜空间扩散 + 文本对齐 兼顾高质量与计算资源效率 架构复杂,依赖庞大的数据集 Stable Diffusion, Midjourney

未来的趋势是什么?
目前,生成式 AI 正在从单纯的 Diffusion 向更多元化的方向发展。例如,OpenAI 的 Sora 将 Diffusion 与 Transformer 架构相结合(DiT - Diffusion Transformer),打破了视频生成的壁垒;而诸如 Consistency Models (一致性模型) 等新兴研究,正试图将 Diffusion 的去噪步骤从几十步压缩到一两步。

我们正处在一个视觉创作被彻底重塑的时代。理解这些底层技术,不仅能让我们更好地使用这些工具,更能让我们洞悉 AI 走向通用人工智能(AGI)的坚实步伐。无论技术如何更迭,“从无到有,化腐朽为神奇” 始终是 AI 最令人着迷的魔力。