当前位置:首页|资讯|Stable Diffusion|编程|人工智能|深度学习

Stable Diffusion到底是什么东西?

作者:蓝鲸泽维尔发布时间:2023-01-31

本来想像一开始接触Disco Diffusion时候那样按一些英文的简单解释加上自己的使用经历来写一篇讨论Stable DIffusion原理的文章,结果发现我根本没有那个能力(现在看我以前写的很多内容都有问题,哈哈哈)。而且我发现这个工程量之巨大,即使我把所有数学公式和代码都略过只看文字,也还是越看越觉得不敢下笔。想跳过所有深度学习方面的概念直接强行解释未免也太扯了,但我又想我应该是不可能去搞这方面开发的,所以要写点东西的话,也就只能做到把我觉得有价值的参考资料总结一下,再说一点自己的感想——我没资格说任何结论性解释,但是如果你看完我的文章,产生很多疑问和兴趣想去自己探索和思考,那我觉得我的目的就达到了。

所以跟别人写的文章不一样,我一开始就把我觉得比较好的参考资料列出来,如果你有数学基础,英文也没问题,那直接去看这些最好,不用听我废话。我是了让自己能用好这些工具才想到去了解这些原理,如果你也是这些东西的使用者,又不想去啃那堆代码和数学公式的话,我后面的内容或许能有点用(就是你可以直接跳到参考资料之后去看我的感想部分)。

比较高级(不太友好)但比较权威的参考资料:

  1. https://jalammar.github.io/illustrated-stable-diffusion/ jalammar

    这位叫Jalammar的老哥写的关于Stable DIffusion原理的简明介绍和各种示意图基本是国内自媒体这方面文章的来源了。但是说实话,如果你不知道什么是Attention机制、什么是U-net,什么是CFG,甚至连Diffusion和GAN的区别都不知道的话,这些图表看了也是不会理解的。有很多内容他都没有解释。

  2. https://huggingface.co/blog/annotated-diffusion

    按DDPM论文代码复现的方式讲解的DIffusion原理。很长,很多代码,但是里面有U-net的示意图。

  3. https://lilianweng.github.io/posts/2021-07-11-diffusion-models/

    OpenAI 大佬关于Diffusion很系统的介绍,当然也是以数学公式为主。

  4. 与关键名词有关的论文,比如CFG、GLIDE、CLIP、Attention,以及CLIP Latent DIffusion\Stable DIffusion发布时的“官方”论文等。其中很多都在前三项的参考文献中有提及。

  5. B站有几位数学或计算机专业的UP做过与这些资料相关的精讲(不是营销广告号那种),时长将近一两个小时,可以自搜一下。

下面列一些对我这种外行帮助很大,又不需要啃代码和数学公式就能看懂的资料:

  1. https://stable-diffusion-art.com/how-stable-diffusion-work/ 

    强推一下这篇文章,在完全不用数学公式和代码的条件下基本把整个工作流讲透了,作者这个网站里还有很多关于SD使用技巧的文章也都很有用。我其实是在找SD负提示语的写法时发现的这个资料。他文末的参考资料列表也把很重要的一些论文提到了。

  2. How AI Image Generators Work (Stable Diffusion _ Dall-E) - Computerphile 

    这个视频站内有人搬运,是我见过把Diffusion原理讲得最简单易懂的视频了,而且还顺带把CFG给解释了。

  3. 顾险锋2016年的文章《人工智能中的联结主义和符号主义》

    你可能会纳闷这个跟SD有什么关系,还有顾险锋又是谁(说丘成桐的弟子可能就知道了吧)。其实大多数外行在AI生成技术之前,对深度学习唯一的认识可能就是AlphaGO打赢了李世石和柯洁。这篇文章对我很有启迪,因为Stability AI CEO每次讲SD原理时候都会从2017年谷歌关于Attention机制的论文说起,而2016年这篇总结性文章可以帮你梳理这个时代之前的信息。

  4. 混沌巡洋舰-许铁在某乎的一系列专栏,承接第3项的扩展阅读。脑神经科学中的一些概念对理解Diffusion模型的广泛应用似乎很有帮助。

  5. http://colah.github.io/posts/2014-03-NN-Manifolds-Topology/

    这篇文章国内有人翻译,叫《用可视化理解神经网络!》,里面的一些动图对形象化的理解神经网络、分类问题、流形假设很有帮助。

  6. https://nonint.com/

    Tortoise.TTS(乌龟 tts)作者的博客,前谷歌现Open AI的研究员, 虽然他跟Stable DIffusion没什么关系,但是他的文章里能看到很多对Diffusion原理很浅显又很深刻的解释。

  7. 关于SD的使用技巧,尤其是对于非二次元类图片的制作,以及一些名词的解释,CSDN上也有一些内容可供参考。

