©作者 | 张瑞
单位 | 站酷网络技术有限公司
研究方向 | 推荐、搜索、NLP等
前言
我很喜欢科幻小说中常出现的「宇宙是台计算机」这个意象。在以 Disco Diffusion、Stable Diffusion 等为代表的扩散模型大火之后,我常常要面对很多人的疑问——扩散模型的原理是什么?为什么会画出惊人的画面?又为什么很多时候会出现一些不知所云的画面? 我发现,要解释清楚这个问题是一个很难的事情——你不能对着一位艺术家讲马尔科夫过程、采样、参数估计;所以,我想写一篇文章, 从「宇宙计算机」的 idea 出发,试图形象地解释扩散模型是什么、发生了什么、如何进行训练的。 希望这篇文章能够对大家(直观地)理解扩散模型有所帮助。 相关: 文章中的示意图大部分通过站酷 AI 实验室 [1] 生成。少部分来自 Illustrated Stable Diffusion [2] 。 A Big Bang——从无到有 根据宇宙学的理论,均匀各向同性的宇宙从一个「奇点」膨胀出来,这个膨胀的过程被称为 The Big Bang —— 宇宙大爆炸 [3] 。在大爆炸之后很短的时间内,由于具备随机性的量子涨落 [4] 的影响,构成物质的各种基本粒子逐渐从各向同性的能量中沉淀出来;接下来,在四种基本力:强力、弱力、电磁力、引力的作用下,弥散在空间中的基本粒子逐步汇聚形成原子、分子、分子团,继而构成了星云、恒星、行星。 而当物质出现之后,稳定的物质结构和物理定律开始主导宇宙,量子涨落的随机性效应逐步退场,这意味着,你将不会走在街上胸口突然出现一个大洞,或者被凭空出现的一块大石头砸成肉泥。
如果大家对 Diffusion Model 有一定的理解,那么我们可以发现,上面的图和 Diffision Model 中的去噪过程惊人地相似:
所以,我们也可以将 Diffusion Model 生成图的过程同样视为一种「创世演化」模型:从一张空白的图片,通过随机的采样(量子涨落)生成无意义的噪点(基本粒子);由模型提供「物理定律」的引导,从噪点逐步演化出颜色、线条、纹理,进而构成物体、人脸、意象、场景、画面。从这个层面来说,Diffusion Model 的运行原理和人类的思维是完全不同的,Diffusion Model 作画是一个 down-top 的过程。 人类作画则是 top-down 的:先有场景——如「一个美丽的少女走在森林中」,有经验的画师会勾勒出只有几条线的再逐步细化画面中的每一个元素:少女在哪里,森林里有几棵树,然后少女是什么面容、穿什么衣服,森林里的树是哪些种类;而 Diffusion Model 则是:先随机地生成像素,然后从这些像素中慢慢浮现出人物、场景等。 下图是经过 50 步迭代生成「少女在森林中」的一个过程,右下角是最原始的噪声图像,从右到左、从下到上依次迭代;每一步的生成都和上一步的结果相关(一阶马尔科夫链)。 可以看到,一开始,图像是完全的噪声,什么都看不出来;经过十几步的迭代后, 如果有足够的想象力,应该可以联想到,中间浮现出的一片白色似乎可以绘制成一个人影,后面杂乱无章的大片绿色纹理经过细化应该可以画成森林背景; 再经过十几步的迭代,图像已经基本定型,人和森林的轮廓都出现了;经过多次迭代,最终生成了一张合乎逻辑和语义的图片。
▲ 图3:经过 50 步迭代生成一张图像的过程,从右下角到左上角 如果改变初始的噪声呢?我们使用同样的文本条件,重新生成了一张图像,但初始噪声则是重新随机生成,生成过程如下图所示(为了展示方便,50 步的生成过程中,之保留了 9 张中间步骤,每隔 5~6 步输出一张图):
▲ 图4:从左上角到右下角,用与图 1 完全相同的 prompt 再次生成一张图片的过程
容易看到,「随机性」的引入,可以在同样的初始条件下,生成截然不同的结果。关于扩散模型中随机性和确定性的解释,将在第 4 节详细介绍。
创世游戏中的「物理定律」从何而来?
宇宙中的一切都是由自组织形成:宇宙大爆炸形成的夸克;宇宙星云中产生的星体;地球岩石圈的形成;石膏和氯化纳的结晶;六角形雪花的凝结;等等等等。宇宙中的四种力:强力、弱力、电磁力和引力是万能的粘合剂,是它们促使复杂组织能自发地建造。... 非生命物质自组织过程是不需要模板的,或者说它也要模板,但这种模板很简单,宇宙中无处不有。所以,太阳和 100 亿光年外的恒星可以有相同的成长过程;巴纳德星系的行星上如果飘雪花,它也只能是六角,绝不会是五角。
——王晋康《水星播种》
在类比创世游戏的图像生成过程中,我们知道,「物理定律」是「宇宙生成游戏」中的一个重要组成部分。缺乏物理定律的约束,完全随机的量子涨落会产生一个即使是在微观尺度上也是各向同性的、充满了躁动的虚粒子的宇宙;类似地,如果在图像生成过程中缺少规则的约束,那么,图像将永远是一堆噪点。 在 Diffusion Model 中的「物理定律」包括两个部分,分别对应生成的两种模式:无引导的生成和条件引导的生成。 我们先看无引导的生成。无引导的生成以创世游戏来类比,对应的是「基本物理规则」:假如我们在 Big Bang 之后产生的空间中划定一块,只规定基本的物理法则,那么这块空间中,通过随机量子涨落和物理法则的共同作用,可能产生星云,也可能产生恒星、黑洞,甚至是一个生命聚集的群落。 而在图像生成过程中,生成的结果如何,则决定于初始的规则和模型从「样本构成的数据宇宙」中学习到的知识:如果数据集中只有人脸的图片,那么通过无引导的生成过程,绝不会产生一只狗的照片,而是会生成一张人脸,因为模型只能从这些数据中学习到「如何生成人脸」的「物理定律」。而对于一个包罗万象的数据集训练出来的模型,做这个实验则有意思的多:
▲ 图5:没有任何初始引导条件下随机生成的两张图片 我们使用 stable diffusion,在不进行任何初始条件输入(没有 prompt、input_image 和 input mask,使用随机 seed)的情况下生成两次图像,可以看到,其生成的图片能被称为「有意义的图像」,但完全无法受控,两者甚至没有任何联系。这意味着,模型自身存储了「从噪点生成图像」的「法则」——尽管能够生成什么样的图像,如同著名的薛定谔的猫,在生成之前我们完全无法想象也无从决定。 而有条件的引导,则对应「创世游戏」的另一种模式。例如,我们划定一块空间,除了指定基本物理规律之外,还进行了一些「引导规律」: 那么,这块空间中更有可能产生一颗岩石星球,而不是弥散整个空间的气体星云或者星际尘埃。 对应 Diffusion Model,在输入文本引导或者初始图像引导时,实际上也引入了「基本物理规律」之外的「引导规律」。当我们使用文本引导,例如「一个美丽的少女照片」的时候,文本将被模型编码成「引导规律」,与「图像生成的基本法则」一起,指导图像的生成——当噪点经过随机扰动出现了一根线条的时候,「文本引导规律」倾向于将这根线条解释成少女的头发或者衣褶,并推动这一区域的像素点向「细化头发/衣褶的纹理」方向变化。所以,Diffusion Model 的运作过程实际上是:
▲ 图6:Diffusion Model 的基本原理。需要注意的是,「基础图像规律」、「引导规律」、「编码器」等都是为了方便理解创造的概念,在 Diffusion Model 并不是以此为依据划分网络模块
「基础图像规律」和「引导规律」编码于神经网络的参数中,与人画图所掌握的规律(如何构图、使用什么样的笔触、线条如何画等等)不同,Diffusion Model 编码的是「像素点在某种条件引导下运动和变化的规律」。 那么,神经网络中编码的规律从何而来? 答案是:从样本中学习。 如果只使用图片的数据,那么神经网络学习到的是「基础图像规则」;如果使用「图文编对」的数据,神经网络则不仅仅能够学习到「基础图像规律」,还能学习到「文字引导规律」。 由于多模态匹配技术如 CLIP 的成熟,「从文字引导中学习图像生成规律」的大部分工作都不需要从 0 开始。这也是文生图模型在 2022 年大量爆发的一个原因(CLIP 模型由 OpenAI 在 2021 年初发布)。
为什么使用多步迭代生成?
在一般的神经网络模型中,「预测」或者「推理」的部分通常是端到端的——输入被送入模型,经过模型的一次运行和处理,能够直接生成结果。而在 Diffusion Model 中,这个过程则通过几十到几百个时间步来完成。这是为什么呢? 如同我们在创世游戏中要生成一个岩石行星一样,从 Big Bang 的开始,到行星的生成,经过了数十亿年的演化。我们如果将这数十亿年的演化历程按照「年」拆成无数的时间片,那么物理规则的归纳将比较简单——比如造物主告诉一位神明,给你一堆样本,每个样本中包含数亿个粒子构成的粒子动力系统及该系统在一秒钟前和一秒钟后的状态,你去总结粒子的动力学法则,这是相对比较简单的。 而如果想要直接从 0 时间点直达最终当前的时间点,那么「物理规则」的总结将变得极其复杂: 岩石行星的地壳、地幔和地核都是由什么元素构成?遵循什么样的规律? 有没有生物圈?生物圈的构成是什么?
虽然神明没有学过地质学和生物学,但凭借总结出来的粒子动力学法则,及近乎无限的计算能力和漫长的时间,这位神明仍然能够从一堆星际粒子中演化出一颗岩石行星。 对于神经网络模型也是如此。神经网络模型本质上是对「规则」的编码,需要编码的规则越简单,意味着神经网络的训练越容易,计算效率也会更高。在实践中,Diffusion Model 的训练过程是「迭代式」的。在 Diffusion Model 的训练中,训练的样本是 形式的样本对。Diffusion Model 学习到的是: 如果我们有某个时间片开始的状态 ,想要得到下一个状态 ,那么对应的「像素点运动或者变化的规律」是怎样的? 或者,如果加入一个引导条件 ,在 和 共同作为输入的情况下,想要得到 ,那么对应的「像素点运动或者变化的规律」又是怎样的? 这些学习到的规律编码在神经网络的参数中。Stable Diffusion 和 Disco Diffusion 数 G 体积的模型(如果大家在自己的电脑上跑模型,势必需要下载这些模型参数),就是训练得到的、固定和存储下来的对这些规律的编码。 相对应的,生成也是一种迭代式的反演。Diffusion Model 的每一步迭代只根据「当前图像的状态」和「模型中编码的规则约束」考虑下一步的状态会怎样。经过数十次的迭代后,也许生成的图像和初始状态千差万别,但其仍然是图像,并且符合语义引导。 Diffusion Model中的随机性和确定性 在使用 Stable Diffusion 的过程中,最开始的时候大家都会有一个困惑:为什么同样的文本,两次生成的图像大相径庭? 答案是:随机性。像第一节中我们通过图片展示的那样,不同的初始条件会产生不一样的结果。在图像生成的过程中,总是充满了随机性: 类似宇宙演化的过程中,从各向同性的空间和能量中演化出了不一样的天体,暴涨时代的随机量子涨落是最主要的原因——即使是同类型的天体,岩石行星的大小、元素构成、地貌、环境也是千差万别。但当「随机性」占据主导的时代过去,物质开始沉淀,随机扰动就开始渐渐让位于确定的物理法则。 如同图 3 和图 4 中所示,尽管由于随机的扰动,对同一个文本生成的图片差异很大,但如果从图 3 所示生成过程的后半段(「大概定型」之后的图片)开始继续迭代生成,那么随机性就不再重要,我们将有很大概率得到和图 3 最终结果类似的图片。 但冯-诺依曼体系结构的计算机毕竟不是量子计算机。这里需要明白一个概念,就是经典结构的计算机中只存在伪随机性 [5] ——如果输入完全相同,则输出必然完全相同。而在 Diffusion Model 的使用中,我们可以通过指定 Seed(随机数发生的种子,相同的种子会产生完全相同的随机数序列),来保证两次生成的结果是相同的。
一些常见问题:为什么Stable Diffusion无法正确生成「男人在女人左边」或者「正常的人脸」一类的图像?
还有一个常见的问题是:Diffusion Model 的生成结果,往往整个画面充满了张力,但特别不擅长处理一些细节和逻辑性的概念。例如: 导致这些问题的原因很复杂,很可能也不是单一的。目前最靠谱的猜测包括如下: 除了这些问题之外,由于数据偏见,也常常导致模型的输出有偏差。例如,研究机构发现,当输入「CEO」的时候,Diffusion Model 有极大概率生成「一张西装革履的白人中年/老年男性」的形象,而不是女性、有色人种、少年人的形象,甚至在输入「黑人少年 CEO」的情况下也有不小的概率出现。这是因为在训练模型的样本中,「CEO」这个词汇往往和「西装革履的白人中年/老年男性」同时小出现,模型错误地学习了这种偏见。
引用及感谢
1. 本文中的部分图像及描述来自 Illustrated Stable Diffusion [6] 。Jay Alammar [7] 是我很喜欢的一位计算机科学方面的「科普作家」,同时他也在 Discord 异常活跃,参与了很多 NLP、CV 方面的讨论。
2. 本文中的部分描述受到 生成扩散模型漫谈:DDPM = 拆楼 + 建楼 一文启发(尽管描述上有很大的不同);
3. 如果想深入研究扩散模型的原理、组件,可以从 GitHub - divamgupta/stable-diffusion-tensorflow: Stable Diffusion in TensorFlow / Keras [8] 入手。尽管这只是 stable diffusion 的一个不完整的实现(只有生成过程而没有训练过程,并且去掉了很多组件),但更加清晰易懂。
4. 本文封面由 www.zcool.com.cn/ailab 生成。
[1] https://www.zcool.com.cn/ailab
[2] https://jalammar.github.io/illustrated-stable-diffusion/
[3]https://zh.wikipedia.org/wiki/大爆炸
[4] https://zh.m.wikipedia.org/zh-hans/量子涨落
[5] https://zh.wikipedia.org/wiki/伪随机性
[6] https://jalammar.github.io/illustrated-stable-diffusion/
[7] https://jalammar.github.io/
[8] https://github.com/divamgupta/stable-diffusion-tensorflow
如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。
总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。
PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读 ,也可以是学术热点剖析 、科研心得 或竞赛经验讲解 等。我们的目的只有一个,让知识真正流动起来。
📝 稿件基本要求:
• 文章确系个人原创作品 ,未曾在公开渠道发表,如为其他平台已发表或待发表的文章,请明确标注
• 稿件建议以 markdown 格式撰写,文中配图以附件形式发送,要求图片清晰,无版权问题
• PaperWeekly 尊重原作者署名权,并将为每篇被采纳的原创首发稿件,提供业内具有竞争力稿酬 ,具体依据文章阅读量和文章质量阶梯制结算
📬 投稿通道:
• 投稿邮箱: [email protected]
• 来稿请备注即时联系方式(微信),以便我们在稿件选用的第一时间联系作者
• 您也可以直接添加小编微信(pwbot02 )快速投稿,备注:姓名-投稿
△长按添加PaperWeekly小编
🔍
现在,在「知乎」 也能找到我们了
进入知乎首页搜索「PaperWeekly」