news 2026/4/3 4:36:37

【2026】 LLM 大模型系统学习指南 (35)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【2026】 LLM 大模型系统学习指南 (35)

Diffusion Model:从噪声到图像的生成魔法 —— 核心原理与入门实操

Diffusion Model(扩散模型)是当前最主流的生成模型之一,核心逻辑是 “逐步加噪再逐步去噪”—— 先把清晰图像变成纯噪声,再训练模型学习 “反向去噪”,最终从随机噪声中还原出逼真的图像。它凭借生成质量高、多样性强、训练稳定的优势,成为图像生成、修复、超分等任务的首选框架,也是 Stable Diffusion 等热门工具的底层核心。

本文用 “去雾” 的通俗类比拆解 Diffusion 的核心原理,详解关键组件与训练流程,再通过基础代码实现 MNIST 数字生成,帮你快速入门这一 “噪声到清晰” 的生成范式。

一、核心原理:“加噪→去噪” 的双向过程

Diffusion Model 的名字来源于 “扩散” 现象 —— 就像墨水滴入清水,逐渐扩散到均匀分布;反之,通过反向过程,也能从均匀的墨水溶液中还原出初始的墨滴。对应到图像生成,就是 “清晰图像→噪声” 的前向扩散,和 “噪声→清晰图像” 的反向扩散。

1. 前向扩散(Forward Diffusion):给图像 “逐步蒙雾”

前向扩散是固定的、可解析的过程,核心是给清晰图像逐步加入高斯噪声,直到图像完全变成随机噪声(类似均匀的雾气)。

关键逻辑:
  • 步骤:从清晰图像x0​开始,经过T步(通常T=1000)逐步加噪,得到x1​,x2​,...,xT​(xT​是纯噪声);
  • 噪声强度:每一步加噪的强度由βt​(噪声系数)控制,βt​随步骤t递增(前期加少量噪声,后期加大量噪声);
  • 核心公式(简化版):xt​=αt​​⋅xt−1​+1−αt​​⋅ϵt​其中αt​=1−βt​,ϵt​是第t步的高斯噪声(ϵt​∼N(0,I));
  • 特点:无需训练,仅通过公式就能从x0​生成任意步骤t的带噪图像xt​。
通俗类比:

就像给一张清晰的照片蒙雾,第 1 步蒙一层薄雾(图像略模糊),第 1000 步蒙一层厚到完全看不清的雾(纯噪声),每一步的雾浓度都有明确规则。

2. 反向扩散(Reverse Diffusion):给带噪图像 “逐步去雾”

反向扩散是需要训练的、近似的过程,核心是学习 “从带噪图像xt​还原出xt−1​”,最终从纯噪声xT​还原出清晰图像x0​。

关键逻辑:
  • 核心问题:前向扩散是可逆的,但直接计算逆过程复杂度极高,因此用神经网络近似逆过程;
  • 模型目标:训练一个去噪模型ϵθ​(xt​,t)(θ是模型参数),输入带噪图像xt​和当前步骤t,预测第t步加入的噪声ϵt​;
  • 还原逻辑:已知xt​和预测的ϵt​,可通过公式近似还原xt−1​:xt−1​≈αt​​1​⋅(xt​−1−αˉt​​1−αt​​⋅ϵθ​(xt​,t))+σt​⋅ϵ其中αˉt​=∏i=1t​αi​(累积噪声系数),σt​是还原时的噪声项(保证生成多样性);
  • 迭代过程:从纯噪声xT​开始,执行T步反向去噪,最终得到清晰图像x0​。
通俗类比:

训练一个 “去雾专家”(神经网络),输入一张蒙了t层雾的图像和当前雾层编号t,让专家预测这一层雾的浓度(噪声ϵt​),再根据预测结果去掉这一层雾,重复T次,最终还原清晰照片。

二、关键组件:Diffusion Model 的 “核心零件”

一个完整的 Diffusion Model 由 3 个核心组件构成,各司其职,共同实现 “加噪→去噪” 的生成流程:

1. 噪声调度器(Noise Scheduler):控制加噪 / 去噪的节奏

噪声调度器是前向扩散和反向扩散的 “规则制定者”,核心作用是定义每一步的噪声强度βt​和相关系数(αt​、αˉt​等)。

常见调度策略:
  • 线性调度:βt​从β1​(如 0.0001)线性增长到βT​(如 0.02),简单易实现;
  • 余弦调度:βt​按余弦规律增长,噪声强度变化更平滑,生成质量更高;
  • 核心作用:调度器的设计直接影响生成质量和训练稳定性,好的调度器能让反向去噪过程更易学习。

2. 去噪模型(Denoiser):“去雾专家” 的核心

去噪模型是 Diffusion Model 的 “大脑”,通常采用UNet 架构(适配图像的空间特征提取),部分进阶模型会加入注意力机制(如 Stable Diffusion 的 Cross-Attention)。

UNet 的核心适配:
  • 输入:带噪图像xt​(如 28×28 的 MNIST 图像)+ 步骤t的编码(通过位置编码将t转化为向量,与图像特征融合);
  • 输出:预测的噪声ϵθ​(与xt​尺寸相同,如 28×28);
  • 关键设计:通过编码器下采样提取全局特征,解码器上采样还原空间维度,中间加入残差连接避免梯度消失。

3. 损失函数:指导模型学习 “去雾”

Diffusion Model 的损失函数非常简洁,核心是 “让模型预测的噪声ϵθ​尽可能接近真实噪声ϵt​”,常用均方误差(MSE)

L=Ex0​,ϵ,t​[∥ϵ−ϵθ​(xt​,t)∥2]

逻辑解释:
  • 随机采样:每次训练时,随机选择一张清晰图像x0​、一个真实噪声ϵ、一个步骤t;
  • 生成带噪图像:用前向扩散公式生成xt​;
  • 计算损失:比较模型预测的噪声ϵθ​(xt​,t)和真实噪声ϵ的 MSE,通过反向传播更新模型参数θ。

三、训练与生成流程:一步一步看懂

1. 训练流程(核心 3 步)

Diffusion Model 的训练逻辑简洁,无需对抗训练(如 GAN),训练稳定性高:

  1. 数据准备:加载清晰图像数据集(如 MNIST、CIFAR-10);
  2. 随机采样:对每张图像x0​,随机采样一个真实噪声ϵ(∼N(0,I))和一个步骤t(1≤t≤T);
  3. 前向生成 + 损失计算:用前向公式生成xt​,输入 UNet 得到预测噪声ϵθ​,计算 MSE 损失,反向传播更新参数。

2. 生成流程(核心 T 步迭代)

训练完成后,生成图像只需执行T步反向去噪,从纯噪声还原出清晰图像:

  1. 初始化:从高斯分布采样纯噪声xT​(与目标图像尺寸相同);
  2. 迭代去噪:对t从T到 1 逐步迭代:
    • 输入xt​和t到 UNet,预测噪声ϵθ​;
    • 用反向还原公式计算xt−1​;
  3. 输出结果:迭代结束后,x0​即为生成的清晰图像。

四、实操:用基础 Diffusion Model 生成 MNIST 数字

以下用 PyTorch 实现一个极简版 Diffusion Model,生成 MNIST 手写数字,直观感受 “噪声→图像” 的生成过程:

1. 完整代码

python

运行

