十分钟读懂Diffusion:图解Diffusion扩散模型

作者 | 绝密伏击  编辑 | 极市平台

原文链接:https://zhuanlan.zhihu.com/p/599887666

点击下方卡片,关注“自动驾驶之心”公众号

ADAS巨卷干货,即可获取

点击进入→自动驾驶之心【大模型】技术交流群

本文只做学术分享,如有侵权,联系删文

导读

 

Diffusion是如何根据文字生成图片的?详解Diffusion的整个生成过程、训练过程等。 

在之前的文章中,我们曾经介绍过Diffusion的具体原理,但是讲的还是比较偏理论,为了让大家快速了解Diffusion原理,这篇文章我们通过图解的方式。

绝密伏击:AIGC爆火的背后——扩散模型DDPM浅析

https://zhuanlan.zhihu.com/p/590840909

1. Diffusion文字生成图片——整体结构

1.1 整个生成过程

我们知道在使用 Diffusion 的时候,是通过文字生成图片,但是上一篇文章中讲的Diffusion模型输入只有随机高斯噪声和time step。那么文字是怎么转换成Diffusion的输入的呢?加入文字后 Diffusion 又有哪些改变?下图可以找到答案。

44f54be0228e524503c417900df7fd7e.jpeg
文字生成图片全过程

实际上 Diffusion 是使用Text Encoder生成文字对应的embedding(Text Encoder使用CLIP模型),然后和随机噪声embedding,time step embedding一起作为Diffusion的输入,最后生成理想的图片。我们看一下完整的图:

24ac3c57b4ffdf6d7c30f6db37cf5076.jpeg
token embedding、随机噪声embedding、time embedding一起输入diffusion

上图我们看到了Diffusion的输入为token embedding和随机embedding,time embedding没有画出来。中间的Image Information Creator是由多个UNet模型组成,更详细的图如下:

11b329952b2d14996170df4a5385b3ae.jpeg
更详细的结构

可以看到中间的Image Information Creator是由多个UNet组合而成的,关于UNet的结构我们放在后面来讲。

现在我们了解了加入文字embedding后 Diffusion 的结构,那么文字的embedding是如何生成的?接下来我们介绍下如何使用CLIP模型生成文字embedding。

1.2 使用CLIP模型生成输入文字embedding

CLIP 在图像及其描述的数据集上进行训练。想象一个看起来像这样的数据集,包含4 亿张图片及其说明:

dc90601280c5fab2ac69697ef65a098f.jpeg
图像及其文字说明

实际上CLIP是根据从网络上抓取的图像及其文字说明进行训练的。CLIP 是图像编码器和文本编码器的组合,它的训练过程可以简化为给图片加上文字说明。首先分别使用图像和文本编码器对它们进行编码。

1f9b6f1f5d2463a7c7d476ff6b1fd28e.jpeg

然后使用余弦相似度刻画是否匹配。最开始训练时,相似度会很低。

50d975a4b32f568470ee4be16330af42.jpeg

然后计算loss,更新模型参数,得到新的图片embedding和文字embedding

28254b6e675b386be44260ce5a51b230.jpeg

