HuggingFace镜像/z-image-turbo-sda
模型介绍文件和版本分析
下载使用量0

⚡️ Z-Image-Turbo-SDA:恢复 8 步模型中的生成多样性

a38959bb6977d81bf164d0d2452dd30d

ddb03e343b61d491eebb3ec54f968f26

352f36ec0f425a654c3682d4a5d1f978

d06e3b31ec16f3501d5c11361af588e8

95e27e37864b5d1441c30d4fb0b30611

37f4b30a6f489d78e834c605dac43f5f

comparison_prompt_00_group_00

comparison_prompt_00_group_01

comparison_prompt_00_group_02

comparison_prompt_00_group_03

Z-Image-Turbo-SDA 是一款高效的 LoKr(低秩克罗内克积) 适配器,旨在解决少步蒸馏流匹配/扩散模型中的 “多样性坍缩” 问题。

通过应用我们创新的 语义方向对齐(SDA)损失,该 LoKr 适配器能够恢复原始教师模型 70.2% 的组合多样性(LPIPS),同时完美保持 8 步基线模型的极致清晰度和快速推理速度。

📖 问题:蒸馏过程中的多样性坍缩

将50步扩散模型(教师模型)蒸馏为8步模型(学生模型)时,学生模型往往会学习走“捷径”,收敛到分布的“均值”。结果是,改变随机噪声种子几乎会得到相同的构图(相同的姿态、相同的布局)。

标准的监督微调(SFT)无法解决此问题,因为强迫学生模型匹配教师模型的绝对速度(vvv)会破坏校正后的直线轨迹,导致生成模糊、发灰或混乱的图像。

💡 我们的解决方案:语义方向对齐(SDA)+ LoKr

我们没有匹配原始速度,而是使用基于物理的四支柱自定义架构对该模型进行微调,并以参数高效的LoKr结构作为支撑:

1. x0x_0x0​空间余弦损失(有方向无幅度)

我们不直接匹配原始速度vvv,而是将预测投影到干净的x0x_0x0​空间(x^0=z−v\hat{x}_0 = z - vx^0​=z−v)。然后,我们应用空间低通滤波(AvgPool2d,k=8k=8k=8) 以防止模型通过高频噪声“作弊”。最后,我们使用标准余弦损失来对齐学生模型与教师模型方差的语义方向,完全释放学生模型以保持其高对比度幅度。

2. 自参考SFT锚点(“恒温器”效应)

为防止多样性推动破坏8步轨迹,我们引入了一个连续锚点: sft_loss = Huber(v_student, v_baseline_detached, delta=0.08) 这就像一根弹性 tether。如果模型偏离过远以改变构图,Huber损失会提供一个恒定的(L1)拉力,以打磨高频细节,而不会将模型猛烈拉回坍缩的均值。

3. 非对称适配器掩蔽(突破性进展)

如果使用预训练的训练适配器,我们会非对称地应用它:

  • 多样性前向传播(适配器关闭):暴露学生模型原始的坍缩流形,为构图校正生成大量准确的梯度。
  • SFT前向传播(适配器开启):提供坚不可摧的质量基线,锁定清晰度。

4. 极低噪声跳跃(div_skip)

在最终推理步骤(例如,t≈8.9t \approx 8.9t≈8.9),宏观构图已确定。此时追求多样性只会导致高频抖动(模糊)。我们在最低噪声步骤完全切断多样性损失,利用纯SFT确保最终像素的锐利清晰。

💻 使用方法

此适配器作为LoKr(LyCORIS生态系统)进行训练。现代版本的diffusers与peft结合,原生支持无缝加载LoKr权重。

from diffusers import DiffusionPipeline
import torch

# 1. Load the base 8-step distilled model
pipeline = DiffusionPipeline.from_pretrained(
    "Tongyi-MAI/Z-Image-Turbo", 
    torch_dtype=torch.float16
).to("cuda")

# 2. Load the SDA Diversity LoKr Adapter
# (Ensure you have the latest `diffusers` and `peft` installed)
pipeline.load_lora_weights("F16/z-image-turbo-sda", adapter_name="sda_diversity")

prompt = "A lone traveler standing on a mountain peak, epic fantasy lighting"

# 3. Generate diverse images with different seeds!
# You will now get completely different poses, camera angles, and layouts across seeds.
for seed in[42, 123, 777, 999]:
    generator = torch.Generator(device="cuda").manual_seed(seed)
    image = pipeline(
        prompt=prompt, 
        num_inference_steps=8, 
        guidance_scale=1,
        generator=generator
    ).images[0]
    image.save(f"traveler_seed_{seed}.png")

📊 定量评估

在复杂提示词和每个提示词16个随机种子的条件下,于Step 2500进行评估:

模型变体平均LPIPS(感知多样性)↑\uparrow↑像素标准差(幅度方差)↓\downarrow↓
8步基线(已坍缩)0.5640.190
8步 + SDA LoKr(我们的方法)0.691 (+0.127)0.209 (原始清晰度)
50步教师模型0.7450.243

重要意义: SDA LoKr 成功地将结构多样性与破坏性噪声解耦。它将宏观构图多样性(LPIPS)提升至接近50步教师模型的水平,同时严格控制像素标准差,以防止连续ODE微调中常见的“变暗/模糊”效应。

💻 实现与使用

核心损失机制可轻松集成到任何Diffusers / Flow Matching训练循环中。

伪代码

import torch
import torch.nn.functional as F

