https://mccormickml.com/2022/12/21/how-stable-diffusion-works/
计算机仅凭书面描述就能创作出艺术品,这种能力令人着迷!我知道,就我个人而言,我非常好奇,想知道这背后的真正原理是什么,所以我想尽我所能,为那些不熟悉人工智能概念的人提供一个不那么肤浅的解释。
概述
在第一部分中,我将为您提供高级解释(您可能已经熟悉了)。这是一个很好的开始,但我知道它不会满足我的好奇心。😉我会问,“好吧,很棒,但它是如何做到的?”
为了解决这个问题,我将向您展示稳定扩散的一些内部工作原理。内部结构比您想象的要复杂得多,但我至少想更具体地向您展示正在发生的事情,这样它就不再是一个完全的谜了。
进一步来说:
稳定扩散是一个巨大的神经网络。
神经网络是纯数学。
事实是,我们并不完全了解它在做什么!
最终,稳定扩散之所以有效是因为我们对其进行了训练。
但是让我们先从更大的角度来看待这个问题!
稳定扩散消除图像中的噪声
如果您曾经在光线太暗的情况下尝试拍照,而照片拍出来却是颗粒状的,那么这种颗粒感就是图像中“噪点”的一个例子。
我们使用稳定扩散来生成艺术作品,但它实际上在幕后做的是“清理”图像!
不过,它比手机图片编辑器中的降噪滑块要复杂得多。它实际上了解世界是什么样子,也了解书面语言,并利用这些来指导整个过程。
例如,想象一下,如果我把下面左边的图片交给一位熟练的平面设计师,并告诉他们这是一幅外星人弹吉他的画作,风格类似 HR Giger。我敢打赌,他们肯定会仔细地把它清理干净,创造出像右边图片一样的东西。
(这些是来自 Stable Diffusion 的实际图像!)
艺术家会利用他们对 Giger 作品的了解以及对世界的了解(例如吉他应该是什么样子以及如何弹奏吉他)来做到这一点。Stable Diffusion 本质上就是在做同样的事情!
“推理步骤”
您是否熟悉大多数艺术生成工具中的“推理步骤”滑块?稳定扩散可逐步消除噪音。
以下是运行 25 个步骤的示例:
外星吉他手的例子更有意义,因为你可以更清楚地看出它应该是什么......但在上图中,起始图像看起来完全无法辨认!
事实上,那个嘈杂的外星人例子实际上是从整个过程进行到一半时拍摄的——它实际上一开始也是完全噪音!
它是如何开始的?
为了生成艺术作品,我们为 Stable Diffusion 提供了一张初始图像,实际上它只是纯噪音。但是,相当残忍的是 😏,我们撒谎说“这是一幅超级嘈杂的画作,画中一个外星人正在以 HR Giger 的风格弹吉他——你能帮我把它清理一下吗?”
如果您将这个任务交给平面设计师,他们会举手投降——“我帮不了您,图像完全无法辨认!”
那么稳定扩散是如何做到的呢?
从最简单的层面来说,答案是它是一个计算机程序,它别无选择,只能做自己的事情并为我们生产一些东西。
更深层次的答案与以下事实有关:像稳定扩散这样的人工智能模型(更确切地说是“机器学习”模型)在很大程度上基于统计数据。它们会估算所有选项的概率,即使所有选项的正确概率都非常低,它们仍然会选择概率最高的路径。
举个例子,它对图像中吉他可能出现的位置有一些概念,并且它可以寻找噪音中最像吉他边缘的部分(尽管实际上没有“正确”的选择),然后开始填充内容。
由于没有正确答案,每次你给它一个不同的纯噪音图像时,它就会产生一个不同的艺术作品!
如何编程实现稳定扩散?
如果我不熟悉机器学习,并且试图猜测它是如何实际实现的,我可能会开始思考如何对其进行编程。换句话说,它遵循的步骤顺序是什么?
也许它会匹配描述中的关键字来搜索与描述相匹配的图像数据库,然后将它们与噪声进行比较?从那家伙的解释来看,听起来它可能首先计算图像中最强的边缘在哪里?🤷♂️
事实并非如此——它没有可供参考的图像数据库,也没有使用任何图像处理算法……它是纯数学。
我的意思并不是“好吧,当然,计算机最终只是大型计算器,它们所做的一切都归结为数学”。我说的是“黑板上令人眼花缭乱的方程式”之类的数学,比如下面的这些:
(这是我写的关于稳定扩散的众多构建块之一“注意力”的技术教程。)
定义每个不同构建块的完整方程式至少会写满几页。
图像和文本作为数字
为了应用这些方程,我们需要将初始噪声图像和文本描述表示为大数字表。
您可能已经熟悉图像的呈现方式,但让我们看一个例子。这是我在涨潮时拍摄的一张长曝光照片:
以下是它在数学上的表示方式。它是 512 x 512 像素,所以我们将它表示为一个有 512 行和 512 列的表格。但实际上我们需要三个表格来表示一张图片,因为每个像素都是由红、绿和蓝 (RGB) 混合而成的。以下是上图的实际值。
借助稳定扩散,我们还可以处理文本。以下是我可能为图像编写的描述:
A long exposure color photograph of decaying concrete steps leading down into the ocean, with concrete railings, head on view, symmetry, dream like, atmospheric.
以下是用数字表表示的方式。每个单词占一行,每个单词由 768 个数字表示。这些是 Stable Diffusion v1.5 中用来表示这些单词的实际数字:
我们如何选择数字来表示一个单词是一个有趣的话题,但也相当技术性。你可以粗略地认为这些数字分别代表单词含义的不同方面。
在机器学习中,我们实际上并不将它们称为“表”——我们使用术语“矩阵”或“张量”。这些来自线性代数领域。
然而,这一切中最重要和最令人费解的部分是参数的概念。
十亿个参数
初始噪声和文本描述就是我们对稳定扩散的输入,不同的输入在这些表中会有不同的值。
然而,我们在这些方程中代入的一组数字要大得多,而且每次都是相同的,这些数字被称为稳定扩散参数。
还记得在高中时用类似的方程式绘制线条y = 3x + 2
吗?
如果这是稳定扩散,那么“x”是我们的输入,“y”是最终图像,数字 3 和 2 是我们的参数。(当然,方程式要复杂得多😝)。
输入图像由大约 790k 个值表示,而提示中的 33 个“标记”由大约 25k 个值表示。
但稳定扩散中大约有 10 亿个参数。🤯
(您能想象手工完成所有这些数学运算吗?!?)
这 10 亿个数字分布在大约 1,100 个大小各异的矩阵中。每个矩阵在数学中都有不同的用途。
如果您好奇的话,我在这里打印出了这些矩阵的完整列表!
再次强调,这些参数不会改变——每次生成图像时它们都是相同的数字。
稳定扩散之所以有效,是因为我们找到了这 10 亿个数字的正确值。这有多荒谬?!
选择 10 亿个参数
显然,作者不可能坐下来决定尝试什么数字。尤其是当你考虑到它们不是像 1、2、3 这样的“整数”,而是我们计算机迷所说的“浮点”值——你在表格中看到的非常小的、非常精确的分数时。
我们不仅没有选择这些数字,甚至连其中任何一个都无法解释!这就是为什么我们无法完全解释稳定扩散是如何工作的。我们对这些方程的作用有一些不错的直觉,但很多事情都隐藏在这些数字的值中,我们无法完全理解。
太疯狂了吧?
那么我们怎样才能弄清楚呢?
我们首先选择 10 亿个随机数。有了这些初始随机参数值,模型就完全没用了——在我们找出更好的参数值之前,它无法做任何有价值的事情。
因此,我们应用了一种称为训练的数学过程,该过程逐渐将值调整为适当的值。
我们确实完全理解训练的工作方式——它是一些基本的微积分(尽管应用于非常大的方程),基本上可以保证有效,而且我们也清楚地了解原因。
训练需要大量的训练样本。单个训练样本由一个输入和一个期望输出组成。(我将在另一篇文章中解释稳定扩散的训练样本是什么样的)。
当我们运行第一个训练输入(使用完全随机的参数值)时,模型输出的结果与所需的输出完全不同。
但是,利用实际输出和期望输出之间的差异,我们可以对这些方程应用一些非常基本的微积分,这些微积分将告诉我们,对于这 10 亿个数字中的每一个,我们应该增加或减去一个特定的量。(每个单独的参数都由不同的小量调整!)
在我们做出这些调整之后,该模型在数学上保证能够生成更接近我们期望输出的图像。
因此,我们用许多不同的训练示例多次(数亿次)进行这种训练,模型也变得越来越好。然而,随着训练的进行,我们的收益逐渐减少,最终会达到模型不再从进一步训练中受益的地步。
一旦作者完成了模型训练,他们就会发布参数值供大家自由使用!
训练稳定扩散
稳定扩散训练过程有很多内容很容易理解,而且学习起来很有趣,但我将其保存到另一篇博客文章中!
结论
如果您对这里的解释感到有些失望,并且觉得它不够容易理解,我不会生气,但希望您至少感觉面纱已经被揭开,并且您所看到的东西令人费解和鼓舞人心!
评论区