Diffusion模型系列文章

news/2024/5/1 7:49:17/文章来源:https://blog.csdn.net/lynn_Dai/article/details/130123966

扩散模型与其它主流生成模型的对比

DDPM

论文

扩散模型包括两个过程:前向过程(forward process)和反向过程(reverse process),其中前向过程又称为扩散过程(diffusion process),如下图所示,从x0x_0x0xTx_TxT的过程。无论是前向过程还是反向过程都是一个参数化的马尔可夫链(Markov chain),其中反向过程可以用来生成数据,这里我们将通过变分推断来进行建模和求解。
在这里插入图片描述

扩散过程

扩散过程是指的对数据逐渐增加高斯噪音直至数据变成随机噪音的过程。对于原始数据x0∼q(x0)x_0 \sim q(x_0)x0q(x0),总共包含TTT步的扩散过程的每一步都是对上一步得到的数据xt−1x_{t-1}xt1按如下方式增加高斯噪音:
q(xt∣xt−1)=N(xt;1−βtxt−1,βtI)q(x_t|x_{t-1} ) = \mathcal{N}(x_t; \sqrt{1-\beta_t}x_{t-1},\beta_t\mathbf{I}) q(xtxt1)=N(xt;1βtxt1,βtI)
其中,βt\beta_tβt是每一步所采用的方差/扩散率,介于0~1之间。随着step的叠加,采用更大的方差。按照超参数处理,β 的范围从0.0001逐步增大到0.02。
扩散过程的每一步都生成一个带噪音的数据xtx_txt,整个扩散过程也就是一个马尔卡夫链:
q(x1:T∣x0)=∏t=1Tq(xt∣xt−1)q(x_{1:T}|x_0) = \prod_{t=1}^Tq(x_t|x_{t-1}) q(x1:Tx0)=t=1Tq(xtxt1)
扩散过程往往是固定的,即采用一个预先定义好的variance schedule,比如DDPM就采用一个线性的variance schedule。
扩散过程的一个重要特性是我们可以直接基于原始数据x0x_0x0来对任意ttt
步的xtx_txt进行采样:xt∼q(xt∣x0)x_t \sim q(x_t|x_0)xtq(xtx0)。定义αt=1−βt\alpha_t = 1-\beta_tαt=1βtαˉ=∏i=1tαi\bar{\alpha} = \prod_{i=1}^t \alpha_iαˉ=i=1tαi。通过重参数技巧(和VAE类似),那么有:
在这里插入图片描述
返重参数化后,得到:
q(xt∣x0)=N(xt;αtˉx0,(1−αtˉ)I)q(x_t|x_0) = \mathcal{N}(x_t;\sqrt{\bar{\alpha_t}}x_0, (1-\bar{\alpha_t})\mathbf{I}) q(xtx0)=N(xt;αtˉx0,(1αtˉ)I)
可以看到xtx_txt其实可以看成是原始数据x0x_0x0和随机噪音ϵ\epsilonϵ的线性组合,其中αtˉ\sqrt{\bar{\alpha_t}}αtˉ1−αtˉ\sqrt{1-\bar{\alpha_t}}1αtˉ为组合系数,它们的平方和等于1,我们也可以称两者分别为signal_rate和noise_rate。我们直接将αtˉ\bar{\alpha_t}αtˉ设定为一个接近0的值,那么就可以保证最终得到的xTx_TxT近似为一个随机噪音。其次,后面的建模和分析过程将使用这个特性。