好了,打了快2000字才开始正式内容。

所以,Stable Diffusion到底是什么东西?很多文章会从Diffusion的原理和训练说起,但我觉得这么开始的话还是缺了很多东西。

我推荐先去看一遍顾险锋的文章。SD首先是人工智能中的联结主义,是模仿人类神经元结构,去完成一项或多项人类工作的深度学习模型。跟符号主义不同的是,它的原理、结果是不能用数学完全解释的。之所以机器学习处在数学-计算机专业鄙视链的底端,而顾险锋作为数学家,试图在计算机视觉领域做出贡献遭到了很多数学专业人的攻击,原因就在于此(他们认为这对数学专业的发展毫无益处)。实际上机器学习有点像数学与脑神经科学的交叉学科,而且这个领域的大牛很多都有心理学等医学方面的背景。如果说电脑和软件是符号主义推理出来的人工智能产物,那么这些基于神经网络的AI模型就完全是另一条路线,一种数学家没办法从理论上证明,但是工程师们却认为可以拿它来替代人类一部分工作的,一种从本质上就会引起文科生、理科生和工科生吵架的玩意。

前2段讲的很透彻了

举个例子,我们知道CLIP模型其实是一个以文本为线索,对相关图像训练形成的一个分类器,但它对图像分类的依据,并不是人类的理性思维,而是一种神经网络计算出来的参数体系。那些存储在神经网络上的用来表示某种图像特征的权重,并不是像人类编写的百科全书或词典里那样,以一个单词或者词根、缩写为单位,而是算法拟合出来的一个次语义级别的单位(token),这个计算过程就叫数据表示(Data Presentation),而tensor、embedding、activations、hidden states,不管你怎么翻译,说的都是这个token所变换成的一个可以存储在神经网络中的向量(vector)。你没办法按人类学习的思路去理解机器学习,比如人类词典里那些超级长的单词,虽然很荒谬但仍在可以理解的范畴,而CLIP里为何会把下面这些词作为人类语言的底层元素来对图像进行分类,就实在无法用理性思维解释了:

thinkbigsundaywithmarsha 和玛莎一起周日大思考?

blackandwhitephotography 黑白摄影?

internationalwomensday 国际妇女节?

artificialintelligence 人工智能?

digitaltransformation 数字转型?

landscapephotography 风景摄影?

wednesdaymotivation 周三的激励?

worldenvironmentday 世界环境日?

screenshotsaturday 周六截屏?

womenshistorymonth 妇女历史月?

thepersonalnetwork 私人网络?

(以上为CLIP中一些比较长的次语义级别单位)

也许是因为数据集中有这些词的图片太多了的缘故?那么在GPT这样的纯语言模型中,又为什么会把indivisible(不可分的)拆成了ind,iv,isible 这3个token的呢?

在 https://beta.openai.com/tokenizer 里可以输入任何英文来查看它被GPT分解成了哪些token。  

我就查到了一些很有趣的分解:如

Chinese= Ch + inese

Japanese= J + apan + ese

Vietnamese= V + iet + namese

Cantonese = C + ant + ones + e

这种令人费解的词义分解方式最后却能让GPT模型表现出一种似乎能理解人类语言的能力,正是很多人对机器学习鄙夷的一个原因——你没办法从数学和常理上去证明它的合理性,你可以随便举几个反例来证明它是“人工智障”。工程师的看法则相反,你认为不可靠是因为看到它只有60%的正确率,但我可以一点点努力把它提高到70%、80%、甚至99%,而每一次提高都可以替代一部分人类的工作,为什么说它没有用呢?

如果这一段内容你看懂的话,你就知道互联网上99%关于人工智能的争吵都是没有意义的。

对反对者来说,任何水平的人都可以通过最基本的生活经验和逻辑来“抵制”或者“推翻”当前的AI模型,但对支持者来说,你总能发现它有一定的成功率来替代和超越部分人类的工作。

这也是为何当前阶段的人工智能,比如AI绘画、AI音乐、AI编程、AI翻译、AI写作,不太可能被已经精通这些技能的人所很快接受,而反而被那些没有精通这些技能的人所快速采纳的根本原因。半杯水总比没水好

插一段我忽然想到的话题:

比取代一些人工作更可怕的,是AI在教育上的用处。你可以认为一个技能水平不如你的人,在工作上使用AI超越你是作弊,但是当AI把过去需要四年才能培养出来的专业人才,用四个月,甚至四天培养出来呢?某棋手不就是这么被逼成网红了么(笑~)。

