大模型之二十六-Diffusion model实例浅析

news2024/9/20 2:29:01

在2022年,midjourney、DALL-E以及Stable Diffusion三个文生图模型引爆了机器生产文生图领域,他们的模型能够在可控条件(标签、文本描述)下生成高分辨率、细节丰富的多样性图像,这在视觉上往往难以与真实图像区分。配套视频请添加图片描述以下是他们几个简单的效果对比图。请添加图片描述
请添加图片描述
请添加图片描述
学术和工业界对他们采用的 Diffusion 模型兴趣迅速增长,导致了大量的研究、改进和创新。这推动了技术的发展和成熟,进一步扩大了它们的应用范围和影响力。

本篇文章通过一个汽车图片生成的无条件Diffusion模型阐述这一原理。

本篇所述的Diffusion模型基于2020年12月的论文《Denoising Diffusion Probabilistic Models》,其是比较基础无条件的Diffusion 模型,简称为DDPM模型。

其生成图片是从一个高斯白噪声图片,一步一步去噪,通常可能要100~1000步以获得高质量、细节丰富的图片,其过程如下。
请添加图片描述

Diffusion生成图的过程

上面gif动图显示的是图像生成过程,下面是一组静态图,首先 X T ′ X'_T XT是一个纯高斯白噪声图片,然后逐步去噪,直到 X 0 ′ X'_0 X0(逼近原始数据集效果的图片),这里的 X 0 ′ X'_0 X0并不是原始训练集里图片。
请添加图片描述
生成的过程是一步步去噪,每一步只去一点点,那么问题来了,如何估计每一步噪声量呢?使用Diffusion模型来估计,所以Diffusion模型输入应该是前一步的带噪图片 X t − 1 X_{t-1} Xt1以及所在步数 t ∈ 1 , . . . T t \in {1,...T} t1,...T,然后模型算出噪声 ϵ θ \epsilon_{\theta} ϵθ,这样就可以得到噪声稍微少一点的图片 X t = X t − 1 − ϵ θ X_t=X_{t-1}-\epsilon_{\theta} Xt=Xt1ϵθ了,迭代去做,直到得到 X 0 ′ X'_0 X0基本和训练集差不多。

这里有一个问题需要解决,就是上面提到的模型算出噪声 ϵ θ \epsilon_{\theta} ϵθ,模型好理解,MLP、CNN、RNN、Transformer、Diffusion等,不论使用哪个模型,如何得到模型的参数集 θ \theta θ(又称权重)呢? θ \theta θ表示的可能有几千万~几十亿的参数量,即几十亿个float值。要同时调节这几十亿个float值以使每一步的 ϵ θ \epsilon_{\theta} ϵθ逼近真实的情况,显然乱试是不可能的。

这样好了,我们先针对不同的 t t t对图片加噪声,然后将带噪声的图片和时间 t t t送入模型,让模型预测我们所加的噪声值,根据模型预测的噪声和实际所加的噪声的差距来调节模型的参数,只要数据量和样本足够多,理论上参数集 θ \theta θ里的参数就可以调整到符合生成逼真图片的要求。权重参数收敛的过程使用的是梯度下降法,梯度下降法在信号处理领域早就使用了。

接下来的问题是,如何生成带噪的图片呢?这个过程在DDPM里称为Diffusion process,这里的 X 0 X_0 X0没有上标,这是因为这个图片是来自数据集里的,是模型训练之前就存在的图片。然后一步步加噪得到 X T X_T XT,这里的 X 1 X_1 X1和Sampling的 X 1 ′ X'_1 X1在时间上是相同的,但是因为噪声是随机的,所以两张图片并不完全相同,但是噪声量的差不多的。

通过这个过程,对每一个图片都可以生成一系列的带噪图片,每一个时间 t ∈ 1 , 2 , ⋯   , T t \in {1,2,\cdots,T} t1,2,,T所加的噪声量由噪声调度器控制(noise schedule),原paper是t越大加的噪声越多,到T的时候 x T \mathbf x_T xT和随机生成的噪声是没有差别的。

