论文阅读:Denoising Diffusion Probabilistic Models

news2024/11/18 11:48:16

论文阅读:Denoising Diffusion Probabilistic Models

最近一两年,在图像生成领域,扩散模型受到了越来越多的关注,特别是随着 DALL-E2 以及 Midjourney 的持续火爆,扩散模型也变得越来越流行,之前很多基于 GAN 的工作也逐渐被扩散模型所替代。今天介绍扩散模型里面非常重要的一篇文章,就是发表在 NeurIPS 2020 年的 Denoising Diffusion Probabilistic Models,即 DDPM。

在介绍 DDPM 之前,我们先回顾一下生成模型的发展历程。

在机器学习中,一般有两大类的模型,一类叫判别式模型,一类叫生成式模型。判别式模型就是给你一个输入,输出一个分类标签,输出一个检测框等等。而生成式模型,一般是学习一个概率分布,从概率分布中预测出数据的真实分布。生成模型在深度学习时代之前,基本也是用于一些分类任务,比如朴素贝叶斯,马尔科夫链等。但是随着深度学习的兴起,生成模型也开始在做 “生成” 任务了,在 DDPM 出现之前,比较主流的有 GAN, VAE, FLOW 等。下面这张图,就很好地展示了这几类生成式模型的基本思想:

在这里插入图片描述

  • 几种不同生成模型的示意图

首先是 GAN 模型,GAN 模型主要包含两部分,一部分称为判别器,一部分称为生成器,生成器的输入是高斯白噪声,而输出就是生成的图像,而判别器的输入就是一张图像,这张图像可以是生成器生成的图像,也可以是一张拍摄的真实图像,判别器的输出就是对输入图像的判别,如果输入图像是生成器生成的图像,判别器需要判别为 0,如果是拍摄的真实图像,那么判别器会判别为 1,生成器的最终目的就是让自己生成的图像判别器无法分辨出是生成的还是真实的,而判别器的目的就是将生成去生成的图像都能准确地判别出来,这就像是一种博弈,生成器就像是矛,判别器就像是盾,矛和盾不断相互提升,到达某种稳态的时候,生成器生成的图片就和真实拍摄的图片非常类似,可以达到以假乱真的地步。所以现在的 GAN 生成的图片都非常逼真。但是 GAN 也有一些致命的缺陷。首先是训练不太稳定,因为 GAN 本质上是一种博弈,需要最终达到一种微妙的平衡,如果训练不好,就有可能坍塌。

接下来看看 VAE 一系列的模型,最早的是 AE,也就是 Auto-Encoder,AE 的思想很简单,就是将一个高维的向量通过一个编码器压缩到一个低维的向量空间,然后再通过一个解码器重新映射回高维空间,所以 AE 解码器的输出就像编码器的输入,训练也比较简单直观。在 AE 之后,出现了 DAE,也就是 Denoising Autoencoder,DAE 与 AE 的流程也非常类似,唯一的区别在于编码器的输入,AE 的编码器的输入是原始的高维向量,而 DAE 的编码器的输入是对原始高维向量加入噪声扰动之后的高维向量,DAE 就是希望把加了噪声的高维向量恢复成原始的高维向量,这个过程有点像是对高维向量去噪,所以就叫 Denoising Autoencoder。不过 AE 和 DAE 中间的低维向量本质上是一种低维特征,并不是一个概率分布,所以为了能将中间的低维向量空间用一个概率分布区拟合,所以就有了 VAE,即 Variational Autoencoder,VAE 和之前的 AE, DAE 之间的区别就是 VAE 不再是学习低维特征本身,而是学习低维特征空间的一个概率分布,VAE 是用一个高斯分布来表征这个概率分布,而高斯分布本身可以用均值和方差来表征,所以 VAE 就是在学习低维特征空间概率分布的均值,方差,有了这个概率分布之后,可以通过对概率分布采样,再将采样得到的样本通过解码器,最后得到生成的高维向量。再往后,就是 VQ-VAE,Vector Quantised-Variational AutoEncoder,VQ-VAE 和 VAE 的区别在于,VAE 是学习一个低维空间的概率分布,而 VQ-VAE 将这个低维空间的概率分布用一个 codebook 做了替换,VQ-VAE 不再去学低维空间的概率分布,而是学习输入到 codebook 的映射,输入的图像通过一个编码器得到一个特征向量,特征向量与 codebook 里的预置向量进行匹配,寻找与输入特征向量最接近的一个预置向量,然后将这个预置向量送入后面的解码器,从而解码得到一个高维向量。不过 VQ-VAE 的问题在于它的特征隐空间被限制在了一个 codebook 里面了,无法再从一个概率分布中进行采样,为了改进这个,后面又出来了一个 VQ-VAE2,VQ-VAE2 就是在 VQ-VAE 的基础上进行了改进,训练了一个 prior 网络,prior 网络就是对 codebook 的一个建模,将固定的 codebook 换成了一个 prior 网络,这样就可以利用 prior 网络来实现采样。