很多人没意识到ChatGPT能写出大学生级别的论文代表什么意思——如果某一学位或某一门课程的学习目标是以学生上交的论文为评价标准的,也就是说教育的目的是为了让学习者能根据教科书、老师的讲解、自己的实践、同学的交流、广泛的资料选读来总结出有新意的结论的话,那如果以后这些事情AI能做到都包办了呢,这个教育体系是否还有必要存在呢?(如果有一天雇主发现找几个高中生用AI培养一下就能完成工作了,还要需要那些老了四岁的大学生么?机器学习本身用到的数学知识甚至都没比高中数学难多少!)

像这篇文章,如果我直接把相关论文和文章都扔给ChatGPT去总结,比我自己研究得到的结论会不会来得更加准确呢!等到了听AI一句话,胜读十年书的时候我们的教育体系可能就会被彻底改变了。AI不仅会让你失去工作,到一定程度,你引以为荣的专业背景和资历也都会不复存在。世界冠军都接受不了,何况是普通人了。

再提一下,Stability.AI CEO 对Stable Diffusion的定义,是一种生成式图片搜索引擎。这是一种从它外在表现去定义的方法论,和我们要探讨的联结主义原理是另一种思路。看上去这个模型学习了人类几亿张图片后,就可以按人类提供的语言定义去生成任何一张与之相关的、之前并不存在的、崭新的图片。而这个模型大小,远比你把几亿张图片进行压缩之后,建立的一个按人类定义索引的图库要小得多,它的“搜索”结果也不是一堆相关图片的排列组合,而是基于机器学习建立的某种内在逻辑而创造出的一组崭新的示例。和GPT这种大型语言模型一样,我觉得你也可以把它视为一种被压缩的“知识”。

所以我们眼前这些AI模型,都可以被视作一种被推送到个人手里的“边缘计算”,它其实某种意义上讲是一种去中心化的知识体系

如果GPT和SD让以提供中心化文本和图像知识推送的谷歌、百度感受到危机的话,那么等文本到视频和3D的模型成熟了,依赖中心化算法,控制流量和推送广告以盈利的视频网站、游戏厂商就是下一轮被“去中心化”的目标。

如果给你一个可以装在手机里的,可以自定义各种信息流,而不用看任何广告的生成式图文、视频、游戏引擎,你还需要装那么多APP么?我没瞎说,这是OpenAI正在开发的真实项目(也是微软投资的真正目的),Stability.AI CEO访谈里也说了,他开源的真正目的也不仅是为了“促进行业发展”,而是在抢夺下一代互联网中心!对他这个计算机专业出身的对冲基金经理来说,这其实是一种套利,而不是纯粹的公益。他想把这些搞AI的大公司都逼到开源领域去,原话。

中心化推荐算法几乎是现在所有互联网企业的核心,然而马云说的以后不再会有专门的互联网企业,而是所有企业都是互联网企业,其实这么看是有点道理的。

我们还是回到正题上吧,如果你接受了机器学习本身的“绝对”可靠性和可“相对”提高性,那下一步就应该从联接主义或者仿生学的角度,重新审视一下眼前的AI模型。

顾险锋文中提到了海马体。对人类记忆原理的一种解释,就是海马体是按时间序列来分解和存储视觉、听觉神经传递的信息的,而海马体的共振频率和地球的一样(很多动物都是这样!)。说到DIffusion模型的实质,(我自己的看法)就是一个循环可逆的、与时间序列相关的、按照一个或多个线索,对某种标准化的、与时间序列相关的数据分布的某种采样结果的去噪音过程。那是不是可以认为Stable Diffusion是在模仿人类视觉神经从海马体储存的记忆数据中复现某种场景的原理呢?

等等,这不就是Conditioned DIffusion模型吗!

你一定听过一切事物都是某种频率或波形的说法。如果我们把文本、图像、声音、视频、某种人类行为等这些非结构化的数据,按时间序列分布相关,强行正则化之后,是不是都可以视为同一种波形呢?脑神经科学已经发现人脑神经元上使用的是一种普适的算法,这也是为何盲人可以利用听觉神经“看见”的原因!(顾险峰的文中有相关内容,一定要看下)

