拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Stable Diffusion原理详解:从降噪反推理解CLIP、UNet与VAE的协作

Stable Diffusion原理详解:从降噪反推理解CLIP、UNet与VAE的协作

"降噪反推"才是Stable Diffusion的本质:先别急着装整合包,搞懂它在做什么

我先说一个会让很多人大吃一惊的事实:Stable Diffusion并不是像多数人想的那样"从零开始画一张图"。它干的事情恰恰相反——它是在一张纯噪声图上不断地"擦除"噪声,一步一步把画面"显影"出来。就像你在暗房里把相纸放进显影液,图像不是被"画"上去的,而是本来就藏在里面,你只是通过化学过程让它浮现。

这个认知是整个SD原理的第一块基石,也是为什么它叫"扩散"(Diffusion)模型的原因。扩散是热力学里一个自然过程:一滴墨滴进清水,墨汁会逐渐扩散直到均匀分布,这个过程基本不可逆。Stable Diffusion学到的是它的逆过程——从一杯已经均匀混合的"墨水溶液"里,把墨汁重新聚拢回一滴墨滴原本的形状。放到图像上,就是把一片纯噪声逐步还原成一张有意义的图。所谓"原理详解",说到底就是搞明白这个逆向过程的每一步在干什么。

理解了这一点,你会发现市面上那些"秋叶整合包"、"模型包"、"主界面"之类的话题全都顺了——因为你知道整条文生图链路里到底有哪些组件,每个组件的活是谁干的,为什么缺了某个模型包一定出不了图,为什么素描画风要单独下一个模型而不是在软件里点个按钮。

这篇我尽量不堆公式,用大白话把整条链路拆穿:从你输入一句提示词,到最终屏幕上出现一张图,这中间代码到底做了哪些事、有哪些核心参数在背后起作用、常见的报错和怪象又是因为哪个环节出了问题。

1. "降噪反推"才是Stable Diffusion的本质:先建立一个反直觉的认知框架

1.1 为什么叫"扩散"模型:把逆过程讲成人话

在Stable Diffusion出现之前,生成模型的主流路线是GAN(生成对抗网络)。GAN的思路是一个生成器和一个判别器互相博弈,生成器努力画出以假乱真的图,判别器负责分辨真假。这套思路在生成人脸等领域效果不错,但有一个致命问题:训练非常不稳定,而且生成的多样性差——因为生成器一旦找到某条"骗过判别器的捷径",就会反复走那条路,出来的图画风单一。

扩散模型换了一个截然不同的思路。它不搞对抗,而是把问题拆成两步:

第一步叫正向扩散过程。取一张真实图片,逐步往里面加噪声,每加一步,图片就更模糊、更花、更"雪花"一点,直到几百步之后彻底变成一张纯随机噪声图。这个过程你不需要什么神经网络,就是纯粹的数学运算。

第二步叫反向去噪过程。训练一个神经网络,让它学会"倒放"正向过程——给它看一个稍微带点噪声的图,它能猜出之前那个噪声更少的状态是什么样。反复操作几百次,一张纯噪声图就被一步步"擦"出来了。

Google在2015年发表的DDPM论文是扩散模型的开山之作,OpenAI后来在此基础上推出了DALL·E 2,而Stable Diffusion是2022年由慕尼黑大学的团队和Stability AI等机构合作推出的。它的核心改进是"潜在空间扩散"——不直接在高分辨率的像素空间里搞事,而是先压缩到低维度的"潜空间"去噪,这极大地降低了算力需求。这也是"Stable"这个名字的由来:它终于让扩散模型能在普通消费级显卡上跑起来了。

1.2 一个关键类比:高维空间里的"雕塑"

为了让"从噪声中显影图像"这个说法更容易落地,我常用雕塑来类比。

想象你拿到一块不规则的石头,你的任务是用它雕出一匹马。传统生成模型(GAN)的做法是你手里有一堆马的模板,照着模板切削;而扩散模型的做法的差别是:你在石头上画了一堆随机线条,然后用刻刀"擦掉"不属于马的部分,一遍遍擦,下一个目标是在当前这个形状上做微调,让整体更接近一匹马。

