作者:Chris McCormick

如果你不知道如何使用 ChatGPT 或者 Midjiourney。那本教程应该能帮到你。这是一份教你如何更好地使用 ChatGPT 和 Midjourney 的免费教程。

 


计算机仅从书面描述中生成艺术的能力令人着迷!我知道,作为一个人,我会非常好奇地想知道“幕后”到底发生了什么,这将使这成为可能,所以我想在这里尽我所能,为那些不熟悉人工智能概念的人提供一个不那么肤浅的解释。

概述

在第一部分中,我将向您提供高级解释(您可能已经熟悉)。这是一个好的开始,但我知道它不会满足我的好奇心。😉 我会问,“好吧,太好了,但它是怎么做到的呢?


为了解决这个问题,我将向你展示 Stable Diffusion 的一些内部工作原理。内部情况比你希望的要复杂得多,但我至少想更具体地向你展示发生了什么,这样它就不再是一个完全的谜。

更具体地说:

  • Stable Diffusion 是一个巨大的神经网络
  • 神经网络是纯粹的数学。
  • 事实是,我们并不完全知道它在做什么!
  • 最终,Stable Diffusion 之所以有效,是因为我们对其进行了训练

但是,让我们从更大的图景开始!


稳定扩散可去除图像中的噪点


如果您曾经尝试在太暗的情况下拍摄照片,但照片看起来都是颗粒状的,那么这种颗粒感就是图像中“杂色”的一个示例。


我们使用 Stable Diffusion 来生成艺术,但它实际上在幕后做的是 “清理” 图像!


不过,它比手机图像编辑器中的降噪滑块要复杂得多。它实际上对世界是什么样子的理解,以及对书面语言的理解,并利用这些来指导这个过程。


例如,想象一下,如果我把左边的下图给一位熟练的图形艺术家,并告诉他们这是一幅外星人弹吉他的画,风格是 H.R. Giger。我敢打赌,他们可能会进去煞费苦心地清理它,以创建类似于右边图像的东西。

稳定扩散(Stable Diffusion)是如何运作的稳定扩散(Stable Diffusion)是如何运作的