而我们将这些非结构化数据进行结构化处理的意义,就是为了让神经网络去学习和分析它。但现在的AI模型和之前不一样之处在于,我们不再需要繁杂的人工数据标注去设计一个庞大的、在人类理性思维看来合理的数据集,而是利用超级计算机,直接把有多模态性质的(文本-图像、文本-声音、文本-文本)丢给AI,让它自己去建立学习规则。也就是从大数据+小计算的有监督学习向小数据+大计算的无监督学习过渡。这大概也是为什么以后所有基于大数据的互联网企业都会被基于超级算力的AI公司取代的原因。而按Sability.AI CEO的说法,苹果的芯片因为特别适合于AI模型的计算,会让这家公司超越谷歌、微软成为世界上最大的AI公司。实际上当前AI发展突飞猛进的真正方向,就是让AI把那些非结构化数据利用起来以形成新的知识。我们不再需要用自己的理性思维去设计一个体系去将非结构化数据(书本、语音、音乐、视频、行为模式、蛋白质中的氨基酸排列等)进行归纳、总结、分析以创造专业知识和在此基础上生产新的内容,而是把这种数据结构化的问题,跨过以前干这些事的专业人士,直接交给AI,让他们去进行科学研究和内容创新。

我又扯远了,再拉回来。之所以强调是非结构化数据,就是要说明它是对人类神经本能(也可以叫形象思维,灵感,或者叫非理性思维)的一种模拟,相当于让AI看了几场电影,听了几首歌之后,按人类在其中留下的线索(比如,语言),自己去拟合一套人类的标准以总结出新的知识,而不是让人类先总结一些标准,再让AI按计算机语言去计算。前面讲的CLIP和GPT中的次语义级别单位,也就是token,都是AI自己算出来的。我们的语言学里就不是这么去分割词根词缀的,如果让人类自己去把语言数据结构化再做计算,是不会得到这种token的。

所以我感觉之所以说2017年的“Attention is all you need”所提出的Attention机制能在几年后引出这一轮利用非结构化数据进行超级计算的热潮,可能就是它解决了存储在神经元上的数据间的交互问题(Information Entanglement)。因为我实在没有能力去理解那些数学公,所以这里只能根据看过的很多资料去想象了。也有人说Attention机制其实就是一种AI的“注意力”,让它能够自己去寻找数据间的隐含规律,以把精力放在最重要的事情上。

这是我在一篇名为“Attention in Natural Language Processing”的论文中找到的一个与Attention有关的图示。可以看到,储存在神经网络中的token是有关联和层次的,当你提出不同的任务时,所关联到的token和权重会有所不同。如果这些token分别存储在不同的神经元上,那就相当于这些神经元会根据不同的任务而有层次的被“唤醒”或“点亮”。AI可能就是通过这种机制自己从非结构数据中“学习”知识并把它以某种层次“记忆”在神经网络上的。可能人类自己也是这样的?

Attention机制的可视化演示

这里还真有一篇论文叫 "Memory is attention through time",  所以当神经网络中的Attention与时间相关,也成为一种类似频率的,和原始token一样结构化的数据分布时,是不是也就成为了被存储在神经元间的某种”记忆“,可以通过采样的办法被人们提取出来呢?能不能说这就是我们需要的那个AI从非结构化数据中压缩和学习到的”知识“呢?实际上,Attention解决的还不止是token间联系的问题,它还可以让神经网路变得”可解释“,也就是甩掉神经网络那个著名的”黑箱“特点,使得人类可以通过学习它的结构,获得有用的”思路“,而不再只是用它来进行蛮力计算。

再回到前面讲的CLIP上,以前用Disco DIffusion时了解过它的原理,就是让文本和图像解码器分别把那些图片和与他们相关的文本分别解码成同结构的向量之后,让相同数据对间的向量余弦相似度最大,不同数据对间的余弦相似度最小以拟合出来的一个神经网络。其实它只是Diffusion模型中的一个模块,能做到的是根据你提供的图像来给出文字描述,而不是生成图像。但它非常酷的一点,就是zero-shot,可以为训练集中没有出现过的新图片预测它对应的文字描述。为什么呢?因为文字token是按次语义级别分解的,新图片被图像解码器解码成 Image embedding之后,与神经网络中文字token的向量进行余弦值比较,再将最相近的token转换成文字,我们就得到了新的文本描述!而这里一定是存在Attention机制的,不然我们得到的描述只会是一堆次语义级别token的堆砌,而不是符合人类语言的句子。

这时候一个新问题就出现了,为什么不能直接对CLIP输入文字,按类似的原理反向解码输出图像呢?是不是因为我们提到的解码-译码结构是单向的,CLIP的The Variational Autoencoder (VAE) 就是只能接受图像输出文字,而不能直接反着用呢?

或许我们还可以探讨得更深入一点。一只猫(A Cat)在CLIP中所对应的 Image embedding(也就是将图像解码后形成的向量表示),到底是什么样子的?CLIP的预设虽然不能画图,但是可以通过一个叫CLIP Front的网站去查询一个文本能联系到哪些图像。如果我们是某种可以”看见“这个512 X 512(训练集图片尺寸) X 3 (红、绿、蓝)=786,432维度的像素空间的生物,那么这只猫的样子应该是包括了所有和"A Cat"有关联的神经元一起点亮之后形成的超高维形象。如果把它映射到二维空间,那么它应该是一张可以包含所有你查询 "A Cat" 时得到的图像,按照Attention机制得到的权重,混合在一起的样子。。。那它还是我们想看到的一只猫的图片么?

