扩散模型之DDPM

news/2025/1/30 21:37:50/

扩散模型之DDPM

  • 文章前置
  • 生成模型
    • 总结
  • Design of DDPM
    • 正向加噪过程
    • 反向去噪过程

文章前置

最原文链接(英文):What are Diffusion Models?
原文链接:Diffusion扩散模型大白话讲解,看完还不懂?不可能
原文链接:DDPM解读(一)| 数学基础,扩散与逆扩散过程和训练推理方法
hugging face diffusers(扩散模型包):huggingface diffusers code
本文并非全部是个人理解,是觉得其他作者的博客和文章通过不同的角度将DDPM讲的更加通俗易懂,希望自己能通过写一些东西加深理解,并且能够将其他人的优质内容进行分享。

生成模型

生成模型的主流网络结构应该可以分成三类,GAN、VAE 和基于流的模型。他们在生成高质量样本方面取得了巨大成功,但每个都有自己的局限性。

  1. GAN:由生成器和判别器构成。先训练判别器,使其能够区分图片的真伪(二分类),再继续训练生成器生成图像,在通过判别器判别图像的真伪,使生成图像的分布逐渐逼近于真实分布。由于 GAN 模型具有对抗性训练的性质,因此以潜在的不稳定训练和较少的生成多样性而闻名。
  2. VAE:与GAN通过判别器判断生成图像的真假不同,VAE直接通过分布的变换来生成图像。将真实样本通过编码器网络变换成一个理想的数据分布,然后这个数据分布再传递给一个解码器网络,得到一堆生成样本,生成样本与真实样本足够接近的话,就训练出了一个自编码器模型。但VAE的方法输出模糊,常会失真。
  3. 基于流模型的方法,是建立训练数据和生成数据之间的概率关系,然后用可逆的神经网络来训练,这种关系是一一对应的。代价就是模型设计比较麻烦,因为要保证可逆而且逆函数可以算,还要有足够的灵活度。流模型必须使用专门的体系结构来构建可逆变换。
  4. 扩散模型的灵感来自非平衡热力学。他们定义了一个扩散步骤的马尔可夫链,以缓慢地将随机噪声添加到数据中,然后学习反转扩散过程以从噪声中构建所需的数据样本。与 VAE 或流模型不同,扩散模型是通过固定过程学习的,并且潜在变量具有高维性(与原始数据相同)。
    在这里插入图片描述

总结

从图中我们可以看到,GAN、VAE和基于流的模型的共同点在于期望“一步跨十个台阶”,直接实现图像的生成,而扩散模型期望“一步跨一个台阶”,这可能是扩散模型生成的图像质量比较高的原因。

Design of DDPM

如下图所示。DDPM模型主要分为两个过程:forward加噪过程(从右往左)和reverse去噪过程(从左往右)。加噪过程意思是指向数据集的真实图片中逐步加入高斯噪声,而去噪过程是指对加了噪声的图片逐步去噪,从而还原出真实图片。加噪过程满足一定的数学规律,而去噪过程则采用神经网络来学习。这么一来,神经网络就可以从一堆杂乱无章的噪声图片中生成真实图片了。
在这里插入图片描述

正向加噪过程

给定一个从真实数据分布中采样的数据点 x 0 ∼ q ( x ) \rm{x_0} \sim q(\rm{x}) x0q(x),定义一个 T T T step 的正向的加噪过程,逐步向样本中添加少量高斯噪声,以产生一连串的噪声样本 x 1 , . . . , x T \rm{x_1},...,\rm{x_T} x1,...,xT。步长的大小是由 β t \beta_t βt控制 β t ∈ ( 0 , 1 ) t = 1 T {\beta_t \in(0,1)}^T_{t=1} βt(0,1)t=1T
在这里插入图片描述
这种公式看起来比较难理解比较抽象,其实就是
x t = 1 − β t x t − 1 + β t ϵ t − 1 \rm{x_t}=\sqrt{1-\beta_t}\rm{x}_{t-1}+\sqrt{\beta_t}\epsilon_{t-1} xt=1βt xt1+βt ϵt1
其中 ϵ t ∼ N ( 0 , I ) \epsilon_t \sim N(0,I) ϵtN(0,I),这样就非常容易理解了,正向的加噪过程是通过公式推导的,不涉及网络参数的学习。随着 t t t不断增大,采样数据 x 0 \rm{x_0} x0逐渐失去可辨别的特征,当 T T T比较大时, x T \rm{x_T} xT就等同于一个高斯分布了。我们可以看到, x T \rm{x_T} xT只由 β T \beta_T βT x T − 1 \rm{x_{T-1}} xT1来确定,是一个不通过学习就可以直接得到的过程。因此,只要我们有了 x 0 \rm{x_0} x0,并且提前确定每一步的固定值 β 1 \beta_1 β1,…, β T \beta_T βT,我们就可以推出任意一步的加噪数据 x 1 \rm{x_1} x1,…, x T \rm{x_T} xT。这里的前向加噪过程被称为是一个马尔科夫链过程。

