1. DDPM模型概述

1. DDPM模型概述

扩散模型(DM,Diffusion Model)是一类生成模型,常见的生成模型还有GAN和VAE。扩散模型分为前向阶段和逆向阶段,在前向阶段中逐步向数据中添加噪声,直至数据变成完全的高斯噪声,然后在逆向阶段学习从高斯噪声中还原为原始数据。

image

图1 扩散模型的前向阶段和逆向阶段. (图片来源:Ho et al. 2020)

前向阶段表示为图1中从右往左的过程。从原始图像�0开始,第�步在��−1的基础上添加噪声得到��。��只与��−1有关,直至�步后��完全变为高斯噪声。逆向过程表示为图1中从左往右的过程。首先给定高斯噪声��,通过逐步去噪,直至将原始数据�0恢复。

模型训练完后,只要给定高斯噪声就能够生成对应的图片,这样就达到了生成各种图片的目的。

2. DDPM模型原理

以DDPM(Denoising Diffusion Probabilistic Models)为例,讲解扩散模型的基本原理。

2.1 前向阶段

假设原始数据�0采样自真实分布�(�),前向阶段就是逐步往数据中添加高斯噪声,从而产生噪声序列�1,�2,⋯,��。由于��只与��−1有关,因此满足:

(1)�(�1:�|�0)=∏�=1��(��|��−1)

添加噪声的过程可以描述为条件概率分布:

(2)�(��|��−1)=�(��;1−����−1,���)

式(2)表示��服从正态分布�(1−����−1,���),其中��∈(0,1)是高斯分布的方差超参,表示��的方差,且满足�1<�2<⋯<��。随着�增大,��的分布逐步趋向于标准正态分布。

式(2)中有一项1−����−1,这其实是为了重参数化技巧(从标准正态分布�中按照�=�+�⊙�来采样分布�(�,�2�))设置的,我们可以推导一下。令��=1−��, �¯�=∏�=1���,�⋅是标准正态分布。有如下关系:

(3)��=����−1+1−����−1;reparameterization trick=��(��−1��−2+1−��−1��−2)+1−����−1=����−1��−2+(��(1−��−1)��−2+1−����−1)=����−1��−2+1−����−1�¯�−2;merge two Gaussians=…;merge all Gaussians=��¯�0+1−�¯��;�∼�(0,�)

这里合并��−2和��−1用到了性质�(0,�12�)+�(0,�22�)=�(0,(�12+�22)�),因此有:

(4)��(1−��−1)��−2+1−����−1∼�(0,(��(1−��−1)+1−��)�)

因此,从式(3)可以得到:

(5)�(��|�0)=�(��;��¯�0,(1−�¯�)�)

我们容易知道1>�1>�2>⋯>��>0,当�→∞时,�¯�=∏�=1���→0,此时��∼�(0,�)是标准正态分布。因此式(2)中均值是1−����−1可以使得最终��收敛到标准正态分布。

2.2 逆向阶段

前向阶段不断往数据中加入噪声得到��,逆向过程就是从��一步步去除噪声获得原始输入�0的过程。如果我们知道真实分布�(��|��−1),那么我们很容易生成原始数据。然而,我们获取不到真实分布,因此需要使用模型��来学习分布�(��|��−1)。其中�是模型参数:

(6)��(�0:�)=�(��)∏�=1���(��−1|��)��(��−1|��)=�(��−1;��(��,�),Σ�(��,�))

虽然我们无法求得真实分布�(��−1|��),但是在已知�0的情况下,我们可以根据贝叶斯公式得到�(��−1|��,�0):

�(��−1|��,�0)=�(��,��−1,�0)�(��,�0)=�(��|��−1,�0)⋅�(��−1,�0)�(��|�0)⋅�(�0)=�(��|��−1,�0)⋅�(��−1|�0)⋅�(�0)�(��|�0)⋅�(�0)=�(��|��−1,�0)⋅�(��−1|�0)�(��|�0)∝exp⁡(−12((��−����−1)2��+(��−1−�¯�−1�0)21−�¯�−1−(��−�¯��0)21−�¯�))) ;because (2) and (3)=exp⁡(−12(��2−2������−1+����−12��+��−12−2�¯�−1�0��−1+�¯�−1�021−�¯�−1−(��−�¯��0)21−�¯�)))=exp⁡(−12((����+11−�¯�−1))��−12−(2������+2�¯�−11−�¯�−1�0)��−1+�(��,�0))

