基于 Stable Diffusion 架构的视觉大模型代表性工作与原理深度解析

基于 Stable Diffusion 架构的视觉大模型代表性工作与原理深度解析

本文对基于 Stable Diffusion 架构的 8 个代表性视觉大模型 进行深度技术剖析,涵盖 LDM、SD 2.x、SDXL、ControlNet、IP-Adapter、LoRA、SD3/MMDiT、FLUX 的核心原理与关键代码实现。从 U-Net 到 Transformer 的范式跃迁,一文读懂 AI 图像生成的技术全景。

概述与技术演进路线

基于 Stable Diffusion 架构的视觉大模型在 2022-2024 年间经历了从 U-Net 到 Transformer 的范式跃迁,形成了覆盖图像生成、可控编辑、视频合成的完整技术谱系。

💡 技术演进主线: LDM (2022) → SD 1.x/2.x → SDXL (2023) → ControlNet (2023) → IP-Adapter (2023) → LoRA → SD3/MMDiT (2024) → FLUX (2024) → SVD (视频)

模型 发布时间/团队 核心架构 关键创新 定位
LDM / SD 1.x 2022 / CompVis + Stability AI VAE + U-Net + CLIP 潜空间扩散 基础范式建立
SD 2.x 2022 / Stability AI VAE + U-Net + OpenCLIP v-prediction, 768px 质量提升
SDXL 2023 / Stability AI 双编码器 + 2.6B U-Net 微条件化, Refiner 产业级生成
ControlNet 2023 / Zhang et al. 冻结U-Net + 可训练副本 零卷积空间控制 精准可控生成
IP-Adapter 2023 / Tencent AI Lab 解耦交叉注意力 图像提示词适配 多模态条件注入
LoRA 2021(原始) / 社区广泛应用 低秩矩阵分解 高效参数微调 个性化定制
SD3 2024 / Stability AI MMDiT (多模态扩散Transformer) 联合注意力 + 整流流 架构范式革新
FLUX 2024 / Black Forest Labs 12B 混合流 Transformer 双流+单流 + RoPE 当前SOTA

一、潜在扩散模型 (LDM) --- 奠基性范式

1.1 为什么在潜空间工作

传统扩散模型(DDPM)直接在像素空间操作。对于 512×512512 \times 512 512×512 的图像,U-Net 需要处理 786432786432 786432 维的输入,计算代价极为昂贵。LDM 的核心贡献在于将扩散过程转移到低维潜空间。

像素空间扩散的瓶颈:

  • 计算复杂度 O(H×W)O(H \times W) O(H×W) 直接作用于全分辨率
  • 单张 512px 图像推理需要数十 GB 显存
  • 大部分计算花在感知上无意义的高频细节

LDM 的解决方案:

  • 利用 VAE 预先将图像压缩 8×8\times
  • 512×512×3→64×64×4512 \times 512 \times 3 \rightarrow 64 \times 64 \times 4 512×512×3→64×64×4
  • 扩散过程在压缩后的语义空间执行
  • 计算量降低约 64×64\times 64×

1.2 三组件架构

LDM 由三个核心模块构成:

1) 变分自编码器 (VAE) --- 感知压缩器

VAE 的 Encoder EE E 将图像投影到潜空间,Decoder DD D 负责还原。压缩后的表示保留了图像的语义结构,但去除了高频噪声。

2) U-Net 去噪网络 --- 核心生成引擎

U-Net 在潜空间中迭代预测并去除噪声。其内部包含 ResNet 残差块(捕捉局部特征)和 Cross-Attention 交叉注意力块(引入文本条件)。

3) 条件编码器 --- 语义桥梁

CLIP 文本编码器 τθ \tau_\theta τθ 将自然语言提示词映射为连续嵌入向量,通过交叉注意力机制注入 U-Net。

1.3 扩散过程数学原理

前向过程(加噪):

