AI绘画工具的底层算法: 源于人人都懂的物理扩散

产品二姐

读完需要

13

分钟

速读仅需 5 分钟

想象你把一滴浓浆果汁(或者其他带颜色的可溶物)放进一杯水里(杯子是透明的),不要搅拌,每隔一分钟给杯子拍一张照片,直到浓浆果汁充分溶解,均匀随机的分散在水中,这个过程在物理学中叫“扩散”,英文名是 Diffusion。这时你把照片按照倒序恢复,就能把一杯“果汁水”还原出一滴浓浆果汁,你可以称其为“反向扩散”。如果每次我们滴入浓浆果汁的方式不同,按照这个方法,就能还原出不同的原始图像,也就生成了不同的图像。

这个过程其实就是目前主流 AI 绘画工具的主流算法–扩散算法。这些工具包括 Mid-Journey, DALL.E3, 还有以 diffusion 命名的 Stable diffusion。今天就带大家深入浅出理解 diffusion 算法原理。

[注]Diffusion 运用在文生图中还需要加上 CLIP(让文字和图片对应) 模型,AE 模型等等,diffusion 并不是 DALL.E, Mid-journey 等工具使用的唯一算法。

   

1.1 Diffusion 算法在 AI 图像生成的地位

我们把近 10 年的图像生成算法做一个发展分析,大概下面的这样一张图,可以说在未来 2-3 年内,diffusion 算法仍然会占据主流的算法内核,把我们带向更广阔的领域。

AI绘画工具的底层算法: 源于人人都懂的物理扩散

阶段 1(2014-2020):