上式巧妙地通过贝叶斯公式将逆向过程转换为前向过程,且最终得到的概率密度函数和高斯概率密度函数的指数部分exp⁡(−(�−�)22�2)=exp⁡(−12(1�2�2−2��2�+�2�2))相对应。其中�(��,�0)是与��−1无关的常数项。令:

(7)�(��−1|��,�0)∼�(��−1;�~(��,�0),�~��)

我们将绿色部分与红色部分一一对应,有:

(8)�~�=1����+11−�¯�−1=��⋅(1−�¯�−1)��−�¯�+��=��⋅1−�¯�−11−�¯��~(��,�0)=(2������+2�¯�−11−�¯�−1�0)/(����+11−�¯�−1)=(2������+2�¯�−11−�¯�−1�0)⋅��⋅1−�¯�−11−�¯�=��(1−�¯�−1)1−�¯���+��−1��1−�¯��0

式(3)揭示了��和�0的关系,我们可以使用��来表示�0,有:

(9)�0=1�¯�(��−1−�¯���)

将式(9)代入到式(8)的�~(��,�0)项,有:

(10)��~=��(1−�¯�−1)1−�¯���+��−1��1−�¯�⋅1�¯�(��−1−�¯���)=��(1−�¯�−1)��(1−�¯�)��+����(1−�¯�)(��−1−�¯���)=����−�¯���+(1−��)��−(1−��)1−�¯�����(1−�¯�)=(1−�¯�)��−(1−��)1−�¯�����(1−�¯�)=1��(��−1−��1−�¯���)

2.3 模型训练

模型的目标是最大化对数似然,即优化在�0∼�(�0)下��(�0)的交叉熵:

���=��(�0)[−log⁡��(�0)]

和VAE类似,可以使用VLB(Variational Lower Bound)来优化负对数似然:

与无关与无关(11)−log⁡��(�0)≤−log⁡��(�0)+���(�(�1:�|�0)||��(�1:�|�0))=−log⁡��(�0)+��1:�∼�(�1:�|�0)[log⁡�(�1:�|�0)��(�0:�)/��(�0)];Bayes' rule=−log⁡��(�0)+��(�1:�|�0)[log⁡�(�1:�|�0)��(�0:�)+log⁡��(�0)⏟与�无关]=−log⁡��(�0)+��(�1:�|�0)[log⁡�(�1:�|�0)��(�0:�)]+log⁡��(�0)=��(�1:�|�0)[log⁡�(�1:�|�0)��(�0:�)]

注意到式(11)的左边求期望就是���,我们可以对式(11)右边也求期望,根据Fubini定理,有:

��(�0)(��(�1:�|�0)[log⁡�(�1:�|�0)��(�0:�)])=��(�0:�)[log⁡�(�1:�|�0)��(�0:�)]≜����

于是我们找到了���的上界,即:

(12)���=��(�0)[−log⁡��(�0)]≤����

可以通过最小化����来最小化���。

除了从式(11)中利用Fubini定理推导出式(12),还可以使用Jensen不等式直接推导,具体如下:

���=−��(�0)log⁡��(�0)=−��(�0)log⁡(∫��(�0:�)��1:�);Law of total probability=−��(�0)log⁡(∫�(�1:�|�0)��(�0:�)�(�1:�|�0)��1:�)=−��(�0)log⁡(��(�1:�|�0)��(�0:�)�(�1:�|�0))≤−��(�0:�)log⁡��(�0:�)�(�1:�|�0);�(�[�])≤�[�(�)]=��(�0:�)log⁡�(�1:�|�0)��(�0:�)=����

虽然����能够作为模型的优化目标,但目前为止它是不好计算的,所以还需要进一步化简:

(13)����=��(�0:�)[log⁡�(�1:�|�0)��(�0:�)]=��[log⁡∏�=1��(��|��−1)��(��)∏�=1���(��−1|��)]=��[−log⁡��(��)+∑�=1�log⁡�(��|��−1)��(��−1|��)];see Eq.14=��[−log⁡��(��)+∑�=2�log⁡�(��|��−1)��(��−1|��)+log⁡�(�1|�0)��(�0|�1)]=��[−log⁡��(��)+∑�=2�log⁡(�(��−1|��,�0)��(��−1|��)⋅�(��|�0)�(��−1|�0))+log⁡�(�1|�0)��(�0|�1)]=��[−log⁡��(��)+∑�=2�log⁡�(��−1|��,�0)��(��−1|��)+∑�=2�log⁡�(��|�0)�(��−1|�0)+log⁡�(�1|�0)��(�0|�1)]=��[−log⁡��(��)+∑�=2�log⁡�(��−1|��,�0)��(��−1|��)+log⁡�(��|�0)�(�1|�0)+log⁡�(�1|�0)��(�0|�1)]=��[log⁡�(��|�0)��(��)+∑�=2�log⁡�(��−1|��,�0)��(��−1|��)−log⁡��(�0|�1)]=��[���(�(��|�0)||��(��))⏟��+∑�=2����(�(��−1|��,�0)||��(��−1|��))⏟��−1−log⁡��(�0|�1)⏟�0]

其中,式(13)的第3行到第4行的变换可以参考下面过程:

(14)�(��|��−1)=�(��,��−1)�(��−1)=�(��,��−1|�0)�(�0)�(��−1|�0)�(�0)=�(��|��−1,�0)�(��|�0)�(��−1|�0)

于是,我们可以将����拆解成如下形式:

(15)����=��+��−1+⋯+�0s.t.��=���(�(��|�0)||��(��))��=���(�(��−1|��,�0)||��(��−1|��))1≤�≤�−1�0=log⁡��(�0|�1)

除了�0外,每一项KL项都是比较两个高斯分布。��是一个常数,因为��是标准正态分布,而�没有可学习的参数,所以训练时可以忽略��这一项。在Ho et al. 2020工作中,�0这一项是单独建模的,接下来我们主要讨论��怎么计算。

��要求分布�(��|��−1)=�(��−1;�~(��,�0),�~��)和��(��−1|��)=�(��−1;��(��,�),Σ�(��,�))之间的KL散度。因此我们希望模型��(��,�)预估�~�=1��(��−1−��1−�¯���)(式10)。由于��在训练阶段会作为输入,因此它是已知的,我们可以转而让模型去预估噪声��,即:

(16)��(��,�)=1��(��−1−��1−�¯���(��,�))

��(��,�)需要预测在前向阶段加入到��的噪声。因此有:

(17)��(��−1|��)=�(��−1;1��(��−1−��1−�¯���(��,�)),Σ�(��,�))

于是我们可以根据多元正态分布的KL散度进行如下推导(忽略常数项):

(18)��=��0,�[12‖Σ�(��,�)‖22‖��~(��,�0)−��(��,�)‖2]=��0,�[12‖Σ�(��,�)‖22‖1��(��−1−��1−�¯���)−1��(��−1−��1−�¯���(��,�))‖2]=��0,�[(1−��)22��(1−�¯�)‖Σ�(��,�)‖22‖��−��(��,�))‖2]=��0,�[(1−��)22��(1−�¯�)‖Σ�(��,�)‖22‖��−��(��¯�0+1−�¯���,�))‖2];because Eq.3

实验中,Ho et al. 2020发现忽略优化式(17)的的权重部分效果更好,也就是:

(19)��simple=��∼[1,�],�0,��[‖��−��(��,�)‖2]=��∼[1,�],�0,��[‖��−��(��¯�0+1−�¯���,�))‖2]

于是,最终DDPM模型的训练和采样算法如图2所示。

image

图2 DDPM模型的训练和采样算法. (图片来源:Ho et al. 2020)

训练阶段,每次采样数据�0,然后采样时间步�和该步的高斯噪声��,然后根据模型预测的高斯噪声与实际的噪声计算损失并更新参数。