# 安装依赖 # pip install torch torchvision numpy matplotlib 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. 超参数与噪声调度器(线性调度) ---------------------- T = 1000 # 扩散步骤 beta_start = 0.0001 # 初始噪声系数 beta_end = 0.02 # 最终噪声系数 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 生成beta_t(1~T步的噪声系数) beta = torch.linspace(beta_start, beta_end, T).to(device) alpha = 1.0 - beta alpha_bar = torch.cumprod(alpha, dim=0) # alpha_bar_t = alpha_1 * alpha_2 * ... * alpha_t # ---------------------- 2. 前向扩散:生成带噪图像x_t ---------------------- def forward_diffusion(x0, t): """ x0: 清晰图像(batch, 1, 28, 28) t: 步骤(batch, 1) 返回:带噪图像x_t + 真实噪声epsilon """ batch_size = x0.shape[0] # 采样真实噪声 epsilon = torch.randn_like(x0).to(device) # 提取alpha_bar_t(batch维度匹配) alpha_bar_t = alpha_bar[t].unsqueeze(-1).unsqueeze(-1).unsqueeze(-1) # (batch, 1, 1, 1) # 生成x_t xt = torch.sqrt(alpha_bar_t) * x0 + torch.sqrt(1 - alpha_bar_t) * epsilon return xt, epsilon # ---------------------- 3. 去噪模型:UNet(简化版) ---------------------- class SimpleUNet(nn.Module): def __init__(self): super().__init__() # 步骤t的位置编码(将t转化为向量) self.time_embed = nn.Sequential( nn.Linear(1, 16), nn.ReLU(), nn.Linear(16, 32) ) # 编码器(下采样) self.encoder = nn.Sequential( nn.Conv2d(1 + 1, 32, 3, padding=1), # 输入:图像(1) + 位置编码(1) nn.ReLU(), nn.Conv2d(32, 64, 3, padding=1, stride=2), # 下采样:28→14 nn.ReLU(), nn.Conv2d(64, 128, 3, padding=1, stride=2), # 下采样:14→7 nn.ReLU() ) # 解码器(上采样) self.decoder = nn.Sequential( nn.ConvTranspose2d(128, 64, 3, padding=1, stride=2, output_padding=1), # 上采样:7→14 nn.ReLU(), nn.ConvTranspose2d(64, 32, 3, padding=1, stride=2, output_padding=1), # 上采样:14→28 nn.ReLU(), nn.Conv2d(32, 1, 3, padding=1) # 输出:预测的噪声(与输入图像尺寸相同) ) def forward(self, x, t): """ x: 带噪图像(batch, 1, 28, 28) t: 步骤(batch, 1) 返回:预测的噪声(batch, 1, 28, 28) """ # 位置编码:t→向量→与图像特征融合 time_emb = self.time_embed(t.float()) # (batch, 32) time_emb = time_emb.unsqueeze(-1).unsqueeze(-1) # (batch, 32, 1, 1) time_emb = time_emb.expand(-1, -1, x.shape[2], x.shape[3]) # (batch, 32, 28, 28) # 融合图像与位置编码(用1×1卷积降维到1通道) time_emb = nn.Conv2d(32, 1, 1)(time_emb) # (batch, 1, 28, 28) x = torch.cat([x, time_emb], dim=1) # (batch, 2, 28, 28) # 编码+解码 x = self.encoder(x) x = self.decoder(x) return x # ---------------------- 4. 数据准备 ---------------------- transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,)) # 归一化到[-1,1] ]) train_dataset = datasets.MNIST( root="./data", train=True, download=True, transform=transform ) train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True) # ---------------------- 5. 训练配置 ---------------------- model = SimpleUNet().to(device) optimizer = optim.Adam(model.parameters(), lr=1e-3) criterion = nn.MSELoss() # 损失函数:MSE(预测噪声vs真实噪声) epochs = 20 # ---------------------- 6. 训练模型 ---------------------- model.train() for epoch in range(epochs): total_loss = 0.0 for batch_idx, (x0, _) in enumerate(train_loader): x0 = x0.to(device) batch_size = x0.shape[0] # 1. 随机采样步骤t(1~T) t = torch.randint(1, T+1, (batch_size, 1)).to(device) # 2. 前向扩散生成x_t和真实噪声epsilon xt, epsilon = forward_diffusion(x0, t) # 3. 模型预测噪声 epsilon_pred = model(xt, t) # 4. 计算损失并更新参数 loss = criterion(epsilon_pred, epsilon) optimizer.zero_grad() loss.backward() optimizer.step() total_loss += loss.item() avg_loss = total_loss / len(train_loader) print(f"Epoch {epoch+1}/{epochs} | Average Loss: {avg_loss:.4f}") # 每5轮可视化生成效果 if (epoch + 1) % 5 == 0: model.eval() with torch.no_grad(): # 生成流程:从纯噪声x_T开始,反向迭代T步 x = torch.randn(10, 1, 28, 28).to(device) # 初始化纯噪声(10个样本) for t_step in range(T, 0, -1): # 构建当前步骤t的batch t_batch = torch.tensor([t_step] * 10).unsqueeze(1).to(device) # 预测噪声 epsilon_pred = model(x, t_batch) # 反向还原x_{t-1}(简化版公式) alpha_t = alpha[t_step-1] # alpha从0开始索引 alpha_bar_t = alpha_bar[t_step-1] # 计算均值和方差 mu = (1 / torch.sqrt(alpha_t)) * (x - (1 - alpha_t) / torch.sqrt(1 - alpha_bar_t) * epsilon_pred) sigma = torch.sqrt(beta[t_step-1]) # 加入噪声(保证多样性) if t_step > 1: x = mu + sigma * torch.randn_like(x).to(device) else: x = mu # 最后一步不加噪声 # 可视化生成结果 generated_imgs = x.cpu().numpy() generated_imgs = (generated_imgs + 1) / 2 # 从[-1,1]转回[0,1] plt.figure(figsize=(10, 2)) for i in range(10): plt.subplot(1, 10, i+1) plt.imshow(generated_imgs[i].reshape(28, 28), cmap="gray") plt.axis("off") plt.title(f"Generated Images (Epoch {epoch+1})") plt.savefig(f"diffusion_generated_epoch_{epoch+1}.png") plt.show() model.train() print("Diffusion Model训练完成!生成结果已保存。")