A CAT

所以实际上,语言是对图像一种极大程度上的精炼,要实现从文本生成图像,你就要设计一种办法,让AI从符合”A Cat“标准的某个超高维度图像中,”挑“出一张映射到二维空间,而让和”猫“的视觉元素有关的所有变量,比如(黑、白、花。。。),(公、母、奶猫。。。),(缅因、狸花、橘猫。。。)(照片、卡通、水彩。。)(在吃饭、睡觉、打架。。。)等,都只是从中分别选择一项,而不是全部混合在一起。所以是不是可以说,所有利用CLIP生成图像的尝试,从DALL-E、CLIPdraw、GLIDE、UnCLIP、StyleGAN 、Latent diffusion\Disco diffusion,再到现在的Stable DIffusion, 其实都是一种采样过程呢?

而这里提到的某个超高维度图像,其实就是一种存在于那个维度下的数据分布。最关键的一点,它是一个连续量,是我们把数据集中离散的、所有与猫有关的图像“融合”起来的,一种让机器能够识别的某种标准化的数据分布。而现在当你想从中抽出一个样本时,怎么才能保证你抽出的是猫在每个变量方向上都是接近离散的状态,而不是混在一起毫无意义的一团呢?

举个例子,假如数据集中的猫只有红、绿、蓝三种颜色,那我想要的是采样是落在这三个区域里,而不是它们中间(比如黄色)。但是当你给出的文字提示没提颜色时,怎么才能告诉它只取那三个颜色区域周围的点呢?和猫的图像有关的变量,就是它可能变化的视觉元素太多太多了,你真的要用文字全部定义出来吗?

所以,我觉得所有生成模型的工作原理,其实都是从某种机器学习得到的知识(某个连续可分的数据分布)中,采样出一个离散的、在人类理解范围内的样本的过程。

那如果图片生成模型其实是从高维度空间中采样的话,我们又该如何得到想要的那种分布呢?假如用最常见的梯度下降算法(Gradient Descent)一个随机采样得到的分布开始,计算它与目标分布的差距,使它往差距变小的方向变化一直演算下去,直到这个差距我们能够接受,是不是就会找到我们需要的那个分布了呢?

问题在于,一个代表图像的数据分布,它的均值(mean)往往是没有任何意义(meaningless)的,就像前面讲的,”A Cat“图像的均值,肯定是一团无法分辨的、没有现实意义的图像。所以当设定损失函数(Loss function)时(量化采样分布与目标分布的差距),我们需要的目标是一个类似众数(mode)的离散值,而不是均值(mean)这样的连续量,可是它做不到。于是才需要一些额外的办法,来间接地实现它。

GAN就是其中一个思路。所谓对抗生产网络,就是让”判断器“列出一系列mode,去判断”生成器“生成的图片是否与其中某个mode的差距足够小,这样就能得到近似于一张真实存在的、或者应该是真实存在的照片的结果但GAN存在一种Mode Collapse的问题(我不明白为何要翻译成模式坍塌,mode在这里明明是众数的意思),就是当AI成功地生成了一张类似某个mode的照片后,它忽然发现这里离其他的mode太远了,于是就每次都找同一个mode——这样的结果就是虽然GAN能保证生成的图片很保真,但是缺乏多样性,看上去好像都是同一张照片衍生出来的一样。

而头图里讲的内容,就是Tortoise.tts开发者对Diffusion模型原理的一个解释。Diffusion其实是一种更加聪明的解决办法。我们依然以均值(mean)作为向目标分布优化的参考,但是最后却能做到让这个分布收敛在某个mode上,而且每次还不是同一个mode!这是怎么做到的?

到现在我才觉得可以开始提Diffusion的工作原理,因为没有前面这些内容,你没办法解释为什么我们要用它来生成图像,和为什么它超越了GAN。

Diffusion在这里就是字面上的扩散的意思,因为它是受到了非平衡态热力学(Non-equilibrium thermodynamics)中类似的扩散过程的启迪而搞出来的。一个常被提及的扩散例子就是把一滴墨水滴入一杯水,看墨水逐渐扩散到水中成为均匀溶液的过程。如果把那滴墨水视作一个染料与水的离散分布(墨滴入水前,四周是空值),而它入水扩散之后,是不是就是一个连续的数据分布了呢(假设这杯水相对于染料而言是无穷大的空间)。如果纯水溶液可以视为一个标准的高斯分布的话,那么我们得到的均匀分布的新的墨水溶液,它的均值是不是还是和原来那滴墨水一样,只是分布近似于纯水溶液呢?如果存在一个条件,能让我们把这个过程倒退回去呢?不就是从一个近似于无意义的数据分布中,生成一个有意义的离散数据吗?