更准确地说,去噪网络每走一步,它会根据当前的噪声图和文本提示,预测出一个"噪声残差",然后从当前图里减掉这个残差。这就像你每次只去除一层薄薄的石皮,而不能一刀切出全部细节。Stable Diffusion通常需要20到50步采样,才够把图像从噪声"雕刻"到可辨认的程度。

这个认知框架特别重要,因为很多参数设置问题都能从这里面推出来。比如"采样步数"太少,图会糊成一片,因为雕刻的刀数不够;"提示词权重"太高,会过度干预,图会过曝或出现伪影。后面我会专门用一个章节来拆解采样过程。

2. 文生图链路里的三大核心部件:CLIP文本编码器与UNet的配合逻辑

2.1 一个完整的文生图请求,到底调用了哪些组件

你在WebUI或ComfyUI里输入一句话、点一下生成按钮,表面上看起来是"一个软件"在干活,实际上内部是由三个独立训练的神经网络组件接力完成的。它们各司其职,缺了任何一个就出不了图:

组件角色输入输出
CLIP文本编码器翻译官自然语言提示词一组Token向量(文本特征)
UNet去噪网络画师文本特征 + 带噪声的潜空间图预测出的噪声残差
VAE解码器显影师去噪完成后的潜空间图最终的像素图片

2.2 CLIP文本编码器:把"一句人话"变成"一堆数字"

CLIP是由OpenAI提出的一种"图文对齐"模型,它通过在海量图片和文字配对数据上训练,学会了把文本和图像映射到同一个向量空间里——意思相近的文字和图像,它们的向量距离就很近。

在Stable Diffusion的Pipeline里,CLIP文本编码器负责把你输入的提示词,比如"A cute corgi wearing a wizard hat",转换成一个固定长度的特征向量序列。这个向量不是简单的词嵌入,它是"语义级别的坐标",里面编码了物体类别、属性、风格、空间关系等大量抽象信息。UNet在生成时会参考这个向量来调整去噪方向——想在哪个方向"雕刻",由文本向量来引导。

有个常见的认知误区是:提示词写得越长越准确。实际上CLIP对超长文本支持有限(特别是旧版SD 1.5模型只支持最多75个Token),而且过多的形容词会稀释核心语义的权重。很多时候,简短的、包含明确主体和风格词的提示词效果反而更好。

2.3 潜空间与VAE:为什么SD不在高分辨率像素上直接去噪

我们直接看像素。一张1024x1024的RGB图像,就是1024x1024x3个数值,也就是大约300万个维度。让神经网络在这个高维空间里做去噪计算,显存和算力压力巨大。

Stable Diffusion的聪明之处是先用一个叫"VAE"(变分自编码器)的模块,把图像压缩到潜空间。VAE由编码器和解码器两部分组成:编码器把像素图压缩成一个远低维度的隐变量表示(大约是原来空间尺寸的1/8,通道数也大幅压缩),解码器负责做相反的操作——把低维隐变量还原成高分辨率的像素图。

在文生图流程中,你实际的工作流是:用一个和图像尺寸相同的纯噪声张量开始,但这个噪声张量是在潜空间里的,不是像素空间里的。UNet在潜空间里进行去噪操作,最后才交给VAE解码器一次性还原成高清像素图。这样可以让UNet的显存占用量减少数倍,这也是为什么SD能在8GB显存的显卡上流畅运行的根本原因。

什么?你不确定自己的显卡能不能跑?没关系,后面实操章节我会给出一个按照显存大小选择工作流和参数的参考表。

2.4 UNet去噪网络:整条链路的绝对核心

UNet是Stable Diffusion里真正"做图"的模型。它最初是医学图像分割领域提出的网络结构,特点是有一个"编码-解码"的U型结构,配合跳跃连接(skip connection),能在不同尺度上提取和融合特征。

在Stable Diffusion中被用作去噪骨干网络,它接受两个核心输入:一是当前带噪声的潜空间图,二是从CLIP传来的文本向量。经过一长串卷积和注意力机制的处理,UNet输出的是:当前这个噪声图里"噪声长什么样"(即噪声残差)。

这里有个容易混淆的点。你可能会以为UNet输出的是"下一张更清晰的图",但准确说它输出的是一张"噪声图",然后你用当前的潜空间图减去这个噪声,才能得到更清晰的版本。这个"减去噪声"的操作也被称为"预测原图"的变体,但本质上,UNet学到的是一种条件映射——给定"带噪的样子"和"我想画的内容描述",推导出"需要擦掉多少噪声"。生成过程可以被理解为一种"逐步细化"。