2. 代码核心逻辑拆解

(1)噪声调度器:

线性生成βt​,控制每步加噪强度,αt​和αb​art​为推导得出的辅助系数,用于前向扩散和反向还原。

(2)前向扩散:

通过公式直接生成带噪图像xt​和真实噪声ϵ,无需训练,仅用于训练时提供模型输入。

(3)简化 UNet:
  • 位置编码:将步骤t转化为向量,与图像特征融合,让模型知道当前是第几步去噪;
  • 编码器 + 解码器:下采样提取全局特征,上采样还原空间维度,最终输出与输入尺寸相同的预测噪声。
(4)训练与生成:
  • 训练:随机采样步骤t,生成xt​和ϵ,让模型预测ϵ,用 MSE 损失优化;
  • 生成:从纯噪声开始,反向迭代 1000 步,逐步去噪,最终得到清晰数字。

3. 预期效果

  • 训练初期(5 轮):生成数字模糊、轮廓不清晰,噪声残留较多;
  • 训练中期(10-15 轮):数字轮廓逐渐清晰,能分辨出 0-9 的大致形状;
  • 训练后期(20 轮):生成数字与真实 MNIST 高度相似,轮廓完整、细节自然,多样性强。

五、与其他生成模型的核心对比

对比维度Diffusion ModelGANVAEFlow-based Model
生成质量高(细节丰富、多样性强)高(风格化效果好)中(细节一般)中 - 高(平滑度好)
训练稳定性高(无对抗、损失函数简单)低(易模式崩溃、梯度消失)高(优化目标明确)高(可逆变换无近似)
生成速度中 - 慢(需 T 步迭代)快(单次生成)快(单次生成)快(反向采样一步到位)
可控性高(支持文本引导、图像编辑)高(进阶架构如 StyleGAN)高(解纠缠变体如 β-VAE)中(隐空间可插值)
结构复杂度中(UNet + 调度器)中(生成器 + 判别器)低(编码器 + 解码器)高(可逆层设计)
适用场景图像生成、修复、超分、文生图风格化生成、图像编辑可控生成、特征提取高效批量生成、概率评估

六、应用场景与进阶方向