再举一个跟前面有关的例子,我们现在的麻烦是将红、绿、蓝三种颜色的墨滴放进了同一杯水里,然后和前面的扩散过程一样看着它们形成一杯分布均匀的白色溶液。如果我们能找到逆转这个过程的条件,不就能保证恢复出来的还是那三种颜色而不是其他任何颜色吗?我是不是找到那三个均值分别和红、绿、蓝三色墨滴一样的近似纯水溶液的分布之后,再把纯水溶液的这个分布想办法减掉,就得到了原来的三色墨滴呢?

我所需要的这个逆转扩散过程的条件,就是马尔可夫链(Markov Chain)。也就是假设染料在水中扩散过程的每一步过程,都只与上一步有关。于是,与之前所有扩散过程有关的信息,都可以从当前的状态中找到。所以,只要我知道在反向扩散过程的每一步中,该去掉哪些正向扩散在这一步插进染料分子中间的水分子(噪音),就可以一小步一小步地将那三种颜色的墨滴从一杯分布均匀的白色溶液恢复出来!于是,我们就找到了一种能从某个连续可分的数据分布中,采样出一个离散的、在人类理解范围内的样本的新办法,也就是一个新的生成模型

那接下来新的问题来了,怎么去计算这个噪音(每一步该去掉的水分子量和它的分布)呢?怎么去获得那个均值和目标数据分布一致,又和纯噪音的分布(纯水溶液)近似的一个初始分布呢?为了让AI获得计算,或者说预测那个噪音的能力,我们就得先让AI学习一遍正向扩散的过程,这就是DIffusion模型的训练原理。既然我们的目的是为了用CLIP模型来生成图片,那就把CLIP模型的图片训练集一张一张丢进“水”里,让AI去学习这个过程,不就OK了?

但是我们怎么去找到那个均值和目标数据分布一致,又和纯噪音的分布近似的一个初始分布呢?在溶解了几亿张图片的水溶液(DIffusion模型)里,我怎么才能排除所有其它的信息,构造出一个只溶解了我要的那个图片的水溶液(只含有应该去掉的水分子和我需要的那张图片的一个跟纯水溶液差不多的分布)呢?如果我们找不到这个合适的起点,那么就不可能通过反向扩散得到我想要的那张图片!

但是等等,这个学习了几亿张图片的正向扩散过程的Difusion模型,到底学会了什么能力?它见识过几亿张图片从一个离散的数据分布,一小步一小步地加入噪音,直到最后形成和噪音本身分布差不多的一种连续分布的过程之后,是不是也可以直接从一张完全随机的噪音采样开始进行反向扩散呢?

当你丢给Diffusion模型一个不含任何图片信息的、纯粹由水分子(噪音)构成的初始分布,它该怎么去计算那些应该减去的水分子分布呢!

看好了,这就是一切魔法开始的地方!

根据马尔可夫链的假设,这张不含任何图片信息的纯水溶液分布里,也是包含了之前所有扩散步骤的信息的。那么从它开始一步步反向扩散回去的话,到底会得到什么呢?这里就涉及一个重要的概念,Diffsuion模型是一种可能性模型,因为这种可逆的扩散现实中其实是不可能存在的,而根据马尔可夫链假设反向扩散得到的结果,只是无数可能性中的一种。你减掉一个噪音分布后,得到的是任何一个可能会正向扩散到这一步的,含有某种信息的一个分布!

所以,在我们没有进行干涉时,Diffusion模型会从一个毫无意义的、不包含任何人类信息的高斯分布噪音开始,一步步向任何一张在它看来合理的图片方向去“降噪”,于是我们就得到了一个可能会生成任何符合人类标准图片的生成模型

但等等,还有一个问题,我们之前说Diffusion能取样到一张人类能接受的离散数据的前提,是因为降噪是从一个和目标分布均值一致的初始分布开始的,而现在这个随机降噪生成的图片,它降噪到最后的均值,很可能就落在了我们需要的目标值中间,让我们看到的只是一团灰蒙蒙的东西,而不会接近训练集中的原始图片。怎么避免这种情况呢?

