AI是如何学会绘画的?通俗易懂讲解Stable Diffusion原理
2025年7月15日
原文:https://mccormickml.com/2022/12/21/how-stable-diffusion-works/
来源:Chris McCormick
翻译:小匠很忙
计算机能仅仅通过一段文字描述就创作出艺术作品,这实在令人着迷!我个人非常好奇这"幕后"究竟发生了什么,才能让这一切成为可能。所以,我想尽力提供一个更深入的解释,即使是对人工智能概念不熟悉的人,也能明白其中的奥秘。
概述
第一部分,我会先进行一个宏观的解释(你可能已经有所了解)。这会是一个不错的开端,但我知道这无法满足我的好奇心。我可能会追问:“好的,很棒,但它具体是怎么做到的?”
为了解答这个问题,我将揭示 Stable Diffusion 的一些内部运作原理。它的内部结构可能比你预想的要复杂,但我至少想更具体地展示它在做什么,这样它就不再是一个完全的谜团。
更具体地说:
- Stable Diffusion 是一个庞大的神经网络。
- 神经网络纯粹是数学。
- 事实上,我们不完全清楚它在做什么!
- 归根结底,Stable Diffusion 之所以能工作,是因为我们训练了它。
但我们还是从宏观层面开始吧!
Stable Diffusion 通过去除图像噪声来生成图像
如果你曾在光线不足的环境下拍照,照片可能会出现颗粒感,这种颗粒感就是图像中的“噪声”。
我们使用 Stable Diffusion 生成艺术作品,但它在幕后实际做的工作是“清理”图像!
然而,它比手机图像编辑器中的降噪滑块要复杂得多。它不仅理解世界的样貌,还理解书面语言,并利用这些来指导图像生成过程。
举例来说,假设我给一位技艺精湛的平面设计师左边的图片,并告诉他们这是一幅H.R.吉格(H.R. Giger)风格的外星人弹吉他画作。我敢打赌,他们可以一丝不苟地将其清理,创作出类似右边那样的图片。
(这些图片都来自 Stable Diffusion!)
这位艺术家会运用他们对吉格作品的了解,以及对世界的认识(例如吉他长什么样以及如何演奏),来完成这项工作。Stable Diffusion 本质上也在做同样的事情!
“推理步数”
你熟悉大多数艺术生成工具中的“推理步数”滑块吗?Stable Diffusion 是通过逐步去除噪声来工作的。
这是一个运行25步的例子:
外星吉他手的例子更容易理解,因为你可以更清楚地辨认出它是什么……但在上图中,起始图像看起来完全无法辨认!
事实上,那个有噪声的外星人例子是从处理过程的中间阶段截取的——它最初也是完全的噪声!
它是如何开始的?
为了生成艺术作品,我们给 Stable Diffusion 提供一张纯粹的噪声图像作为起始输入。但我们“有点残忍地”😂说谎,告诉它:“这是一幅H.R.吉格风格的外星人弹吉他超高噪声画作——你能帮我把它清理一下吗?”
如果你把这个任务交给一位平面设计师,他们会束手无策——“我帮不了你,这图片完全无法辨认!”
那么 Stable Diffusion 是如何做到的呢?
最简单的解释是,它是一个计算机程序,它别无选择,只能完成它的任务,为我们生成一些东西。
一个更深层次的解释与一个事实有关:像 Stable Diffusion 这样的人工智能模型(更准确地说,是“机器学习”模型)严重依赖统计学。它们会估计所有选项的概率,即使所有选项的正确概率都极低,它们仍然会选择概率最高的那条路径。
举例来说,它对吉他可能在图像中的位置有一些概念,它会寻找噪声中看起来最像吉他边缘的部分(尽管实际上并没有“正确”的选择),然后开始填充内容。
由于没有正确的答案,所以每次你给它不同的纯噪声图像,它都会生成一个不同的艺术作品!
如何编写 Stable Diffusion 程序?
如果我对机器学习不熟悉,并试图猜测它的具体实现方式,我可能会开始思考如何编写它的程序。换句话说,它遵循的步骤序列是什么?
也许它会匹配描述中的关键词来搜索符合描述的图像数据库,然后将它们与噪声进行比较?从那个家伙的解释来看,它可能从计算图像中最强的边缘开始?🤷♂️
真相并非如此——它没有图像数据库可供参考,也没有使用任何图像处理算法……它纯粹是数学。
我这样说,并不是指“当然,计算机最终只是大型计算器,它们所做的一切都可以归结为数学”。我指的是那种“黑板上令人费解的方程式”式的数学,就像下面这些:
(这是我写的一篇关于 Stable Diffusion 众多构建模块之一“注意力(Attention)”的技术教程中的内容。)
定义各个构建模块的完整方程组,至少会填满好几页。
图像和文本的数字化表示
为了应用这些方程式,我们需要将最初的噪声图像和我们的文本描述表示为大型的数字表格。
你可能已经熟悉图像是如何表示的,但我们来看一个例子。这是我在涨潮时拍摄的一张长曝光照片:
下面是它的数学表示方式。它有512 x 512像素,所以我们用一个512行512列的表格来表示它。但我们实际上需要三个表格来表示一张图像,因为每个像素都是由红色、绿色和蓝色(RGB)混合而成的。以下是上面图像的实际数值。
使用 Stable Diffusion,我们还处理文本。下面是我可能为这张图片写的一段描述:
一张长曝光彩色照片,显示腐朽的混凝土台阶通向大海,带有混凝土栏杆,正面视角,对称,梦幻般,氛围感。
下面是它如何被表示为数字表格。每行代表一个词,每个词由768个数字表示。这些是 Stable Diffusion v1.5 中用于表示这些词的实际数字:
如何选择数字来表示一个词是一个引人入胜的话题,但技术性也相当强。你可以大致将这些数字理解为每个数字都代表着一个词的不同方面含义。
在机器学习中,我们通常不称这些为“表格”——我们使用“矩阵”(Matrix)或“张量”(Tensor)这样的术语。它们都来源于线性代数领域。
然而,所有这一切中最重要也最令人费解的部分是参数的概念。
十亿个参数
初始噪声和我们的文本描述被称为 Stable Diffusion 的输入,不同的输入在这些表格中会有不同的值。
但是,我们还会将一组数量庞大得多的数字代入这些方程式,这些数字每次都相同——它们就是 Stable Diffusion 的参数。
还记得高中时用 y = 3x + 2
这样的方程绘制直线吗?
如果这是 Stable Diffusion,那么“x”就是我们的输入,“y”是最终图像,而数字3和2就是我们的参数。(当然,实际的方程式要复杂得多😝)。
输入图像大约由79万个值表示,我们提示中的33个“词元”(tokens)由大约2.5万个值表示。
但是 Stable Diffusion 大约有10亿个参数。🤯
(你能想象手工完成所有这些数学计算吗?!)
这10亿个数字分布在大约1100个不同大小的矩阵中。每个矩阵在数学运算的不同阶段被使用。
如果你好奇,我在这里列出了这些矩阵的完整列表!
同样,这些参数不会改变——每次生成图像时,它们都是相同的数字。
Stable Diffusion 之所以能工作,是因为我们找到了这10亿个数字中每个数字的正确值。这不是很荒谬吗?!
选择十亿个参数
显然,作者们不可能坐下来决定要尝试哪些数字。特别是考虑到它们不是1、2、3这样的“整数”,而是我们这些计算机迷所说的“浮点”值——你之前在表格中看到的那些小而非常精确的分数。
我们不仅没有选择这些数字,甚至连其中一个都无法解释!这就是我们无法完全解释 Stable Diffusion 工作原理的原因。我们对这些方程式在做什么有一些不错的直觉,但很多事情都隐藏在这些数字的值中,我们无法完全理解。
是不是很疯狂?
那么,我们到底是怎么找到它们的呢?
我们首先随机选取10亿个数字作为初始值。有了这些随机的参数值,模型是完全无用的——在我们找到更好的参数值之前,它无法做任何有价值的事情。
因此,我们应用一个被称为训练的数学过程,它会逐渐调整这些值,使它们变得有效。
训练的工作原理是我们完全理解的——它是一些基本的微积分(尽管应用于一个非常大的方程式),它基本上可以保证有效,而且我们对它为何有效有清晰的理解。
训练涉及一个庞大的数据集,其中包含训练样本。一个训练样本包括一个输入和一个期望输出。(我会在另一篇文章中解释 Stable Diffusion 的训练样本是什么样子。)
当我们用完全随机的参数值运行第一个训练输入时,模型输出的结果将与期望输出完全不同。
但是,利用实际输出和期望输出之间的差异,我们可以对这些方程式应用一些非常基本的微积分,它会告诉我们,对于那10亿个数字中的每一个,我们应该增加或减少的具体量。(每个独立的参数都会被一个不同的微小量进行调整!)
在完成这些调整后,模型在数学上保证会生成一张图像,这张图像会比我们期望的输出更接近一点点。
所以我们用许多不同的训练样本反复进行这个过程(数亿次),模型就会变得越来越好。不过,随着训练的进行,我们会遇到收益递减的情况,最终达到一个模型无法从进一步训练中受益的程度。
一旦作者们完成了模型的训练,他们就会将参数值公开发布,供大家免费使用!
训练 Stable Diffusion
关于 Stable Diffusion 的训练过程,有很多内容很容易理解,而且学习起来也很有趣,但我会把它留到另一篇博客文章中!
结论
如果我在这里的解释让你有些失望,觉得它不够通俗易懂,我不会感到冒犯。但我希望你至少能感觉到面纱已被揭开,并且你所看到的一切都令人惊叹和充满启发!