而流模型也是一种生成模型,Flow 模型通过一系列可逆的变换去拟合真实的数据分布,虽然数学形式上更加优美,但是最后也没有火起来。

然后,就是最近一两年大火的 diffusion model,也就是扩散模型,在生成领域,风头已经盖过了之前的 GAN,VQ-VAE,俨然成为了新时代生成领域的霸主。

在这里插入图片描述

扩散模型的整个过程看起来非常简洁,给定一张图像,每次在图像上叠加很小的噪声,随着这个过程的进行,到一定次数的时候,原始的图像可能就完全被噪声所淹没了,假设 x 0 \mathbf{x}_0 x0 是从原始图像分布中抽取的一个初始样本,然后每次叠加少量的噪声,生成一系列的带噪图像, x 1 , x 2 , . . . , x T \mathbf{x}_1, \mathbf{x}_2, ..., \mathbf{x}_T x1,x2,...,xT,整个前向的扩散过程可以表示成如下的式子:

q ( x t ∣ x t − 1 ) = N ( x t , 1 − β t x t − 1 , β t I ) q ( x 1 : T ∣ x 0 ) = ∏ t = 1 T q ( x t ∣ x t − 1 ) q(\mathbf{x}_t | \mathbf{x}_{t-1}) = \mathcal{N}(\mathbf{x}_t, \sqrt{1 - \beta_{t}}\mathbf{x}_{t-1}, \beta_{t}\mathbf{I}) \quad q(\mathbf{x}_{1:T} | \mathbf{x}_{0}) = \prod_{t=1}^{T} q(\mathbf{x}_t | \mathbf{x}_{t-1}) q(xtxt1)=N(xt,1βt xt1,βtI)q(x1:Tx0)=t=1Tq(xtxt1)

可以看到,整个序列,当前的状态 x t \mathbf{x}_t xt 只和前一次的状态 x t − 1 \mathbf{x}_{t-1} xt1 有关,遵循马尔科夫随机过程,因为叠加的噪声是高斯噪声,而高斯分布的和依然是高斯分布,可以利用重参数化的技巧,将所有的中间状态 x t \mathbf{x}_t xt 与初始状态建立联系:

假设 α t = 1 − β t \alpha_{t} = 1 - \beta_{t} αt=1βt α t ˉ = ∏ i = 1 t α i \bar{\alpha_t} = \prod_{i=1}^{t} \alpha_{i} αtˉ=i=1tαi

在这里插入图片描述

  • 重参数化过程

前向的扩散过程,是一个逐渐加噪的过程,图像逐渐变成高斯噪声,那么反过来看,就是噪声逐渐变成图像的过程,这个过程也被称为逆扩散过程,如果能得到逆扩散过程的分布,那么给定一个随机噪声,就能通过逆扩散过程得到最终的图像。但是逆扩散过程的分布很难直接获得,所以扩散模型最终是通过学习一个模型来近似这个逆扩散过程,

p θ ( x 0 : T ) = p ( x T ) ∏ t = 1 T p θ ( x t − 1 ∣ x t ) p θ ( x t − 1 ∣ x t ) = N ( x t − 1 ; μ θ ( x t , t ) , Σ θ ( x t , t ) ) p_{\theta}(\mathbf{x}_{0:T}) = p(\mathbf{x}_T) \prod_{t=1}^{T} p_{\theta}(\mathbf{x}_{t-1} | \mathbf{x}_{t}) \quad p_{\theta}(\mathbf{x}_{t-1} | \mathbf{x}_{t}) = \mathcal{N}(\mathbf{x}_{t-1}; \mu_{\theta}(\mathbf{x}_t, t), \Sigma_{\theta}(\mathbf{x}_t, t)) pθ(x0:T)=p(xT)t=1Tpθ(xt1xt)pθ(xt1xt)=N(xt1;μθ(xt,t),Σθ(xt,t))

通过一堆眼花缭乱的推导(此处略去xx字),最终可以得到:

μ θ ( x t , t ) = 1 α t ( x t − 1 − α t 1 − α t ˉ ϵ θ ( x t , t ) ) \mu_{\theta}(\mathbf{x}_t, t) = \frac{1}{\sqrt{\alpha_t}}(\mathbf{x}_t - \frac{1-\alpha_t}{\sqrt{1-\bar{\alpha_t}}}\epsilon_{\theta}(\mathbf{x}_t, t )) μθ(xt,t)=αt 1(xt1αtˉ 1αtϵθ(xt,t))

x t − 1 = N ( x t − 1 ; 1 α t ( x t − 1 − α t 1 − α t ˉ ϵ θ ( x t , t ) ) , Σ θ ( x t , t ) ) \mathbf{x}_{t-1} = \mathcal{N}(\mathbf{x}_{t-1}; \frac{1}{\sqrt{\alpha_t}}(\mathbf{x}_t - \frac{1-\alpha_t}{\sqrt{1-\bar{\alpha_t}}}\epsilon_{\theta}(\mathbf{x}_t, t )), \Sigma_{\theta}(\mathbf{x}_t, t)) xt1=N(xt1;αt 1(xt1αtˉ 1αtϵθ(xt,t)),Σθ(xt,t))

而最终的扩散过程和逆扩散过程可以表示成如下是形式:

在这里插入图片描述

  • 扩散与采样过程的程序

  • 参考:

https://www.bilibili.com/video/BV17r4y1u77B/?spm_id_from=333.788&vd_source=bb80399e033aacf33a21a9f9864c6086

https://lilianweng.github.io/posts/2021-07-11-diffusion-models/

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

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

相关文章

C++ 参数的三种传递方式和应用场景

C 参数的三种传递方式分别是值传递、指针传递和引用传递。 值传递 值传递的实质 将实参的值(a、b)复制到形参(m、n)相应的存储单元中,即形参和实参分别占用不同的存储单元。 值传递的特点 值传递的特点是单向传递,即主调函数…

Java Web开发实战经典学习过程笔记

Java Web开发实战经典学习简单笔记 第一章 Java Web 开发简介 1.胖客户端程序指的是,当一个程序运行时需要一个单独的客户端程序支持(如:QQ)。瘦客户端程序在操作时不需要任何其他程序的安装(如:登录网上论坛,只需浏览器即可)。 2…

I.MX6ull UART

一 简介 UART 全称叫做串行接口,通常也叫做 COM 接口,串行接口指的是数据一个一个的顺序传输,通信线路简单。使用两条线即可实现双向通信,一条用于发送,一条用于接收。串口通信距离远,但是速度相对会低&…

Self-Attention 自注意力机制