a. 为什么扩散率是逐渐增大的呢,也即为什么噪音所占的比例越来越大呢?
在加噪声的过程中,扩散率逐渐增大,对应着在去噪声的过程中,扩散率逐渐减小,也就是说,去噪的过程是先把"明显"的噪声给去除,对应着较大的扩散率;当去到一定程度,逐渐逼近真实真实图像的时候,去噪速率逐渐减慢,开始微调,也就是对应着较小的扩散率
b. 重参数化技巧
如果要对高斯分布N(μ,σ2)\mathcal{N}(\mu, \sigma^2)N(μ,σ2)进行采样一个噪声ϵ\epsilonϵ,等价于先从标准正态分布N(0,1)\mathcal{N}(0,1)N(0,1)中采样的到一个噪声z\mathbf{z}z,然后对其乘上标准差σ\sigmaσ,加上均值 μ\muμ,即ϵ=μ+σ⋅z\epsilon=\mu+\sigma\cdot\mathbf{z}ϵ=μ+σz。举个例子,上面我们已经得到了xt\mathbf{x}_txt是从高斯分布N(1−βtxt−1,βtI)\mathcal{N}(\sqrt{1-\beta_{t}}\mathbf{x}_{t-1},\beta_{t}\mathbf{I})N(1βtxt1,βtI)采样出来的噪声,该高斯分布的均值为1−βtxt−1\sqrt{1-\beta_{t}}\mathbf{x}_{t-1}1βtxt1标准差为βt\sqrt{\beta_{t}}βt,所以xt=1−βtxt−1+βtz\mathbf{x}_t=\sqrt{1-\beta_{t}}\mathbf{x}_{t-1}+\sqrt{\beta_{t}}\mathbf{z}xt=1βtxt1+βtz

反向过程

扩散过程是将数据噪音化,那么反向过程就是一个去噪的过程,如果我们知道反向过程的每一步的真实分布q(xt−1∣xt)q(x_{t-1}|x_{t} )q(xt1xt),那么从一个随机噪音xT∼N(0,I)x_T \sim \mathcal{N}(0,\mathbf{I})xTN(0,I)逐渐去噪就能生成一个真实的样本,所以反向过程也就是生成数据的过程。

根据贝叶斯公式:
q(xt−1∣xt,x0)=q(xt∣xt−1,x0)q(xt−1∣x0)q(xt∣x0)q(x_{t-1}|x_{t},x_0) = q(x_{t}|x_{t-1},x_0) \frac{q(x_{t-1}|x_{0})}{q(x_{t}|x_{0})} q(xt1xt,x0)=q(xtxt1,x0)q(xtx0)q(xt1x0)
根据前向过程,已知:在这里插入图片描述
把标准正态分布展开后,乘法相当于加,除法就相当于减。则可以得到分布:
在这里插入图片描述
进一步化简,得到 :
在这里插入图片描述
在这里插入图片描述

可以得到,后验分布q(xt−1∣xt,x0)q(x_{t-1}|x_{t},x_0)q(xt1xt,x0)的均值和方差:
在这里插入图片描述

可以看到方差是一个定量(扩散过程参数固定),而均值是一个依赖x0x_0x0xtx_txt的函数。模型预测在xtx_txt在t时刻的噪音ztz_tzt,求解近似ztz_tzt

在这里插入图片描述

训练部分

  • 首先在真实图像分布q(x0)q(\mathbf{x}_0)q(x0),也即我们的训练图像
  • 在区间1,…,T中随机生成一个t,代表扩散(加噪)次数
  • 在标准正态分布中采样一个随机噪声
  • 计算损失函数:让网络预测的噪声与真实的噪声一致。

这里的t做一个时间编码喂入网络中,因为在后向过程中,每一次迭代的网络都是相同的,即参数共享,那怎么让网络知道现在迭代到哪一步呢,那么我们就将t一同传进去参与训练,用t来告诉网络进行到第几次迭代了。时间编码和transformer中的位置编码类似。

Stable Diffusion

论文
Stable Diffusion基于Latent Diffusion Models,专门用于文图生成任务。
论文贡献

  • Diffusion model相比GAN可以取得更好的图片生成效果,然而该模型是一种自回归模型,需要反复迭代计算,因此训练和推理代价都很高。论文提出一种在潜在表示空间(latent space)上进行diffusion过程的方法,从而能够大大减少计算复杂度,同时也能达到十分不错的图片生成效果。
  • 相比于其它空间压缩方法,论文提出的方法可以生成更细致的图像,并且在高分辨率图片生成任务(如风景图生成,百万像素图像)上表现得也很好。
  • 论文将该模型在无条件图片生成(unconditional image synthesis), 图片修复(inpainting),图片超分(super-resolution)任务上进行了实验,都取得了不错的效果。
  • 论文还提出了cross-attention的方法来实现多模态训练,使得条件图片生成任务也可以实现。论文中提到的条件图片生成任务包括类别条件图片生成(class-condition), 文图生成(text-to-image), 布局条件图片生成(layout-to-image)。这也为日后Stable Diffusion的开发奠定了基础。