通过在训练集上训练模型,最终得到文字的embedding和图片的embedding。有关CLIP模型的细节,可以参考对应的论文(https://arxiv.org/pdf/2103.00020.pdf)。

1.3 UNet网络中如何使用文字embedding

前面已经介绍了如何生成输入文字embedding,那么UNet网络又是如何使用的?实际上是在UNet的每个ResNet之间添加一个Attention,而Attention一端的输入便是文字embedding。如下图所示。

6d90a9f341ff469bce0b319286807c62.jpeg

更详细的图如下:

c9e2226162f1f079b0c8039b5a1c2ca5.jpeg

2. 扩散模型Diffusion

前面介绍了Diffusion是如何根据输入文字生成图片的,让大家有个大概的了解,接下来会详细介绍扩散模型Diffusion是如何训练的,又是如何生成图片的。

2.1 扩散模型Duffison的训练过程

b110ba5d36b73755e09cda4f319e0f76.jpeg
扩散模型Diffusion

Diffusion模型的训练可以分为两个部分:

  1. 前向扩散过程(Forward Diffusion Process) \rightarrow\rightarrow 图片中添加噪声

  2. 反向扩散过程(Reverse Diffusion Process) \rightarrow\rightarrow 去除图片中的噪声

2.2 前向扩散过程

007b77807ec0b705d76d5def21cf5bb0.jpeg

前向扩散过程是不断往输入图片中添加高斯噪声。

2.3 反向扩散过程

2e8055a6af8f3d03686701ce149df44c.jpeg

反向扩散过程是将噪声不断还原为原始图片。

2.4 训练过程

feaa8affd794bc647ec888b7a2cd97a1.jpeg

在每一轮的训练过程中,包含以下内容:

  1. 每一个训练样本选择一个随机时间步长 tt

  2. 将time step tt 对应的高斯噪声应用到图片中

  3. 将time step转化为对应embedding

下面是每一轮详细的训练过程:

3c17900cba5fe5e71d1df04bd73dc67b.jpeg

2.5 从高斯噪声中生成原始图片(反向扩散过程)

d279dfe793e2311fc321d6477a7ba1e5.jpeg

上图的Sample a Gaussian表示生成随机高斯噪声,Iteratively denoise the image表示反向扩散过程,如何一步步从高斯噪声变成输出图片。可以看到最终生成的Denoised image非常清晰。

补充1:UNet模型结构

前面已经介绍了Diffusion的整个过程,这里补充以下UNet的模型结构,如下图所示

d2bb69822356ed8578fd2299dfd90de3.jpeg

这里面Downsampe、Middle block、Upsample中都包含了ResNet残差网络。

补充2:Diffusion模型的缺点及改进版——Stable Diffusion

前面我们在介绍整个文字生成图片的架构中,图里面用的都是Stable Diffusion,后面介绍又主要介绍的是Diffusion。其实Stable Diffusion是Diffusion的改进版。

Diffusion的缺点是在反向扩散过程中需要把完整尺寸的图片输入到U-Net,这使得当图片尺寸以及time step t足够大时,Diffusion会非常的慢。Stable Diffusion就是为了解决这一问题而提出的。后面有时间再介绍下Stable Diffusion是如何改进的。

补充3:UNet网络同时输入文字embedding

在第2节介绍Diffusion原理的时候,为了方便,都是没有把输入文字embedding加进来,只用了time embedding和随机高斯噪声,怎么把文字embedding也加进来可以参考前面的1.3节。

补充4:DDPM为什么要引入时间步长_t_

引入时间步长 tt 是为了模拟一个随时间逐渐增强的扰动过程。每个时间步长 tt 代表一个扰动过程,从初始状态开始,通过多次应用噪声来逐渐改变图像的分布。因此,较小的 tt 代表较弱的噪声扰动,而较大的 tt 代表更强的噪声扰动。

这里还有一个原因,DDPM 中的 UNet 都是共享参数的,那如何根据不同的输入生成不同的输出,最后从一个完全的一个随机噪声变成一个有意义的图片,这还是一个非常难的问题。我们希望这个 UNet 模型在刚开始的反向过程之中,它可以先生成一些物体的大体轮廓,随着扩散模型一点一点往前走,然后到最后快生成逼真图像的时候,这时候希望它学习到高频的一些特征信息。由于 UNet 都是共享参数,这时候就需要 time embedding 去提醒这个模型,我们现在走到哪一步了,现在输出是想要粗糙一点的,还是细致一点的。

所以加入时间步长 tt 对生成和采样过程都有帮助。

补充5:为什么训练过程中每一次引入的是随机时间步长 t

我们知道模型在训练过程中 loss 会逐渐降低,越到后面 loss 的变化幅度越小。如果时间步长 tt 是递增的,那么必然会使得模型过多的关注较早的时间步长(因为早期 loss 大),而忽略了较晚的时间步长信息。

参考

https://medium.com/@steinsfu/stable-diffusion-clearly-explained-ed008044e07e

http://jalammar.github.io/illustrated-stable-diffusion/

https://pub.towardsai.net/getting-started-with-stable-diffusion-f343639e4931

https://zhuanlan.zhihu.com/p/597924053

https://zhuanlan.zhihu.com/p/590840909?

https://arxiv.org/abs/2103.00020

① 全网独家视频课程

BEV感知、毫米波雷达视觉融合、多传感器标定、多传感器融合、3D目标检测、目标跟踪、Occupancy、cuda与TensorRT模型部署、协同感知、语义分割、自动驾驶仿真、传感器部署、决策规划、轨迹预测等多个方向学习视频(扫码免费学习)

cb9e07c42f9a4473ad413fa0b8051004.png 视频官网:www.zdjszx.com

② 国内首个自动驾驶学习社区

近2000人的交流社区,涉及30+自动驾驶技术栈学习路线,想要了解更多自动驾驶感知(2D检测、分割、2D/3D车道线、BEV感知、3D目标检测、Occupancy、多传感器融合、多传感器标定、目标跟踪、光流估计)、自动驾驶定位建图(SLAM、高精地图、局部在线地图)、自动驾驶规划控制/轨迹预测等领域技术方案、AI模型部署落地实战、行业动态、岗位发布,欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频,期待交流!

d9d793882790f94a89d3911ebb129de2.png

③【自动驾驶之心】技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦目标检测、语义分割、全景分割、实例分割、关键点检测、车道线、目标跟踪、3D目标检测、BEV感知、Occupancy、多传感器融合、大模型、SLAM、光流估计、深度估计、轨迹预测、高精地图、NeRF、规划控制、模型部署落地、自动驾驶仿真测试、产品经理、硬件配置、AI求职交流等方向。扫码添加汽车人助理微信邀请入群,备注:学校/公司+方向+昵称(快速入群方式)

dcee38320e4cf8b3e66c3629e78ef8d4.jpeg

<think>好的,我现在需要帮助用户详细了解Diffusion网络的结构。首先,用户提到了参考引用中的“5.两个Algorithm 二、Diffusion Framework 1.Framework [^1]”,这可能涉及到扩散模型的基本框架。 扩散模型的核心结构通常包括前向扩散过程和反向去噪过程。前向过程逐步向数据添加噪声,直到数据变成纯噪声。反向过程则通过神经网络学习如何逐步去噪,恢复原始数据。用户可能想知道这些过程的具体实现,比如使用哪种网络架构,如U-Net。 接下来,我需要考虑扩散模型中常用的组件。比如,U-Net在图像生成任务中常用于去噪,因为它能捕捉多尺度特征。此外,时间步嵌入也很重要,它帮助网络了解当前处理的扩散阶段。 用户可能对具体的技术细节感兴趣,比如如何将时间步信息整合到网络中,或者损失函数的设计。同时,应用场景也是常见的疑问点,比如图像生成、音频处理等。 最后,要确保回答符合格式要求,使用正确的中文和LaTeX排版,并生成相关问题。需要检查是否有遗漏的关键点,比如反向过程的数学表达,或者训练方法。确保引用正确,并自然地融入回答中。</think># Diffusion网络结构详解 Diffusion模型是近年来深度学习领域的重要突破,其核心结构由前向扩散和反向去噪两个过程构成,通过渐进式噪声处理实现数据生成[^1]。 ## 一、核心架构组成 1. **前向扩散过程** 对输入数据$x_0$逐步添加高斯噪声,经过$T$步后得到纯噪声$x_T$: $$q(x_t|x_{t-1}) = \mathcal{N}(x_t;\sqrt{1-\beta_t}x_{t-1},\beta_t\mathbf{I})$$ 其中$\beta_t$是预设的噪声调度参数。 2. **反向去噪过程** 通过神经网络$\epsilon_\theta$学习噪声预测: $$p_\theta(x_{t-1}|x_t) = \mathcal{N}(x_{t-1};\mu_\theta(x_t,t),\Sigma_\theta(x_t,t))$$ 其中均值$\mu_\theta$通过预测的噪声计算得到。 ## 二、关键网络组件 ![Diffusion架构示意图](https://example.com/diffusion-arch.png) 1. **U-Net主干网络** - 编码器-解码器结构 - 跳跃连接保留多尺度特征 - 卷积块包含残差连接 2. **时间步嵌入模块** ```python class TimeEmbedding(nn.Module): def __init__(self, dim): super().__init__() self.dense = nn.Sequential( nn.Linear(dim, 4*dim), nn.SiLU(), nn.Linear(4*dim, dim) ) def forward(self, t): return self.dense(t) ``` 3. **注意力机制** - 自注意力层增强全局建模 - 交叉注意力用于文本到图像生成 ## 三、训练方法 损失函数采用简化形式: $$L_\text{simple} = \mathbb{E}_{t,x_0,\epsilon}\left[\|\epsilon - \epsilon_\theta(x_t,t)\|^2\right]$$ 其中$\epsilon$是真实噪声,$\epsilon_\theta$是网络预测值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值