采样阶段(逆向阶段),首先从标准高斯分布中采样��,然后串行执行逆向过程。在每一步中,首先从标准正态分布中采样�用于重参数化。我们需要根据��生成��−1,首先根据式(17)计算出��−1的均值,然后根据式(8)得到��−1的方差��=�~�,拿到均值和方差后就可以通过重参数化技巧得到��−1,最终生成�0。

3. 模型加速

DDPM模型整个流程分为前向阶段和逆向阶段,前向阶段和逆向阶段可能有上千步,因此用它生成样本实际上是很慢的,远远低于GAN生成样本的速度。一种简单的改进方法是进行等距采样(Nichol & Dhariwal, 2021),比如从�步中等距抽取�步,新的采样时间步可以表示为{�1,�2,…,��},其中�1<�2<⋯<��∈[1,�],�<�。

参考资料

[1] lilianweng,"What are Diffusion Models?",What are Diffusion Models? | Lil'Log.
[2] 珍妮的选择,"扩散模型 (Diffusion Model) 简要介绍与源码分析",扩散模型 (Diffusion Model) 简要介绍与源码分析 - 知乎.

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

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

相关文章

Redis高可用之哨兵模式和集群模式

Redis高可用 Redis哨兵高可用 概述 sentinel哨兵是特殊的redis服务&#xff0c;不提供读写服务&#xff0c;主要用来监控redis实例节点。 哨兵架构下client端第一次从哨兵找出redis的主节点&#xff0c;后续就直接访问redis的主节点 不会每次都通过sentinel代理访问redis的主…

网络地址转换协议NAT

网络地址转换协议NAT NAT的定义 NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09;是1994年提出的。当在专用网内部的一些主机本来已经分配到了本地IP地址&#xff08;即仅在本专用网内使用的专用地址&#xff09;&#xff0c;但现在又想和因…

YOLOv8改进 | 注意力机制 | 添加YOLO-Face提出的SEAM注意力机制优化物体遮挡检测(附代码 + 修改教程)

一、本文介绍 本文给大家带来的改进机制是由YOLO-Face提出能够改善物体遮挡检测的注意力机制SEAM,SEAM(Spatially Enhanced Attention Module)注意力网络模块旨在补偿被遮挡面部的响应损失,通过增强未遮挡面部的响应来实现这一目标,其希望通过学习遮挡面和未遮挡面之间的…

Word转PDF保持图片原有清晰度

目录 1、需要的软件 2、配置Acrobat PDFMaker 3、配置Acrobat Distiller 4、更改Acrobat PDFMaker中的首选项 5、将word转换成pdf 1、需要的软件 利用Adobe Acrobat DC工具。 打开word&#xff0c;选择Acrobat的插件&#xff0c;选择首选项。 如果没有出现Acrobat插件也…

Java学习记录(十七)IO流(三)

转换流&#xff08;在字节流中想使用字符流的方法时使用&#xff09; 转换流是字节流和字符流之间的桥梁&#xff0c;转换流本身其实就是字符流所以可以使用字符流里的相关方法&#xff0c;通过InputStreamReader字符转换输入流能将字节流转化为字符流输入到内存中&#xff0c…

基于java的公寓报修管理系统设计与实现(程序+文档+数据库)

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一、研究背景…

portraiture2024汉化版PS人像处理的磨皮美化插件

Portraiture插件是一款广泛应用于人像处理的磨皮美化插件&#xff0c;尤其在Photoshop和Lightroom等图像编辑软件中备受欢迎。这款插件能够帮助用户快速实现智能磨皮效果&#xff0c;使皮肤看起来更加平滑细腻&#xff0c;同时保留自然纹理和其他重要细节。Portraiture是一款适…

STM32利用标准库编写同时输出4路PWM信号的程序(Proteus)仿真

先看看结果&#xff1a; 这个是根据上午发的文章的基础上更改的&#xff0c;很简单&#xff0c;只是用了一个定时器&#xff0c;初始化了4个比较器而已&#xff0c;就可以单独的控制每一路PWM的占空比了&#xff0c;好了&#xff0c;把源文件展示一下&#xff0c;完事去接孩子放…

NCDA大赛中哪些HTML5设计作品展现出色?

