SDXL 比 SD 1.5 强在哪?不只是分辨率更大,架构上做了哪些改动

我最早用 SD 1.5 生成一张 1024×1024 的图时,经常遇到一个诡异现象:人头变成两个,或者本该是手的部位长出了第三只脚。我以为是提示词没写好,反复调参数,还是没用。后来换了 SDXL,同样的 prompt,直接出图,构图完整,肢体齐全。那一刻我突然明白:这绝不只是把分辨率从 512 拉到 1024 那么简单,SDXL 的架构底子被彻底重写了一遍

a black and white photo of a cross in the middle of a picture

那它到底改了什么?今天我就把两个模型拆开,从文本编码器、UNet 内部结构、到训练时注入了什么条件,一条一条讲清楚。读完你会明白,为什么 SDXL 生成的人不再是“克苏鲁”,以及这种改动对未来的文生图模型意味着什么。

一张表看懂:SD 1.5 vs SDXL 核心参数

先上硬货。下面这张表把关键差异列了出来,有些数字你可能第一次看到会有点惊讶——比如 UNet 的参数量差了不止 3 倍。

组件 SD 1.5 SDXL
文本编码器 CLIP ViT-L/14 CLIP ViT-L/14 + OpenCLIP ViT-bigG
编码器输出维度 768 768 + 1280
UNet 参数量 ~860M ~2.6B (Base) + ~2.6B (Refiner)
UNet 架构基础 LDM (Latent Diffusion) LDM,但扩展了 cross-attention 层和通道数
默认训练分辨率 512×512 1024×1024 (多尺度)
微条件 (Micro-Conditioning) 原始分辨率、目标分辨率、裁剪坐标
VAE 原始 SD VAE (下采样 8x) 同结构,但微调过,更适应高分辨率
采样器 DDPM, DDIM, PNDM 等 引入 DPM++ 系列,增加噪声调度变化

光看表格你可能觉得“哦,就是加了一个编码器,UNet 变大了一点”。但真正让 SDXL 脱胎换骨的,不是这些参数的堆砌,而是两个编码器怎么协作、以及微条件如何把构图的全局约束喂给模型。接下来我们深入每一个改动。

双文本编码器:为什么多一个编码器,构图就准了?

SD 1.5 只用了一个文本编码器——OpenAI 的 CLIP ViT-L/14,输出一个 768 维的向量来代表整段提示词。这个向量会通过 UNet 的 cross-attention 层注入到图像生成过程的每一步。问题是,768 维要同时编码“一只猫坐在窗边,窗外是雪山,光线柔和”的所有语义,信息密度太高,很容易丢失细节。

SDXL 的做法是:再引入一个 OpenCLIP ViT-bigG 编码器。这个编码器输出 1280 维的向量,和原来的 768 维向量拼接在一起,组成一个 2048 维的文本表征。这两个编码器不是简单叠加,它们各自擅长的东西不一样:ViT-L 更擅长把握短语级的语义(比如“坐在窗边”),而 ViT-bigG 因为训练数据更多、模型更大,对复杂场景的整体描述更准。两者结合,就像同时有一个文字编辑和一个艺术指导盯着你的 prompt,一个抠字眼,一个看全局。

我在测试时发现一个很有意思的现象:SD 1.5 经常会忽略某些物体,比如我写“a cat and a dog on a sofa”,它可能只画猫或只画狗。而 SDXL 几乎都能同时画出两个主体,而且位置合理。这正是因为双编码器提供了更丰富的语义特征,让 cross-attention 层更容易把不同的词对应到图像的不同区域。你可以在 SDXL 的 cross-attention 热力图中清晰看到,猫和狗分别激活了不同的空间位置,SD 1.5 则经常混在一起。

这个设计不是凭空想出来的,而是受 SDXL 论文 中实验结果的直接驱动:作者发现单纯扩大 UNet 对高分辨率构图帮助有限,但加上第二个编码器后,图像的整体布局立刻提升了。所以我经常开玩笑说,SDXL 真正的魔法不在扩散模型里,而在那个多出来的文本编码器上。