但是这里有一个问题,就是在训练模型的时候,并不是按照 X 1 , X 2 , ⋯   , X T X_1,X_2,\cdots,X_T X1,X2,,XT的顺序给模型的, t t t是随机的,所以假如 t = 8 t=8 t=8,要生成 X 8 X_8 X8,我们需要生成 X 1 , X 2 , ⋯   , X 7 X_1, X_2,\cdots,X_7 X1,X2,,X7,显然这样生成训练所需要的带噪图片效率太低了,这会浪费大量的算力。
请添加图片描述
t − 1 t-1 t1时刻加噪得到 t t t时刻带噪图片的计算如下:
q ( x t ∣ x t − 1 ) = N ( x t ; 1 − β t x t − 1 ; β t I ) , ∀ t ∈ 1 , ⋯   , T q(\mathbf x_t|\mathbf x_{t-1}) = N(\mathbf x_t;\sqrt{1-\beta_t}\mathbf x_{t-1}; \beta_t I), \forall t \in {1, \cdots,T} q(xtxt1)=N(xt;1βt xt1;βtI),t1,,T
( X t ∣ X t − 1 ) (X_t|X_{t-1}) XtXt1表示从 t − 1 t-1 t1时刻图片 X t − 1 X_{t-1} Xt1得到t时刻图片 X t X_t Xt,q表示后验概率,即观察到 X t X_t Xt时,输入是 X t − 1 X_{t-1} Xt1的概率, β t \beta_t βt是超参数,事先定义好的,公式1对应的图片表示如下:
请添加图片描述
从时刻0到时刻T的这一加噪过程,称为noise schedule,噪声就是独立同分布的高斯白噪声,只需要均值和方差这两个值就可以确定一个高斯分布(也称正态分布,确实比较简单,还有拉普拉斯、泊松分布、狄拉克分布等等),在Diffusion模型中更简单只使用了方差 β \beta β这一个参数(因为均值是0)。

上面的步骤可以生成任意时刻的带噪图片,但是效率有些低,有没有办法一次性生成任意时刻的图片,而不用迭代呢?这样效率会高很多,根据公式1,即从 x 0 x_0 x0可以生成 x 1 x_1 x1,从 x 1 x_1 x1再生成 x 2 x_2 x2,通过一步步迭代计算 q ( x t ∣ x 0 ) q(x_t|x_0) q(xtx0),看看有没有规律。
请添加图片描述
从上面的图示可以看到,可以从 X 0 X_0 X0一步生成 X 2 X_2 X2,那按照递推公式应该是可以一步生成 X t X_t Xt,这里不再详细推导,感兴趣可以自行推导,这里直接给出公式:

X t = α ‾ t X 0 + 1 − α ‾ t ϵ X_t=\sqrt{\overline \alpha_t}X_0 + \sqrt{1-\overline \alpha_t}\epsilon Xt=αt X0+1αt ϵ
α t \alpha_t αt α ‾ t \overline \alpha_t αt以及 β t \beta_t βt三者之间的关系。

α t = 1 − β t \alpha_t=1-\beta_t αt=1βt

α ‾ t = α 1 α 2 ⋯ α t \overline \alpha_t=\alpha_1 \alpha_2\cdots\alpha_t αt=α1α2αt

前面说了, β t \beta_t βt是noise schedule的参数,通常T选择比较大,如1000,然后就可以确定所有的 β \beta β,然后 α t \alpha_t αt α ‾ t \overline \alpha_t αt也就确定了。

到这里,我们已经了解了Diffusion生成图片的过程,以及训练时,带噪图片是怎么生成的了。接下来结合paper上的公式讲一下算法。

训练和推理

paper给出的两个公式如下,traning使用的Diffusion一次生成带噪图片,Sampling就是应用的时候生成图片。
请添加图片描述

Algorithm 1 训练过程

Training算法过程,

首先这个是一个大的循序,直到模型收敛之后才会停止,收敛的标准就是训练时步骤5~6loss为判断依据。

第二行: x 0 \mathbf x_0 x0是一个干净的图,就是训练集中的图

第三行:从{1,T}中选择一个值,通常T是一个比较大的值,比如1000,为了训练方便,这里选择了300

第四步:首先 N ( 0 , I ) N(0,I) N(0,I)是一个标准正态分布,其均值是0,标准差是1,这一步是计算一个和汽车图大小一样的噪声图片,是对每一个像素(RGB)加随机一个标准正态分布的噪声,这种生成的噪声图被称为独立同分布的,没有考虑像素点之间的关系,但是效果好且简单,所以一直都是用的独立同分布的噪声。