3. 一次出图就是一次"从雪花到照片"的逐步追踪:采样器、步数与CFG的真实角色

3.1 采样过程和采样器:每一步是怎么走出来的

扩散模型的去噪并不会一步到位,它必须通过多步迭代逐渐精细化。这个过程叫做"采样"(Sampling),而采样策略就是"采样器"(Sampler)。

每次迭代大致分四步:第一步,把当前的潜空间特征图喂给UNet,得到预测的噪声图;第二步,根据当前步数,计算出一个与噪声水平对应的缩放系数;第三步,从当前特征图中减去"缩放后的噪声",得到更清晰的版本;第四步,加入一点随机噪声来维持多样性(这一步不是所有采样器都一样,要看具体算法)。经过N次迭代后,潜空间特征图变得越来越清晰,最后交给VAE解码成最终图片。

采样器之间的差别在于"怎么走得更聪明"。最简单的DDIM是沿直线走,而DPM++、Euler等变体则引入了更精确的微分方程求解器,每一步的噪声估计更准确,因此在更少的步数内就能达到同等质量。这也是为什么同样20步,不同采样器的出图效果差异很大。

给你几个实测经验:SD 1.5时代,常用的组合是20步Euler a或DDIM;SDXL的时代,DPM++ 2M Karras是口碑很好的默认选择;如果你追求稳定可复现,用DPM++ SDE Karras效果更细腻但更慢。我个人的建议是:除非你对图像质量有极致要求,否则日常出图20到30步就足够了,更多的步数收益递减——在连续出图时,这个差别会非常直观。

3.2 随机种子:为什么同一句提示词每次出的图都不一样

每次生成时,输入的初始噪声图是一张随机噪声,这个噪声的随机种子(Seed)决定了噪声的"纹理"。这就是为什么同一句提示词、同样的参数,两次生成的结果完全不同——初始噪声不一样。

这里有个小技巧:如果你看到一个还不错的图但想微调,可以固定Seed,只改变提示词里的某个词,观察它的变化。这样能有效缩小变量范围,更容易定位是哪个词影响了画面。如果你完全随机制作,就像让雕塑家每次换一块完全不同形状的石头开始雕,很难做控制和对比分析。

另外,SDXL时代对Seed敏感的感知降低了一些,因为潜空间不同了,但固定Seed依然是可复现实验的底线。

3.3 CFG:提示词对画面到底有多大的"控制力"

CFG(Classifier-Free Guidance)是控制生成结果对提示词遵循程度的参数。它的调节范围通常是1到30(默认7),它的核心逻辑是:每次采样时,同时计算"有文本条件下的噪声预测"和"无文本条件下的噪声预测",两者之差代表"文本信号"的影响方向,用CFG值来放大或缩小这个差距。

简单理解:CFG越高,画面越贴近提示词描述,但代价是多样性下降、容易出现颜色过饱和或伪影;CFG太低,模型容易"放飞自我",画面可能跟提示词弱相关。经验值方面:SD 1.5一般用7到10,SDXL一般用5到8。我见过很多新手把CFG拉到15,结果画面饱和度高得吓人,细节出现大量坏点——这不是显卡问题,是CFG值设置不合理。这个参数的本质是一个"跟随文本指令的强度旋钮",它不是越大越好。

3.4 负面提示词与负面嵌入:不是"额外功能",而是"引导的一部分"

在自动抠图或WebUI里,"负面提示词"框看起来像一个附加功能,但本质上它参与了CFG计算。UNet不只会计算"符合正面提示词"的方向,也会计算"远离负面提示词"的方向。两者联合起来决定了最终生成的方向。负面提示词里常见的"lowres, bad anatomy, bad hands, blurry"本质是在帮你引导模型避开一些常见坏图区域。

这里有一个进阶技巧:很多时候,与其在负面提示词里堆砌大量词语,不如先用一个"负面嵌入"(Negative Embedding)文件。负面嵌入是一组预先训练好的"有害语义向量",一个文件名就能代替一堆负面词,效果往往更稳定,也更省Token。

