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 算法仍然会占据主流的算法内核,把我们带向更广阔的领域。

picture.image

阶段 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 一句话说原理:

picture.image

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

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

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

用更多的方式理解:

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

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

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

👀

2. Diffusion 的架构

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

picture.image

图: 糖分子的扩散过程

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

picture.image

图:正向扩散

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

picture.image

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

picture.image

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

picture.image

不过,虽然架构简单,但训练步骤是非常繁杂的,在原论文中,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) 加的噪声就需要小一点。

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

picture.image

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

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

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

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

picture.image

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

picture.image

其中 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)之间的关系,就可以训练出一个神经网络用于重构图像。

3.2 重构图像

理论上来讲,在已知神经网络参数的情况下,我们就可以根据Beta(t)倒推Beta(t-1)。但这样的计算比较复杂,于是 DDPM 中就想到了一个简单的方法,

与其预测Beta(t-1),不如预测Beta(t)到Beta(t-1)的噪声Noise(t-1)

,要知道噪声分布是一个已知条件,只是在反向扩散时,在同样的分布中采样不同的值而已。那么 Beta(t-1) 就可以通过以下公式计算出来:

picture.image

同时,DDPM 还采用了 Unet 方法让计算量降低,即把 X(t-1) 降低到一个低维空间后(可以理解为把高分辨率的图片压缩为低分辨率图片)进行计算推理低维空间的 Noise,然后再把低维空间的 Noise 升高到高维空间,这也是图像处理中常见的一种解决方法。

picture.image

图:Unet

[注] Unet 本质是还是因为图像信息中存在着大量冗余信息。举例来说,给你看一个 32*32 像素的图片,和 1024**1024 的图片,信息含量大了 1024 倍,但视觉感受可远远没有 1024 倍扩大。

👀

4. WHY :为什么 Diffusion 这么重要

4.1 Before Diffusion

  1. 在上篇文章中我们提到 GAN 有一个缺陷就是生成图片缺乏创造性,因为 GAN 从原理上来讲就是要和真实图像对比生成逼真的图像。而对于 Diffusion 模型,生成的图像既逼真,又有多样性。这是因为 diffusion 模型在重构图像时,从一个噪声分布中采样从而得到新的图片,这个“采样”就为多样性提供了可能。

  2. Diffusion 模型数学原理上非常优美。对于学术界来讲,“数学优美”是一种追求,所以这也进一步激发了更多的学者对 diffusion 模型进行改进。

4.2 After Diffusion

Diffusion 之后也诞生了很多衍生品。

  1. Improved DDPM

Improved DDPM 是 Open AI 的研究者发表的论文,参考论文链接 ( https://arxiv.org/abs/2102.09672 )

  1. Diffusion model with ControlNet

支持在扩散模型 (如 Stable Diffusion) 上附加额外的多种空间语义条件来控制生成过程。比如将下图左侧的卡通图像转化为真实图像。

picture.image

其他有待更新,也可以侧面看出来 Diffusion Model 的潜力还没有被完全挖掘出来。

👀

5. WHO- 谁发明了 Diffusion 模型

2015 年最初提出 diffusion model 的学者是 Jascha Sohl-Dickstein,本科康奈尔,博士在加州伯克利大学,主要职业生涯在谷歌大脑和 Google Deep mind 工作。他有自己的博客网站 ( http://sohldickstein.com/ )。

picture.image

Jascha Sohl-Dickstein

而在 2020 年真正把扩散模型拉到聚光灯下的人是 Jonathan Ho ( http://www.jonathanho.me/ ),相关论文也是他在 UC Berkeley 读博期间发表的,主要职业生涯在谷歌。

👀

6. 在产品中的应用

目前主要看了 diffusion 在 DALL.E.2 中应用的论文《Hierarchical Text-Conditional Image Generation with CLIP Latents ( https://arxiv.org/abs/2204.06125 )》,跟着沐神的 B 站视频看的。

简要概述一下就是 DALL.E.2 综合使用了 CLIP 和 Diffusion 模型来实现图像生成的。

CLIP 全称是 Contrastive Language–Image Pre-training,通过文本和图像对来训练出来的模型,详见 Open AI 官网 ( https://openai.com/research/clip )

👀

7. Diffusion 不足

前文其实有提到 Diffusion 最大的不足在于训练次数复杂,想象 T=1000,相信这也会成为大家争相改进的地方,期待后续改进。

👀

关注我

看到这里了,各位不妨点击右下角在看。

我是关注AI产品的产品二姐,致力于带来丰富的AI学习分享、体会,欢迎你和我一起学习,如果你觉得文章有用,欢迎关注、点赞、转发。

0
0
0
0
评论
未登录
暂无评论