第五步:$\sqrt{\overline \alpha_t} \mathbf x_0 + \sqrt{1-{\overline \alpha_t}}\mathbf {\epsilon} ,该式表示将训练集中的图 ,该式表示将训练集中的图 ,该式表示将训练集中的图\mathbf x_0 ,和图片尺寸大小相等的噪声 ,和图片尺寸大小相等的噪声 ,和图片尺寸大小相等的噪声\mathbf \epsilon 做一个 w e i g h t e d s u m ,这里的 w e i g h t 是事先已经定好的 做一个weighted sum,这里的weight是事先已经定好的 做一个weightedsum,这里的weight是事先已经定好的{\overline {\alpha}_1,\overline {\alpha}_2, \cdots, \overline {\alpha}_T} ,当第三步中的 t 取哪个值,这里的 ,当第三步中的t取哪个值,这里的 ,当第三步中的t取哪个值,这里的\overline {\alpha} 就取哪一个,通常 就取哪一个,通常 就取哪一个,通常\overline {\alpha}_t$取值随着t的增加而减少,即t越大加的噪声就越多,权重相加之后,得到的是带噪图片,

ϵ θ ( α ‾ t x 0 + 1 − α ‾ t ϵ , t ) \mathbf \epsilon_{\theta}(\sqrt{\overline \alpha_t} \mathbf x_0 + \sqrt{1-{\overline \alpha_t}}\mathbf {\epsilon} ,t) ϵθ(αt x0+1αt ϵ,t),这是噪声预测器(就是Diffusion模型),即给定带噪图片和该时刻时间值,预测图片加的噪声是多少,很明显理想情况下模型预测的就是t时刻加的噪声 ϵ \mathbf {\epsilon} ϵ,但是由于模型参数一开始是随机的,所以预测值和真实值之间必然存在差异,所以就用这个差异来做为loss的基准,直到误差足够小,即图中的converged条件满足。

Sampling算法过程:

因为是从纯噪图片里面生成图片,所以每一步都是一个去噪的过程,那噪声是多少呢?这个是Diffusion model做的事,Diffusion model去预测噪声,然后一步步迭代去减掉噪声。
请添加图片描述
1.首先生成一个独立同分布的噪声 x T \mathbf x_T xT

2.2~5这几行是一个T次的循环,循环的目的是逐步去噪声,第三行是再次生成一个独立同分布的噪声 z \mathbf z z,作用后面再讲。

x t \mathbf x_t xt是上一步生产的图,对于第一步就是 x T \mathbf x_T xT ϵ θ ( x t , t ) \mathbf \epsilon_{\theta}(\mathbf x_t, t) ϵθ(xt,t),这步就是调用前面训练得到的Diffusion模型根据上一步产生的图和t预测图片的噪声

背后的数学原理

对于一个训练好的模型(一般用 θ \theta θ)表示其参数集,其得到一张训练集中的图片的概率可以表示成如下公式:
P θ ( x 0 ) = ∫ x 1 : x T P ( x T ) P θ ( x T − 1 ∣ x T ) ⋯ P θ ( x t − 1 ∣ x t ) ⋯ P θ ( x 0 ∣ x 1 ) d x 1 : x T P_{\theta}(x_0)= \int \limits_{x_1:x_T}P(x_T)P_{\theta}(x_{T-1}|x_T)\cdots P_{\theta}(x_{t-1}|x_t)\cdots P_{\theta}(x_{0}|x_1)dx_1:x_T Pθ(x0)=x1:xTP(xT)Pθ(xT1xT)Pθ(xt1xt)Pθ(x0x1)dx1:xT
模型最优的参数应该是使得所有图片的概率最高,这样得到的模型输出的分布最接近原始数据集的分布,这可以表示为:
θ ∗ = arg ⁡ max ⁡ θ ∏ i = 1 m P θ ( x i ) \theta^*=\arg \max \limits_{\theta}\prod_{i=1}^mP_{\theta}(x^i) θ=argθmaxi=1mPθ(xi)= arg ⁡ max ⁡ θ log ⁡ ∏ i = 1 m P θ ( x i ) \arg \max \limits_{\theta}\log\prod_{i=1}^mP_{\theta}(x^i) argθmaxlogi=1mPθ(xi)= a r g max ⁡ θ ∑ i = 1 m log ⁡ P θ ( x i ) arg \max \limits_{\theta}\sum_{i=1}^m \log P_{\theta}(x^i) argθmaxi=1mlogPθ(xi)

q ( x 1 ∣ x 0 ) q(x_1|x_0) q(x1x0)表示在有原图时,得到第一步带噪图片 x 1 x_1 x1的概率,则一直加噪得到带噪 x T x_T xT图的概率可以表示为 q ( x 1 : x T ∣ x 0 ) q(x_1:x_T|x_0) q(x1:xTx0),这也是加噪过程,其表达的式是: q ( x 1 : x T ∣ x 0 ) = q ( x 1 ∣ x 0 ) q ( x 2 ∣ x 1 ) ⋯ q ( x T ∣ x T − 1 ) q(x_1:x_T|x_0)=q(x_1|x_0)q(x_2|x_1)\cdots q(x_T|x_{T-1}) q(x1:xTx0)=q(x1x0)q(x2x1)q(xTxT1)