zt= αˉt  z0+ 1− αˉt  ϵ,ϵ∼N(0,I) z_t = \sqrt{\bar{\alpha}_t}\, z_0 + \sqrt{1 - \bar{\alpha}_t}\, \epsilon, \quad \epsilon \sim \mathcal{N}(0, I) zt=αˉt z0+1−αˉt ϵ,ϵ∼N(0,I)

训练目标(噪声预测):

LLDM = Ez∼E(x), ϵ, t ∥ϵ−ϵθ(zt,t,τθ(y))∥22 \mathcal{L}{LDM} = \mathbb{E}{z \sim E(x),\, \epsilon,\, t}\left\\\|\\epsilon - \\epsilon_\\theta(z_t, t, \\tau_\\theta(y))\\\|_2\^2\\right LLDM=Ez∼E(x),ϵ,t∥ϵ−ϵθ(zt,t,τθ(y))∥22

模型学习在给定时间步 tt t 和文本条件 yy y 下,从含噪潜变量 zt z_t zt 中预测所加噪声 ϵ\epsilon ϵ。

1.4 关键代码解读

VAE 编码/解码
python 复制代码
# VAE 编码:将图像压缩到潜空间
def encode(vae, image):
    # image: [B, 3, 512, 512] → 潜变量分布
    posterior = vae.encode(image).latent_dist
    latents = posterior.sample()
    # 缩放因子 0.18215 确保潜变量标准差 ≈ 1
    return latents * 0.18215  # [B, 4, 64, 64]

# VAE 解码:从潜空间还原图像
def decode(vae, latents):
    latents = latents / 0.18215
    image = vae.decode(latents).sample  # [B, 3, 512, 512]
    return image

缩放因子 0.18215 是根据训练数据统计得出的,目的是将 VAE 输出的潜变量规范化到标准正态分布附近,使扩散过程的噪声调度更加稳定。

U-Net 交叉注意力机制
python 复制代码
class CrossAttention(nn.Module):
    """文本引导图像生成的核心桥梁"""
    def __init__(self, query_dim, context_dim, inner_dim, num_heads):
        super().__init__()
        self.scale = (inner_dim // num_heads) ** -0.5
        self.to_q = nn.Linear(query_dim, inner_dim, bias=False)
        self.to_k = nn.Linear(context_dim, inner_dim, bias=False)
        self.to_v = nn.Linear(context_dim, inner_dim, bias=False)

    def forward(self, x, context):
        # x: U-Net 中间特征 [B, HW, C]
        # context: CLIP 文本嵌入 [B, 77, 768]
        q = self.to_q(x)
        k = self.to_k(context)   # 文本信息成为 Key
        v = self.to_v(context)   # 文本信息成为 Value
        
        # 注意力权重计算
        sim = torch.einsum('b i d, b j d -> b i j', q, k) * self.scale
        attn = sim.softmax(dim=-1)
        
        # 加权聚合:文本语义融入图像特征
        out = torch.einsum('b i j, b j d -> b i d', attn, v)
        return out

这里 Query 来自 U-Net 的图像特征,Key/Value 来自文本编码器------每个空间位置都可以"查询"最相关的文本语义。

DDIM 采样循环(推理核心)
python 复制代码
@torch.no_grad()
def sample_loop(unet, scheduler, latents, text_embeddings, guidance_scale=7.5):
    for t in scheduler.timesteps:
        # 无分类器引导 (CFG):同时计算有条件/无条件预测
        latent_input = torch.cat([latents] * 2)
        noise_pred = unet(latent_input, t, 
                         encoder_hidden_states=text_embeddings).sample
        
        # 引导公式:增强文本对应方向的生成
        noise_uncond, noise_text = noise_pred.chunk(2)
        noise_pred = noise_uncond + guidance_scale * (noise_text - noise_uncond)
        
        # 调度器执行单步去噪
        latents = scheduler.step(noise_pred, t, latents).prev_sample
    return latents

guidance_scale 控制生成与文本的一致程度,典型值 7.5 在质量与多样性之间取得平衡。


二、Stable Diffusion 2.x --- v-prediction 与高分辨率

2.1 与 SD 1.5 的关键差异

特性 SD 1.5 SD 2.0/2.1
文本编码器 OpenAI CLIP ViT-L/14 (768维) OpenCLIP ViT-H/14 (1024维)
训练分辨率 512 × 512 768 × 768
预测范式 ε-prediction (噪声预测) v-prediction (速度预测)
训练数据 LAION-2B (过滤较宽松) LAION-5B (NSFW严格过滤)

2.2 v-prediction 的数学含义

SD 2.x 引入的 v-prediction 定义速度变量:

vt≡αtϵ−σtz0 v_t \equiv \alpha_t \epsilon - \sigma_t z_0 vt≡αtϵ−σtz0

相比 ε-prediction,v-prediction 在高噪声水平( tt t 接近 1)时数值更稳定,梯度方差更小,有助于模型学习高频结构。


三、SDXL --- 产业级文本到图像生成

3.1 架构跃升

SDXL 是 Stability AI 于 2023 年推出的第二代模型,参数量从 SD 1.5 的 8.6 亿跃升至 26 亿 (Base) + 66 亿 (Refiner)。

三大核心改进:

1) 双文本编码器系统