4. 模型包与画风模型:训练阶段的原理决定了模型生态

4.1 为什么模型下载动不动就是几个GB

Stable Diffusion的官方基础模型就有多个版本:SD 1.5是2GB左右,SDXL是6到7GB。加上不同社区微调出来的"画风模型包",动辄几个GB是很正常的。很多新手第一反应是"整合包是不是出问题了",其实不是,这是模型本身的体积。

为什么模型文件这么大?因为这里的模型权重是UNet里无数个卷积核和注意力层的参数。以SD 1.5为例,UNet参数大约8.6亿,每个参数以FP16精度存储仍需约1.6GB;加上VAE和文本编码器,整体模型体积自然就上去了。要想通过"压缩"来减小体积基本不可行,除非牺牲精度(比如用INT4量化),但代价是生成质量明显下降。

尤其涉及"素描画"这类风格时,你会发现它不是一个内置选项,而是需要单独下载一个"素描画模型"或在对应平台上选用某个风格化模型。原因就在于:基础模型(如SD 1.5、SDXL)训练时覆盖的是一般性场景,而特定画风需要额外微调或搭配风格化模型,才能稳定输出对应的艺术风格。

4.2 微调与LoRA:为什么一个几百MB的小文件就能改变画风

在不同社区网站上下载"素描画"、"二次元"、"真实摄影"等风格模型包,本质上都是对基础模型进行了微调。但细分的微调方法不同,模型文件的用法和体积差异也很大。

完整微调模型:在基础模型之上,用大量"目标风格"图片继续训练整个UNet,最终产出一个数个GB的新模型文件(比如SD 1.5风格模型)。它最灵活,但训练成本和文件体积都大。

LoRA:不修改整个UNet,而是训练一组低秩矩阵"补丁",使用时叠加到原始模型上。LoRA文件通常只有几十到几百MB,因为只保存了少量可训练参数。这就是为什么你能在ComfyUI里同时挂载多个LoRA来叠加不同风格:它们最终只是矩阵加和,开销很小。

同理,像"stable diffusion instant-id"这类人脸生成/Lora方案,也是通过LoRA或更小的微调手段实现的。理解了LoRA的原理,你就知道为什么几百MB的小文件能稳定改变画风,因为它本质上是在基础模型上施加了"方向修正"。

4.3 为什么你的模型分辨率不对:基础模型版本决定出图尺寸

SD 1.5和SDXL潜空间倍率是相同的,但潜空间通道数和分辨率不同。SD 1.5训练时主要面向512x512,SDXL则支持1024x1024乃至更高。如果你用SD 1.5模型强行生成1024x1024,常常会出现构图怪异、物体重复的问题——因为模型从没在这个尺度上学过如何构图。用SDXL模型生成512x512,则会浪费它的能力,细节表现不够充分。

在实际操作中,第一步应该检查当前基础模型支持的"推荐分辨率"(通常在模型卡页面写得很清楚)。然后根据这个推荐值设置宽度和高度。如果非要生成客户指定尺寸的图,正确做法是用1024生成后再用外部工具进行高清放大,而不是直接修改长宽比硬出图。

4.4 采样步数、CFG和模型版本之间的"三角关系"

到这里,我们其实可以把前面讲到的参数统一成一个"三角关系"思考模型:

  • 模型版本决定了它训练时见过的数据分布和分辨率范围。
  • 采样器决定去噪过程的精细程度和收敛速度。
  • CFG决定文本引导的强度。

这三者不是独立的。SD 1.5在25步Euler a、CFG 7下效果不错,但这套参数搬到SDXL上效果未必好。SDXL在20步DPM++ 2M Karras、CFG 5下已经很出色。很多"为什么我的图总是崩"问题,追根溯源是这三个参数之间的错配,而不是显卡坏了或者模型坏了。

5. 用原理看懂实操:主界面、整合包与显存选型的底层逻辑

5.1 秋叶整合包和官方源装的区别,本质是"依赖管理的取舍"

很多新手被推荐使用"秋叶整合包",也有很多人主张用官方泄漏代码自己搭环境。两者之争其实根本不是"谁更正宗",而是"依赖管理方式"的取舍。

