深度学习——Diffusion Model学习,扩散模型

ops/2025/3/15 5:07:32/

一、什么是扩散模型

针对一张图片有一个前向过程,也就是逐渐批次加噪,生成一张Noise图片,那么问题就是是不是有这样的一个反向的过程能够针对一个有噪点的数据,还原到清晰的图片

请添加图片描述

具体来说:通过加入0-1正态分布的高斯噪声生成Noise图片,而扩散模型需要完成的是去预测每个时间步的噪声,到达去噪的目的

请添加图片描述

二、加噪过程(Forward Diffusion Process)

加噪过程简单来讲就是,图片+噪声=Noise图片,但是需要注意的是,这个的相加是有系数的,可以从下图右下角中发现,图片的系数是逐渐减小的,而噪声的系数是逐渐增大的,那为什么要这样设计呢:

可以举个相对极端的例子,如果在每次加噪水平一致的情况下,比较第一次加噪和最后一次加噪,第一次相较于最后一次对原图的质量影响是比较明显的,为了使每次加噪对原图的质量影响尽可能一致,所以设计了这两个参数,让第一次加噪的图片权重要大噪声权重要小,然后逐渐降低图片的权重,增大噪声的权重,达到最后的加噪效果

请添加图片描述

从下图右侧第一个图看出,前面咱们针对加噪过程讲的是一步一步进行加噪,经过公式的迭代推导,从下图右侧第二个图可以发现,从x。到Noise图片可以一步完成:

请添加图片描述

三、去噪过程(Reverse Diffusion Process)

对于加噪过程是一步一步加入高斯噪声,所以是满足马尔可夫性质的,但是对于回溯过程,逐渐去噪是很难找到这样一个高斯分布q(Xt-1|Xt),针对去噪的目标就是找到一个从Xt到Xt-1的噪声高斯分布

请添加图片描述

这个时候就需要神经网络去拟合这样的一个高斯噪声pθ(Xt-1|Xt),也就是下图中Approximated Distribution逐渐逼近Targe Distributionde的过程

请添加图片描述

首先用一个神经网络去拟合我们观察到的数据分布,也就是生成一个参数能够让我们生成的数据相较于ground truth的概率最大,对应到数学中就是求一个最大自然估计

请添加图片描述

最大自然估计等价于min -logpθ(X0)

注:Dkl散度就是描述两个数据之间的距离,即恒大于等于0的值

ELBO是观测数据对数似然的一个下界,用于近似潜在变量在观测变量下的条件概率分布。在变分推断中,直接计算后验概率通常是困难的,因此引入了ELBO来作为一个可优化的目标函数。

请添加图片描述

这样loss函数就可以经过一系列的数学推导过程得出

请添加图片描述

四、训练过程(Illustration of training)

  1. 随机采样时间步并进行encode

在训练扩散模型时,为了让模型学会处理所有可能的噪声水平,不会每次都从 t=0 完整地加噪到 t=T ,再完整地去噪回去。这样太慢了,而且不高效。相反,他们会随机选择一个时间步 t(比如从 1 到 1000 中随机挑一个数字,比如 34),然后直接在那个时间步上操作。

而编码是为了让模型需要知道当前处理的是哪个时间步(比如 t=34),因为不同的时间步对应不同的噪声水平。为了让模型理解 t 的具体含义,t 通常会被“编码”成一种更容易被神经网络处理的形式。

请添加图片描述

  1. 加噪

通过前面提到的一步加噪,将原始图片加噪到t=34时的噪声数据

请添加图片描述

  1. 开始训练

将噪声和时间步输入到UNet网络,通过网路去预测一个噪声

请添加图片描述

  1. 最后计算loss

请添加图片描述

五、采样过程(Illustration of sampling)

  1. 初始化:从纯噪声开始