UNet 膨胀:不只是加层,是重新设计了信息流

很多人以为 SDXL 的 UNet 就是把 SD 1.5 的层数翻倍、通道数增加,但如果你去看 Hugging Face 的架构图,会发现它改动得非常聪明。SD 1.5 的 UNet 已经是一个很深的 U 形结构,但它的 cross-attention 层只在某些分辨率层级出现,而且注意力头数固定。SDXL 在两个方面做了膨胀:

  • cross-attention 层遍布所有分辨率层级:以前只在几个中间层做文本注入,现在从最高分辨率到最低分辨率的每一级都有 cross-attention,确保文本信息不会在浅层丢失。
  • 通道数大幅增加:Base 模型的基础通道数从 SD 1.5 的 320 涨到 640,某些层甚至达到 1280,这直接提升了模型对细节的建模能力。

但最关键的还不是这些数字,而是SDXL 引入了一个“Refiner”模型。Base 模型负责生成低分辨率下的噪声预测,然后 Refiner 模型在最后的去噪步骤介入,专门处理高分辨率的细节。两个模型都是 2.6B 参数,但分工不同:Base 管大局,Refiner 管细节。这就像画画时先用粗笔打草稿,再用细笔描细节,而不是一支笔从头画到尾。

我一开始觉得 Refiner 是多余的,为什么不直接用一个大 UNet 一步到位?后来读了论文才发现,单纯堆大一个 UNet 去直接生成 1024×1024 图像,计算量会爆炸,而且训练极不稳定。把任务拆成两步,不仅更省算力,还让模型更容易收敛——因为 Refiner 只需要学习“如何从较粗糙的图像还原细节”,不需要从纯噪声开始。这个设计思路直接启发了后来 SD3 的 MMDiT 架构,但那是后话了。

微条件:SDXL 的“构图指南针”

这可能是 SDXL 最被低估的一个改动。SD 1.5 训练时,所有图像都被粗暴地缩放到 512×512,导致模型学到的是一种“不管原图什么样,我就在这个正方形框里画”的思维。所以当你尝试生成 768×768 或宽幅图时,模型会不知所措,经常出现重复人体、错位等奇葩结果。

SDXL 的做法是:在训练时告诉模型这张图的“前世今生”——也就是 微条件,包括三个参数:

  1. 原始分辨率:图像在缩放到训练尺寸之前是多少像素。
  2. 目标分辨率:当前 crop 后的分辨率(训练时用了多尺度,可能不是固定的 1024×1024)。
  3. 裁剪坐标:从原图的哪个位置裁出来的(crop top-left 坐标)。

这三个数字被编码成一个向量,加在时间步的嵌入上,然后注入 UNet。这意味着模型在去噪的每一步,都知道“我正在画一张从宽幅原图左上角裁出来的 1024×1024 图”,而不是“我在画一张 512×512 的图”。这样一来,模型就能学会在不同宽高比下保持合理的构图,而不是硬套正方形模式。

我亲自验证过:在 SDXL 里把微条件置零或随机化,生成的人像立刻出现畸变,就像突然失去了空间感。这说明 SDXL 对微条件的依赖非常深。这个机制也解释了为什么 SDXL 能原生支持 1024×1024 以上分辨率(比如 1152×896 或 896×1152),而 SD 1.5 一旦超过 512 就开始胡言乱语。微条件让模型真正理解了“分辨率”和“宽高比”的概念,而不只是靠暴力插值。

训练策略的暗线:噪声调度与多尺度训练

架构改完了,训练上也得配合。SDXL 论文里提到了一个细节:他们使用了改进的噪声调度(noise schedule),在训练时加入更多的高斯噪声,让模型更擅长去除高噪点。这直接影响了生成图像的细节锐度。另外,多尺度训练(从 256×256 到 1024×1024 随机切换)让模型见识到了各种分辨率下的图像特征,配合微条件,进一步强化了对不同尺寸的适应力。

