当前位置: 首页 > article >正文

可扩散模型(Diffusion Models)详解:从原理到应用

使用MINIST实现的扩散模型可见diffusion_minist:基于扩散模型的MNIST手写数字生成项目 - AtomGit | GitCode可扩散模型是近年来生成式 AI 领域的热门领域。与 GAN、VAE 等传统生成模型相比它通过 “逐步加噪 - 逐步去噪” 的独特思路实现了对复杂数据分布的精准建模。本文将从直观理解到数学原理逐步解析可扩散模型的工作机制。一、核心思想从 “加噪” 到 “去噪” 的逆转游戏可扩散模型的核心灵感来自物理学中的 “扩散过程”—— 就像一滴墨在水中逐渐扩散直至均匀混合模型通过模拟 “数据→噪声” 的扩散过程再学习逆转这个过程“噪声→数据”最终实现从随机噪声生成逼真数据的目标。简单来说它分为两个互补的过程前向扩散Forward Diffusion人为地、逐步地向清晰数据如一张图片中添加高斯噪声直到数据完全变成随机噪声类似 “墨水滴入水中” 的过程。反向扩散Reverse Diffusion训练一个神经网络学习 “去噪” 能力从纯噪声出发逐步移除噪声最终恢复出清晰的数据类似 “从浑浊水中还原墨水” 的逆过程。二、前向扩散如何让数据 “变成” 噪声前向扩散是一个确定性的过程我们按照预设的 “噪声调度表”分 T 步向数据中添加噪声最终让数据 x₀如原始图片变成近似标准正态分布的噪声 x_T。1. 数学定义设原始数据为 x₀服从真实数据分布 p_data前向扩散的每一步 t从 1 到 T都按如下规则添加噪声其中εₜ₋₁ 是服从标准正态分布的噪声ε ~ (0, I)αₜ 是一个预设的 “保持系数”通常在 0.995~1 之间控制每一步保留的原始信息比例为简化计算定义累积系数 ᾱₜ α₁・α₂・…・αₜᾱ₀1ᾱ_T≈0。2. 直观理解初始时t0x₀是清晰的原始数据如一张猫的图片随着 t 增大xₜ中噪声比例逐渐增加√(1-αₜ) 增大原始信息比例逐渐减少√αₜ减小当 tT 时ᾱ_T≈0x_T ≈ ε几乎是纯噪声肉眼无法分辨原始内容。这种设计的巧妙之处在于任意 xₜ都可以直接由 x₀和噪声表示无需逐步计算前序步骤。通过数学推导可得其中 ε 是某一固定噪声这一性质极大简化了后续的反向扩散过程。三、反向扩散如何从噪声 “还原” 数据反向扩散是需要学习的过程我们需要训练一个模型从纯噪声 x_T 出发逐步预测并移除噪声经过 T 步后还原出清晰数据 x₀。1. 核心挑战反向扩散的每一步 t需要从 xₜ推断出 xₜ₋₁。由于前向过程是确定的理论上 xₜ₋₁的分布 p (xₜ₋₁|xₜ) 可由贝叶斯公式推导但实际计算复杂。因此可扩散模型通过近似建模解决这一问题。2. 模型设计预测噪声而非直接预测数据可扩散模型的关键技巧是不直接预测 xₜ₋₁而是预测前向过程中添加的噪声 ε。具体来说训练一个神经网络 ε_θ(xₜ, t)θ 是模型参数t 是当前步骤的 “时间编码”输入是带噪声的数据 xₜ和步骤 t输出是对前向过程中添加的噪声 ε 的预测。为什么预测噪声因为从 xₜ和预测的噪声 ε_θ可以通过前向公式的逆运算反推出 xₜ₋₁其中 ϵt​ 是随机噪声用于保留生成多样性σₜ是预设的标准差由 αₜ和ᾱₜ计算。3. 网络结构U-Net 是主流选择用于预测噪声的 ε_θ 通常采用U-Net 架构如 Stable Diffusion并结合以下关键设计时间编码Time Embedding将步骤 t 转换为高维向量输入网络以区分不同去噪阶段注意力机制在网络中间层加入自注意力或交叉注意力如 Stable Diffusion 的文本引导生成捕捉长距离依赖残差连接帮助深层网络训练缓解梯度消失问题。四、训练如何让模型学会 “去噪”可扩散模型的训练过程异常简单核心是最小化预测噪声与真实噪声的差异。1. 训练目标损失函数随机采样原始数据 x₀ ~ p_data步骤 t ~ Uniform (1, T)噪声 ε ~ (0, I)。根据前向公式生成 xₜ √ᾱₜ・x₀ √(1-ᾱₜ)・ε然后让模型 ε_θ(xₜ, t) 预测 ε损失函数为L [x₀, t, ε] [ || ε - ε_θ(xₜ, t) ||² ]即预测噪声与真实噪声的均方误差MSE。这种简单的损失函数是可扩散模型训练稳定的重要原因无需像 GAN 那样进行对抗训练。2. 训练过程初始化网络 ε_θ如 U-Net和噪声调度表α₁, α₂, ..., α_T迭代采样 x₀、t、ε生成 xₜ计算模型预测的 ε_θ(xₜ, t) 与真实 ε 的 MSE 损失通过梯度下降更新网络参数 θ重复步骤 2-4 直至收敛。五、采样从噪声生成数据的过程训练完成后即可通过反向扩散过程生成新数据步骤如下从标准正态分布采样初始噪声x_T ~ (0, I)对 t 从 T 到 1 逐步迭代用模型 ε_θ(xₜ, t) 预测噪声根据 xₜ和预测噪声通过逆公式计算 xₜ₋₁当 t0 时x₀即为生成的最终数据。为加速采样原始 T 通常取 1000较慢可采用 DDIMDenoising Diffusion Implicit Models等改进算法将采样步数减少到 20-50 步同时保持生成质量。六、优势与应用优势生成质量高能生成细节丰富、逼真度高的数据如图像、视频训练稳定基于 MSE 损失无需对抗训练不易崩溃易于控制可通过条件输入如文本、边缘图引导生成方向如 Stable Diffusion 的文本到图像。应用场景图像生成文生图DALL・E 2、图生图Stable Diffusion、图像修复 / 超分视频生成如 Sora通过时空扩散模型生成逼真视频3D 建模从文本生成 3D 模型其他领域语音合成、分子结构生成等。七、代码示例import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pyplot as plt import numpy as np # 1. 配置参数 device torch.device(cuda if torch.cuda.is_available() else cpu) image_size 28 # MNIST图像大小 channels 1 # 灰度图像通道数为1 batch_size 128 epochs 10 # 训练轮次 T 1000 # 扩散步数 lr 2e-4 # 2. 定义噪声调度前向扩散的β参数 # β从较小值线性增加到较大值控制每步加噪强度 betas torch.linspace(0.0001, 0.02, T).to(device) alphas 1.0 - betas alphas_cumprod torch.cumprod(alphas, dim0) # 累积乘积α₁α₂...αₜ alphas_cumprod_prev torch.cat([torch.tensor([1.0]).to(device), alphas_cumprod[:-1]]) # 3. 前向扩散过程给图像添加噪声 def forward_diffusion(x0, t, noiseNone): x0: 原始图像 (batch_size, channels, H, W) t: 时间步 (batch_size,) 返回t步加噪后的图像和添加的噪声 if noise is None: noise torch.randn_like(x0) # 生成标准正态噪声 # 从累积乘积中获取当前时间步的α值 sqrt_alphas_cumprod_t torch.sqrt(alphas_cumprod[t])[:, None, None, None] sqrt_one_minus_alphas_cumprod_t torch.sqrt(1.0 - alphas_cumprod[t])[:, None, None, None] # 前向扩散公式xₜ √ᾱₜ x₀ √(1-ᾱₜ) ε xt sqrt_alphas_cumprod_t * x0 sqrt_one_minus_alphas_cumprod_t * noise return xt, noise # 4. 定义噪声预测网络U-Net简化版 class SimpleUNet(nn.Module): def __init__(self, channels1): super().__init__() # 时间步编码将t转换为高维向量 self.time_mlp nn.Sequential( nn.Linear(T, 128), nn.ReLU(), nn.Linear(128, 128) ) # 主干网络简单卷积网络 self.conv1 nn.Conv2d(channels 128, 64, 3, padding1) # 输入图像时间编码 self.conv2 nn.Conv2d(64, 64, 3, padding1) self.conv3 nn.Conv2d(64, channels, 3, padding1) # 输出噪声 self.relu nn.ReLU() def forward(self, x, t): # 时间步编码将t转换为独热向量后输入MLP t_emb nn.functional.one_hot(t, num_classesT).float() # (batch, T) t_emb self.time_mlp(t_emb) # (batch, 128) # 将时间编码与图像拼接在通道维度 t_emb t_emb[:, :, None, None].repeat(1, 1, x.shape[2], x.shape[3]) # (batch, 128, H, W) x torch.cat([x, t_emb], dim1) # (batch, channels128, H, W) # 卷积网络预测噪声 x self.relu(self.conv1(x)) x self.relu(self.conv2(x)) x self.conv3(x) return x # 5. 训练函数 def train(batch_size): # 加载数据 transform transforms.Compose([ transforms.ToTensor(), transforms.Normalize(0.5, 0.5) # 归一化到[-1, 1] ]) train_dataset datasets.MNIST( rootrC:\COMPUTER\python\计算机视觉\GAN\mnist data, trainTrue, downloadTrue, transformtransform ) train_loader DataLoader(train_dataset, batch_sizebatch_size, shuffleTrue) # 初始化模型、优化器 model SimpleUNet().to(device) optimizer optim.Adam(model.parameters(), lrlr) criterion nn.MSELoss() # 噪声预测用MSE损失 model.train() for epoch in range(epochs): total_loss 0 for batch in train_loader: x0, _ batch # 只需要图像不需要标签 x0 x0.to(device) batch_size x0.shape[0] # 随机采样时间步 t torch.randint(0, T, (batch_size,), devicedevice).long() # 前向扩散得到带噪声图像和真实噪声 xt, noise forward_diffusion(x0, t) # 模型预测噪声 noise_pred model(xt, t) # 计算损失并优化 loss criterion(noise_pred, noise) optimizer.zero_grad() loss.backward() optimizer.step() total_loss loss.item() avg_loss total_loss / len(train_loader) print(fEpoch {epoch 1}/{epochs}, Average Loss: {avg_loss:.4f}) return model # 6. 采样函数反向扩散从噪声生成图像 def sample(model, num_samples10): model.eval() with torch.no_grad(): # 从纯噪声开始 x torch.randn(num_samples, channels, image_size, image_size).to(device) # 逐步去噪 for t in reversed(range(0, T)): t_tensor torch.tensor([t] * num_samples, devicedevice).long() # 预测当前噪声 noise_pred model(x, t_tensor) # 计算去噪所需参数 alpha_t alphas[t] alpha_cumprod_t alphas_cumprod[t] beta_t betas[t] # 反向扩散公式从xₜ计算xₜ₋₁ if t 0: noise torch.randn_like(x) else: noise torch.zeros_like(x) # 最后一步不加噪声 x (1 / torch.sqrt(alpha_t)) * ( x - ((1 - alpha_t) / torch.sqrt(1 - alpha_cumprod_t)) * noise_pred ) torch.sqrt(beta_t) * noise # 转换为可显示的图像格式 x x.cpu().numpy() x (x 1) / 2 # 从[-1,1]转回[0,1] return x # 7. 执行训练并生成样本 if __name__ __main__: model train(batch_size) samples sample(model, num_samples10) # 显示生成的图像 plt.figure(figsize(10, 2)) for i in range(10): plt.subplot(1, 10, i 1) plt.imshow(samples[i].squeeze(), cmapgray) plt.axis(off) plt.show()八、总结可扩散模型通过 “前向加噪 - 反向去噪” 的思路实现了对复杂数据分布的精准建模。其核心是用简单的噪声预测任务替代直接的数据生成通过 U-Net 等网络学习去噪能力最终从随机噪声中 “生长” 出逼真数据。尽管采样速度较慢需多步迭代但其生成质量和训练稳定性使其成为当前生成式 AI 的主流技术。随着加速算法的发展如 DDIM、Flash Diffusion可扩散模型的应用场景还在不断扩展未来有望在更多领域展现潜力。

