杀回Stable Diffusion的时代

发布于:2025-08-06 ⋅ 阅读:(41) ⋅ 点赞:(0)

Control Net

在这里插入图片描述

Adding Conditional Control to Text-to-Image Diffusion Models

很久没有碰SD相关的了,现在复习一下。emmm 主要keypoints 有3个:
zero convolution
一堆用于和Unet 交互的 module, 这里叫做trainale copy
locked block

Spatial conditioning 一般指可以finer-grained control 生成结果的东西

这里在前后加上zero convolution 主要是为了training 初始考虑,一开始防止污染pretrained的hidden
states.(ps:lock住了,还会被影响?那后面这个zero convolution 的weight会从0
变成有意义的数值吧?然后最后使用的时候,需要去掉这两个辅助性质的zero convolution 只用trainale copy吗?)

原有的块虽然被锁定(参数冻结),但在正向传播时,隐藏状态仍是动态计算的。如果不使用零初始化,直接注入新条件信号可能会引入随机噪声(来自trainable copy中未初始化或初始化不当的参数),这可能在早期训练中传播并暂时降低性能。锁定防止参数更新导致灾难性遗忘,但不直接保护计算图中的噪声输入或添加。通过从零开始,zero convolution 确保初始“无操作”行为,随着训练进行,其权重会通过梯度更新逐渐从零增长为有意义的值,从而“学习”如何融入条件信号,而不会突然干扰。

在推理(最终使用)时,不需要去除这些zero convolution层——它们是ControlNet架构的组成部分。它们并非纯辅助性质;训练后,它们携带学习到的参数,用于调节条件注入。去除它们会破坏控制机制。完整结构(包括zero convolution)用于生成,支持多条件组合(如多个ControlNet的输出求和,用于边缘+姿势)。

我记得需要交互的trainable copy 需要保持和pretrain model的layer一致,才能使用吧?

是的,trainable copy 需要保持与预训练模型的层结构一致(包括层类型、维度等),才能确保在计算图中兼容并通过加法操作(如通过 zero convolution)无缝交互。如果不一致,就无法正确添加隐藏状态或注入条件信号。

我记得好像Lora是做了像factor的事情,controlnet 好像会更粗暴的直接替换?

LoRA 的确是通过低秩分解(low-rank factorization)来高效适配预训练模型,它只训练权重更新的低秩矩阵(A 和 B),参数量很少(通常远少于原模型),本质上是参数偏移,而不复制整个块。

ControlNet 相对“粗暴”一些,它创建了完整的 trainable copy(参数量约 190M,相比 Stable Diffusion 的 860M),但不是直接替换原层——而是并行运行:原 locked block 处理原始输入,trainable copy 处理带条件信号的输入,然后通过 zero convolution 加法合并输出。这保留了预训练知识,同时允许端到端学习复杂控制。

Spatial Conditioning in Diffusion Models

在这里插入图片描述

Multi-Scale Control Injection

这个是相当于额外又给unet里代表不同resolutions的blocks 注入一个 encoded conditioning vector(Ps:只是一个vector吗?是每层有各自的还是全部用同一个?)

在 ControlNet 中,多尺度控制注入(Multi-Scale Control Injection)本质上是将 input condition(conditioning image c i c_i ci,如边缘图、姿势图等)的 feature representation(特征表示,即 c f = E ( c i ) c_f = E(c_i) cf=E(ci))与 U-Net 的不同分辨率(scales) blocks 挂钩,从而提供分层、从粗到细的 spatial conditioning 指导。具体来说,这个过程从一个单一的 compact spatial feature map c f c_f cf(形状如 64×64×C,C 为通道数,通常从 128 开始)开始,通过 trainable copies 的逐层处理和注入,实现与 U-Net 编码阶段(12 个 encoding blocks 和 1 个 middle block,对应 64×64、32×32、16×16、8×8 等分辨率)的无缝挂钩。

cf 的来源与初始形式

c f c_f cf 直接来自于 input condition 的 feature representation:它是通过一个小编码器网络 E(四层卷积层,每层使用 4×4 内核和 2×2 步幅)从原始 c i c_i ci(通常 512×512 像素)提取出的单一 spatial feature map。
注意: c f c_f cf 不是简单的 scalar vector,而是一个具有空间结构的特征图(spatial feature map),这使得它能捕捉 input condition 的布局细节,并作为起点与 U-Net 的多尺度结构挂钩。

如何与 U-Net 不同 scales 挂钩?

单一 cf 的注入起点 c f c_f cf 首先通过第一个 zero convolution(初始化为零)添加到 ControlNet 的初始输入(对应 U-Net 的最高分辨率块,64×64)。这确保了渐进学习:训练初期不干扰预训练状态,随着权重从零渐变,$ c_f $ 的信号开始生效。

逐层“挂钩”与多尺度传播:ControlNet 的 trainable copies(复制 U-Net 的 downsampling blocks)会处理这个注入后的输入,从高分辨率开始逐层 downsampling(通过卷积、注意力等操作)。在这个过程中, c f c_f cf 的信号被逐步变换和精炼,生成对应每个分辨率(64×64 → 32×32 → … → 8×8)的中间输出。这些输出不是独立的 cf 拷贝,而是通过 trainable copies 的参数更新而“分化”的结果——高分辨率挂钩细粒度细节(如边缘纹理),低分辨率挂钩整体结构(如物体布局)。

输出注入:每个 trainable copy 块的输出,再通过第二个 zero convolution 添加到 U-Net 对应 locked 块的输出中,实现多尺度注入:确保条件指导在整个 U-Net 编码路径上分层生效,提供从粗(低分辨率)到细(高分辨率)的控制。

这种设计让读者从一开始就看到:input 的 feature representation c f c_f c


网站公告

今日签到

点亮在社区的每一天
去签到