1. 典型应用场景

  • 图像生成:文生图(Stable Diffusion、Midjourney)、图生图、超分辨率重建(将低清图转为高清图);
  • 图像编辑:图像修复(填补破损区域)、风格迁移(如照片转油画)、去除水印 / 噪声;
  • 跨模态生成:文本→图像、语音→图像、3D 模型→2D 渲染图;
  • 其他领域:语音生成(Audio Diffusion)、视频生成(Video Diffusion)、分子生成(药物研发)。

2. 进阶方向

  • 高效采样:用 DDIM、PLMS 等采样算法减少迭代步数(从 1000 步降至 50 步),提升生成速度;
  • 文本引导:加入 Cross-Attention 机制,让模型接收文本提示词(如 “红色的猫”),生成对应图像(Stable Diffusion 核心改进);
  • 高效微调:用 LoRA、ControlNet 等技术,在低资源下微调模型,适配特定风格或任务;
  • 多模态融合:结合 LLM 生成精准提示词,再用 Diffusion 生成图像,实现更复杂的生成需求。

七、总结:核心逻辑与学习建议

  1. 核心逻辑:Diffusion Model 的本质是 “噪声的预测与还原”—— 前向扩散固定加噪,反向扩散学习去噪,从纯噪声中逐步还原出清晰图像;
  2. 关键优势:训练稳定、生成质量高、多样性强,且支持丰富的可控生成场景;
  3. 学习顺序:
    • 入门:掌握 “前向 + 反向” 核心逻辑,跑通 MNIST 生成代码,理解噪声调度器和 UNet 的作用;
    • 进阶:学习 Stable Diffusion 的文本引导机制(Cross-Attention)、高效采样算法(DDIM);
    • 实操:用 Hugging Face Diffusers 库快速调用预训练模型(如 Stable Diffusion),实现文生图、图生图。

Diffusion Model 已成为生成式 AI 的 “标配” 技术,掌握其核心原理后,能轻松理解各类主流生成工具的底层逻辑,也是进入 AIGC 领域的关键基础。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/25 8:13:06

【SSM毕设源码分享】基于ssm+vue的健康医疗体检管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/3/27 11:20:23

防抖与节流在Vue中的实现

防抖与节流在Vue中的实现 在前端开发中,高频事件(如输入框输入、窗口缩放、滚动等)的频繁触发往往会导致性能问题,如过多的DOM操作、网络请求或计算开销。防抖(Debounce)和节流(Throttle&#x…

作者头像 李华
网站建设 2026/3/27 6:22:58

C++作业调度问题

洛谷:作业调度方案 🚩 作业调度问题:算法笔记 1. 核心模拟策略:见缝插针 这类题目最容易掉入“按时间一分钟一分钟模拟”的陷阱(你第一版代码的问题)。 正确思路: 按照题目给出的优先顺序&am…

作者头像 李华
网站建设 2026/3/27 16:40:16

一文搞懂大模型 - RAG技术(检索、增强、生成)

RAG(Retrieval-Augmented Generation,检索增强生成) 是一种结合了信息检索技术与语言生成模型的人工智能技术。该技术通过从外部知识库中检索相关信息,并将其作为提示(Prompt)输入给大型语言模型&#xff0…

作者头像 李华
网站建设 2026/3/20 1:35:30

Redis缓存三大问题深度解析:击穿、穿透与雪崩

引言 Redis作为高性能的内存数据库,在互联网架构中扮演着至关重要的缓存角色。然而在实际应用中,我们常会遇到缓存击穿、穿透和雪崩三大问题,这些问题可能导致系统性能急剧下降,甚至引发服务雪崩。本文将从理论原理、解决方案、代…

作者头像 李华
网站建设 2026/3/20 23:35:22

2026毕设ssm+vue魔方教学网站论文+程序

本系统(程序源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。 系统程序文件列表 开题报告内容 一、选题背景 关于魔方教学与在线教育资源管理问题的研究,现有研究主要以通用在线教育平台或综合性技能培训系统为主&…

作者头像 李华