def compute_sda_loss(student_model, teacher_model, z1, z2, latents, t_continuous, v_self_detached):
    # 1. Teacher Predictions (No Grad)
    with torch.no_grad():
        x0_T_z1 = z1 - teacher_model(z1, t_continuous)
        x0_T_z2 = z2 - teacher_model(z2, t_continuous)
    
    # 2. Student Baseline (from detached SFT forward, Adapter is ON)
    x0_S_z1 = z1 - v_self_detached  
    
    # 3. Asymmetric Adapter Masking: Adapter-OFF for Diversity
    # Temporarily disable the pre-trained assistant adapter to expose 
    # the raw collapsed manifold and generate massive diversity gradients.
    student_model.assistant_adapter.is_active = False
    try:
        # Student forward with Adapter OFF
        x0_S_z2 = z2 - student_model(z2, t_continuous)
    finally:
        # Crucial: Turn it back ON for subsequent SFT / validation steps
        student_model.assistant_adapter.is_active = True
    
    # Calculate Deltas
    delta_T = x0_T_z2 - x0_T_z1
    delta_S = x0_S_z2 - x0_S_z1
    
    # 4. Spatial Low-Pass Filter (Force Macro-Composition changes, prevent high-freq cheating)
    pooled_T = F.avg_pool2d(delta_T, kernel_size=8).view(delta_T.size(0), -1)
    pooled_S = F.avg_pool2d(delta_S, kernel_size=8).view(delta_S.size(0), -1)
    
    # 5. Standard Cosine Loss (Direction alignment without magnitude penalty)
    cos_sim = F.cosine_similarity(pooled_S, pooled_T, dim=-1)
    div_loss = (1.0 - cos_sim).mean()
    
    return div_loss

# --- Training Loop Integration ---

# SFT Forward (Adapter ON) -> Protects pristine image quality
with torch.no_grad():
    v_self = student_baseline(xt_z1, t) 

# Self-Reference Huber Loss (Elastic anchor to preserve 8-step trajectory)
sft_loss = F.huber_loss(v_pol_z1, v_self.detach(), delta=0.08)

# Time-Segmented Diversity (Enabled only for t > div_skip_threshold)
# Skip Index 7 (extremely low noise) to lock in final pixel sharpness
if t > LOW_NOISE_THRESHOLD:
    div_loss = compute_sda_loss(student_model, teacher_model, z1, z2, latents, t, v_pol_z1.detach())
    loss = sft_loss + diversity_lambda * div_loss
else:
    loss = sft_loss # Pure SFT

🛠 训练详情

  • 基础模型:Z-Image-Turbo(8步流匹配)
  • 适配器类型:LoKr(低秩克罗内克积,full_rank,factor=8)
  • 优化器:AdamW(weight_decay=0.001)
  • 学习率:2.5e-4
  • 多样性权重(λ\lambdaλ):1.0(标准余弦损失)
  • Huber Delta:0.08
  • 时间步:严格的离散调度器采样(索引1-6),在极低噪声下(索引7)使用div_skip。

❓ 常见问题(FAQ)

Q1:能否将SDA LoRA与其他Z-Image-Turbo(ZIT)LoRA一起使用?

A:可以,但存在潜在的兼容性风险。您需要手动平衡权重。

  • 原理:SDA LoRA的核心机制涉及旋转模型的速度场。由于预测方向已有意偏离原始校正轨迹以实现多样性,这可能会与期望原始“直线”路径的其他ZIT LoRA产生冲突。
  • 冲突:堆叠多个LoRA时,您可能会因方向梯度冲突而遇到结构伪影或模糊问题。
  • 解决方案:尝试降低SDA LoRA的推理权重(例如,降至0.5 ~ 0.7)。注意内在权衡:降低权重会减弱“语义推动”,导致多样性向坍缩均值回归。您需要根据具体需求找到“最佳平衡点”。

Q2:为什么简单提示词的多样性比复杂提示词更显著?

A:这取决于提示词对构图空间施加的“拓扑约束”。

  • 简单提示词(例如,“一只坐着的猫”):在此类提示词下,SDA能释放最大多样性,因为提示词对潜在空间的限制较少。“猫”可以自由地坐着、躺着或看向不同方向。
  • 复杂提示词(例如,“左边一只猫,看着右边的红色杯子”):这类提示词就像一个刚性的“蓝图”,将元素严格锚定在特定坐标上。由于文本编码器的引导极强,SDA LoRA在不违反提示词指令的情况下难以轻易改变构图。因此,更长、描述更详细的提示词自然会表现出更少的空间变化。

⚠️ 开发者说明与限制

SDA 是我个人研究和探索 Flow Matching 模型底层机制的成果。因此,它远非完美。

当前的 v1 版本 基于我们内部最佳检查点(div_27_2500,该检查点实现了高达 70% 的多样性恢复),随后进行了额外 360 步以质量为重点的微调。

  • 遗憾的权衡(解剖结构 vs. 多样性):要维持肢体和手部等刚性结构,模型需要贴近其原始的蒸馏流形。为了实现更好的解剖结构稳定性,我不得不牺牲“语义推动”。因此,在最终版本中,构图多样性恢复从峰值的 70% 回落至 58%。
  • 遗留问题:尽管牺牲了 12% 的多样性,模型在复杂姿态下仍可能偶尔出现解剖结构错误——这是少步蒸馏模型常见的“阿喀琉斯之踵”。

在 8 步推理框架内解决“宏观构图多样性”与“微观解剖结构刚性”之间的零和博弈仍是一个开放的挑战。我希望未来能找到更优雅的解决方案,也欢迎社区在此探索基础上继续发展。

🤝 引用

如果您在研究中使用了此模型或 SDA 方法,请引用:

@misc{sda_diversity_loss_2026,
  title={Teacher-Guided Semantic Directional Alignment (SDA) for Restoring Diversity in Few-Step Distilled Models},
  author={Fok},
  year={2026},
  url={https://huggingface.co/F16/z-image-turbo-sda}
}