
降噪反推才是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或DDIMSDXL的时代DPM 2M Karras是口碑很好的默认选择如果你追求稳定可复现用DPM SDE Karras效果更细腻但更慢。我个人的建议是除非你对图像质量有极致要求否则日常出图20到30步就足够了更多的步数收益递减——在连续出图时这个差别会非常直观。3.2 随机种子为什么同一句提示词每次出的图都不一样每次生成时输入的初始噪声图是一张随机噪声这个噪声的随机种子Seed决定了噪声的纹理。这就是为什么同一句提示词、同样的参数两次生成的结果完全不同——初始噪声不一样。这里有个小技巧如果你看到一个还不错的图但想微调可以固定Seed只改变提示词里的某个词观察它的变化。这样能有效缩小变量范围更容易定位是哪个词影响了画面。如果你完全随机制作就像让雕塑家每次换一块完全不同形状的石头开始雕很难做控制和对比分析。另外SDXL时代对Seed敏感的感知降低了一些因为潜空间不同了但固定Seed依然是可复现实验的底线。3.3 CFG提示词对画面到底有多大的控制力CFGClassifier-Free Guidance是控制生成结果对提示词遵循程度的参数。它的调节范围通常是1到30默认7它的核心逻辑是每次采样时同时计算有文本条件下的噪声预测和无文本条件下的噪声预测两者之差代表文本信号的影响方向用CFG值来放大或缩小这个差距。简单理解CFG越高画面越贴近提示词描述但代价是多样性下降、容易出现颜色过饱和或伪影CFG太低模型容易放飞自我画面可能跟提示词弱相关。经验值方面SD 1.5一般用7到10SDXL一般用5到8。我见过很多新手把CFG拉到15结果画面饱和度高得吓人细节出现大量坏点——这不是显卡问题是CFG值设置不合理。这个参数的本质是一个跟随文本指令的强度旋钮它不是越大越好。3.4 负面提示词与负面嵌入不是额外功能而是引导的一部分在自动抠图或WebUI里负面提示词框看起来像一个附加功能但本质上它参与了CFG计算。UNet不只会计算符合正面提示词的方向也会计算远离负面提示词的方向。两者联合起来决定了最终生成的方向。负面提示词里常见的lowres, bad anatomy, bad hands, blurry本质是在帮你引导模型避开一些常见坏图区域。这里有一个进阶技巧很多时候与其在负面提示词里堆砌大量词语不如先用一个负面嵌入Negative Embedding文件。负面嵌入是一组预先训练好的有害语义向量一个文件名就能代替一堆负面词效果往往更稳定也更省Token。4. 模型包与画风模型训练阶段的原理决定了模型生态4.1 为什么模型下载动不动就是几个GBStable 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训练时主要面向512x512SDXL则支持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可跑注意显存占用12GBSDXL / 各种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的原理不算复杂核心就是潜空间里去噪文本条件引导。把这条主线记在脑子里你再看任何一篇教程、调任何一个参数都会有主心骨。这也是为什么我愿意花这么大篇幅来写原理因为方法论比参数表更值钱。