ControlNet简洁
ControlNet
什么是ControlNet
ControlNet是一种用于控制扩散模型生成结果的网络结构。该结构可以将边缘图,结构图等信息注入扩散模型,从而能够对生成结果进行更为精细的控制。
ControlNet是怎么实现的
在模型结构方面,其大致结构如下图所示,左侧的neural network block可以认为就是diffusion模型,右侧的controlnet则是复制了前者训练好的权重,并添加零卷积(即零初始化的卷积)构成。在训练时,冻结原始权重,仅训练复制出来的权重,以保证模型原本学到的知识不会被破坏掉。同时,由于添加了零卷积(即零初始化的卷积),刚开始训练时ControlNet对输出结果没有任何影响,随着训练逐步进行才开始逐渐施加影响,这也使得训练过程变得更加平滑。
上图仅为简单示意图,在最初的,使用unet为主要网络结构的diffusion中,其完整结构如下所示:
可以看到,左侧就是一个简单的stable diffusion,右侧则是ControlNet。值得注意的是,ControlNet编码器部分就是简单的复制diffusion的编码器,ControlNet解码器则是全部零卷积层。这么做的原因同上,不再赘述。
随着 DiT (Diffusion Transformer) 结构逐步替换掉了unet,它与后者结构的不同也带来了一些适配上的问题。ControlNet 的核心在于通过一个额外的、可训练的网络分支来处理条件输入(如边缘图、深度图等),并将其信息注入到原始扩散模型的相应层中,以控制生成图像的空间结构。
然而,DiT 没有 U-Net 那样明确的编码器-解码器结构和跳跃连接,它将图像处理为序列化的 patches,并通过 Transformer blocks 进行全局和局部的交互。 因此,U-Net 时代 ControlNet 直接复制编码器层并利用跳跃连接的方式,无法直接或高效地应用于 DiT。
目前,并没有一个像原始 ControlNet 论文那样被广泛认可的标准方法来定义 DiT 的 ControlNet。 社区和研究人员正在探索多种不同的适配方案。这些方法通常涉及设计 专门的模块或策略 来处理条件信息,并将其 注入或集成到 DiT 模型的不同 Transformer blocks 中。具体的注入方式可能有所不同,例如通过 注意力机制的调制、特征的残差相加,或者使用轻量级的适配器(如 LoRA) 等。由于缺乏一个标准的定义和实现,当前针对 DiT 的条件控制结构呈现多样性。
简而言之,DiT 的 ControlNet 是在 Transformer 架构下重新思考和实现的条件控制机制,其目标与 U-Net ControlNet 相同,但具体的技术路径和结构设计需要适应 DiT 的特性,并且目前还在发展演变中。