深入浅出解析Stable Diffusion核心网络架构:VAE、U-Net与CLIP Text Encoder
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
前言
最近在学习comfyui框架来使用SD,之前使用Stable Diffusion使用过webUI进行绘制过文生图和图生图。对于其中一些模型参数设置没有深入了解。最近看了一篇zhihu上文章,链接: SD文章链接对于主要vae和unet和clip有更深的了解。
之前的印象,Unet之前在分割模型时候了解过,主要是通过下采样和上采样过程中有连接增加分割时候对之前特征的记忆。SD中的,主要用到的模块和原始还是有很大不同。
Vae模型主要是把图片通过一系列处理变小,类似下采样降低维度,但是里面用到模块还是很多。CLIP之前有看过李沐老师的论文精讲系列视频,主要是文字和图片配对模型,用于多模态。
看懂这篇文章需要一定的基础比如激活函数,卷积这些损失函数,自注意力,上采样之类的前置知识。如果要了解完整架构,可以看吴恩达的深度学习系列视频,台湾大学李宏毅老师讲的也挺好。李沐老师在B站课程也很好。两个链接是李沐老师账号关于CLIP链接: link和transform链接: link的论文精读视频链接。
下文插图主要根据参考资料 SD文章链接
引言
自2022年Stable Diffusion(简称SD)横空出世以来,它凭借开源属性、强大的图像生成能力和繁荣的生态,成为AIGC时代AI绘画领域的“标杆模型”。不同于闭源的Midjourney,SD的模型、代码、训练数据完全开放,让开发者和爱好者能深度探索其底层逻辑。
SD的核心能力源于其精妙的网络架构——VAE(变分自编码器)、U-Net(噪声预测网络)和CLIP Text Encoder(文本编码器) 三者的协同工作。本文将基于Stable Diffusion 1.5版本,从架构设计、核心作用、结构细节到训练逻辑,全方位解析这三大组件,帮助开发者吃透SD的“骨架”,为后续的模型微调、推理优化和应用开发打下基础。
一、Stable Diffusion整体架构初识
SD本质是一个端到端(End-to-End)的生成式扩散模型,核心目标是将文本或图像输入转化为符合需求的高质量图像。其整体架构围绕“Latent隐空间”展开,通过VAE压缩数据、U-Net去噪优化、CLIP关联文本与图像,最终实现高效的图像生成。
1.1 架构概览
SD的整体流程可概括为3步:
- 文本编码:CLIP Text Encoder将输入的Prompt(提示词)转化为机器可理解的Text Embeddings(77×768维度特征矩阵);
- Latent空间去噪:若为文生图,初始化高斯噪声作为Latent特征;若为图生图,通过VAE Encoder将输入图像压缩为Latent特征。随后U-Net结合Text Embeddings和调度算法(Scheduler),迭代预测并去除噪声,优化Latent特征;
- 图像重建:VAE Decoder将优化后的Latent特征重建为像素级图像。
1.2 模型规模与参数分布
在FP16精度下,SD模型总大小约2G(FP32为4G),各核心组件的参数占比如下:
- U-Net:约860M参数(占比85%),大小1.6G,是噪声预测的核心;
- VAE:约80M参数(占比8%),大小160M,负责图像压缩与重建;
- CLIP Text Encoder:约123M参数(占比7%),大小235M,负责文本编码。
下图为SD整体架构的逻辑流(参考原文档可视化图):

二、核心组件一:VAE(变分自编码器)—— 图像的“压缩与重建引擎”
VAE是SD实现高效计算的关键:它将高分辨率图像压缩到低维Latent隐空间,让U-Net的去噪过程无需在像素级进行,大幅降低显存占用和计算成本。


2.1 VAE的核心作用
VAE基于“Encoder-Decoder”架构,在SD中承担两大核心任务:
- 图像压缩(Encoder):将输入的像素级图像(如512×512×3)编码为低维Latent特征(如64×64×4),下采样率
f=8(512/64=8),特征维度c=4; - 图像重建(Decoder):将U-Net优化后的Latent特征,反向重建为像素级图像(如64×64×4 → 512×512×3)。
为什么压缩后还能重建?
图像的全局特征(如人脸的五官布局、猫的肢体结构)具有强规律性,VAE的有损压缩会保留这些核心特征,仅丢失少量细节。实验表明:当重建图像分辨率≥512×512时,压缩损失对视觉效果的影响极小。
2.2 VAE的高阶能力:控制图像色彩与细节
除了基础的压缩重建,切换不同微调版本的VAE模型,可改变生成图像的颜色表现和细节精度(类似“色彩滤镜”)。开源社区常用的VAE模型包括:
vae-ft-mse-840000-ema-pruned.ckpt(官方优化版,重建平滑);kl-f8-anime.ckpt/kl-f8-anime2.ckpt(二次元图像优化,色彩更鲜艳);ClearVAE.safetensors(细节更清晰,适合写实场景)。
注意:多数VAE仅调整颜色和细节,不会改变图像构图;仅少数模型(如pastel-waifu-diffusion.vae.pt)可能轻微影响构图。
2.3 VAE的网络结构细节
SD的VAE由Encoder、Decoder两部分组成,核心组件包括GSC、ResNetBlock、SelfAttention等,具体结构如下(参考原文档可视化图):
| 组件 | 组成 | 作用 |
|---|---|---|
| GSC | GroupNorm + Swish + Conv | 基础特征提取与归一化 |
| Downsample | Padding + Conv(3×3,步长2) | Encoder中降低特征分辨率 |
| Upsample | Interpolate(插值) + Conv | Decoder中提升特征分辨率 |
| ResNetBlock | 2个GSC + 残差连接 | 加深网络,避免梯度消失 |
| SelfAttention | QKV矩阵计算 + Softmax | 捕捉图像局部与全局特征的关联 |
- Encoder流程:输入图像 → 3个DownBlock(ResNetBlock + SelfAttention + Downsample)→ MidBlock(ResNetBlock + SelfAttention)→ 转化为高斯分布 → Latent特征;
- Decoder流程:Latent特征 → 3个UpBlock(ResNetBlock + SelfAttention + Upsample)→ MidBlock → Conv → 像素级图像。
2.4 VAE的训练逻辑与损失函数
SD的VAE需单独微调,核心目标是“让重建图像尽可能接近原图”,训练采用三大损失函数:
- L1回归损失:衡量重建图像与原图的像素级差异,公式:
L 1 ( y , y ^ ) = ∑ i = 1 n ∣ y i − y ^ i ∣ L1(y, \hat{y}) = \sum_{i=1}^{n} |y_i - \hat{y}_i| L1(y,y^)=∑i=1n∣yi−y^i∣
( y i y_i yi为原图像素, y ^ i \hat{y}_i y^i为重建像素); - 感知损失(Perceptual Loss):对比原图与重建图在预训练模型(如VGG)中间层的特征相似度,避免“像素级相似但语义失真”,公式:
L p e r c e p t u a l = ∑ l λ l ⋅ ∣ ∣ ϕ l ( I p r e d ) − ϕ l ( I t a r g e t ) ∣ ∣ 2 2 L_{perceptual} = \sum_{l} \lambda_l \cdot || \phi_l(I_{pred}) - \phi_l(I_{target}) ||_2^2 Lperce<