噪声 σ t z \sigma_t \mathbf z σtz作用

σ t z \sigma_t \mathbf z σtz前面说了sampling的过程实际是去噪声的过程,Diffusion model就是预测噪声用的,为什么这里反而要额外加一个微小的噪声呢?这是因为每一步模型生成的都是概率最高的噪声,经过一步步的迭代强化之后,得到最终会是概率最高的唯一图片,从大语言模型的最后的temp值就是控制生成过程的随机性。对于一句话,如果每一个字的概率都是最高的,反而是不好的,比如这一段的内容,并不是每一个字的概率都是最高的。

模型中的t

positional Embedding
请添加图片描述
请添加图片描述

UNet

Diffusion模型结够采用UNet结构,主要是CNN算子请添加图片描述
[1] DDPM https://arxiv.org/abs/2006.11239

模型细节这里不展开了,在代码实例中再展开。

欢迎大家点赞、关注以便及时收到更新提醒。
对应讲解视频:https://www.bilibili.com/video/BV18pWieTEDP/
代码地址:https://github.com/shichaog/AI_model_explained

接下来看简单的例子,后续在这个简单例子上继续深入,包括

  • 自己的数据集怎么处理
  • 多GPU训练
  • 标签、文本控制图片生成
  • 图片修复
  • 以及开源比较火的Stable Diffusion 1.5/3
  • 模型的部署推理等

下一篇还是先看代码和实例,代码可以完全在CPU上训练,这意味着即使没有GPU,也可以跑代码理清里面的原理,但训练的时间上会比较长。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2072781.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

其它特殊库存

自有特殊库存 对于特殊库存,我们通常认为是由于所有权或存储地点与其它库存分开管理的物料库存。当过帐涉及特殊库存的货物移动时,除了移动类型外,必须(如向特定供应商或客户或销售订单)提供相关特殊库存标识以及更多…

3秒内搞定服务器端口扫描!用RustScan快速查看开放端口

文章目录 3秒内搞定服务器端口扫描!用RustScan快速查看开放端口1. RustScan简介2. RustScan特点3. RustScan的基本使用3.1 创建alias别名3.2 基本用法3.3 常用参数说明3.4 示例4. 注意事项 最近开始公众号文章也开始同步更新了,对Java、大数据、人工智能…

游戏开发设计模式之命令模式