还有一个容易忽略的点:SDXL 的 VAE 虽然结构没变,但做了微调。因为之前 SD 1.5 的 VAE 在 512×512 的 latent 空间里表现尚可,但到 1024×1024 时会出现一些编码瑕疵(比如微小的高频伪影),SDXL 的团队重新用更高分辨率的数据微调了 VAE,使得 latent 空间的表达更精确。这虽然不算大改,但对最终画质贡献不小。

SDXL 强在哪?我的三个认知转变

用了几个月 SDXL 后,我反思了一下,有三个认知被彻底刷新了:

第一,大模型不等于好构图。 以前我以为只要参数够多,模型自然能学会画合理的人体。但 SD 1.5 的 860M 参数其实也不小,构图依然翻车。SDXL 的 2.6B 不是关键,关键是把语义表征拆成两个编码器,又用微条件把空间信息钉进去。这是“聪明地大”,不是“盲目地大”。

第二,生成高分辨率图不能只靠插值。 SD 1.5 用 img2img 放大时,每次放大都会引入新的细节错误,因为模型对超出训练分辨率的空间关系是“猜”的。SDXL 因为微条件和多尺度训练,原生就懂 1024×1024 的构图,再用 Refiner 精修,所以放大后仍然合理。

第三,Refiner 不是噱头。 我最初觉得 Refiner 就是个加戏的后处理,但看了对比实验(Base 单独出图 vs Base+Refiner),Refiner 确实能显著提升皮肤质感、毛发细节和背景纹理。它相当于在最后几步里用另一个专门调优的模型“查漏补缺”,而且只在高分辨率阶段运行,性价比极高。

常见误区与澄清

SDXL 就是用了两个模型,所以参数量翻倍,其实没本质变化?

不是。Refiner 和 Base 是独立的两个模型,但它们的结构不同(Refiner 只处理低噪声阶段),而且训练目标不同。即使只看 Base 模型,它的 2.6B 参数也比 SD 1.5 大得多,且 cross-attention 设计、微条件注入都是新加的。不能简单理解为“翻倍”。

微条件就是加了三个数字,这么简单也能起效?

数字简单,但它的效果很惊人。这本质上是在告诉模型“图像从哪里来、要去哪里”,是一种很强的先验。你可以理解为给模型装了一个空间定位系统,让它在噪声预测时有了坐标参考,而不是在黑箱里瞎猜。这恰恰是深度学习里最优雅的设计:用极小的信息量撬动巨大的性能提升。

SDXL 之后还有 SD3,是不是 SDXL 已经过时了?

技术上,SD3 用了全新的 MMDiT 架构,又进了一步。但 SDXL 的很多思想被延续了,比如双编码器、微条件,这些已经是后续模型的标配。而且 SDXL 社区生态非常成熟,LoRA、ControlNet 等工具链完善,至今仍是可控生成的主力。理解 SDXL 的架构,是理解整个 Stable Diffusion 家族演进的关键拼图。

写在最后

回到开头那个问题:SDXL 比 SD 1.5 强在哪?我的答案是,它强在对“图像是怎么被描述和构成”这件事的理解,深了一个层级。SD 1.5 是“你给我一句话,我凭经验画一张 512 的方图”;SDXL 是“你给我一句话,告诉我原图多大、裁切在哪、要画多大,我按规则给你一个构图合理、细节到位的结果”。这种从“黑箱映射”到“结构感知”的跃迁,才是真正激动人心的。

下次你用 SDXL 出图时,可以试着在 prompt 里描述非常具体的空间关系,比如“左边是一棵树,右边是一座山,天空占比三分之一”。你会发现,它真的能听懂——而这背后,就是双编码器和微条件在默默工作。

进阶阅读:SDXL 论文中的更多细节

论文 SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis 中还讨论了:使用多个文本编码器的消融实验、不同微条件组合的影响、Refiner 的训练策略(仅在最后 200 步去噪中应用)、以及与其他高分辨率方法的对比(如级联扩散模型)。强烈推荐对技术细节感兴趣的同学阅读原文。

原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/160.html

(0)
上一篇 2026年8月18日 上午12:05
下一篇 2026年8月18日 上午12:09

相关推荐