拍棹 发表于 2025-8-7 08:30:02

深入浅出了解生成模型-6:常用基础模型与 Adapters等解析

更加好的排版:https://www.big-yellow-j.top/posts/2025/07/06/DFBaseModel.html
基座扩散模型

主要介绍基于Unet以及基于Dit框架的基座扩散模型,其中SD迭代版本挺多的(从1.2到3.5)因此本文主要重点介绍SD 1.5以及SDXL两个基座模型,以及两者之间的对比差异,除此之外还有许多闭源的扩散模型比如说Imagen、DALE等。对于Dit基座模型主要介绍:Hunyuan-DiT、FLUX.1等。对于各类模型评分网站(模型评分仁者见仁智者见智,特别是此类生成模型视觉图像生成是一个很主观的过程,同一张图片不同人视觉感官都是不同的):https://lmarena.ai/leaderboard
SDv1.5 vs SDXL

SDv1.5: https://huggingface.co/stable-diffusion-v1-5/stable-diffusion-v1-5
SDXL:https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0
两者模型详细的模型结构:SDv1.5--SDXL模型结构图,其中具体模型参数的对比如下:
1、CLIP编码器区别:
在SD1.5中选择的是CLIP-ViT/L(得到的维度为:768)而在SDXL中选择的是两个CLIP文本编码器:OpenCLIP-ViT/G(得到的维度为:1280)以及CLIP-ViT/L(得到维度为:768)在代码中对于两个文本通过编码器处理之后SDXL直接通过cat方式拼接:prompt_embeds = torch.concat(prompt_embeds_list, dim=-1) 也就是说最后得到的维度为:[..,..,1280+768]。最后效果很明显:SDXL对于文本的理解能力大于SD1.5
2、图像输出维度区别:
再SD1.5中的默认输出是:512x512而再SDXL中的默认输出是:1024x1024,如果希望将SD1.5生成的图像处理为1024x1024可以直接通过超分算法来进行处理,除此之外在SDXL中还会使用一个refiner模型(和Unet的结构相似)来强化base模型(Unet)生成的效果。
3、SDXL论文中的技术细节:

[*]1、图像分辨率优化策略。
数据集中图像的尺寸图像利用率问题(选择512x512舍弃256x256就会导致图像大量被舍弃)如果通过超分辨率算法将图像就行扩展会放大伪影,这些伪影可能会泄漏到最终的模型输出中,例如,导致样本模糊。(The second method, on the other hand, usually introduces upscaling artifacts which may leak into the final model outputs, causing, for example, blurry samples.)作者做法是:训练阶段直接将原始图像的分辨率 \(c=(h_{org},w_{org})\)作为一个条件,通过傅里叶特征编码而后加入到time embedding中,推理阶段直接将分辨率作为一个条件就行嵌入,进而实现:当输入低分辨率条件时,生成的图像较模糊;在不断增大分辨率条件时,生成的图像质量不断提升。


[*]2、图像裁剪优化策略
直接统一采样裁剪坐标top和cleft(分别指定从左上角沿高度和宽度轴裁剪的像素数量的整数),并通过傅里叶特征嵌入将它们作为调节参数输入模型,类似于上面描述的尺寸调节。第1,2点代码中的处理方式为:
def _get_add_time_ids(
      self, original_size, crops_coords_top_left, target_size, dtype, text_encoder_projection_dim=None
    ):
    add_time_ids = list(original_size + crops_coords_top_left + target_size)

    passed_add_embed_dim = (
      self.unet.config.addition_time_embed_dim * len(add_time_ids) + text_encoder_projection_dim
    )
    expected_add_embed_dim = self.unet.add_embedding.linear_1.in_features
    ...
    add_time_ids = torch.tensor(, dtype=dtype)
    return add_time_ids推荐阅读:
1、SDv1.5-SDXL-SD3生成效果对比
Imagen

https://imagen.research.google/
https://deepmind.google/models/imagen/
非官方实现:https://github.com/lucidrains/imagen-pytorch
类似Github,通过3阶段生成:https://github.com/deep-floyd/IF
Imagen论文中主要提出:1、纯文本语料库上预训练的通用大型语言模型(例如T5、CLIP、BERT等)在编码图像合成的文本方面非常有效:在Imagen中增加语言模型的大小比增加图像扩散模型的大小更能提高样本保真度和Imagetext对齐。

2、通过提高classifier-free guidance weight(\(\epsilon(z,c)=w\epsilon(z,c)+ (1-w)\epsilon(z)\) 也就是其中的参数 \(w\))可以提高image-text之间的对齐,但会损害图像逼真度,产生高度饱和不自然的图像(论文里面给出的分析是:每个时间步中预测和正式的x都会限定在 \([-1,1]\)这个范围但是较大的 \(w\)可能导致超出这个范围),论文里面做法就是提出 动态调整方法:在每个采样步骤中,我们将s设置为 \(x_0^t\)中的某个百分位绝对像素值,如果s>1,则我们将 \(x_0^t\)阈值设置为范围 \([-s,s]\),然后除以s。
https://img2024.cnblogs.com/blog/3395559/202508/3395559-20250807094349611-687876681.webp
3、和上面SD模型差异比较大的一点就是,在imagen中直接使用多阶段生成策略,模型先生成64x64图像再去通过超分辨率扩散模型去生成256x256以及1024x1024的图像,在此过程中作者提到使用noise conditioning augmentation(NCA)策略(对输入的文本编码后再去添加随机噪声)
https://img2024.cnblogs.com/blog/3395559/202508/3395559-20250807094348741-64880959.webp
Dit

https://github.com/facebookresearch/DiT