同时使用 CLIP ViT-L/14 (768维) 和 OpenCLIP ViT-bigG/14 (1280维)。特征在最后一维拼接得到 2048 维向量:

τθ(y)=Concat(τCLIP-L(y )−2 ,  τOpenCLIP-G(y )−2 ) \tau_\theta(y) = \text{Concat}(\tau_{\text{CLIP-L}}(y){-2},\; \tau{\text{OpenCLIP-G}}(y)_{-2}) τθ(y)=Concat(τCLIP-L(y)−2,τOpenCLIP-G(y)−2)

2) 微条件化 (Micro-Conditioning)

训练时将图像的原始尺寸、裁剪坐标、目标尺寸作为额外条件注入模型,避免因数据增强引入的分布偏差。

3) Base + Refiner 两阶段流水线

Base 模型完成主体结构生成,Refiner 在最后 20% 步骤细化纹理。

3.2 关键代码解读

双编码器特征融合
python 复制代码
# 从两个编码器获取隐藏状态
# CLIP-L: [batch, 77, 768], OpenCLIP-G: [batch, 77, 1280]
prompt_embeds = torch.cat([
    text_encoder_1(prompt).hidden_states[-2],  # 倒数第二层
    text_encoder_2(prompt).hidden_states[-2]
], dim=-1)  # → [batch, 77, 2048]

# 池化输出用于全局向量条件化
pooled_embeds = text_encoder_2(prompt).pooler_output  # [batch, 1280]

取倒数第二层(而非最后一层)是因为 CLIP 最后一层专为对比学习优化,倒数第二层包含更丰富的语义信息。

微条件化实现
python 复制代码
def compute_time_ids(original_size, crops_coords_top_left, target_size):
    """构造6维微条件向量: (原高, 原宽, 裁剪y, 裁剪x, 目标高, 目标宽)"""
    add_time_ids = list(original_size + crops_coords_top_left + target_size)
    return torch.tensor([add_time_ids], dtype=torch.float32)

# 推理时:告诉模型"这是一张1024x1024的完整图像"
time_ids = compute_time_ids(
    original_size=(1024, 1024),
    crops_coords_top_left=(0, 0),   # 无裁剪
    target_size=(1024, 1024)
)

推理时设置 crops_coords=(0,0) 可以避免模型生成"被裁剪"风格的图像。


四、ControlNet --- 零卷积空间控制

4.1 设计哲学

ControlNet 解决了一个关键问题:如何在不破坏预训练模型生成能力的前提下,添加精确的空间控制?

其解决方案极为优雅:

  • 冻结原模型:SD U-Net 权重完全锁定
  • 创建可训练副本:克隆 U-Net 编码器部分
  • 零卷积连接:通过初始化为 0 的卷积层连接两者

4.2 零卷积的数学直觉

F\mathcal{F} F 为原 U-Net 层, Z\mathcal{Z} Z 为零卷积操作:

y=F(x;Θ)+Z(F(x+Z(c); Θcopy ))y = \mathcal{F}(x;\Theta) + \mathcal{Z}(\mathcal{F}(x + \mathcal{Z}(c);\Theta_{copy})) y=F(x;Θ)+Z(F(x+Z(c);Θcopy))

训练开始时 Z=0\mathcal{Z}=0 Z=0,ControlNet 输出为零,不干扰原模型。随着训练推进,控制信号被渐进式注入。

4.3 关键代码解读

零卷积层
python 复制代码
def zero_module(module):
    """将模块所有参数初始化为零"""
    for p in module.parameters():
        p.detach().zero_()
    return module

# 创建零卷积:1×1 卷积,权重和偏置均为 0
zero_conv = zero_module(nn.Conv2d(channels, channels, kernel_size=1))
# 训练初期,zero_conv(x) ≡ 0,保证安全启动

这个设计看似简单,却是 ControlNet 能够稳定训练的关键保障------它创造了一个"安全的学习起点"。

ControlNet 推理流程
python 复制代码
# Step 1: ControlNet 处理控制图像(如 Canny 边缘图)
down_residuals, mid_residual = controlnet(
    noisy_latents,
    timestep,
    encoder_hidden_states=prompt_embeds,
    controlnet_cond=canny_image  # 控制条件输入
)

# Step 2: 将控制残差注入冻结的 U-Net
noise_pred = unet(
    noisy_latents,
    timestep,
    encoder_hidden_states=prompt_embeds,
    down_block_additional_residuals=down_residuals,
    mid_block_additional_residual=mid_residual
)

ControlNet 的输出通过跳跃连接累加到 U-Net 各层级,实现了多尺度的空间控制。


五、IP-Adapter --- 图像提示词解耦注入

5.1 解耦交叉注意力

IP-Adapter 的核心洞察:文本和图像是两种本质不同的条件,不应共享同一组 Key/Value 投影权重。

解耦公式:

Znew =Attn(Q, Ktext , Vtext )+λ⋅Attn(Q, Kimage′ , Vimage′ ) Z_{new} = \text{Attn}(Q, K_{text}, V_{text}) + \lambda \cdot \text{Attn}(Q, K'{image}, V'{image}) Znew=Attn(Q,Ktext,Vtext)+λ⋅Attn(Q,Kimage′,Vimage′)

其中 λ\lambda λ 为图像影响力权重(推理时可调), K′K' K′ 和 V′V' V′ 来自独立的图像投影层。

5.2 架构:最小侵入式设计

IP-Adapter 仅训练两个轻量组件:

  1. 图像投影模块 --- 将 CLIP 图像特征映射为 cross-attention 可用的 Token
  2. 解耦注意力层 --- 为图像特征独立设置的 K/V 投影

原始 U-Net 和 CLIP 文本编码器完全冻结。

5.3 关键代码解读

图像投影模块
python 复制代码
class ImageProjection(nn.Module):
    """将 CLIP 图像特征映射为可注入 cross-attention 的 Token 序列"""
    def __init__(self, clip_embed_dim=1024, cross_attention_dim=768, num_tokens=4):
        super().__init__()
        self.num_tokens = num_tokens
        self.proj = nn.Linear(clip_embed_dim, num_tokens * cross_attention_dim)
        self.norm = nn.LayerNorm(cross_attention_dim)

    def forward(self, image_embeds):
        # image_embeds: [B, 1024] (CLIP ViT-H 全局特征)
        projected = self.proj(image_embeds)             # [B, 4*768]
        projected = projected.view(-1, self.num_tokens, -1)  # [B, 4, 768]
        return self.norm(projected)  # 4 个 image tokens

num_tokens=4 意味着一张参考图像被编码为 4 个"虚拟文本 Token",与 77 个文本 Token 在不同的注意力头中被分别查询。