这就是前面Tortoise.tts作者画的图中所描绘的,Diffusion模型的神奇之处。我们知道在没有干涉时,AI会自行判断当前的分布应该向哪一个目标分布的均值去优化。但如果只是单纯降噪的话,一旦某一步得到的分布中不包含任何一个mode(错误地删掉了所有想要收敛到的目标),那么可能接下来再计算就没有意义了。所以在每一步降噪之后,还要再加上一定量的高斯噪音,让AI有机会修正自己的错误。

那么这时候,把两种噪音的加减放在一起来看的话,到底意味着什么呢?意味着每一步我们都在把这个分布的均值向某一个mode移动一点点,同时还保证,这个分布中至少包含一个和某个数据集中真实存在的或应该存在的一张图片的分布均值一致的mode。最后我们就可以得到一个均值和训练集中某张图片或AI认为应该存在的某张图片类似的一个分布。这其实就是在反向扩散过程中,AI逐渐地排除掉其他所有可能性,帮我们从一个随机噪音样本中恢复出一张高质量图片的过程!

而之所以我们会认为它是高质量的,恰恰是因为它的数据分布是向某张真实存在的或在AI看来应该存在的图片收敛的结果。而如果我们从另一个随机噪音样本开始降噪,就会收敛到另外一张“真实”的图片上,而不会出现GAN那样的Mode collapse。所以这就是Diffusion模型为什么总能生成令人惊艳而多样化的图像的原因了。

而且它作为种可能性模型,你是不可能看到它输出一张和训练集中某张图片完全一致的图片的,反而是无数张似曾相识的新图片!这种举一返N的能力用水溶液的例子解释,就是虽然你仍然能够得到一个看上去和入水前状态很相像的红色墨滴,但细看会发觉它里面混进去了不少绿色和蓝色的染料。

那有没有办法人为去影响这个Diffusion过程,而不是让AI自己看着办呢?

这就是Prompts的作用了。当我们输入一段文本作为Prompt时,AI就可以通过CLIP找到它所对应的 token-embedding, 也就是一个存在于高维度空间的数据分布。这时候我们的Diffusion模型从一个随机噪音开始降噪的过程,就多了一个新的条件,那就是在每一步反向扩散降噪时,都以这个token-embedding的分布为参考条件去选择均值移动的方向(去找那个看上去更像的mode,而不是最近的!),直到最后收敛到某一个最合适的mode上。

这样我们就得到了一张既符合Prompts,又看上去很真实(无论如何都会收敛于某个“真实“的分布上)的新照片!这实在是一种天才的设计。现在你是否明白为何每次看到一张AI绘画作品时,不管上面的内容多么天马行空,都有那么一种似曾相识的感觉的原因了呢?

那么该如何控制这个参考条件的影响呢?这就是 CGS(Clip Guidance Scale) 和 CFG(Classifier-Free Guidance)两个参数的意义所在了。前者顾名思义就是直接去调节CLIP提供的参考条件对DIffusion过程的影响,以前的Disco DIffusion就是用的这个参数。而到了Stable DIffusion上,却换成了CFG——它实际上是个比例,先以Prompts为参考条件做一次降噪,再在不考虑它的情况下做一次降噪,而这个参数就是在控制这两者间差别对分布的影响。当CFG>1时,它就是在放大Prompt的效果。加大每一次降噪后新的分布的均值向参考分布的均值移动的距离。

等下,那CFG如果小于1会怎样?那就相当于让AI把每一次降噪后得到的新分布的均值向你给出的参考分布的均值的反方向移动。这就是传说中的负提示词(Negative Prompts)。

说了这么多,其实才只讲到了Dall-E和Imagen这种Pixel级别的Diffusion,而我们能拿到手用的,其实都是在Latent Space(一种低维度的潜在空间)下计算的。前面提到的512 X 512(训练集图片尺寸) X 3 (红、绿、蓝)=786,432维度的像素空间,对当前的消费级GPU来说要求太高了。所以,Stable DIffusion其实能计算这么快的原因之一,就是把DIffusion降噪的过程,放到了一个4 X 64 X 64的低维度空间中进行的,这是一个比原来的像素空间小了48倍的潜空间。所以这是一个VAE结构,前面说的随机噪音、token-embedding都要先被压缩到这个空间里,再通过Latent Diffsuion(潜空间中的diffusion)生成一张潜空间中的新图片,再通过VAE还原到像素级别输出给人类。而这种Latent Diffusion的训练过程当然也是在潜空间中完成的(所以计算成本也下降了!)。