与传统的HTML网页设计相比&#xff0c;HTML5网页设计主要是对网页内容的加强。HTML5已成为目前最流行的标记语言&#xff0c;拥有成熟的社区和广泛的浏览器支持&#xff0c;HTML5完整的功能和强大的扩展性使设计师和开发者能够点铁成金。HTML5可以一手控制更多可控元素&#xf…

eggjs+egg-mongoose操作mongodb数据库

使用的数据库是mongodb数据库&#xff0c;mongodb的数据库表创建就不一一介绍了&#xff0c;可自行查询资料如何创建数据库。 使用的数据库可视化工具是mongodb compass 使用的接口工具是postman 这里使用的egg项目脚手架模板是simple版本&#xff0c;详细创建项目流程可在egg…

Redis常见数据类型下

目录 Hash 哈希 常用指令 HSET HGET HEXISTS HDEL HKEYS HVALS HGETALL HMGET 内部编码 Hash类型和关系型数据库 缓存方式对比 List 列表 特点 常用命令 LPUSH LPUSHX RPUSH RPUSHX LRANGE LPOP / RPOP LINDEX LINSERT 阻塞(BLOCK)版…

【Python】新手入门学习:什么是工作目录?

【Python】新手入门学习&#xff1a;什么是工作目录&#xff1f; &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得…

数据库不应放在容器中?- B站Kubernetes有状态服务实践(Elasticsearch/Clickhouse)

本期作者 前言 云原生时代下&#xff0c; Kubernetes已成为容器技术的事实标准&#xff0c; 使得基础设施领域应用下自动化运维管理与编排成为可能。对于无状态服务而言&#xff0c; 业界早已落地数套成熟且较完美的解决方案。可对于有状态的服务&#xff0c; 方案的复杂度就以…

StringBuilder --java学习笔记

StringBuilder 代表可变字符串对象&#xff0c;相当于是一个容器&#xff0c;它里面装的字符串是可以改变的&#xff0c;就是用来操作字符串的StringBuilder比String更适合做字符串的修改操作&#xff0c;效率会更高&#xff0c;代码也会更简洁 StringBuilder的常用构造器和方…

分享8款高效办公软件,让你准时下班

在现代职场中&#xff0c;办公软件已经成为我们日常工作中不可或缺的一部分。选择适合自己、高效且实用的办公软件&#xff0c;能大大提升我们的工作效率&#xff0c;从而帮助我们更好地平衡工作与生活。今天给大家分享8款高效办公软件&#xff0c;让你准时下班成为可能。 01、…

29 残差网络 ResNet【李沐动手学深度学习v2课程笔记】

目录 1. ResNet 1.1 残差块 1.2 ResNet块 1.3 总结 2. 代码实现 2.1 残差块 2.2 ResNet模型 2.3 训练模型 3. 小结 1. ResNet 1.1 残差块 只有当较复杂的函数类包含较小的函数类时&#xff0c;我们才能确保提高它们的性能。 1.2 ResNet块 五个stage 只不过是ResNet块…

Docker学习——Dock镜像

什么是Docker镜像 Docker 镜像类似于虚拟机镜像&#xff0c;可以将它理解为一个只读的模板。 一个镜像可以包含一个基本的操作系统环境&#xff0c;里面仅安装了 Apache 应用程序&#xff08;或 用户需要的其他软件&#xff09; 可以把它称为一个 Apache 镜像。镜像是创建 Do…

POS 之 提款密钥与验证者密钥

回顾之前的文章 文章标题文章地址&#x1f367;ETH网络中的账户https://blog.csdn.net/weixin_29491885/article/details/136318898&#x1f368;我们为什么需要助记词https://blog.csdn.net/weixin_29491885/article/details/135860211&#x1f9c1;一组助记词走遍天下也不怕…

嵌入式学习第二十六天!(网络传输:TCP编程、HTTP协议)

TCP通信&#xff1a; 1. TCP发端&#xff1a; socket -> connect -> send -> recv -> close 2. TCP收端&#xff1a; socket -> bind -> listen -> accept -> recv -> send -> close 3. TCP需要用到的函数&#xff1a; 1. co…

excel函数

1.VLOOKUP(B2.[测试部门.xls]结果集!$A:$C,1,FALSE)