1小时搞懂扩散模型:从原理到代码实战

用通俗语言拆解扩散模型的前向加噪、反向去噪原理与代码实现。
本文基于B站教程,系统梳理扩散模型的核心原理。文章首先对比GAN的训练不稳定与模式崩溃问题,说明扩散模型通过前向加噪与反向去噪实现稳定训练。前向过程对图像逐步添加高斯噪声,并可推导出任意时刻Xt与X0的闭式关系,无需迭代。反向过程借助贝叶斯公式,将去噪转化为学习噪声预测网络,损失函数为预测噪声与真实噪声的均方误差。噪声预测网络常用UNet,输入带噪图像与时刻t,输出预测噪声。文章还给出基于Fashion-MNIST的简洁代码流程,并指出扩散模型仍处快速发展期,建议初学者先把握整体流程再深入公式。
扩散模型(Diffusion Model)已成为生成式AI的核心技术之一,从DALL·E 2到Stable Diffusion,其影响力席卷了整个AI领域。但许多初学者面对复杂的数学推导和论文时往往望而却步。本文基于B站UP主的保姆级教程,用通俗的语言拆解扩散模型的原理、公式推导与代码实现,帮助你快速建立直观理解。
从GAN到扩散模型:为什么需要新方法?
生成对抗网络(GAN)曾是最流行的生成模型,但它存在两大痛点:训练不稳定和模式崩溃。GAN需要同时训练生成器和判别器,两者博弈过程难以收敛,损失函数波动大,且生成器容易走“捷径”学到偏见,导致输出多样性差。据UP主形容,训练GAN就像“两个玩家互相氪金升级”,最终可能一方倾家荡产,另一方盆满钵满——过程极难控制。
扩散模型则另辟蹊径:它不依赖对抗训练,而是通过前向加噪和反向去噪两个过程,将数据分布逐步转换为噪声,再学习从噪声中恢复数据。这种思路最早在2015年就被提出,但直到DALL·E 2等模型展示了惊艳效果后才真正爆发。UP主指出,DALL·E 2的论文虽然简略,但明确揭示了其基于扩散模型的本质。

模式崩溃(Mode Collapse) 是GAN训练中的典型失败模式:生成器发现某些样本特别容易骗过判别器后,便会反复输出这类样本,放弃覆盖数据分布的其他模式。结果是生成结果高度雷同,多样性严重不足。例如在人脸数据上训练,生成器可能只产出同一种面孔。其根源在于生成器的目标是“骗过判别器”而非“覆盖真实分布”,两者目标并不完全一致。扩散模型以逐级去噪的方式建模整个数据分布,每个噪声级别都对应一个学习目标,天然规避了这种“走捷径”的问题。
前向过程:一步步加噪,直到面目全非
前向过程(Forward Process)的核心思想是:对原始图像X0逐步添加高斯噪声,经过T步后得到一个纯噪声图像XT。每一步加的噪声量由β_t控制,且β_t随时间递增(从0.001到0.002线性衰减),确保后期加入更多噪声。
数学上,每一步的加噪公式为:
X_t = √(1-β_t) * X_{t-1} + √β_t * Z_t
其中Z_t服从标准正态分布。通过递推,可以推导出任意时刻Xt与X0的直接关系:
X_t = √(α̅_t) * X0 + √(1-α̅_t) * Z
这里α_t = 1-β_t,α̅_t是α_t的累乘。这个公式的精妙之处在于:无需迭代,给定X0和t,就能直接采样出Xt。UP主用“酒鬼走路”比喻:每一步都随机偏移,但整体趋势是越来越远离起点。