在 t=T (最大时间步,比如 T=1000 ) 时,我们从一个标准高斯分布中随机采样一个初始样本 XT∼N(0,I) 。这个 XT就是纯噪声,完全没有数据的信息,看起来就像电视上的“雪花屏”。然后和时间步输入到Unet中预测一个噪声ϵθ(xt,t),这里的ϵθ是训练好的模型。

利用预测的噪声,按照反向过程的公式,从 xt 去掉一部分噪声,生成下一步的样本 xt−1。

请添加图片描述

  1. 逐步去噪:从 t=T到 t=0
  2. 重复直到 t=0

这里需要注意的是,在最后一步是不加扰动项的

请添加图片描述

六、总结

总的来说,扩散模型是一种生成模型,它的工作原理是通过一个“加噪-去噪”的过程来学习数据的分布。训练时,先从真实数据开始,逐步添加噪声(称为正向过程),然后让模型学会从纯噪声反向恢复到原始数据(称为反向过程)。

七、Reference

一文理清 Diffusion Model 扩散模型 | 原理图解+公式推导

八、Think

扩散模型作为一个生成式模型,其训练数据是决定生成分布的,训练数据是猫的话,生成的结果只会是猫,那如果训练数据包括猫、狗、鸟等多种类别,模型则会学习所有这些类别的联合分布。采样时生成的 x0 可能是猫、狗或鸟中的一种(具体是什么取决于初始噪声的随机性)。


http://www.ppmy.cn/ops/165854.html

相关文章

第27周JavaSpringboot 前后端联调

电商前后端联调课程笔记 一、项目启动与环境搭建 1.1 项目启动 在学习电商项目的前后端联调之前,需要先掌握如何启动项目。项目启动是整个开发流程的基础,只有成功启动项目,才能进行后续的开发与调试工作。 1.1.1 环境安装 环境安装是项…

Celery - 入门(get-started)

本文翻译整理自 Celery 官方文档 get-started 部分:https://docs.celeryq.dev/en/stable/getting-started/index.html 文章目录 Celery 简介任务队列是什么?我需要什么?版本要求 开始使用Celery 优点简单高度可用快灵活 特性框架集成快速跳转…

游戏引擎学习第140天

回顾并为今天的内容做准备 目前代码的进展到了声音混音的部分。昨天我详细解释了声音的处理方式,声音在技术上是一个非常特别的存在,但在游戏中进行声音混音的需求其实相对简单明了,所以今天的任务应该不会太具挑战性。 今天我们会编写一个…

zsh: command not found: adb 报错问题解决

哈喽小伙伴们大家好,我是小李,今天,我满怀信心想要在本地跑一下pda,然而, what? 居然报错了!!别逗我啊! 好吧,究其原因:没有配置好sdk 那就配呗。 首先,…

Oracle RAC 三种心跳机制

在Oracle RAC(Real Application Clusters)中,心跳(Heartbeat) 是集群节点间用于检测存活状态的核心机制,确保节点间的通信正常并避免脑裂(Split Brain)问题。以下是RAC的三种关键心跳…

四、Jmeter工具接口脚本编写

目录 1 Jmeter工具的不同控件的功能概述 1.1 线程组 1.2 取样器 1.3 配置元件 1.4 监听器 1.5 定时器 1.6 逻辑控制器 1.7 前置处理器 1.8 后置处理器 1.9 断言 2 Jmeter写单接口测试脚本 2.1 添加线程组 - 普通线程组 2.2 添加取样器 2.3 添加消息头管理器 2…

【零基础入门unity游戏开发——进阶篇】unity中配合VideoClip和VideoPlayer组件实现视频播放

考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…

[Linux] Not enough free space to extract *.zip or file

原因分析: 导致该错误的主要原因是,虽然你的主分区确实有足够的可用空间,但很多图形解压工具在解压时会默认先把文件写到一个较小的临时文件系统(tmpfs),比如这里只显示 1.6 GB。ZIP 文件在解压过程中会产…