深度学习入门Day8:生成模型革命——从GAN到扩散模型
一、开篇:创造力的算法革命
从昨天的Transformer到今天的生成模型,我们正从"理解"世界迈向"创造"世界。生成对抗网络(GAN)和扩散模型(Diffusion Model)代表了当前生成式AI的两大主流范式,它们让机器能够生成逼真的图像、音乐甚至视频。今天我们将深入这两种技术的核心原理,并亲自动手实现图像生成的神奇过程。
二、上午攻坚:GAN原理与实战
2.1 GAN核心架构解析
最小最大博弈公式:
min_G max_D V(D,G) = E_{x~p_data}[log D(x)] + E_{z~p_z}[log(1-D(G(z)))]
DCGAN关键实现:
# 生成器网络
class Generator(nn.Module):
def __init__(self, latent_dim=100):
super().__init__()
self.main = nn.Sequential(
# 输入: (latent_dim, 1, 1)
nn.ConvTranspose2d(latent_dim, 512, 4, 1, 0, bias=False),
nn.BatchNorm2d(512),
nn.ReLU(True),
# 输出: (512, 4, 4)
nn.ConvTranspose2d(512, 256, 4, 2, 1, bias=False),
nn.BatchNorm2d(256),
nn.ReLU(True),
# 输出: (256, 8, 8)
nn.ConvTranspose2d(256, 128, 4, 2, 1, bias=False),
nn.BatchNorm2d(128),
nn.ReLU(True),
# 输出: (128, 16, 16)
nn.ConvTranspose2d(128, 1, 4, 2, 1, bias=False),
nn.Tanh() # 输出范围[-1,1]
# 最终输出: (1, 28, 28)
)
def forward(self, input):
return self.main(input)
# 判别器网络
class Discriminator(nn.Module):
def __init__(self):
super().__init__()
self.main = nn.Sequential(
# 输入: (1, 28, 28)
nn.Conv2d(1, 128, 4, 2, 1, bias=False),
nn.LeakyReLU(0.2, inplace=True),
# 输出: (128, 14, 14)
nn.Conv2d(128, 256, 4, 2, 1, bias=False),
nn.BatchNorm2d(256),
nn.LeakyReLU(0.2, inplace=True),
# 输出: (256, 7, 7)
nn.Conv2d(256, 512, 4, 2, 1, bias=False),
nn.BatchNorm2d(512),
nn.LeakyReLU(0.2, inplace=True),
# 输出: (512, 3, 3)
nn.Conv2d(512, 1, 3, 1, 0, bias=False),
nn.Sigmoid() # 输出概率
)
def forward(self, input):
return self.main(input).view(-1)
2.2 GAN训练技巧与可视化
训练循环关键代码:
for epoch in range(epochs):
for i, (real_imgs, _) in enumerate(dataloader):
# 训练判别器
optimizer_D.zero_grad()
# 真实图像损失
real_loss = criterion(D(real_imgs), real_labels)
# 生成假图像
z = torch.randn(batch_size, latent_dim, 1, 1)
fake_imgs = G(z)
fake_loss = criterion(D(fake_imgs.detach()), fake_labels)
d_loss = real_loss + fake_loss
d_loss.backward()
optimizer_D.step()
# 训练生成器
optimizer_G.zero_grad()
g_loss = criterion(D(fake_imgs), real_labels) # 骗过判别器
g_loss.backward()
optimizer_G.step()
模式坍塌诊断与解决:
- 现象:生成器只产生少量模式样本
- 解决方案:
- 使用Wasserstein GAN (WGAN)
- 添加多样性惩罚项
- 尝试小批量判别(Minibatch Discrimination)
生成过程可视化:
# 固定潜在向量观察生成演变
fixed_z = torch.randn(64, latent_dim, 1, 1)
sample_imgs = G(fixed_z).detach()
grid = torchvision.utils.make_grid(sample_imgs, nrow=8)
plt.imshow(grid.permute(1, 2, 0))
plt.show()
三、下午探索:扩散模型原理与实践
3.1 扩散过程数学描述
前向扩散(加噪):
q(x_t|x_{t-1}) = N(x_t; √(1-β_t)x_{t-1}, β_tI)
其中β_t是噪声调度
反向去噪(生成):
p_θ(x_{t-1}|x_t) = N(x_{t-1}; μ_θ(x_t,t), Σ_θ(x_t,t))
DDPM简化训练目标:
def diffusion_loss(model, x0, t):
# 随机时间步
t = torch.randint(0, T, (x0.size(0),)
# 计算加噪后的样本
sqrt_alpha_bar = extract(sqrt_alpha_bar_t, t, x0.shape)
sqrt_one_minus_alpha_bar = extract(sqrt_one_minus_alpha_bar_t, t, x0.shape)
noise = torch.randn_like(x0)
xt = sqrt_alpha_bar * x0 + sqrt_one_minus_alpha_bar * noise
# 预测噪声
predicted_noise = model(xt, t)
# 计算损失
return F.mse_loss(predicted_noise, noise)
3.2 扩散模型实践
使用Diffusers库生成图像:
from diffusers import DDPMPipeline, DDPMScheduler
# 加载预训练模型
pipe = DDPMPipeline.from_pretrained("google/ddpm-cifar10-32")
# 生成图像
image = pipe().images[0]
image.save("generated_image.png")
自定义采样过程:
def sample_ddpm(model, shape, steps=50):
x = torch.randn(shape)
for t in reversed(range(steps)):
t_tensor = torch.full((shape[0],), t, dtype=torch.long)
with torch.no_grad():
pred_noise = model(x, t_tensor)
alpha_t = alpha[t]
alpha_bar_t = alpha_bar[t]
beta_t = beta[t]
if t > 0:
noise = torch.randn_like(x)
else:
noise = 0
x = (x - (1-alpha_t)/torch.sqrt(1-alpha_bar_t)*pred_noise)/torch.sqrt(alpha_t)
x += torch.sqrt(beta_t) * noise
return x
四、生成模型应用全景
4.1 图像超分辨率实现
# 使用ESRGAN (Enhanced Super-Resolution GAN)
from basicsr.archs.rrdbnet_arch import RRDBNet
model = RRDBNet(num_in_ch=3, num_out_ch=3, num_feat=64, num_block=23)
4.2 艺术风格迁移
# 基于扩散模型的风格迁移
from diffusers import StableDiffusionPipeline
pipe = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
image = pipe("Van Gogh style landscape").images[0]
4.3 医学图像合成
# 使用条件GAN生成CT扫描图像
class MedGAN(nn.Module):
def __init__(self):
super().__init__()
self.encoder = ... # 编码临床参数
self.generator = ... # 生成图像
self.discriminator = ... # 判别真实/生成
五、学习总结与明日计划
5.1 今日核心成果
✅ 实现DCGAN并生成MNIST/Fashion-MNIST图像
✅ 理解扩散模型的前向/反向过程
✅ 使用Diffusers库完成图像生成
✅ 探索生成模型在超分辨率等场景的应用
5.2 关键问题记录
❓ GAN训练不稳定的根本原因
❓ 扩散模型采样加速方法
❓ 生成结果的评估指标选择
5.3 明日学习重点
- 图神经网络(GNN)基础概念
- 图卷积网络(GCN)实现
- 节点分类与图分类任务
- 图注意力网络(GAT)初探
六、资源推荐与延伸阅读
1. GAN Zoo:各类GAN变体集合
2. Diffusion Models Beat GANs:扩散模型里程碑论文
3. Stable Diffusion WebUI:最强开源图像生成工具
4. 生成模型可视化:交互式理解GAN训练
七、实践心得与伦理思考
1. 生成模型调试技巧:
- GAN:监控D_loss和G_loss的平衡
- 扩散:可视化中间去噪过程
- 通用:使用固定随机种子复现问题
2. 伦理边界警示:
# 人脸生成伦理检查
if task == "face_generation":
assert has_ethical_approval, "需要伦理审查"
add_watermark(output_image)
3. 实用代码片段:
# 潜在空间插值
z1 = torch.randn(1, latent_dim)
z2 = torch.randn(1, latent_dim)
for alpha in torch.linspace(0, 1, 10):
z = alpha*z1 + (1-alpha)*z2
generated = G(z)
下篇预告:《Day9:图神经网络入门—非欧空间的数据智慧》
将探索社交网络、分子结构等图数据的深度学习处理方法!