解耦注意力前向传播
python 复制代码
class IPAttnProcessor(nn.Module):
    """替换 U-Net 中的注意力处理器,实现解耦注入"""
    def __init__(self, hidden_size, cross_attention_dim, num_tokens):
        super().__init__()
        self.to_k_ip = nn.Linear(cross_attention_dim, hidden_size, bias=False)
        self.to_v_ip = nn.Linear(cross_attention_dim, hidden_size, bias=False)

    def forward(self, attn, hidden_states, encoder_hidden_states, ip_hidden_states, scale=1.0):
        # 标准文本注意力
        q = attn.to_q(hidden_states)
        k = attn.to_k(encoder_hidden_states)
        v = attn.to_v(encoder_hidden_states)
        text_out = scaled_dot_product_attention(q, k, v)
        
        # 图像注意力(解耦路径)
        k_ip = self.to_k_ip(ip_hidden_states)
        v_ip = self.to_v_ip(ip_hidden_states)
        ip_out = scaled_dot_product_attention(q, k_ip, v_ip)
        
        return text_out + scale * ip_out

六、LoRA --- 低秩高效微调

6.1 低秩分解原理

对于预训练权重 W∈Rd×kW \in \mathbb{R}^{d \times k} W∈Rd×k,LoRA 不直接更新 WW W,而是学习一个低秩增量:

W′=W+ΔW=W+B⋅AW' = W + \Delta W = W + B \cdot A W′=W+ΔW=W+B⋅A

其中 B∈Rd×rB \in \mathbb{R}^{d \times r} B∈Rd×r, A∈Rr×kA \in \mathbb{R}^{r \times k} A∈Rr×k,秩 r≪min⁡(d,k)r \ll \min(d,k) r≪min(d,k)。

参数效率示例: SD U-Net 某注意力层 W∈R768×768W \in \mathbb{R}^{768 \times 768} W∈R768×768,原始参数量 = 589,824。使用 r=4r=4 r=4 的 LoRA: (768×4)+(4×768)=6144(768 \times 4) + (4 \times 768) = 6144 (768×4)+(4×768)=6144,仅为原始的 1%

6.2 在 SD 中的应用位置

LoRA 通常应用于 U-Net 的注意力投影层:to_q, to_k, to_v, to_out,有时也包括文本编码器的线性层。

6.3 关键代码解读

python 复制代码
class LoRALayer(nn.Module):
    """低秩适配层"""
    def __init__(self, original_layer, rank=4, alpha=1.0):
        super().__init__()
        in_dim = original_layer.in_features
        out_dim = original_layer.out_features
        self.rank = rank
        self.scale = alpha / rank
        
        # A 矩阵:降维 (Kaiming 初始化)
        self.lora_down = nn.Linear(in_dim, rank, bias=False)
        nn.init.kaiming_uniform_(self.lora_down.weight, a=math.sqrt(5))
        
        # B 矩阵:升维 (零初始化 → 确保训练初始 ΔW=0)
        self.lora_up = nn.Linear(rank, out_dim, bias=False)
        nn.init.zeros_(self.lora_up.weight)

    def forward(self, x):
        return self.lora_up(self.lora_down(x)) * self.scale

💭 B 矩阵零初始化的意义: 训练起始时 ΔW = B·A = 0,模型行为与原始预训练完全一致。这保证了训练过程的平稳启动------LoRA 和 ControlNet 的零卷积采用了相同的设计哲学。

权重合并(推理加速)
python 复制代码
def merge_lora_weights(base_layer, lora_layer):
    """推理时将 LoRA 权重合并到基础模型,无额外计算开销"""
    merged_weight = base_layer.weight.data + (
        lora_layer.lora_up.weight @ lora_layer.lora_down.weight
    ) * lora_layer.scale
    base_layer.weight.data = merged_weight

合并后推理速度与原模型完全相同,这是 LoRA 的独特优势。


七、Stable Diffusion 3 --- MMDiT 架构革命

7.1 从 U-Net 到 Transformer 的范式转移

SD3 彻底摒弃了 U-Net 架构,引入 多模态扩散 Transformer (MMDiT)