Dit模型结构上,1、模型输入,将输入的image/latent切分为不同patch而后去对不同编码后的patch上去添加位置编码(直接使用的sin-cos位置编码),2、时间步以及条件编码,对于时间步t以及条件c的编码而后将两部分编码后的内容进行相加,在TimestepEmbedder上处理方式是:直接通过正弦时间步嵌入方式而后将编码后的内容通过两层liner处理;在LabelEmbedder处理方式上就比较简单直接通过nn.Embedding进行编码处理。3、使用Adaptive layer norm(adaLN)block以及adaZero-Block(对有些参数初始化为0,就和lora中一样初始化AB为0,为了保证后续模型训练过程中的稳定)
在layernorm中一般归一化处理方式为:\(\text{Norm}(x)=\gamma \frac{x-\mu}{\sqrt{\sigma^2+ \epsilon}}+\beta\) 其中有两个参数 \(\gamma\) 和 \(\beta\) 是固定的可学习参数(比如说直接通过 nn.Parameter 进行创建),在模型初始化时创建,并在训练过程中通过梯度下降优化。但是在 adaLN中则是直接通过 \(\text{Norm}(x)=\gamma(c) \frac{x-\mu}{\sqrt{\sigma^2+ \epsilon}}+\beta(c)\) 通过输入的条件c进行学习的,
Hunyuan-DiT

https://huggingface.co/Tencent-Hunyuan/HunyuanDiT
腾讯的Hunyuan-DiT模型整体结构

整体框架不是很复杂,1、文本编码上直接通过结合两个编码器:CLIP、T5;2、VAE则是直接使用的SD1.5的;3、引入2维的旋转位置编码;4、在Dit结构上(图片VAE压缩而后去切分成不同patch),使用的是堆叠的注意力模块(在SD1.5中也是这种结构)self-attention+cross-attention(此部分输入文本)。论文里面做了改进措施:1、借鉴之前处理,计算attention之前首先进行norm处理(也就是将norm拿到attention前面)。
简短了解一下模型是如何做数据的:

PixArt

https://pixart-alpha.github.io/
华为诺亚方舟实验室提出的 \(\text{PixArt}-\alpha\)模型整体框架如下:

相比较Dit模型论文里面主要进行的改进如下:
1、Cross-Attention layer,在DiT block中加入了一个多头交叉注意力层,它位于自注意力层(上图中的Multi-Head Self
-Attention)和前馈层(Pointwise Feedforward)之间,使模型能够灵活地引入文本嵌入条件。此外,为了利用预训练权重,将交叉注意力层中的输出投影层初始化为零,作为恒等映射,保留了输入以供后续层使用。
2、AdaLN-single,在Dit中的adaptive normalization layers(adaLN)中部分参数(27%)没有起作用(在文生图任务中)将其替换为adaLN-single
不同模型参数对生成的影响

https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#stable-diffusion-20


[*]参数guidance_rescale对于生成的影响
引导扩散模型(如 Classifier-Free Guidance,CFG)中,用于调整文本条件对生成图像的影响强度。它的核心作用是控制模型在生成过程中对文本提示的“服从程度”。公式上,CFG 调整预测噪声的方式如下:

\[\epsilon = \epsilon_{\text{uncond}} + \text{guidance\_scale} \cdot (\epsilon_{\text{cond}} - \epsilon_{\text{uncond}})\]
其中:1、\(\epsilon_{\text{cond}}\):基于文本条件预测的噪声。2、\(\epsilon_{\text{uncond}}\):无条件(无文本提示)预测的噪声。3、guidance_scale:决定条件噪声相对于无条件噪声的权重。得到最后测试结果如下(参数分别为,prompt = "A majestic lion standing on a mountain during golden hour, ultra-realistic, 8k", negative_prompt = "blurry, distorted, low quality"),容易发现数值越大文本对于图像的影响也就越大。

其中代码具体操作如下,从代码也很容易发现上面计算公式中的 uncond代表的就是我的negative_prompt,也就是说CFG做的就是negative_prompt对生成的影响:
if self.do_classifier_free_guidance:
    prompt_embeds = torch.cat(, dim=0)
    add_text_embeds = torch.cat(, dim=0)
    add_neg_time_ids = add_neg_time_ids.repeat(batch_size * num_images_per_prompt, 1)
    add_time_ids = torch.cat(, dim=0)
prompt_embeds = prompt_embeds.to(device)Adapters

https://huggingface.co/docs/diffusers/tutorials/using_peft_for_inference
此类方法是在完备的 DF 权重基础上,额外添加一个“插件”,保持原有权重不变。我只需修改这个插件,就可以让模型生成不同风格的图像。可以理解为在原始模型之外新增一个“生成条件”,通过修改这一条件即可灵活控制模型生成各种风格或满足不同需求的图像。
ControlNet

https://github.com/lllyasviel/ControlNet
建议直接阅读:https://github.com/lllyasviel/ControlNet/discussions/categories/announcements 来了解更加多细节

ControlNet的处理思路就很简单,再左图中模型的处理过程就是直接通过:\(y=f(x;\theta)\)来生成图像,但是在ControlNet里面会 将我们最开始的网络结构复制 然后通过在其前后引入一个 zero-convolution 层来“指导”( \(Z\) )模型的输出也就是说将上面的生成过程变为:\(y=f(x;\theta)+Z(f(x+Z(c;\theta_{z_1});\theta);\theta_{Z_2})\)。通过冻结最初的模型的权重保持不变,保留了Stable Diffusion模型原本的能力;与此同时,使用额外数据对“可训练”副本进行微调,学习我们想要添加的条件。因此在最后我们的SD模型中就是如下一个结构:


在论文里面作者给出一个实际的测试效果可以很容易理解里面条件c(条件
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 深入浅出了解生成模型-6:常用基础模型与 Adapters等解析