AE、VAE、GAN 与扩散模型
生成模型学习重建、潜分布、对抗或去噪目标,采样过程各不相同。
学习目标
- 相同 latent 导致无法区分的重构
- 为什么重构网络不能直接当成可靠生成器?
- 说明:低重构误差、漂亮样例或较小生成损失都不能单独证明分布覆盖与新样本质量。
为什么需要这个概念
深度生成模型学习数据分布或与其相关的采样机制。VAE 用潜变量与变分目标,GAN 用对抗反馈,扩散模型用分步加噪与逆向去噪;它们的训练损失不能直接横向比较。
学习前需要掌握
背景与问题
分类模型给已有样本分配标签,生成模型则要产生新的内容。仅能重构训练输入的压缩网络,并不自动拥有可以随机采样的合理潜在分布。
概念定义
深度生成模型学习数据分布或与其相关的采样机制。VAE 用潜变量与变分目标,GAN 用对抗反馈,扩散模型用分步加噪与逆向去噪;它们的训练损失不能直接横向比较。
直观理解
重构像按原稿复写,生成像从指定规则中创作新稿。复写得好并不保证任意随机起点都会变成合理作品。
核心原理
普通自编码器把输入压到 latent 再重构,主要约束见过输入的编码位置。若直接从标准正态采样 latent,可能落在解码器从未学习过的区域;需要额外分布建模或其他生成机制。
VAE 对近似后验施加先验约束,GAN 让生成样本接受判别器反馈,扩散模型学习各噪声级别的去噪目标。各家损失的意义、尺度与采样步骤都不同,不能只挑一个更小的数就宣布生成更好。
评价要兼顾质量、多样性、条件一致性与记忆训练样本的风险。固定随机输入有助于比较训练阶段,仍需独立样本和明确协议;精选几张好图不能说明模型覆盖了完整分布。
数学表达
核心公式
这是普通自编码器的重构目标,用于说明瓶颈;VAE、GAN 和扩散模型各有额外或不同目标,不能把此式作为统一生成损失。
变量含义
Nbatch sizeD/H特征或隐藏维度
计算步骤
- 1两个不同输入都被编码成 1。
- 2两者均重构为 (0.5,0.5)。
- 3全元素平均平方误差为 0.25。
代码对应位置
示例 1相同 latent 导致无法区分的重构的最小验证:使用完整构造输入核对相同 latent 导致无法区分的重构,输出只表示本例计算。
变量解释
| 变量 | 含义 |
|---|---|
N | batch size |
D/H | 特征或隐藏维度 |
完整数值示例
相同 latent 导致无法区分的重构
已知条件
- 输入为 (1,0) 和 (0,1)
- 编码器将两维相加,二者 latent 都为 1
- 解码器把 latent 各乘 0.5 输出两维
计算步骤
- 两个不同输入都被编码成 1。
- 两者均重构为 (0.5,0.5)。
- 全元素平均平方误差为 0.25。
计算结果
压缩碰撞造成相同重构;拥有 encoder 和 decoder 不等于学到了可采样数据分布。
处理前后对比
- 低重构误差、漂亮样例或较小生成损失都不能单独证明分布覆盖与新样本质量。
相同 latent 导致无法区分的重构
这个构造用固定权重展示瓶颈丢失信息,没有训练过程。只看 latent shape=(2,1),无法知道它是否保留了所需结构;必须把具体输入与重构对应起来。
若现在任意采样一个 latent=10,解码器会输出 (5,5),但它是否属于真实数据分布毫无保证。这正是“会重构”和“会生成”之间需要额外机制的地方。
计算与实现步骤
- 两个不同输入都被编码成 1。
- 两者均重构为 (0.5,0.5)。
- 全元素平均平方误差为 0.25。
代码实现
示例 1
相同 latent 导致无法区分的重构的最小验证
example_01.py用途:使用完整构造输入核对相同 latent 导致无法区分的重构,输出只表示本例计算。
import torch
from torch import nn
encoder, decoder = nn.Linear(2, 1, bias=False), nn.Linear(1, 2, bias=False)
with torch.no_grad():
encoder.weight.fill_(1.)
decoder.weight.fill_(0.5)
x = torch.tensor([[1., 0.], [0., 1.]])
z = encoder(x)
reconstruction = decoder(z)
print("latent:", z.detach().flatten().tolist())
print("reconstruction:", reconstruction.detach().tolist())
print(f"mse={(reconstruction - x).square().mean().item():.2f}")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
使用完整构造输入核对相同 latent 导致无法区分的重构,输出只表示本例计算。
mean- 训练特征逐列均值。
Step 1 · 1–12 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import torch
from torch import nn
encoder, decoder = nn.Linear(2, 1, bias=False), nn.Linear(1, 2, bias=False)
with torch.no_grad():
encoder.weight.fill_(1.)
decoder.weight.fill_(0.5)
x = torch.tensor([[1., 0.], [0., 1.]])
z = encoder(x)
reconstruction = decoder(z)
print("latent:", z.detach().flatten().tolist())
print("reconstruction:", reconstruction.detach().tolist())
print(f"mse={(reconstruction - x).square().mean().item():.2f}")代码与数学原理
减去训练均值并除以训练标准差,对应代码中的 mean/std 或 StandardScaler。
预期输出或运行结果
latent: [1.0, 1.0] reconstruction: [[0.5, 0.5], [0.5, 0.5]] mse=0.25
常见错误 · 4 条
- 不要在测试集上调用 fit 或 fit_transform;测试集只能复用训练参数。
- AE 重建好即能随机采样
- 输出范围不匹配
- 不同 loss 横比
实际应用
- 比较 VAE、GAN 与扩散的目标
- 设计质量、多样性和条件一致性评估
常见错误
- AE 重建好即能随机采样
- 输出范围不匹配
- 不同 loss 横比
常见问题
为什么重构网络不能直接当成可靠生成器?
训练可能只约束输入经过编码后的 latent 区域,任意先验采样未必落在这些区域;需要先验约束或明确的生成分布建模。
这个示例能说明什么边界?
低重构误差、漂亮样例或较小生成损失都不能单独证明分布覆盖与新样本质量。
推荐学习资料
MIT Introduction to Deep Learning
以密集讲座和实验介绍神经网络、序列模型、生成模型和深度学习应用。
MIT 6.S191 Team · MIT