以 GAN+ VAE 主导图片生成算法。

  • GAN: 参见[之前文章]中,GAN 在 2014 年之后,吸引了众多学者的注意,对 GAN 进行了非常多次的改进。

  • VAE: VAE 也是在 2014 年提出来的,参见[论文 ( https://arxiv.org/abs/1312.6114 )], 后来被多次改进,其改进版本 VQ-VAE 被用在 Open AI 的文生图产品 DALL.E 1 当中。

阶段 2:(2020 年-至今)

在 2020 年左右,一篇论文《[Diffusion Models Beat GANs on Image Synthesis] ( https://arxiv.org/pdf/2105.05233.pdf )》(在图像生成上 Diffusion 打败 GAN)发表,使得 Diffusion 成为新宠。按照过去的发展来看,diffusion 模型还可以发展两三年。

   

1.2 一句话说原理:

AI绘画工具的底层算法: 源于人人都懂的物理扩散

Diffusion(扩散)概念源于非平衡统计物理学的概念,类似本文开始提出的实验,这次我们换成糖块。想象你把一颗糖块放进水里,随着时间流逝,冰糖会慢慢融入水中,“糖分子”会均匀分布在水中。那么如果我们学会了糖分子是如何扩散的,然后把这个过程反过来,让糖分子按照原来的方式再汇聚,就可以得到一块冰糖。

当然现实中,我们是无法让时间倒流,但是计算机却可以,这就是 Diffusion 算法的原理:

先训练模型学会如何扩散,使用时给模型一杯糖水,让模型重构“糖块”,当然这个重构的糖块和原有的糖块并非一模一样,但也能表达出类似含义,所以扩散模型= 扩散 + 反扩散。

用更多的方式理解:

  • 扩散算法也是:“编码” + “解码”的过程,通过编码训练好模型,解码的时候用训练好的模型解码。

  • 扩散算法也阐释了“解铃还须系铃人”的道理。

那么扩散算法到底是如何进行“训练”和“重构”的呢,首先看看扩散算法的架构。

👀

   

2. Diffusion 的架构

我们还是拿糖分子举例,为了研究糖分子是怎么扩散的,我们把糖分子的扩散过程按照时间分为 1000 段,每段给糖分子拍一张照片,我们发现在 T 时刻,糖分子是以 T−1 时刻的糖分子为中心呈现正态分布(高斯分布)来扩散的。

AI绘画工具的底层算法: 源于人人都懂的物理扩散

图: 糖分子的扩散过程

当然这只是一颗糖颗粒的糖分子扩散过程,如果有很多个糖颗粒,在容器里的糖分子就是所有糖颗粒产生的糖分子的累加。这里的糖颗粒相当于图片中的像素,糖分子的扩散就相对于对这个像素进行扩散,怎么理解呢,假设我们有一张黑白照片,像素的值在[0,255]之间,这张图上有一个像素的值为 0,每一次扩散之后,这个像素就会像糖分子一样把自己的“溶解”到周围环境中,像素的值会从以 0 为中心的值按照正态分布的概率采样一个值成为新的值。大家可以注意到每次的正态分布都不一样,这一点我们会在稍后做出解释。

AI绘画工具的底层算法: 源于人人都懂的物理扩散图:正向扩散

以上过程放在真实的图画场景中就是这样的,可以看到,小狗逐渐被“溶解”。

AI绘画工具的底层算法: 源于人人都懂的物理扩散

这种溶解过程称为“正向扩散”,也是模型的训练过程。如果我们要从随机噪声图片中重构图像,就要“反向扩散”。

AI绘画工具的底层算法: 源于人人都懂的物理扩散

我们把上述过程用数学计算流程来表示就是下图,如此简单以至于我第一次接触的时候以为是我理解错了。

AI绘画工具的底层算法: 源于人人都懂的物理扩散

不过,虽然架构简单,但训练步骤是非常繁杂的,在原论文中,t=1000, 也就是说,无论正向还是反向,需要计算 1000 次,这也是 diffusion 算法目前最大的不足。

👀

   

3. Diffusion 训练过程

   

3.1 加噪声的过程

第一步:确定每一步的高斯噪声强度。

我们的目标是,最后一步加噪声之后的图像是随机分布的像素点,即服从正态分布 N(0-1)。那我们能不能一步到位呢,显然不行 ,因为我们没有办法通过一个随机分布而重构出一个原始图像的。

如果有多步,比如 1000(这是个经验数值),那么需要每一步均匀加噪声呢,还是开头的步数添加大噪声,后面的步数添加小噪声呢?因为我们的最终目标是要从随机噪声重构到细节高清图像,那么刚开始重构只需要关注轮廓,不需要关注细节,而越到最后,越要注重细节。也就是:

  • 从 X(1000) 倒推 X(999),我们可以粗略一点,那么从 X(999) 到 X(1000)就可以多加些噪声。

  • 相反,从 X(1) 预测 X(0) ,我们需要高清细节,那么从 X(0) 到 X(1) 加的噪声就需要小一点。

我们知道正态分布是由均值,方差决定的。如下图,如果均值越大,方差越大,说明噪声强度也越大。

AI绘画工具的底层算法: 源于人人都懂的物理扩散

所以,为了达到上述要求,我们添加的高斯分布应该是遵循如下规则:

  • t 越小,我们希望噪声小一些,即均值越接近于 X−1 , 方差越小。

  • t 越大,我们希望噪声大一些,即均值与 X−1 相差较远, 方差也可以大一点。

这就是我们为什么在【正向扩散】中采用了不同的高斯分布来添加噪声。我们观察 Mid-Journey 生成图片时也是由轮廓逐渐清晰。

AI绘画工具的底层算法: 源于人人都懂的物理扩散

根据上述要求,我们也就可以理解为什么要用下面的公式计算(如果不需要精确了解,公式可以略过)。

AI绘画工具的底层算法: 源于人人都懂的物理扩散

其中 Beta(t)是随 t 变换的一个值,是我们预先设定好的值,它的设定需要遵循以下规则:

  • Beta(t)是 0~1 之间的值,

  • 且 t 越大,Beta(t)也越大。即:

0<Beta(1)<Beta(2)<Beta(3)<…<Beta(t)<1

实际应用中,我们可以将 Beta(t)与 t 的关系设置为线性的、二次的、余弦的等。

确定好噪声之后,相当于我们有了Beta(t−1) 与Beta(t)之间的关系,就可以训练出一个神经网络用于重构图像。

原创文章,作者:产品二姐,如若转载,请注明出处:https://www.agent-universe.cn/2024/01/8539.html

Like (0)
Previous 2024-01-01 20:35
Next 2024-01-03 08:57

相关推荐