Latent Diffusion Models整体框架如图,首先需要训练好一个自编码模型(AutoEncoder,包括一个编码器 E\mathcal{E}E和一个解码器D\mathcal{D}D )。这样就可以利用编码器E\mathcal{E}E对图片进行压缩,然后在潜在表示空间上做diffusion操作,最后再用解码器D\mathcal{D}D 恢复到原始像素空间。论文将这个方法称之为感知压缩(Perceptual Compression)。在这里插入图片描述
在潜在表示空间上做diffusion操作其主要过程和标准的扩散模型没有太大的区别,所用到的扩散模型的具体实现为 time-conditional UNet。有一个重要的地方是论文为diffusion操作引入了条件机制(Conditioning Mechanisms),通过cross-attention的方式来实现多模态训练,使得条件图片生成任务也可以实现。

图片感知压缩

感知压缩主要利用一个预训练的自编码模型,该模型能够学习到一个在感知上等同于图像空间的潜在表示空间。这种方法的一个优势是只需要训练一个通用的自编码模型,就可以用于不同的扩散模型的训练,在不同的任务上使用。这样一来,感知压缩的方法除了应用在标准的无条件图片生成外,也可以十分方便的拓展到各种图像到图像(inpainting,super-resolution)和文本到图像(text-to-image)任务上。

基于感知压缩的扩散模型的训练本质上是一个两阶段训练的过程,第一阶段需要训练一个自编码器,第二阶段才需要训练扩散模型本身。在第一阶段训练自编码器时,为了避免潜在表示空间出现高度的异化,作者使用了两种正则化方法,一种是KL-reg,另一种是VQ-reg,因此在官方发布的一阶段预训练模型中,会看到KL和VQ两种实现。在Stable Diffusion中主要采用AutoencoderKL这种实现。

具体来说,给定图像x∈RH×W×3x\in \mathbb{R}^{H\times W\times 3}xRH×W×3,先利用一个编码器 E\mathcal{E}E来将图像编码到潜在表示空间z=E(x)z = \mathcal{E}(x)z=E(x),其中x∈Rh×w×cx\in \mathbb{R}^{h\times w\times c}xRh×w×c,然后再用解码器从潜在表示空间重建图片x^=D(z)=D(E(x))\hat{x} = \mathcal{D}(z) = \mathcal{D}(\mathcal{E}(x))x^=D(z)=D(E(x))

潜在扩散模型

扩散模型可以解释为一个时序去噪自编码器,其目标是根据输入去预测一个对应去噪后的变体,或者说预测噪音,相应的目标函数可以写成如下形式:
在这里插入图片描述
在潜在扩散模型中,引入了预训练的感知压缩模型,它包括一个编码器和一个解码器 。这样就可以利用在训练时就可以利用编码器得到。从而让模型在潜在表示空间中学习,相应的目标函数可以写成如下形式:
在这里插入图片描述

条件机制

除了无条件图片生成外,我们也可以进行条件图片生成,这主要是通过拓展得到一个条件时序去噪自编码器ϵθ(zt,t,y)\epsilon_{\theta} (z_t,t,y)ϵθ(zt,t,y)

通过yyy来控制图片合成的过程。论文通过在UNet主干网络上增加cross-attention机制来实现。为了能够从多个不同的模态预处理y,论文引入了一个领域专用编码器,它用来将 y 映射为一个中间表示。这样我们就可以很方便的引入各种形态的条件(文本、类别、layout等等)。最终模型就可以通过一个cross-attention层映射将控制信息融入到UNet的中间层,cross-attention层的实现如下:
在这里插入图片描述

实验

感知压缩权衡

下采样因子f,f=H/h=W/wf=H/h=W/wf=H/h=W/w,如果f=1f=1f=1等于没有对输入的像素空间进行压缩,如果fff越大,则信息压缩越严重,可能会噪声图片失真,但是训练资源占用的也越少。论文对比了fff在分别 {1,2,3,4,8,16,32}\{1,2,3,4,8,16,32\}{1,2,3,4,8,16,32}下的效果,发现fff{4−16}\{4-16\}{416}之间可以比较好的平衡压缩效率与视觉感知效果。作者重点推荐了LDM-4和LDM-8。
下采样因子对比实验,横坐标train step,左纵坐标FID,右纵坐标Inception Score
其中:FID(Fréchet Inception Distance)是一种评价GAN的指标,是表示生成图像的多样性和质量,FID越小,则图像多样性越好,质量越好。IS(Inception Score)被用来描述随机性,指标衡量的是生成模型的两个能力:生成图片的质量和生成图片的多样性。