反向去噪过程

反向的过程是复杂的,需要逐步反向计算,即计算 q ( x t − 1 ∣ x t , x 0 ) q(\rm{x_{t-1}}|\rm{x_t},\rm{x_0}) q(xt1xt,x0)。这里为什么不是直接计算 q ( x t − 1 ∣ x t ) q(\rm{x_{t-1}}|\rm{x_t}) q(xt1xt),这是因为在正向加噪的过程中,我们已知的只有各种条件概率 q ( x t ∣ x t − 1 ) q(\rm{x_{t}}|\rm{x_{t-1}}) q(xtxt1),而像 q ( x t ) q(\rm{x_t}) q(xt)这样的先验概率不能得到,所以需要计算 q ( x t − 1 ∣ x t , x 0 ) q(\rm{x_{t-1}}|\rm{x_t},\rm{x_0}) q(xt1xt,x0)。这里我们可以由贝叶斯公式得出(公式真的不想手打了,直接复制粘贴):
在这里插入图片描述
根据正向的加噪过程,我们很容易计算贝叶斯公式中的各个成分
在这里插入图片描述
在这里 α t = 1 − β t \alpha_t = 1-\beta_t αt=1βt α t ‾ = α t α t − 1 . . . α 1 \overline{\alpha_t} = \alpha_t \alpha_{t-1}...\alpha_1 αt=αtαt1...α1。标准正态分布可以表示为:
在这里插入图片描述
所以贝叶斯公式的表示可以转化为:
在这里插入图片描述
将平方展开并合并同类项我们可以得到:
在这里插入图片描述
因为KaTeX parse error: Undefined control sequence: \x at position 1: \̲x̲_t x 0 x_0 x0都是已知的,所以最后一项可以作为一个常数项。对比标准的正态分布展开项为:
在这里插入图片描述
对比两个指数形式的分布,我们就可以分别计算 σ \sigma σ μ \mu μ,而且可以发现这里的 σ \sigma σ是一个固定值,而 μ \mu μ可以得到:
在这里插入图片描述
通过正向加噪的过程可以有 x t x_t xt计算 x 0 x_0 x0,所以可以得到:
在这里插入图片描述
而在反向去噪的过程中, ϵ t \epsilon_t ϵt并不知道是什么样的,所以就可以通过神经网络来拟合了,并且可以通过与正向加噪的过程中使用的噪声计算mse损失来训练这个网络。这就是一个标准的扩散模型DDPM的过程。


http://www.ppmy.cn/news/229625.html

相关文章

SpringBoot项目使用slf4j的MDC日志打点功能

SpringBoot项目使用slf4j的MDC日志打点功能 物料准备: 1.自定义1个线程MDC打点工具类 2.配置logback打印MDC打点的traceId 3.配置webMVC使用MDC打点 4.配置ThreadPoolTaskExecutor使用MDC打点 5.配置HttpClient使用MDC打点 6.测试MDC日志打点效果 线程mdc打…

摩托车公司网站

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字):

摩托车联网TBOX系统的研究与开发,摩托车领域的新技术摩托车tbox是什么系统!

摩托车tbox远程控制系统?摩托车装T-Box啥作用?摩托车联网未来正逐渐成为现实,中山迈易科技推出的移动管家摩托车T-BOX让车联更简单,增加一个盒子既可让车联网应用快速落地。 移动管家摩托车专用T-BOX车联网系统: 1.GPS定位实时定…

摩托车动力学

Bicycle and motorcycle dynamics Steering Geometry

摩托车无钥匙启动的好处

1.一键启动的优点是非常明显的。我们在生活中,需要用到钥匙的地方有很多,车钥匙算是一个比较重要的钥匙,一点丢了非常麻烦,所以一键启动是比较智能的 2.摩托车配带了一键启动,就可以不用掏钥匙,直接进行启动,不用再去找车钥匙,插钥匙等等,直接进入到PKE智能钥匙感应区域的时候…

CMU 15-445 Project Project #1 - Buffer Pool(Task #1 - Extendible Hash Table)

Task #1 - Extendible Hash Table 一、题目链接二、准备工作三、部分实现四、自定义测试用例 一、题目链接 二、准备工作 见 CMU 15-445 Project #0 - C Primer 中的准备工作。 三、部分实现 Find auto Find(const K &key, V &value) -> bool override {std::sco…

骑摩托车出行防水防雾小技巧

新交规实施以后,机车出行的时候,头盔已经成了不得不佩戴的装备。 头盔从之前的可有可无,变成了现在的必不可少,相信大家也和我一样戴上头盔以后会感到很不习惯,特别是视野问题,视野再也没有不戴头盔那样开…

摩托车无钥匙启动解决方案设计

摩托车“无钥匙启动”存在的意义是什么?摩托车无钥匙启动普及还有多远?这个东西技术含量大么? 普及的可能性有多大?摩托车智能钥匙一键启动防盗系统采用了汽车式的一键启动和PKE智能感应技术,在靠近车1-2米2秒后防盗自动解除后ACC供电,一键…