官方路线类似Git仓库源码安装:需要手动安装Python环境、CUDA、PyTorch等深度学习依赖。包管理容易出现版本冲突——一个典型的例子是PyTorch的CUDA版本和显卡驱动版本不匹配,导致无法调用GPU;这种问题你如果不熟悉环境,排查起来确实头大。

整合包本质上是把所有依赖封装成"绿色免安装"的目录结构,解压即用。它把"环境搭建"这一步的风险彻底拿掉,让你直接面对WebUI主界面。对大多数只关心画图效果、不想折腾环境的人,我推荐使用整合包;如果你未来要改源码、做训练、部署到服务器,那可以考虑官方路线。

不过有一点要提醒:整合包版本和模型版本之间也需要匹配。比如SDXL模型要在支持SDXL的界面版本里加载,否则即使你下载了SDXL模型也加载不上或者出图尺寸不对。很多热搜里"stable diffusion(comfyui)"和"stable diffusion主界面"都指向同一个问题——选对界面后,还要关注它基于哪个SD版本、支持哪些模型格式。这比纠结于整合包本身重要得多。

5.2 显存不够怎么办:根据显存大小调整大道至简的生成策略

讲完原理,最后落到最实际的硬件问题上。我用一张表给入门用户一个可执行的显存参考:

显卡显存推荐工作流采样步数图片分辨率特殊设置
4GBSD 1.520步512x512开启FP16,尽量用低倍率放大
6GBSD 1.5 / SDXL(注意优化)20-25步512-768可试SDXL,但需开启VAE切片
8GBSD 1.5 / SDXL25-30步768 / 1024日常SDXL可跑,注意显存占用
12GB+SDXL / 各种LoRA30步1024可以自由叠加多个LoRA

如果你只有4GB显存还想生成1024的图,那不是靠"硬出"能解决的——要么用SD 1.5模型先生成512,再用高清放大算法(如Latent Upscale、ESRGAN)把图像放大;要么租用在线算力。我建议新手从512x512开始跑通全流程,确认没有问题再提高分辨率。

这里要特别提醒一个黑图/灰图的经典问题:显卡显存不够时,显卡驱动程序会报OOM(显存溢出)错误,WebUI通常会显示一个英文报错。但还有一种常见情况是生成了一张全黑或者全灰色图,大多数时候是因为VAE没有正确加载——SD 1.5的某些标准模型默认不带VAE,需要单独下载VAE文件并放到对应目录。不理解VAE,你就只能靠试错,理解了VAE,这个问题一查就是一个目录的事。

5.3 实操中容易踩的三个坑:模型冲突、加载失败和路径乱码

最后分享三个我在实践中见过最多、也最容易用原理来解释的坑。

第一坑:模型文件下了但加载失败。大多是模型文件名或目录包含中文、空格、乱码字符。深度学习框架的加载路径对特殊字符极其敏感,建议所有模型目录统一用英文小写和下划线。

第二坑:同时挂载多个画风模型互相干扰。很多人觉得"我把多个风格模型一起加载,就能融合所有风格",实际上不是这样。如果多个模型都改写了UNet权重,它们叠加的效果经常是互相打架,画面混乱。正确做法是:基础模型保持不变,风格和概念通过LoRA来叠加——LoRA的低秩架构天然就是为了组合设计的。

第三坑:Seed固定了但复现不出原图。这通常是因为采样器或CFG设置不同。要完全复现一张图,必须同时固定Seed、采样器、步数、CFG、分辨率、正负提示词、模型和LoRA。只固定Seed不是完全复现,这在多人协作或者教程撰写时容易误导。

我个人在实际使用中还有一个很深的体会:与其在运行时报错时焦急地在网上搜索,不如先理解整个链路的每个环节。一旦你明白UNet、VAE、CLIP和采样器分别在干什么,你排查错误的速度会快很多,因为你不会再在错误的环节上打转。比如看到"显存溢出"报错,你会立刻想起潜空间分辨率、模型参数量、VAE解码开销这几个因素,然后从降低分辨率、换小模型、开启优化选项这几个方向去排查。

Stable Diffusion的原理不算复杂,核心就是"潜空间里去噪+文本条件引导"。把这条主线记在脑子里,你再看任何一篇教程、调任何一个参数,都会有主心骨。这也是为什么我愿意花这么大篇幅来写原理,因为方法论比参数表更值钱。

返回列表