MMDiT 的根本性创新 :文本和图像不再是"主从关系"(Cross-Attention 中文本单向注入图像),而是对等的双流,通过联合注意力实现双向信息交换。

7.2 整流流 (Rectified Flow) 理论

SD3 放弃了离散噪声调度,采用连续时间整流流公式:

线性插值路径:

xt=t⋅x1+(1−t)⋅x0 x_t = t \cdot x_1 + (1-t) \cdot x_0 xt=t⋅x1+(1−t)⋅x0

速度预测目标:

L= E t,x0,x1 ∥vθ(xt,t)−(x1−x0)∥2 \mathcal{L} = \mathbb{E}_{t, x_0, x_1}\left\\\|v_\\theta(x_t, t) - (x_1 - x_0)\\\|\^2\\right L=Et,x0,x1∥vθ(xt,t)−(x1−x0)∥2

整流流学习从纯噪声 x0 x_0 x0 到数据 x1 x_1 x1 的直线路径,理论上允许单步生成(实践中 20-50 步即可获得高质量结果)。

7.3 三重文本编码器

编码器 作用 注入方式
CLIP ViT-L/14 通用语义编码 隐藏层 → 联合上下文
OpenCLIP ViT-bigG/14 视觉增强编码 + 全局调制 隐藏层 → 联合上下文;池化输出 → AdaLN
T5-XXL (4.7B参数) 复杂逻辑与长文本理解 隐藏层 → 联合上下文

7.4 关键代码解读

MMDiT Block(联合注意力)
python 复制代码
class MMDiTBlock(nn.Module):
    """双流联合注意力 Transformer 块"""
    def __init__(self, dim, context_dim, num_heads):
        super().__init__()
        self.norm_img = AdaLayerNorm(dim)
        self.norm_txt = AdaLayerNorm(context_dim)
        self.img_qkv = nn.Linear(dim, dim * 3)
        self.txt_qkv = nn.Linear(context_dim, dim * 3)
        self.ff_img = FeedForward(dim)
        self.ff_txt = FeedForward(context_dim)

    def forward(self, img_tokens, txt_tokens, timestep_emb):
        img_mod = self.norm_img(img_tokens, timestep_emb)
        txt_mod = self.norm_txt(txt_tokens, timestep_emb)
        
        q_img, k_img, v_img = self.img_qkv(img_mod).chunk(3, dim=-1)
        q_txt, k_txt, v_txt = self.txt_qkv(txt_mod).chunk(3, dim=-1)
        
        # 核心:联合注意力 --- 拼接后统一计算
        q = torch.cat([q_img, q_txt], dim=1)
        k = torch.cat([k_img, k_txt], dim=1)
        v = torch.cat([v_img, v_txt], dim=1)
        
        attn_out = scaled_dot_product_attention(q, k, v)
        
        img_attn, txt_attn = attn_out.split(
            [img_tokens.shape[1], txt_tokens.shape[1]], dim=1
        )
        
        img_tokens = img_tokens + img_attn
        txt_tokens = txt_tokens + txt_attn
        img_tokens = img_tokens + self.ff_img(img_tokens)
        txt_tokens = txt_tokens + self.ff_txt(txt_tokens)
        
        return img_tokens, txt_tokens

关键设计要素:

  • 图像和文本各有独立权重(适应不同模态分布)
  • 联合注意力中,图像 Token 可以 attend 到文本 Token(获得语义指导),文本 Token 也可以 attend 到图像 Token(获得视觉反馈)
  • 这种双向信息流是 SD3 文本遵循能力大幅提升的根本原因
Patch Embedding
python 复制代码
class PatchEmbed(nn.Module):
    """将 VAE 潜变量转化为 Transformer Token 序列"""
    def __init__(self, in_channels=16, embed_dim=1536, patch_size=2):
        super().__init__()
        self.proj = nn.Conv2d(in_channels, embed_dim, 
                             kernel_size=patch_size, stride=patch_size)

    def forward(self, latents):
        # latents: [B, 16, H, W] (SD3 使用 16 通道 VAE)
        x = self.proj(latents)        # [B, 1536, H/2, W/2]
        x = x.flatten(2).transpose(1, 2)  # [B, (H/2)*(W/2), 1536]
        return x

