18【3分钟AI】爆火的Diffusion从何而来?
扩散模型 - Diffusion Model【李宏毅2023】
U-net
十分钟讲懂Unet | 中文字幕 | The U-Net (actually) explained in 10 minutes
U-Net 最初是为了解决医学图像分割的问题而设计的。由于其在小规模数据集上表现良好,因此它也被广泛应用于其他类型的图像分割任务中。U-Net 的 U 形结构使得网络能够精确地定位分割边界。
U-Net 的核心思想是结合了全卷积网络(FCN)和跳跃连接。网络由一个收缩路径(编码器)和一个对称的扩张路径(解码器)组成。收缩路径用于捕获上下文信息,而扩张路径则用于精确定位分割边界。跳跃连接将编码器中的特征图与解码器中的对应特征图拼接起来,这样可以保留更多的细节信息,有助于提高分割的精度。
U-Net具有以下特点:
- 端到端的训练:U-Net可以直接从原始图像学习到像素级的分类,不需要额外的预处理或后处理步骤。
- 较少的训练样本:由于医学图像数据通常比较难获取,U-Net在小规模数据集上也能取得很好的效果。
- 高效的内存利用:U-Net采用了重叠的卷积和池化操作,这样可以减少内存的使用,同时也有助于提高分割的精度。
- 多尺度的特征融合:通过跳跃连接,U-Net能够将不同尺度的特征信息融合起来,有助于提高分割的准确性。
论文
Diffusion是《NeurIPS-2020-denoising-diffusion-probabilistic-models-Paper》这篇文章提出的,先来分析一下这篇文章
标题:去噪概率扩散模型
过程
噪声→denoise→denoise→denoise
相关模型
DALL
CLIP(contrastive language-image pre-training)
Imagen
在过去的一年里,diffusion model火遍整个学术界,而24年初sora的诞生更是让大家看到了diffusion model的无穷潜力。相信不少人都会跟我有一样的疑问:
diffusion model是什么?
diffusion model好在哪里?
diffusion model是怎么来的?
这篇文章里,我将会带着这几个问题,由浅入深地剖析diffusion model的结构、训练过程、数学原理及其发展脉络。因为本人是一个看到太多公式会头疼的人(相信很多人有相同的烦恼),因此与大多数文章不同,本篇文章不会堆砌太多的数学公式,而是从整体入手,先带着大家对diffusion model有一个整体的了解,再逐渐细化到深处,争取让没有数学基础的人也可以轻松看懂。因为本人也是刚刚接触diffusion model,有些地方是基于自己的理解,如果有讲的不对的地方,欢迎大家指出!
Diffusion Model是什么?
概述
Diffusion Model是一种生成模型,所谓生成模型就是能够随机生成观测数据的模型,在很多场景下这种数据都是图片。下图展现了生成模型中的几个经典模型的发展脉络。本文所介绍的diffusion model基本是基于Pieter Abbeel的Denoising Diffusion Probabilistic Models这篇论文[2]。
图1 生成模型概述(来源[1])
Diffusion Model和其他模型最大的区别我认为有两个,1)diffusion model中的latent code z和图片是同维度的;2)diffusion model的加噪声和去噪过程都是一步一步来的,不是一步到latent code也不是一步从latent code恢复成一张图片。
Diffusion Model的训练简单来说,主要由两个步骤组成:加噪声和去噪声。加噪声就是由图1所示的从
逐渐加噪声到latent code
的过程,这个
在理论上是完全的白噪声,在实际操作中我们加T次噪声就形成了
。注意这里所有操作都没有改变输入的维度。而去噪声是从
一步步去噪恢复到输入
的过程。
前传:加噪声
加噪声准确来说不是加噪声,而是原输入和高斯噪声的一个加权平均,对于每一步
来说,权重分别为
和
。(后文中提到的
)
由独立高斯分布可加性,有
,于是我们可以将(1)式再往前推:
令
,递推到
,有:
这里的
的各种标识是不重要的,因为各种
本质上都是从标准高斯分布中独立采样的噪声,这也是由(1)式推到(2)式的根源。
到这里我们已经知道了任意时刻的
可以由
和一系列的
得到,但是这个
是怎么来的呢?为了使
可以快速收敛到标准高斯分布,原文令
逐渐减小。在DDPM论文[2]中,令
从
到
线性增长,从而使得
线性减小。
由此,我们可以总结得到,加噪声的过程是一个从慢到快逐渐改变原图像,让图像变成最终均值为0,方差为I的标准高斯噪声的过程。
逆过程:去噪
在正向过程中,我们人为设置了T步加噪声过程。而在逆向过程中,我们希望能够倒过来去除所加的噪声,让一幅纯噪声图像变回原始的输入图像。
直接求得去噪操作的理论解是不现实的,我们只能训练神经网络去拟合它。数学原理表明,当
足够小时,每一步加噪声的逆操作也满足正态分布,即:
那么现在的问题就变成了怎么拟合每一步的
和
。我们知道
和
,那么是否可以列出已知
和
时的
条件分布呢?答案是可以,通过贝叶斯公式,我们可以得到:
看到这里已经可以发现,通过贝叶斯公式,逆向操作的未知分布可以被全部转化为前向操作的已知分布。
由前传的马尔可夫性等价为
,可以由(1)式得到;
和
可以由(2)式得到。代入(4)式,经过计算,简化之后可以得到(3)式中的均值
和方差
:
在(5)式中,逆操作去噪时唯一一个不知道的值是
,因此,我们可以训练神经网络去预测噪声
去拟合生成
的噪声
。相应的训练loss即为两者的MSE loss:
总结去噪过程:去噪过程就是一步步从
去噪得到
的过程,这个去噪过程实际上是在用神经网络去拟合生成
时的用到的随机噪声
,从而拟合正向过程的逆操作。
训练算法和推断算法
首先看看DDPM的训练算法:
图2 DDPM训练算法
我们来逐行分析训练算法:
第二行是指从训练集里取一个数据
。
第三行是指随机从1到T中取一个时刻用来训练。在前面的分析中,我们虽然希望神经网络从
逐步恢复成为
,但在实际训练时,我们不用一轮预测T个结果,而是只用随机预测T个时刻中某一个时刻的结果就行;当数据量足够大时效果是一样的。
第四行指随机生成一个高斯噪声
,该噪声是用于执行前向过程生成
的。之后,我们把
和
传给神经网络得到
,即为预测噪声。
第五行则进行梯度下降来优化网络,损失函数是预测噪声和实际噪声之间的均方误差。
训练得到网络
(这里的网络结构可以自己定义)之后,就可以从任意一副噪声图中生成图像了,下面是DDPM的推断算法(原文叫做采样算法):
图3 DDPM推断算法
逐行分析推断算法:
第一行是指生成一个标准高斯噪声。不同的噪声可以生成出不同的图像。
第二~四行是重复进行反向操作,令时刻从T到1,根据(5)式计算每一时刻去噪声操作的均值和方差,从而得到
。
到这里,我们已经了解了Diffusion Model的基本原理、训练及推断过程了。
Diffusion Model好在哪里?
要了解一个模型好在哪里,我们可以先去了解这个模型是怎么诞生的。
Diffusion 扩散模型的第一次提出在 2015 年的 Deep Unsupervised Learning using Nonequilibrium Thermodynamics [3]这篇文章中。但当时,这个扩散模型并没有立刻得到广泛的关注,而是在2020年Pieter Abbeel的Denoising diffusion probabilistic models[2]这篇文章出来之后大家才广泛注意到Diffusion Model的潜力,本文所介绍的算法也是来源于DDPM这篇文章。 Deep Unsupervised Learning using Nonequilibrium Thermodynamics [3]这篇文章是受到非平衡热力学的启发,其基本思想是通过前向扩散过程系统地、缓慢地破坏数据分布中的结构(类似于布朗运动),把原始状态一步步地破坏为混沌态,然后再让机器去学习反向扩散过程,从这片混沌中恢复出原始状态。因为每一步的破坏都足够微小,微小到其逆过程可以被神经网络拟合,所以神经网络才可以在单步逆过程中恢复出一个“以假乱真”的状态。这样微小的破坏可以慢慢“温水煮青蛙”式的导致原状态变为混沌态,那么神经网络每一步微小的拟合也可以一步步的从混沌态“恢复”出一个“以假乱真”的原状态。
图4 Diffusion扩散过程示意图
个人认为Diffusion Model的好就好在它更加接近自然的本质。当我们在谈生成模型时,我们在谈论什么?从一片混沌的噪声中“无中生有”是墒减的过程,是违背自然规律的,正如一滴墨可以在水里扩散开来,但一杯混满了墨的水不能轻易的分成一滴墨和一杯干净的水。但如果每一滴墨在水里的扩散过程可以被完整的记录下来并且我们可以在小范围内去拟合其扩散的逆过程,那么我们就可以一步步的模仿出原来的状态。这里我们模仿出来的状态已经不是原来的那滴墨和那杯水了,但这并不重要,因为我们的目的是让神经网络去拟合这个“墒减”的过程,从而达到“无中生有”的目的。
简单来说,diffusion model把“无中生有”这个看似不可能的任务拆解成了可以一步步完成的简单任务,我们很难从噪声中直接生成图片,但是我们可以先把噪声变的不那么像噪声,然后再一步步的1+1+1...因此扩散模型可以更加真实准确地还原数据,对图像细节的保持能力更强,写实性也更好。但有优点必然有代价,由于其计算步骤的繁琐,扩散模型也存在采样速度较慢的问题。
Diffusion Model的应用
这里先占个坑,之后我不断学习现在diffusion model的各种发展及其应用,会总结到这里。
1.title
2.abstract
3.introduction
4.method
5.experiments
6.conclusion
第一遍:标题、摘要、结论。可以看一看方法和实验部分重要的图和表。这样可以花费十几分钟时间了解到论文是否适合你的研究方向。
第二遍:确定论文值得读之后,可以快速的把整个论文过一遍,不需要知道所有的细节,需要了解重要的图和表,知道每一个部分在干什么,圈出相关文献。觉得文章太难,可以读引用的文献。
第三遍:提出什么问题,用什么方法来解决这个问题。实验是怎么做的。合上文章,回忆每一个部分在讲什么。
Summary: 今天要讲什么,亮点是什么
What is the problem?
- Input
- Output
Why do we care?
和其他模型对比
- Advantage
- Drawbacks
What's new
- Insight
- Method
What's the experimental results?
- 结果
- Speed vs Quality
Bring-home message
一句话总结
How this research benefit your project?