(这些是来自 Stable Diffusion 的实际图像!


艺术家会利用他们对 Giger 艺术作品的了解以及对世界的了解(例如吉他应该是什么样子以及你如何弹奏吉他)来做到这一点。Stable Diffusion 本质上也在做同样的事情!

 “推理步骤”


您是否熟悉大多数艺术生成工具中的“Inference Steps”(推理步骤)滑块?Stable Diffusion 逐步去除杂色。


下面是运行 25 个步骤的示例:

稳定扩散(Stable Diffusion)是如何运作的

稳定扩散(Stable Diffusion)是如何运作的外星吉他手的例子更有意义,因为你可以更清楚地看出它应该是什么……但在上图中,起始图像看起来完全无法辨认


事实上,那个嘈杂的外星人例子实际上是从过程的一半开始的——它实际上一开始也是完全的噪音!

稳定扩散(Stable Diffusion)是如何运作的稳定扩散(Stable Diffusion)是如何运作的


它是如何开始的?


为了生成艺术,我们给 Stable Diffusion 一个起始图像,它实际上只不过是纯粹的噪声。但是,相当残酷的是😏,我们撒谎说:“这是一幅超级嘈杂的画,画的是一个外星人以 H.R. Giger 的风格弹吉他——你能帮我清理一下吗?


如果你把这个任务交给平面艺术家,他们会举手——“我帮不了你,这张图片完全面目全非!


那么 Stable Diffusion 是怎么做到的呢?


在最简单的层面上,答案是它是一个计算机程序,它别无选择,只能做它的事情并为我们生产一些东西


更深层次的答案与这样一个事实有关,即像 Stable Diffusion 这样的 AI 模型(更技术上说,是“机器学习”模型)在很大程度上基于统计数据。他们估计所有选项的概率,即使所有选项的正确概率都极低,他们仍然只选择概率最高的路径。


因此,例如,它对吉他在图像中可能出现的位置有一些想法,并且可以寻找噪声中看起来最像吉他边缘的任何部分(即使确实没有“正确”的选择),并开始填充内容。


既然没有正确的答案,每次你给它一个不同的纯噪声图像时,它都会得到一个不同的艺术品!


如何对 Stable Diffusion 进行编程?


如果我不熟悉机器学习,并且我试图猜测它实际上是如何实现的,我可能会开始考虑如何对其进行编程。换句话说,它遵循的步骤顺序是什么?


也许它会匹配描述中的关键字来搜索与描述匹配的图像数据库,然后将它们与噪声进行比较?从那家伙的解释来看,听起来它可能从计算图像中最强的边缘在哪里开始?🤷‍♂️


事实并非如此——它没有可供参考的图像数据库,它不使用任何图像处理算法……这是纯粹的数学。


我的意思并不是说“嗯,当然,计算机最终只是大型计算器,它们所做的一切都归结为数学”。我说的是“黑板上令人眼花缭乱的方程式”类型的数学,如下所示:

稳定扩散(Stable Diffusion)是如何运作的稳定扩散(Stable Diffusion)是如何运作的


(这是我写的一篇技术教程,上面写的是一个关于 Stable Diffusion 的众多构建块,叫做 “Attention”。


定义每个不同构建块的全套方程至少可以填满几页。


数字形式的图像和文本


为了应用这些方程式,我们需要将初始噪声图像和文本描述表示为大数字表。


您可能已经熟悉图像的表示方式,但让我们看一个示例。这是我在涨潮时拍摄的一张长曝光照片:

稳定扩散(Stable Diffusion)是如何运作的稳定扩散(Stable Diffusion)是如何运作的


以下是它的数学表示方式。它是 512 x 512 像素,因此我们将其表示为具有 512 行和 512 列的表格。但实际上,我们需要三个表格来表示一个图像,因为每个像素都由红色、绿色和蓝色 (RGB) 的混合体组成。以下是上图的实际值。

稳定扩散(Stable Diffusion)是如何运作的稳定扩散(Stable Diffusion)是如何运作的


在 Stable Diffusion 中,我们还处理文本。以下是我可能会为这张图片写的描述:

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 中用于表示这些单词的实际数字:

稳定扩散(Stable Diffusion)是如何运作的稳定扩散(Stable Diffusion)是如何运作的


我们如何选择数字来代表一个单词是一个引人入胜的话题,但也相当技术性。你可以粗略地将这些数字视为每个数字代表一个词含义的不同方面。


在机器学习中,我们实际上并不将这些称为“表”,而是使用术语“矩阵”或“张量”。这些来自线性代数领域。


不过,这一切中最重要和最令人费解的部分是参数的概念。

 十亿个参数


初始噪声和文本描述就是我们所说的 Stable Diffusion 的输入,不同的输入在这些表中会有不同的值。


不过,我们也将这些方程式中插入了一组大得多的数字,这些数字每次都是相同的——这些被称为稳定扩散的参数


还记得高中时用 y = 3x + 2 等方程绘制的线条吗?

稳定扩散(Stable Diffusion)是如何运作的

稳定扩散(Stable Diffusion)是如何运作的如果这是 Stable Diffusion,那么 ‘x’ 是我们的输入,’y’ 是最终图像,数字 3 和 2 是我们的参数。(当然,方程要复杂😝得多)。


输入图像由大约 790k 个值表示,而我们提示中的 33 个“标记”由大约 25k 个值表示。


但是 Stable Diffusion 中大约有 10 亿个参数。🤯


(你能想象手动计算所有这些数学运算吗?!?)


这 10 亿个数字分布在大约 1100 个大小不同的矩阵中。每个矩阵在数学中的不同点使用。


如果您好奇,我已经在这里打印了这些矩阵的完整列表!


同样,这些参数不会改变 – 每次生成图像时,它们都是相同的数字。


Stable Diffusion 之所以有效,是因为我们找到了用于这 10 亿个数字的正确值。这有多荒谬?!


选择 10 亿个参数


显然,作者不可能坐下来决定尝试什么数字。特别是当你考虑到它们不是像 1,2,3 这样的“整数”,而是我们计算机书所说的“浮点”值时——你在表格中看到的非常精确的小分数。


我们不仅没有选择这些数字——我们甚至无法解释其中的任何一个!这就是为什么我们无法完全解释 Stable Diffusion 是如何工作的。我们对这些方程式的作用有一些不错的直觉,但很多事情都隐藏在这些数字的值中,我们无法完全理解它。

太疯狂了,对吧?


那么我们如何弄清楚它们呢?


我们首先挑选 10 亿个随机数来使用。对于这些初始随机参数值,模型完全无用——在我们找出更好的参数值之前,它无法做任何有价值的事情。


因此,我们应用了一个我们称为 training 的数学过程,该过程逐渐将值调整为运行良好的值。


我们确实完全理解了训练的运作方式——它是一些基本的微积分(尽管适用于一个非常大的方程式),基本上可以保证有效,并且我们对原因有清晰的理解。


训练涉及一个巨大的训练示例数据集。单个训练示例由输入和所需输出组成。(我将在另一篇文章中解释 Stable Diffusion 的训练示例是什么样的)。


当我们通过(使用完全随机的参数值)运行第一个训练输入时,模型输出的内容将与所需的输出完全不同。


但是,利用实际输出和期望输出之间的值,我们可以对这些方程式应用一些非常基本的微积分,这些方程式将告诉我们,对于这 10 亿个数字中的每一个,我们应该加上或减去一个特定的量。(每个单独的参数都经过不同的小量调整!


在我们进行这些调整后,从数学上保证模型生成的图像更接近我们所需的输出。


因此,我们用许多不同的训练示例做了很多次(数亿次),模型变得越来越好。然而,随着我们的进展,我们得到的回报会递减,我们最终会达到一个点,即模型不会从进一步的训练中受益。


作者完成模型训练后,他们发布了参数值供大家自由使用!


训练稳定扩散


关于 Stable Diffusion 训练过程,有很多内容很容易理解,而且学习起来也很有趣,但我把这些留到另一篇博文中!

结论

如果你对这里的解释有点失望,我不会感到生气,而且它不是更容易理解,但希望你至少觉得面纱已经被揭开,你所看到的令人费解和鼓舞人心!