SD3 使用 16 通道 VAE(相比 SD1.x 的 4 通道),压缩比从 8× 提升到 16×,输入到 Transformer 的 Token 序列长度大幅减少。


八、FLUX --- 12B 参数的当前 SOTA

8.1 架构设计哲学

FLUX 由 Black Forest Labs 开发(核心成员为 Stable Diffusion 原始团队),参数量达到 120 亿 (12B)

其独特的混合架构设计:

  • 前 19 层:双流块 (Double-Stream) --- 类似 SD3 的 MMDiT,保持模态独立性
  • 后 38 层:单流块 (Single-Stream) --- 将图像和文本合并为统一序列处理

双流 → 单流的设计逻辑: 模型浅层需要分别理解两种模态的特征(独立权重更高效),深层则需要两种模态的深度融合(统一处理更彻底)。这一设计在保持参数效率的同时最大化了跨模态理解能力。

8.2 旋转位置编码 (RoPE)

FLUX 引入 2D 旋转位置编码替代固定位置嵌入。RoPE 的核心优势:天然支持任意分辨率和长宽比,无需像 SD3 那样在固定网格上重新训练。

8.3 模型变体

  • FLUX.1-pro: 商用全功能版本
  • FLUX.1-dev: 开源研究版本,保留 Classifier-Free Guidance
  • FLUX.1-schnell: 经引导蒸馏 (Guidance Distillation),1-4 步即可生成高质量图像

8.4 关键代码解读

单流块实现
python 复制代码
class FLUXSingleStreamBlock(nn.Module):
    """FLUX 后38层:图像和文本合并为统一序列"""
    def __init__(self, dim, num_heads):
        super().__init__()
        self.norm = AdaLayerNorm(dim)
        self.linear1 = nn.Linear(dim, dim * 3)
        self.attention = FlashAttention(num_heads)
        self.linear2 = nn.Linear(dim, dim)

    def forward(self, x, vec, pe):
        modulated = self.norm(x, vec)
        qkv = self.linear1(modulated)
        q, k, v = qkv.chunk(3, dim=-1)
        
        q = apply_rope(q, pe)
        k = apply_rope(k, pe)
        
        attn_out = self.attention(q, k, v)
        x = x + self.linear2(attn_out)
        return x
RoPE 应用
python 复制代码
def apply_rope(x, freqs):
    """对查询/键向量施加旋转位置编码"""
    cos, sin = freqs
    x_even = x[..., 0::2]
    x_odd = x[..., 1::2]
    rotated_even = x_even * cos - x_odd * sin
    rotated_odd = x_even * sin + x_odd * cos
    return torch.stack([rotated_even, rotated_odd], dim=-1).flatten(-2)

九、Stable Video Diffusion (SVD) --- 从图像到视频

9.1 时序维度扩展策略

SVD 在 SD 的 U-Net 中每个空间层之后插入时序层 (Temporal Layer),使模型感知帧间关系。

两种时序算子:

  • 时序卷积 (Temporal Conv):沿时间轴的 1D 卷积,学习帧间局部运动
  • 时序注意力 (Temporal Attention):每帧像素关注其他帧的对应位置,确保全局时序一致性

9.2 三阶段训练范式

🥇 SVD 的训练秘诀:

  1. 图像预训练 --- 在高质量图像上建立强大的空间生成能力
  2. 视频预训练 --- 在海量低质量视频上学习运动规律
  3. 高质量视频微调 --- 在精选高清视频上细化质量

9.3 微条件控制

python 复制代码
frames = pipeline(
    image=reference_image,    # 条件参考帧
    fps=7,                    # 帧率条件
    motion_bucket_id=127,     # 运动强度 (0=静止, 255=剧烈)
    noise_aug_strength=0.02,  # 参考图像增强噪声
    num_frames=25             # 生成帧数
).frames