但问题在于,为何经过这样的压缩处理之后,Latent Diffusion的出图质量不但没有下降,反而更好呢?这可能和机器学习里的流形假设( Manifold hypothesis )有关。如果认为自然数据是由低维的流形所表示在空间里的,那它本身就是一个假象,可以直接去低维空间中计算它而得到和高维度相似的结果。而我在脑神经科学方面文章中看到一点,就是这种将高维图像压缩到低维去理解,好像恰恰是人类视觉神经的一个运作原理?也就是说,更有助于让AI将注意力放在低频段的、总体性的形态上去——相当于让AI把更多的精力放在判断一张图片的整体构造上,或者说,把一张图像的总体性特征放大了给AI看?

不过从输出结果上看,我们其实可以看到流形假设并不完全正确,因为Latent Diffusion在人脸、手这种在图像整体中占比比较小,但细节又不可忽视的地方,表现都不如Dall-E这种像素级别的DIffusion。所以这种低维的计算还是有损的——这也是为何Stable DIffusion的VAE解码中,是加入了人脸修正等加强模块的。更换更好的VAE似乎也是一种增强SD效能的方式。

潜空间中的Latent Difusion,是在一种叫U-net的结构中完成的。这名字就是指这种神经网络看上去是个U型(这个图是别的模型里的,跟SD中的可能不一样!)。这种结构实际上常见于医学影像的处理,输入数据从高维度一层一层地降到低维度后,再从低维度一层一层地上升到高维度形成输出数据。如果这是一个图像生成模型的话,是不是可以认为AI是在神经网络的最深处,从最低维层次开始生成图像的低频段信息,再一点一点上升到更高维度去补充高频段的细节呢?如果是这样的话,那就和人类绘画的思路很像了——先定构图和轮廓,最后再补充图层和细节。而这样一个沿U形前进的路线,是不是也可以视为一条马尔可夫链呢?

只是个示意图,SD中可能并不是这样的结构!

其实我前面说反向扩散DIffusion遵循马尔可夫链的过程,应该是省略了很多很多内容的。从SD官方的示意图里可以看到,在Conditioned Diffusion(参考Promts的扩散)路线中,token-embendding是先形成一种Attention层,再去影响残差网络Resnet的Diffusion过程的。有人把这个过程叫Cross-Attention机制。我理解它的意思可能就是把CLIP中的Attention机制反过来用一下,把你输入的文本所分解成的次语义级token和定义它们之间关系的Attention组合起来,以筛选掉一些不必要的扩散目标(mode)?这个Attention层与时间相关之后,是不是可以看作是一种”记忆“或”知识“在被Diffusion过程采样出来呢?

Conditioned Diffusion with Cross-Attention

我觉得到这一步,应该基本上是把我能理解到的与Stable DIffusion有关的原理和性质梳理完了。总结起来,除了利用U-net+VAE的结构实现信息损失可控的低维度计算提升了速度外,CFG和Cross-Attention可能也是它在自然语言理解和处理效率上和Disco Diffusion相比有很大提升的一个原因。

但我觉得从Tortoise.tts作者给出的Diffsuion原理解释上看,其实这类生成模型还是存在致命的弱点的。虽然它可以确保向”真实“的数据分布收敛,但一旦训练集的分布不够多样化,出现那种过于突出的"mode",就可能会在生成的结果中放大与它相关的概率,让其他一些本来应该是有”平等机会“被选中的”mode“,比现实中的分布更多地视为一种”噪音“而删掉。

比如,如果你的数据集中80%与法官有关的图像都是男法官,70%以上的美女照片都是西方面孔,或者某个女演员的照片太多了,那么当你的Prompts中只约定是”法官“、”美女“、”女演员“时,你会发现得到的全是男法官、欧美长相的美女,而那20%的女法官、30%的东方面孔是根本画不出来的;或者所有的女演员好像都和某个人有血缘关系。

解决的办法就是追求更多样化、重复性更少的训练集。SD到第二代时弃用了CLIP,使用未经筛选的、量级更大的OpenClip就是出于这个原因。或者我们可以期待某种更聪明的模型替代它——毕竟能满足生成模型要求的”连续分布-离散取样“解决办法的,应该还有很多吧。

最后说点和使用技巧有关的内容:

Stable Diffusion 1.5 比 2.1版本似乎容易出好图,基本上国外社区比较高质量的作品都出自1.5;

Stable Diffusion 每一代训练之后,对Prompts的使用都需要调整,1.5和2.1版本所用的技巧都是不通用的——到3.0之后,应该也需要重新探索;

Stable Diffusion 2.0之后的版本,Negative Prompts的作用好像都被放大了。一个负提示词的效果能顶上十个正提示词。

随着SD版本迭代,AI对语义的理解越来越接近“常识”之后,对Prompts的要求也会越来越高。描绘词绝不是无脑堆砌、越多越好——1个Prompts最多只能有77个token, 所以放太多没有关联的单词不一定有好的效果。

(完)


Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1