Versatile Diffusion : Text, Images and Variations All in One Diffusion Model

论文 代码
供一种统一模型去处理:文本到图像、图像到文本生成、图像编辑等多功能扩散模型。

多功能框架需要面向不同任务,这往往需要设计不同模型,因此Versatile Diffusion提出将现有的单流扩散管道扩展为多流网络,这样就能在一个统一的模型中处理文本到图像、图像到文本、图像编辑和文本变体。具体模型结构如下所示:
在这里插入图片描述
借鉴Stable Diffusion,文章在单流扩散时使用autoKL作为VAEs的编码和解码部分,使用UNet作为噪声预测网络,使用CLIP/Bert作为Context的条件输入。为了统一多流任务,VD包含以下三个部分,

  • Diffuser:采用带有cross-attention的UNet网络。即在文到图生成任务下,采用图片UNet和文本的cross-attention上下文;在图到图生成任务下,采用图片的UNet和图片的cross-attention上下文,如上图所示不同颜色的线。
  • VAE:图像使用Stable Diffusion相同的Autoencoder-KL,文本使用Bert编码、GPT2解码。
  • Context encoder:图像和文本都基于CLIP。

文章将扩散器分为三层:全局层(global layers),数据层(data layers),上下文层(context layers)。例如Stable Diffusion中time-embedding是全局层,残差网络(UNet)是数据层,cross-attention是上下文层。在文到图生成任务下,扩散器采用图片的数据层和文本的上下文;在图到图生成任务下,扩散器采用图片的数据层和图片的上下文。
基于此框架训练时选择一系列的支撑任务来计算所有的loss,并且使用可定制的梯度计算器同时优化每个层。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何定位Spark数据倾斜问题,解决方案

文章目录前言一、数据倾斜和数据过量二、 数据倾斜的表现三、定位数据倾斜问题定位思路:查看任务-》查看Stage-》查看代码四、7种典型的数据倾斜场景解决方案一:聚合元数据解决方案二:过滤导致倾斜的key解决方案三:提高shuffle操作…

1.docker-安装及使用

1.安装步骤 Install Docker Engine on CentOS 1. 确定CenOS7及以上版本 cat /etc/redhat-release2.卸载旧版本 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine3.yum安…

Spimes x5.0主题模板全开源源码/Typecho主题模板

☑️ 品牌:Typecho ☑️ 语言:PHP ☑️ 类型:主题模板 ☑️ 支持:PCWAP 🎉有需要的朋友记得关赞评,底部分享获取!!! 🎉 ✨ 源码介绍 Spimes x5.0主题模板全开…

基于overleaf 的美国大学生数学建模竞赛(美赛)latex 格式模板(含信件和附件)

可能是最后一次打美赛了,感觉有的东西不整理整理有点对不起自己的经历。感觉为这个比赛付出过挺多的,这几次参赛的经历也从各种方面提升了我的能力,相信未来的自己也还会怀念这段时光。 个人认为美赛的难点之一就是优质资源难得,…

Pytorch深度学习笔记(三)线性模型

目录 1.机械学习的过程 2.线性模型 1.机械学习的过程 机械学习的过程: 1.准备数据集DataSet——>2.选择模型Model——>3.训练Training——>4.推理Infering 监督学习:用已知标签的训练样本训练模型,用来预测未来输入样本的标签&#…

Android---内存泄漏检测核心原理

目录 LeakCanary 核心原理 LeakCanary 检测对象的类型 ReferenceQueue 与 WeakReference LeakCanary 里的监控列表与保留列表 常见内存泄漏案例 1. 单例导致内存泄漏 2. 静态变量导致内存泄漏 3. 非静态内部类导致内存泄漏 4. 未取消注册或回调导致内存泄漏 5. Timer…

ChatGPT的发展对客户支持能提供什么帮助?

多数组织认为客户服务是一种开销,实际上还可以将客户服务看成是一种机会。它可以让你在销售后继续推动客户的价值。成功的企业深知,客户服务不仅可以留住客户,还可以增加企业收入。客户服务是被低估的手段,它可以通过推荐、见证和…