重参数化技巧(Reparameterization Trick) 是扩散模型公式推导的关键工具。当我们需要从高斯分布 N(μ, σ²) 中采样时,可以直接写成 μ + σ·ε,其中 ε 服从标准正态分布 N(0,1)。这样采样结果对 μ 和 σ 的依赖是显式的,梯度可以顺畅地回传到网络参数上。前向加噪公式 X_t = √(1-β_t)·X_{t-1} + √β_t·Z_t 正是这一技巧的体现:把随机性全部交给独立的 Z_t,而均值和方差由确定性系数控制。这使得任意时刻的 X_t 都能写成 X0 与标准噪声的线性组合,为推导闭式解铺平了道路。
反向过程:从噪声中恢复数据
反向过程(Reverse Process)的目标是从XT逐步去噪,最终生成X0。直接由XT预测X0几乎不可能,因此采用贝叶斯公式,将问题转化为学习条件分布p(X_{t-1}|X_t)。推导后,均值μ_θ可表示为:
μ_θ = (1/√α_t) * (X_t - (β_t/√(1-α̅_t)) * ε_θ(X_t, t))
其中ε_θ是一个神经网络,用于预测噪声。UP主强调,这个网络需要输入X_t和时刻t(类似Transformer的位置编码),输出预测的噪声。训练时,损失函数就是预测噪声与真实噪声的均方误差。

贝叶斯公式在反向过程中的作用值得展开说明。前向过程定义了已知的 q(X_t|X_{t-1}),而反向过程需要的是 p(X_{t-1}|X_t),两者方向相反。直接计算该条件分布需要知道真实数据分布,这恰恰是我们想学习的。贝叶斯公式将其改写为 p(X_{t-1}|X_t) ∝ p(X_t|X_{t-1})·p(X_{t-1}),其中第一项来自前向过程的已知高斯形式,第二项则用神经网络近似。进一步地,当 β_t 足够小时,反向过程的条件分布也可近似为高斯分布,其均值可以解析地表示为 X_t 与预测噪声 ε_θ 的函数,这正是文中 μ_θ 公式的来源。
训练与采样:代码实战
训练阶段,从数据集中采样X0,随机选择时刻t,生成噪声Z,计算Xt,然后让UNet预测噪声,计算损失并反向传播。UP主用Fashion-MNIST数据集演示,代码仅需几十行。采样阶段,从纯噪声XT开始,迭代调用训练好的UNet预测噪声,逐步去噪,直到得到X0。
UP主特别提到,原始论文使用UNet作为噪声预测网络,并结合了注意力机制。虽然为何用UNet而非纯Transformer尚无定论,但实践表明小规模网络已足够。

UNet 的结构特点:UNet 最初用于医学图像分割,其名称来自对称的“U”形结构——左侧编码器逐级下采样提取语义特征,右侧解码器逐级上采样恢复空间分辨率,并通过跳跃连接(Skip Connection)将同层级的浅层特征直接拼接到解码器。在扩散模型中,UNet 的输入是带噪图像 X_t,输出是与输入同尺寸的预测噪声图。时刻 t 通常通过正弦位置编码嵌入后,注入到每个残差块中,使网络知道当前处于哪个噪声级别。跳跃连接保留了高频细节,这对精确预测噪声至关重要,也是 UNet 优于纯 Transformer 的实践原因之一。
总结与展望
扩散模型通过简洁的数学框架和稳定的训练过程,克服了GAN的诸多缺陷。尽管推导涉及概率论和重参数化技巧,但核心思想可以概括为“加噪容易去噪难,神经网络来帮忙”。UP主认为,扩散模型仍处于快速发展期,未来可能在更多领域爆发。对于初学者,建议先理解整体流程,再逐步深入公式细节。
相关推荐

达芬奇如何证明太阳是热的?一段被忽视的科学史
达芬奇如何用凹面镜实验推翻亚里士多德的冷太阳理论?本文梳理这段被忽视的科学史,揭示科学思维在十五世纪的萌芽,以及达芬奇对太阳发热和生命本质的冷峻观察。

SharpLogic:用k-CNF为LangGraph路由图做形式化查错
SharpLogic开源项目将LangGraph风格的多智能体路由与重试图映射为k-CNF,用Rust内核统计死锁与失败路径(#F计数),提供Python AgentGuard钩子与CLI,在发布前做形式化门禁检查。本文分析其原理、与评测的互补关系及社区关注的建模成本问题。

PPO训练Franka机械臂抓取放置:一个强化学习入门项目
一个用PPO算法在PyBullet中训练Franka Panda机械臂完成抓取放置任务的强化学习项目,涵盖技术栈选型、任务设计难点与未来文本/语音指令交互计划,适合入门者参考。