当前位置:首页>AI快讯 >

扩散模型训练原理与实战

发布时间:2025-10-11源自:融质(上海)科技有限公司作者:融质科技编辑部

好的,我们直接开始,深入讲解扩散模型的训练原理与实战。

扩散模型核心思想:破坏与重建

想象一下,你有一张清晰的图片。现在,你开始不断地向这张图片上撒“雪花”(加入噪声)。第一次,图片只是有点模糊;撒一百次、一千次后,图片就完全变成了电视雪花屏一样的随机噪声。

扩散模型的训练,本质上就是在学习这个过程的逆过程。它学习如何从一片纯粹的随机噪声中,一步步地“去噪”,最终还原出一张清晰的、有意义的图片。这就像一个艺术家,能从一块混沌的大理石中,看到雕像的形态并将其雕刻出来。

这个过程包含两个核心阶段:

  1. 前向过程(加噪):一个固定的、已知的过程。它按照一个预设的 schedule,逐步将训练图片 x₀ 变成纯噪声 x_T

  2. 反向过程(去噪):模型需要学习的核心。它从噪声 x_T 开始,一步步地预测如何去除噪声,最终生成图片 x₀

训练原理详解

1. 前向过程:可控的破坏

前向过程不涉及任何需要学习的参数。它定义了一系列步骤,在每一步 t(从 0 到 T),都向图片加入一点高斯噪声。这个过程由一个公式精确控制:

x_t = √(ᾱ_t) x₀ + √(1 - ᾱ_t) ε

其中:

x₀ 是原始图片。

x_t 是第 t 步加噪后的图片。

ε 是从标准正态分布中采样得到的噪声,与 x₀ 同尺寸。

ᾱ_t 是一个介于 0 和 1 之间的值,由预设的“噪声调度表”决定。随着 t 增大,ᾱ_t 趋近于 0。

这个公式的强大之处在于,你可以直接从原始图片 x₀ 一步到位地计算出任何第 t 步的加噪结果 x_t,而无需一步步迭代计算。这极大地提高了训练效率。

2. 训练目标:预测噪声

现在我们有了加噪后的图片 x_t,以及我们加入的噪声 ε。模型(通常是一个 U-Net 结构的神经网络)的任务是什么?

模型的任务非常简单:根据当前步数 t 和加噪图片 x_t,预测出我们加入的噪声 ε

具体训练流程如下:

  1. 从训练数据集中随机抽取一张真实图片 x₀

  2. 随机选择一个时间步 t(例如,在 1 到 1000 之间随机选一个数)。

  3. 从标准正态分布采样一个噪声 ε

  4. 根据上述公式,计算第 t 步的加噪图片 x_t

  5. x_t 和步数 t 输入神经网络,让网络预测噪声 ε_θ(θ 代表网络参数)。

  6. 计算预测噪声 ε_θ 和真实噪声 ε 之间的均方误差(MSE Loss)。

  7. 通过梯度下降更新网络参数,让这个误差越来越小。

为什么预测噪声如此有效?

因为一旦模型学会了精准地预测出某张噪声图片中的噪声成分,那么它自然也就知道了如何从 xt 中减去这个噪声,从而得到更清晰的 x{t-1}。重复这个过程,就能从噪声中生成图片。

实战环节:简化版代码思路

下面我们用一个高度简化的伪代码逻辑来说明训练和采样的过程,帮助你理解如何将原理付诸实践。

1. 模型架构(U-Net)

模型通常采用 U-Net,因为它具有编码器-解码器结构,并带有跳跃连接,特别擅长处理图像到图像的任务。关键改进是引入了“时间步嵌入”,将步数 t 的信息(通常转换为向量)注入到网络的每一层,让模型知道当前是在执行“重度去噪”还是“轻度去噪”。

2. 训练循环


**伪代码,展示核心逻辑**

for epoch in range(total_epochs):

    for real_images in dataloader:  real_images 即 x₀

         1. 随机采样时间步和噪声

        batch_size = real_images.size(0)

        t = torch.randint(0, T, (batch_size,))  为batch中每张图随机选一个t

        noise = torch.randn_like(real_images)    生成随机噪声 ε

     2. 前向加噪过程(一步到位)

     根据公式 x_t = sqrt(alpha_bar_t)  x_0 + sqrt(1 - alpha_bar_t)  noise

     其中 alpha_bar_t 根据调度表从预计算的张量中索引

    noisy_images = compute_noisy_image(real_images, t, noise)

     3. 神经网络预测噪声

     将加噪图片和步数t输入模型

    predicted_noise = model(noisy_images, t)  模型预测的噪声 ε_θ

     4. 计算损失

    loss = torch.nn.functional.mse_loss(predicted_noise, noise)

     5. 反向传播,更新参数

    optimizer.zero_grad()

    loss.backward()

    optimizer.step()

3. 采样(生成图片)

训练好模型后,我们就可以从随机噪声开始生成新图片了。这是一个迭代的过程。


**伪代码,展示采样逻辑**

def sample(model, image_size, T):

     1. 从纯噪声开始

    x_t = torch.randn((1, 3, image_size, image_size))  生成一张随机噪声图

for t in range(T, 0, -1):  从最大步数 T 一步步倒回到 1

     2. 用模型预测噪声

    predicted_noise = model(x_t, t)

     3. 计算当前步去噪后的图像(核心去噪步骤)

     这里会使用一个确定的公式,从 x_t 和 predicted_noise 计算出 x_{t-1}

     公式中通常还包括一个调节生成“创造性”的参数(分类器引导或无分类器引导)

    x_t = compute_previous_step(x_t, predicted_noise, t)

 4. 循环结束后,x_t 就是最终生成的图片 x_0

return x_t

实战中的关键点

噪声调度ᾱ_t 的变化规律至关重要。如 DDPM 的线性调度和 Improved DDPM 的余弦调度,会影响生成质量和速度。

无分类器引导:这是让扩散模型生成指定内容(如“一只猫”)的关键技术。它在训练时随机丢弃文本描述(以一定概率置为空文本),在采样时通过调整条件信息和无条件信息的方向差,来增强生成内容与文本的匹配度。

加速采样:上述采样需要迭代很多步(如1000步),速度很慢。现在有很多方法如 DPM-Solver 可以大幅减少采样步数(如20步)而不损失太多质量。

总结来说,扩散模型的训练是一个优雅的“破坏与重建”的过程。通过让神经网络学习预测噪声,它最终获得了从混沌中创造秩序的强大能力。希望这个从原理到实战的讲解能帮助你透彻地理解扩散模型。

欢迎分享转载→ https://shrzkj.com.cn/aikuaixun/144559.html

Copyright © 2025 融质(上海)科技有限公司 All Rights Reserved. 本站部分资源来自互联网收集,如有侵权请联系我们删除。沪ICP备2024065424号-2XML地图