目录 命令模式的定义和工作原理 应用场景 实现方式 优点 缺点 结论 命令模式在游戏开发中的具体实现案例是什么? 如何在Unity3D中有效地实现和管理命令模式以提高游戏性能? 命令模式与其他设计模式(如观察者模式、状态模式&#xff…

【C++ 面试 - 内存管理】每日 3 题(一)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…

JavaScript解构介绍

​在JavaScript中,解构赋值(Destructuring Assignment)是一种方便的语法,用于从数组或对象中提取值并将其赋给变量。解构使得代码更简洁、可读性更高,同时减少了重复的代码。 1. 数组解构 数组解构允许我们从数组中提…

2024最新、最热、最全Java容器【知识点】!!!

文章目录 Java容器种类详细说说他们都有哪些内容Collection :存储对象的集合 为什么HashSet和ArrayDeque不支持有序性操作Map:存储键值对的映射表 ArrayList和LinkedList的区别?ArrayList的增删一定比LinkedList的增删慢吗?native()方法是什么…

SOMEIP_ETS_064: String_UTF16FIXED_too_short

测试目的: 验证当设备(DUT)接收到一个小于64字节的UTF16FIXED字符串时,是否能够返回错误消息。 描述 本测试用例旨在检查DUT在接收到一个长度小于64字节的UTF16FIXED字符串的SOME/IP消息时,是否能够返回格式错误&am…

04-javascript 高阶(知识点)

目录 1.严格模式 1.1什么是严格模式 1.2开启严格模式 1.3严格模式中的变化 2.高阶函数 3.闭包 3.1 变量的作用域 3.2 什么是闭包 3.3 闭包的作用 3.4 闭包的案例 4.递归 4.1 什么是递归 4.2 利用递归求1~n的阶乘 5.赋值(地址传递)-浅拷贝-深拷贝 5.1 地址传递 5…

MATLAB中bicgstabl函数用法

目录 语法 说明 示例 线性系统的迭代解 使用指定了预条件子的 bicgstabl 提供初始估计值 使用函数句柄代替数值矩阵 bicgstabl函数的功能是求解线性系统 - 稳定双共轭梯度 (l) 法。 语法 x bicgstabl(A,b) x bicgstabl(A,b,tol) x bicgstabl(A,b,tol,maxit) x bic…

map容器的所有操作

1.基本概念 2.构造和赋值 注意map中存放的是pair对组&#xff0c;<key,value>&#xff0c;会根据key自动排序 3.大小和交换 4.插入和删除 插入的四种方式&#xff1a; 5.查找和统计 6.排序

8.21-部署eleme项目

1.设置主从从mysql57服务器 &#xff08;1&#xff09;配置主数据库 [rootmsater_5 ~]# systemctl stop firewalld[rootmsater_5 ~]# setenforce 0[rootmsater_5 ~]# systemctl disable firewalldRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.serv…

# 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群

利刃出鞘_Tomcat 核心原理解析&#xff08;八&#xff09;-- Tomcat 集群 一、Tomcat专题 - Tomcat集群 - 介绍及准备工作 1、Tomcat集群 简介 由于单台Tomcat的承载能力是有限的&#xff0c;当我们的业务系统用户量比较大&#xff0c;请求压力比较大时&#xff0c;单台Tomc…

i.MX6裸机开发(8):中断

相比STM32的NVIC&#xff0c;i.MX 6ULL的中断控制系统更复杂&#xff0c;它的中断管理器使用的是GIC V2&#xff0c;GIC V2的实现方式与我们熟知的NVIC差别较大。 本章重点讲解i.MX 6U的GIC基本结构以及实现方法&#xff0c;更详细的介绍可以参考《ARM Generic Interrupt Contr…

快速学习初阶“堆“(数据结构C语言)

前言&#xff1a; 二叉树是什么&#xff1f; 同样也和之前的"栈"跟"队列"是一样的&#xff0c;是一种存储数据的方式&#xff0c;只不过二叉树的结构更为复杂。 那么为什么要用二叉树存储数据呢&#xff1f;真的多此一举吗&#xff1f; 它的实际作用是什么…

买对不买贵,宠物空气净化器应该怎么选才能选到好的产品

你是否还在为家中无处不在的猫毛而烦恼&#xff1f;每当有风吹来&#xff0c;就把四处躲藏的猫毛给吹出来&#xff0c;不经意间就可能让这些”蒲公英“悄悄附在你的食物上&#xff0c;或是不经意间吸入鼻腔&#xff0c;让人既无奈又尴尬。你是否每天下班回家后的第一件事&#…

AnyV2V:一种用于各种视频编辑任务的即插即用框架

人工智能咨询培训老师叶梓 转载标明出处 视频编辑任务通常涉及根据额外的控制信息&#xff08;如文本提示、主题、风格等&#xff09;编辑源视频&#xff0c;以生成与源视频和提供的控制信息相符的新视频。然而&#xff0c;现有方法往往局限于特定类型的编辑任务&#xff0c;难…

面向对象06:super关键字详解

本节内容视频链接&#xff1a;面向对象10&#xff1a;Super详解_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p69&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 Java中的‌super关键字是一个特殊的引用&#xff0c;‌用于指代父类对象‌。‌在子…

搜维尔科技:Xsens通过其先进的动作捕捉技术和惯性跟踪传感器,实现了与机器人的高效互动,提高了机器人的操作精度、自然性和稳定性

‌Xsens通过实时动作捕捉技术和MTI惯性跟踪传感器与机器人进行互动‌&#xff0c;这些技术为机器人提供了高精度的运动数据和稳定的导航能力&#xff0c;从而实现了机器人操作的精确性和效率的提升。 Xsens的技术主要应用于两大领域&#xff1a;人类物理交互行为的建模和分析&a…

如何使用ssm实现基于java的小型超市管理系统+vue

TOC ssm195基于java的小型超市管理系统vue 绪论 1.1 研究背景 现在大家正处于互联网加的时代&#xff0c;这个时代它就是一个信息内容无比丰富&#xff0c;信息处理与管理变得越加高效的网络化的时代&#xff0c;这个时代让大家的生活不仅变得更加地便利化&#xff0c;也让…

Git 的配置

1. 忽略特殊文件 在⽇常开发中&#xff0c;我们有些⽂件不想或者不应该提交到远端&#xff0c;⽐如保存了数据库密码的配置⽂件&#xff0c;那怎么让 Git 知道呢&#xff1f;在 Git ⼯作区的根⽬录下创建⼀个特殊的 .gitignore ⽂件&#xff0c;然后把要忽略的⽂件名填进去&am…