motion_bucket_id 通过离散化的运动强度桶实现对运动幅度的精确控制。


技术总结与发展趋势

架构演进的核心矛盾:

  • 生成质量 vs 推理效率
  • 模态融合深度 vs 训练稳定性
  • 参数规模 vs 可部署性

已被验证的设计原则:

  • 潜空间压缩(LDM 范式)是必要的效率保障
  • 零初始化连接确保安全的增量学习
  • 低秩近似可以在 1% 参数量下完成有效适配

2024-2025 趋势预判:

  • Transformer 取代 U-Net 已成定局 (SD3, FLUX)
  • 整流流/流匹配替代 DDPM 离散调度
  • RoPE 解锁分辨率自由度
  • 蒸馏技术使 1-4 步生成成为现实
  • 视频/3D 生成从图像模型自然扩展

参考资料

  1. High-Resolution Image Synthesis with Latent Diffusion Models - Robin Rombach et al., CVPR 2022
  2. arXiv:2112.10752 - Latent Diffusion Models
  3. Latent diffusion model - AI Wiki
  4. 深入解析Stable Diffusion基石------潜在扩散模型(LDMs)
  5. Text Conditioning - DeepWiki
  6. Stable Diffusion的"引擎":揭秘Latent Diffusion的巧妙架构
  7. stable-diffusion条件网络架构:交叉注意力机制解析
  8. 扩散生成基础原理(三)------DDIM、LDM与diffusers代码实践
  9. Improved Noise Schedule for Diffusion Training
  10. 参数化之v-prediction
  11. SDXL 1.0: a semi-technical introduction/summary
  12. The SDXL Model Pipeline
  13. SDXL: Improving Latent Diffusion Models
  14. Stable Diffusion XL 理论与实现
  15. arXiv:2302.05543 - ControlNet
  16. ControlNetの仕組み --- Zero Convolution
  17. ControlNet零卷积原理
  18. ControlNet原理+代码解析
  19. IP-Adapter - Hugging Face
  20. IP-Adapter 论文解读
  21. Source code for ip_adapter
  22. LoRA Networks - DeepWiki
  23. kohya_ss LoRA options
  24. Merging LoRAs
  25. Scaling Rectified Flow Transformers
  26. From U-Nets to DiTs - ICLR 2026
  27. arXiv:2403.03206
  28. SD3 Paper - Stability AI
  29. SD3 text encoding explained
  30. Stable Diffusion 3 技术报告解禁
  31. 欢迎 Stable Diffusion 3 加入 Diffusers
  32. FLUX Model Architecture - DeepWiki
  33. Flux Models - DeepWiki
  34. What Is FLUX 1.1 Pro?
  35. FLUX.1 源码深度前瞻解读
  36. FLUX.1 dev
  37. Enhanced Creativity through Stable Video Synthesis
  38. Stability AI视频生成参数调优全攻略
相关推荐
佳児素花痴╮1 小时前
树的基础知识与查找排序算法
数据结构·算法
lueluelue478 小时前
LeetCode:链表
算法·leetcode·链表
橘子汽水16811 小时前
Leetcode 23,543合并K个升序链表,二叉树的直径
算法·leetcode·链表
huameinan狮子11 小时前
Adaboost算法原理与计算实例
算法
别怪我很水11 小时前
API中提供了VelocityTracker类用于计算触摸事件MotionEvent的速度,而其内部默认使用的方法就是最小二乘法,本 ...
算法·gitee·最小二乘法
Re.不晚14 小时前
挑战做100道力扣算法- DAY1
算法·leetcode·职场和发展
蓝悦无人机15 小时前
《Planning algorithms》读书笔记——第1章 引言
算法·读书笔记·规划算法·lavalle
Sagittarius_A*15 小时前
分组密码基础(二):Feistel 结构与 DES 的设计思想
算法·信息安全·密码学·des·数论
青山木15 小时前
Hot 100 --- 搜索插入位置
java·数据结构·算法·leetcode