输出形式 李宏毅讲到: 模型的输入是只有一种形式——词向量但是输出的形式却是不唯一的,主要有以下三种: 每一个向量对应一个输出(多对多,且一一对应) 每个序列只有一个输出(多对一) 一个序列对应一个序列(多对多,长…

MySQL 索引的10 个核心要点

文章目录 🍉1. 索引底层采用什么数据结构?为什么不用hash🍉2. B树与B树区别?为何用B树?🍉3. 自增主键理解?🍉4. 为什么自增主键不连续🍉5. Innodb为什么推荐用自增ID&…

代码随想录第59天

1.下一个更大元素II 有两种方法&#xff1a; 1.把两个一样的数组拼起来&#xff1a; // 版本一 class Solution { public:vector<int> nextGreaterElements(vector<int>& nums) {// 拼接一个新的numsvector<int> nums1(nums.begin(), nums.end());nu…

Chapter7: SpringBoot与数据访问

尚硅谷SpringBoot顶尖教程 1. JDBC 1.1 依赖及配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency><groupId>mysql</groupId…

《Reinforcement Learning: An Introduction》第4章笔记

Chapter 4 Dynamic Programming 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是一类在给定完备环境模型的MDP后用来计算最优策略的算法。动态规划算法在强化学习中因为&#xff1a;1. 假设有一个完美的环境模型&#xff1b;2. 极大的计算代价 实际用处…

树莓派4B连接不了产品开的热点

目的 关于树莓派连接不了产品开的5G热点&#xff0c; 当时还是一头雾水。 参考这篇博客 把思路方向转向了频率&#xff0c; 信道&#xff0c; 通过给的产品A相关规格说明wifi 5.18GHz, 信道36。 于是乎我两款产品A、产品B为例。 树莓派是能连接产品B开的热点&#xff08;5.74…

【Unity SRP】实现基础的Temporal AA(未完)

写在前面 【技术美术图形部分】简述主流及新的抗锯齿技术&#xff0c;花了点时间盘点了一些主流AA技术&#xff0c;再在SRP下的URP管线中实现一下目前游戏用得比较多的TAA。参考Unity的TAA&#xff08;比较容易懂&#xff09;以及sienaiwun的实现思路&#xff0c;也参考了很多…

OpenCV转换HDR图像与源码分析

我们常见的图像位深一般是8bit&#xff0c;颜色范围[0, 255]&#xff0c;称为标准动态范围SDR(Standard Dynamic Range)。SDR的颜色值有限&#xff0c;如果要图像色彩更鲜艳&#xff0c;那么就需要10bit&#xff0c;甚至12bit&#xff0c;称为高动态范围HDR(High Dynamic Range…

Docker部署ES集群、kibana、RabbitMq和chrome安装elasticsearch-head插件

文章目录 [toc] 1.安装ES集群和kibana1.1安装ES集群1.1.1 准备挂载目录1.1.2 准备配置文件1.1.3 启动命令1.1.3.0 启动前设置系统环境变量1.1.3.1 Windows10环境启动命令1.1.3.2 Linux环境启动命令 1.2安装kibana1.2.1 准备挂载目录1.2.2 准备配置文件1.2.3 启动命令1.2.3.1 Wi…

Spring IOC基于XML和注解管理Bean(一)

Spring IOC基于XML和注解管理Bean&#xff08;二&#xff09; 文章目录 1、IoC容器1.1、控制反转&#xff08;IoC&#xff09;1.2、依赖注入1.3、IoC容器在Spring的实现 2、基于XML管理Bean2.1、搭建模块spring-first2.2、实验一&#xff1a;获取bean①方式一&#xff1a;根据i…

过滤器和拦截器实现

说明&#xff1a;当用户未经登录&#xff0c;直接访问后台网址时&#xff0c;为了避免可以直接访问后台内容&#xff0c;就需要使用过滤器或拦截器将此类请求在服务器响应数据之前做核对&#xff0c;如果未登录&#xff0c;则驳回请求&#xff0c;返回登录页面&#xff0c;如果…

PyQt5桌面应用开发(20):界面设计结果自动测试(一)

本文目录 PyQt5桌面应用系列PyQt5的测试驱动开发&#xff08;Test-Driven Development&#xff0c;TDD&#xff09;QTestUI动作函数信号测试 最平凡的例子unittest框架总结 PyQt5桌面应用系列 PyQt5桌面应用开发&#xff08;1&#xff09;&#xff1a;需求分析 PyQt5桌面应用开…

【Apache Pinot】简单聊聊前面没讲的 Deep Store 和 Cluster

背景 前面3篇文章讲解了 Pinot 用的最多的几个组件&#xff0c;现在就聊最后剩下的两个&#xff0c;一个是 Cluster&#xff0c;另外一个就是 Deep Store。 Cluster 其实 Cluster 比较简单&#xff0c;就是一个概念的集合&#xff0c;他说有 Server&#xff0c;Broker 和 Co…

代码随想录算法训练营第五十六天 | 力扣 583. 两个字符串的删除操作, 72. 编辑距离

583. 两个字符串的删除操作 题目 583. 两个字符串的删除操作 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 解析 1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义 …

学会这个Python库,做接口测试不是手拿把掐吗?

我们在做接口测试时&#xff0c;大多数返回的都是json属性&#xff0c;我们需要通过接口返回的json提取出来对应的值&#xff0c;然后进行做断言或者提取想要的值供下一个接口进行使用。 但是如果返回的json数据嵌套了很多层&#xff0c;通过查找需要的词&#xff0c;就很不方便…

三、Typora软件的介绍及安装

1、Typora软件的介绍 (1)Typora时一款Markdown编辑器和阅读器。 (2)Typora使用起来十分简洁&#xff0c;十分方便&#xff0c;可用于记录日常的笔记等。 (3)Markdown 是一种轻量级标记语言&#xff0c;它允许人们使用易读易写的纯文本格式编写文档。 2、Typora软件的安装 …

都说未来AI测试辅助自动化测试,难道手工测试真的要被淘汰了吗?

目录 前言 AI测试的迷思 第一个问题&#xff1a;AI辅助测试真的能用吗&#xff1f; 第二个问题&#xff1a;AI辅助测试已经发展到什么程度了&#xff1f; 第三个问题&#xff1a;哪些软件系统能用AI辅助测试&#xff1f; 总结 总结&#xff1a; 前言 近年来&#xff0c;…