AI绘画与虚拟人生成实践(一):生成人像,AI绘画模型和工具的效果对比

本篇的目的是生成一个虚拟的女生形象。先进入正题说明人像怎么生成,本篇使用到的工具和工具的介绍放在文末。 先来一波Midjourney生成的美图提升下大家学习的欲望 以上四张图使用的是相同的Prompt,如下: a beautiful chinese girl, 18 years old, detailed and big eye…

【c++初阶】命名空间的定义

命名空间的定义一.缺陷二.namespace和::三.访问namespace四.一些注意1.工程里标准库的展开2.命名域的小技巧一.缺陷 在c语言中,如果我们同时定义一个全局变量和一个局部变量并且使用同一个名称的话,是可以编过的(因为全局和局部是属于两个不同…

算法训练Day25:216.组合总和III ,17.电话号码的字母组合

文章目录[组合总和 III](https://leetcode.cn/problems/combination-sum-iii/description/)题解电话号码的字母组合题解组合总和 III CategoryDifficultyLikesDislikesContestSlugProblemIndexScorealgorithmsMedium (71.84%)6570--0 TagsCompanies 找出所有相加之和为 n 的 …

分子生物学 第五章 DNA损伤修复和突变

文章目录第五章 DNA损伤修复和突变第一节第二节 DNA损伤的类型1 造成DNA损伤的因素2 DNA损伤的类型3 DNA损伤修复机制3.1 直接修复3.2 切除修复3.3 双链断裂修复3.4 重组修复3.5 跨越合成第五章 DNA损伤修复和突变 第一节 损伤:比如碱基,甲基化 突变&…

JavaWeb——锁策略, cas和synchronized优化过程

目录 一、锁策略 1、悲观锁和乐观锁 2、轻量级锁和重量级锁 3、自旋锁和挂起等待锁 4、互斥锁和读写锁 5、可重入锁和不可重入锁 6、公平锁和非公平锁 二、cas和synchronized 优化过程 1、CAS(compare and swap) (1)、原…

路由器的两种工作模式及快速通过express搭建微型服务器流程,解决刷新页面服务端404的问题

history模式与hash模式 首先这个#叫做hash,最大的特点就是不会随的http请求,发给服务器。 默认的模式是hash模式,如果想要修改,可以在router里面的index.js中配置mode属性, 它们俩直接的区别最明面上的有没有#和hist…

类型转换——C++

1. C语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化, C语言中总共有两种形式的类型转换:隐式类型转换…

linux工具gcc/g++/gdb/git的使用

目录 gcc/g 基本概念 指令集 函数库 (重要) gdb使用 基本概念 指令集 项目自动化构建工具make/makefile 进度条小程序 ​编辑 git三板斧 创建仓库 git add git commit git push git status git log gcc/g 基本概念 gcc/g称为编译器…

[ 应急响应基础篇 ] evtx提取安全日志 事件查看器提取安全日志

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

Java阶段一Day22

Java阶段一Day22 文章目录Java阶段一Day22线程安全synchronized教师总结新单词多线程多线程并发安全问题概念例synchronized关键字同步方法同步块在静态方法上使用synchronized互斥锁总结重点:多线程并发安全问题聊天室(续)实现服务端发送消息给客户端服务端转发消息给所有客户…

Android FrameWork 知识点与面试题整合~

1.如何对 Android 应用进行性能分析 android 性能主要之响应速度 和UI刷新速度。 首先从函数的耗时来说,有一个工具TraceView 这是androidsdk自带的工作,用于测量函数耗时的。 UI布局的分析,可以有2块,一块就是Hierarchy Viewe…

SpringBoot集成Mybatis-Plus实现多租户动态数据源

1. 概述 最近接手一个多租户系统,多租户主要的就是租户之间的数据是相互隔离的,每个租户拥有自己独立的数据,相互之间不干扰。目前实现多租户主要有三种方案: 独立数据库 每个租户拥有自己单独的数据库,从物理上隔离了…

手写一个IO泄露监测框架

作者:长安皈故里 大家好,最近由于项目原因,对IO资源泄漏的监测进行了一番调研深入了解,发现IO泄漏监测框架实现成本比较低,效果很显著;同时由于IO监测涉及到反射,还了解到了通过一种巧妙的方式实…