controlnet可以让stable diffusion的生图变得可控。
文章连接:https://arxiv.org/pdf/2302.05543.pdf
解决方案:限制可训练参数的数量或等级来缓解。
ControlNet 通过锁定stable diffusion参数并制作其编码层的可训练副本来保留大型模型的质量和功能。此体系结构将大型预训练模型视为学习各种条件控制的强大骨干。可训练的副本和原始的锁定模型与零卷积层连接,权重初始化为零,以便在训练期间逐渐增长。这种架构确保了在训练开始时不会将有害噪声添加到大型扩散模型的深层特征中,并保护可训练副本中的大规模预训练骨干不会受到此类噪声的损害。
我们的实验表明,ControlNet 可以通过各种条件输入来控制 Stable Diffusion,包括 Canny 边缘、Hough 线、用户涂鸦、人类关键点、分割图、形状法线、深度等(图 1)。我们使用单个条件反射图像(带或不带文本提示)测试我们的方法,并演示了我们的方法如何支持多个条件的组合。此外,我们报告说,ControlNet 的训练在不同大小的数据集上是健壮和可扩展的,并且对于某些任务,如深度到图像调节在单个 NVIDIA RTX 3090Ti GPU 上训练 ControlNet 可以取得与在大型计算集群上训练的工业模型相媲美的结果。最后,我们进行消融研究,以调查模型中每个组成部分的贡献,并将我们的模型与几个强大的条件图像生成基线与用户研究进行比较。
微调神经网络的一种方法是直接使用额外的训练数据继续训练它。但这种方法可能导致过拟合、模式崩溃和灾难性的遗忘。广泛的研究集中在开发避免此类问题的微调策略上
灾难性遗忘的原因:灾难性遗忘的根源在于神经网络的训练过程。神经网络在学习过程中采用梯度下降法,试图最小化当前任务的损失函数。然而,这种优化行为可能会破坏存储在网络权重中的原有知识。当网络学习新任务时,它需要改变自己的权重来适应新的数据,这可能会导致旧的知识被覆盖。
解决灾难性遗忘的策略:
多经验回放(Experience Replay)策略通过保留旧任务的一部分数据,并在训练新任务时一同训种策略来解决灾难性遗忘问题。
弹性权重共享(Elastic Weight Consolidation, EWC),通过对网络权重施加额外的约束,使其在新旧任务之间找到一个平衡点,防止新任务过度改变旧任务的权重。
HyperNetwork旨在训练一个小型递归神经网络来影响一个大型神经网络的权重。已经被广泛用于生成对抗网络1、2。Heathen等[26]和Kurumuz[43]实现了HyperNetworks for Stable Diffusion [72]来改变其输出图像的艺术风格。
Adapter在计算机视觉中,适配器用于增量学习[74]和领域适应[70]。这种技术通常与CLIP[66]一起使用,用于将预训练的骨干模型转移到不同的任务[23,66,85,94]。最近,适配器在视觉变压器[49,50]和ViT-Adapter[14]中取得了成功。在与我们同时进行的研究中,T2IAdapter [56] 使稳定扩散适应外部条件。
Additive Learning冻结原始模型权重并使用学习到的权重掩码 [51 , 74 ]、修剪 [52] 或硬注意力 [80] 添加少量新参数来规避遗忘。Side-Tuning [92 ] 使用侧分支模型通过线性混合冻结模型和添加网络的输出,以及预定义的混合权重表来学习额外的功能。
LORA通过学习低秩矩阵的参数偏移来防止灾难性的遗忘 [ 31 ],基于对许多过度参数化模型的观察,该模型位于低本征维子空间[2,47]。
Zero-Initialized Layers,Nichol等[59]讨论了如何在扩散模型中缩放卷积层的初始权重以改善训练,他们实现的“零模块”是将权重缩放到零的极端情况。Stability的模型卡[83]也提到了在神经层中使用零权重。ProGAN [36]、StyleGAN [37] 和 Noise2Noise [46] 中也讨论了如何操纵初始卷积权重。
Taming Transformer [19]是一种视觉transformer方法
StyleGANs可以通过额外的编码器控制[71],[3,22,38,39,55,60,65,71]中研究了更多应用。
ControlNet ControlNet 将附加条件注入到神经网络的模块中。在这里,我们使用术语网络块来指代一组神经层,这些神经层通常组合在一起形成神经网络的单个单元,例如,resnet 块、conv-bn-relu 块、多头注意力块、transformer 块等。假设 F(·; Θ) 就是这样一个经过训练的神经块,参数为 Θ,它转换输入特征图 x, 到另一个特征图 y 作为
Stable Diffusion 的 U-net 架构与编码器模块和中间模块上的 ControlNet 连接。锁定的灰色块显示了 Stable Diffusion V1.5(或 V2.1,因为它们使用相同的 U-net 架构)的结构。添加了可训练的蓝色块和白色零卷积层以构建 ControlNet。
在我们的设置中,x 和 y 通常是 2D 特征图,即 x ∈ R,其中 {h, w, c} 分别作为图中的高度、宽度和通道数。为了将ControlNet添加到这样一个预先训练的神经块中,我们锁定(冻结)原始块的参数Θ,同时将该块克隆到具有参数Θ的可训练副本。可训练副本采用外部条件向量 c 作为输入。当这种结构应用于像 Stable Diffusion 这样的大型模型时,锁定的参数会保留使用数十亿张图像训练的生产就绪模型,而可训练的副本会重用这种大规模预训练模型来建立一个深度、鲁棒和强大的骨干,以处理不同的输入条件。
可训练副本连接到具有零卷积层的锁定模型,表示为 Z(·; ·)。具体来说,Z(·; ·) 是一个 1 × 1 卷积层,权重和偏差都初始化为零。为了构建 ControlNet,我们使用两个零卷积实例,参数分别为 和 。
Controlnet的计算公式
是Controlnet模块的输出,在第一个训练步骤中,由于零卷积层的权重和偏置参数都初始化为零,因此等式(2)中的两个Z(·; ·)项的计算结果均为零
这样做法的好处
- 当训练开始时,有害噪声不会影响可训练副本中神经网络层的隐藏状态。
- 由于 Z(c; Θ) = 0,并且可训练副本也接收输入图像 x,因此可训练副本功能齐全,并保留了大型预训练模型的功能,使其能够作为进一步学习的强大骨干。
Stable Diffusion 本质上是一个 U-Net。带有编码器、中间块和跳层连接的解码器。编码器和解码器都包含 12 个块,完整模型包含 25 个块,包括中间块。在 25 个模块中,8 个模块是下采样或上采样卷积层,而其他 17 个模块是主模块,每个模块包含 4 个 resnet 层和 2 个视觉转换器 (ViT)。每个 ViT 都包含多个交叉注意力和自我注意力机制。例如,在图 3a 中,“SD 编码器块 A”包含 4 个 resnet 层和 2 个 ViT,而“×3”表示该块重复 3 次。文本提示使用CLIP文本编码层编码,diffusion时间步使用一个位置编码的时间编码器表示。
ControlNet 结构应用于 U-net 的每个编码器级别(图 3b)。特别是,我们使用 ControlNet 创建了 12 个编码块和 1 个 Stable Diffusion 中间块的可训练副本。这 12 个编码块有 4 种分辨率(64 × 64、32 × 32、16 × 16、8 × 8),每个分辨率复制 3 次。输出被添加到 U 网的 12 个跳跃连接和 1 个中间块。由于 Stable Diffusion 是典型的 U-net 结构,因此这种 ControlNet 架构可能适用于其他模型。
我们连接ControlNet的方式在计算上是高效的——由于锁定的复制参数被冻结,因此在最初锁定的编码器中不需要梯度计算来进行微调。这种方法可以加快训练速度并节省 GPU 内存。在单个 NVIDIA A100 PCIE 40GB 上测试时,使用 ControlNet 优化 Stable Diffusion 只需要增加约 23% 的 GPU 内存和 34% 的内存;与不使用 ControlNet 优化 Stable Diffusion 相比,使用 ControlNet 优化 Stable Diffusion 所需的 GPU 内存增加约 23%,每次训练迭代所需的时间增加 34%。
图像扩散模型学习逐步对图像进行去噪,并从训练域生成样本。去噪过程可以发生在像素空间中,也可以发生在由训练数据编码的潜在空间中。Stable Diffusion 使用潜在空间图像作为训练域,因为在这个空间中工作已被证明可以稳定训练过程 [72 ]。具体来说,Stable Diffusion 使用类似于 VQ-GAN [19] 的预处理方法将 512 × 512 像素空间的图像转换为更小的 64 × 64 个潜在图像。为了将 ControlNet 添加到 Stable Difusion,我们首先将输入大小为 512 × 512 的每个输入条件图像(例如边缘、姿态、深度等)转换为与 Stable Diffusion 大小匹配的 64 × 64 特征空间向量。具体而言,我们使用一个由4个卷积层组成的微小网络,该卷积层具有4个4×4的卷积核和2个2*2步长(由ReLU激活,分别使用16、32、64、128个通道,用高斯权重初始化并与完整模型联合训练)将图像空间条件编码为特征空间条件向量,
将条件向量传递到 ControlNet 中。
给定输入图像,图像扩散算法逐渐往图像里添加噪声,并产生一个噪声图像,t表示添加噪声的步数。给定一组条件包括时间步t、文本提示词、还有指定任务条件(就是边缘、深度等条件控制),图像扩散算法通过网络来预测添加到噪声图片中的噪声。
L是训练完整的扩散模型的目标函数。这个训练目标直接用来微调带有Controlnet的扩散模型。
训练过程中,使用空字符串随即替换掉50%的文本提示词。这种方法增强了 ControlNet 直接识别输入条件图像中的语义(例如,边缘、姿势、深度等)的能力,以替代提示词。
在训练过程中,由于零卷积不会给网络增加噪声,因此模型应该始终能够预测高质量的图像。我们观察到,该模型并没有逐渐学习控制条件,而是突然成功地跟踪了输入条件图像;通常在不到 10K 的优化步骤中。如图 4 所示,我们称之为“突然收敛现象”。
在6133步的时候,突然学习到了这个输入的额外控制条件。
Stable Diffusion依赖CFG技术来生成高质量图像。CFG 的公式为,其中 分别是模型的最终输出、无条件输出、条件输出和用户指定的权重。当通过 ControlNet 添加调节图像时,可以将其添加到 和 ,也可以仅添加到。在具有挑战性的情况下,例如,当没有给出提示时,将其添加到和,将完全删除CFG指导(图b);仅使用将使引导非常强(图c)。我们的解决方案是首先将条件反射图像添加到 ,然后根据每个块的分辨率 w= 64/h 将权重 w乘以 Stable Diffusion 和 ControlNet 之间的每个连接,其中 iblock 的大小,例如 h= 8, h= 16, ..., h= 64。通过降低 CFG 指导强度,我们可以获得图d 所示的结果,我们称之为 CFG 分辨率加权。
将图像(例如,Canny 边缘和姿态)分配到 Stable Diffusion 的单个实例中,我们可以直接将相应 ControlNet 的输出添加到 Stable Diffusion 模型中(图 6)。这种组合不需要额外的加权或线性插值。
上图通过姿态和深度进行组合条件输入生成图像。
此处省略,有兴趣自行查阅
与工业SDV2 Depth-to-Image模型对比,使用NVIDIA A100 集群、数千个 GPU 小时和超过 12M 的训练图像。我们使用 SD V2 的深度调节训练 ControlNet,但仅使用 200k 训练样本、一个 NVIDIA RTX 3090Ti 和 5 天的训练。我们使用每个 SDv2-D2I 和 ControlNet 生成的 100 张图像来教 12 个用户区分这两种方法。之后,我们生成 200 张图像,并要求用户说出每个图像是哪个模型生成的。用户的平均精度为0.52±0.17,表明两种方法产生的结果几乎无法区分。
训练数据集即使只有1k,训练也不会坍塌,数据集的大小当然是越大越好,有助于泛化性的学习。
由于Controlnets并没有改变预训练SD模型的拓扑结构,是可以与社区的SD模型兼容的。
ControlNet 是一种神经网络结构,用于学习大型预训练文本到图像扩散模型的条件控制。它重用源模型的大规模预训练层来构建一个深度而强大的编码器来学习特定条件。原始模型和可训练副本通过“零卷积”层连接,以消除训练过程中的有害噪声。大量的实验验证了ControlNet可以在单个或多个条件下有效地控制稳定扩散,无论是否有提示。在不同条件数据集上的结果表明,ControlNet结构可能适用于更广泛的条件,并促进相关应用。
参考链接:
https://arxiv.org/pdf/2302.05543.pdf
GitHub - lllyasviel/ControlNet: Let us control diffusion models!