相关文章:

可扩散模型(Diffusion Models)详解:从原理到应用

使用MINIST实现的扩散模型可见diffusion_minist:基于扩散模型的MNIST手写数字生成项目 - AtomGit | GitCode 可扩散模型是近年来生成式 AI 领域的热门领域。与 GAN、VAE 等传统生成模型相比,它通过 “逐步加噪 - 逐步去噪” 的独特思路,实现了对复杂数据…...

Qt_笔记

1.事件 举例:按键事件使用:包含QKeyEvent头文件。h文件里声明,cpp重写虚函数:void keyPressEvent(QKeyEvent *k)即可。事件的名称和获取事件的函数等细节可以在帮助里查找。2.TCP网络:需要在pro文件里第一行添加一个库…...

抖音无水印批量下载实战指南:3分钟搞定高效内容管理

抖音无水印批量下载实战指南:3分钟搞定高效内容管理 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support…...

从Prompt注入到训练数据投毒:生成式AI全链路隐私攻击图谱(2024最新ATTCK for AI v2.1)

第一章:从Prompt注入到训练数据投毒:生成式AI全链路隐私攻击图谱(2024最新ATT&CK for AI v2.1) 2026奇点智能技术大会(https://ml-summit.org) ATT&CK for AI v2.1(2024年9月发布)首次将生成式AI…...

VS2019 MFC TeeChart V5.1动态曲线绘制实战:从安装到高级功能封装

1. TeeChart V5.1控件安装与注册避坑指南 第一次在VS2019 MFC项目里用TeeChart V5.1时,我在注册环节就栽了跟头。明明按照网上的教程操作,却总是提示"模块已加载但调用失败"。后来才发现,64位系统下的注册有特殊姿势——必须用管理…...

W5500网络芯片初始化与状态机实战解析

1. W5500网络芯片基础介绍 第一次接触W5500这颗芯片时,我完全被它丰富的功能震撼到了。作为一款硬连线TCP/IP协议栈的网络芯片,它把复杂的网络通信简化成了几个简单的寄存器操作。想象一下,你只需要通过SPI接口发送几条命令,就能让…...

Keil调试踩坑记:Flash Timeout错误全解析(附STM32解锁教程)

Keil调试踩坑记:Flash Timeout错误全解析(附STM32解锁教程) 第一次在Keil环境下遇到"Flash Timeout.Reset the Target and try it again"这个红色错误弹窗时,我盯着屏幕愣了三秒——明明昨天还能正常下载程序&#xff0…...

ESP32-S3开发环境避坑指南:VSCode插件配置与常见错误解决

ESP32-S3开发环境避坑指南:VSCode插件配置与常见错误解决 1. 环境准备:避开Python环境冲突的雷区 在开始ESP32-S3开发前,环境配置是第一个需要跨越的门槛。许多开发者在这里遭遇的第一个拦路虎就是Python环境冲突。当你在VSCode终端看到pyt…...

别再乱调学习率了!用TensorFlow/PyTorch实战演示自适应学习率与EarlyStopping如何联手防过拟合

自适应学习率与EarlyStopping实战:让深度学习模型训练更智能 在深度学习模型训练过程中,最令人头疼的问题莫过于如何平衡训练效率与模型泛化能力。许多开发者都有过这样的经历:精心设计的模型架构,却因为学习率设置不当导致训练过…...

企业级知识图谱构建解决方案:基于LLM的智能文档结构化架构与实践

企业级知识图谱构建解决方案:基于LLM的智能文档结构化架构与实践 【免费下载链接】llm-graph-builder Neo4j graph construction from unstructured data using LLMs 项目地址: https://gitcode.com/GitHub_Trending/ll/llm-graph-builder 在数字化转型浪潮中…...

Halcon实战:基于光度立体的金属表面划痕检测

1. 光度立体法在金属表面检测中的独特优势 金属表面划痕检测一直是工业质检中的难点问题。传统方法如2D视觉检测在面对反光强烈、纹理复杂的金属表面时,往往难以准确识别细微划痕。我在实际项目中就遇到过这样的情况:一个汽车零部件厂商需要检测铝合金表…...

Redis可视化管理的终极方案:Another Redis Desktop Manager完整指南

Redis可视化管理的终极方案:Another Redis Desktop Manager完整指南 【免费下载链接】AnotherRedisDesktopManager 🚀🚀🚀A faster, better and more stable Redis desktop manager [GUI client], compatible with Linux, Windows…...

终极解决方案:如何永久保存你的微信聊天记录并生成精美年度报告

终极解决方案:如何永久保存你的微信聊天记录并生成精美年度报告 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending…...

SocialEcho技术架构深度解析:MERN全栈实战

SocialEcho技术架构深度解析:MERN全栈实战 【免费下载链接】SocialEcho Social networking platform with automated content moderation and context-based authentication system 项目地址: https://gitcode.com/gh_mirrors/so/SocialEcho SocialEcho是一个…...

开发者的第二曲线:35岁后职业图谱

当“分水岭”成为“新起点”在软件测试行业,35岁常常被描绘为一道充满焦虑的“分水岭”。当自动化工具日益普及,生成式AI开始辅助甚至编写测试脚本时,许多资深测试工程师感到传统经验的价值在流失,职业道路似乎越走越窄。然而&…...

EPC发布用于机器人和轻型电动车的5kW氮化镓三相逆变器

Efficient Power Conversion (EPC) 推出了两款基于氮化镓(GaN)技术的高功率密度三相逆变器评估板(EPC9186HC2/HC3),专为5kW级别的电机驱动设计,旨在满足机器人及轻型电动交通领域的严苛运动控制需求。该产品…...

八大网盘直链解析工具终极指南:告别下载限速的完整解决方案

八大网盘直链解析工具终极指南:告别下载限速的完整解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 /…...

LDO的实战指南:从参数解析到稳定设计

1. LDO基础:从线性稳压器到低压差设计 我第一次接触LDO是在2013年设计智能手表电源模块时。当时为了给MCU和传感器供电,需要在3.7V锂电池和3.3V系统电压之间实现高效转换。传统线性稳压器压差太大导致效率低下,而开关电源又存在电磁干扰问题&…...

django-push-notifications错误处理与调试:解决常见推送问题

django-push-notifications错误处理与调试:解决常见推送问题 【免费下载链接】django-push-notifications Send push notifications to mobile devices through GCM or APNS in Django. 项目地址: https://gitcode.com/gh_mirrors/dj/django-push-notifications …...

如何彻底掌控你的数字记忆:WeChatMsg让你的聊天数据真正属于你

如何彻底掌控你的数字记忆:WeChatMsg让你的聊天数据真正属于你 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/…...

如何用Retrieval-based-Voice-Conversion-WebUI在10分钟内打造专属AI语音模型

如何用Retrieval-based-Voice-Conversion-WebUI在10分钟内打造专属AI语音模型 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Vo…...

从数据混乱到决策清晰:2025年数据工程必备开源工具实战指南

从数据混乱到决策清晰&#xff1a;2025年数据工程必备开源工具实战指南 【免费下载链接】data-engineer-handbook This is a repo with links to everything youd ever want to learn about data engineering 项目地址: https://gitcode.com/GitHub_Trending/da/data-enginee…...

别再死记硬背了!用Arduino和ADC0804芯片,5分钟搞懂AD转换的采样保持到底在干啥

用Arduino和ADC0804芯片5分钟直观理解AD转换的采样保持原理 记得第一次在教科书上看到"采样保持电路"这个词时&#xff0c;我盯着那几张抽象的原理图看了半小时还是一头雾水。直到后来用ADC0804芯片配合Arduino做了个简单的电压测量实验&#xff0c;才突然明白那些看…...

5个实用技巧:用Supersonic开源音乐播放器打造个性化音乐体验

5个实用技巧&#xff1a;用Supersonic开源音乐播放器打造个性化音乐体验 【免费下载链接】supersonic A lightweight and full-featured cross-platform desktop client for self-hosted music servers 项目地址: https://gitcode.com/gh_mirrors/sup/supersonic Supers…...

因果效应估计:从关联到因果,AI决策的“反事实”革命

因果效应估计&#xff1a;从关联到因果&#xff0c;AI决策的“反事实”革命 引言 在大数据时代&#xff0c;我们常常陷入“相关性不等于因果性”的经典陷阱。广告点击率的提升&#xff0c;真的是营销活动的功劳吗&#xff1f;某种药物的疗效&#xff0c;在复杂的真实世界中如…...

别再乱画了!Axure RP 9/10 高效原型设计的8个核心规范(附实战避坑清单)

Axure高效原型设计的黄金法则&#xff1a;从规范到实战的进阶指南 在数字产品设计领域&#xff0c;原型就像建筑师的蓝图&#xff0c;既是创意的具象表达&#xff0c;也是团队协作的共同语言。作为从业多年的交互设计师&#xff0c;我见过太多本可以避免的"原型灾难"…...

网盘直链解析工具终极指南:八大平台高速下载完整解决方案

网盘直链解析工具终极指南&#xff1a;八大平台高速下载完整解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…...

显卡驱动彻底清理指南:Display Driver Uninstaller(DDU)完全教程

显卡驱动彻底清理指南&#xff1a;Display Driver Uninstaller&#xff08;DDU&#xff09;完全教程 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors…...

5分钟掌握微信好友检测神器:WechatRealFriends完整使用指南

5分钟掌握微信好友检测神器&#xff1a;WechatRealFriends完整使用指南 【免费下载链接】WechatRealFriends 微信好友关系一键检测&#xff0c;基于微信ipad协议&#xff0c;看看有没有朋友偷偷删掉或者拉黑你 项目地址: https://gitcode.com/gh_mirrors/we/WechatRealFriend…...

ruoyi源码探秘-3 登录后端接口的架构设计与安全实践

1. RuoYi登录模块架构全景 第一次拆解RuoYi的登录模块时&#xff0c;我对着admin和system两个模块反复切换了十几次才理清调用关系。这个经典框架的登录流程设计&#xff0c;就像乐高积木一样把安全、性能、扩展性都考虑进去了。先带大家看看整体架构&#xff1a;admin模块作为…...