封面 《紅月ゆれる恋あかり》
前言
最近读了 ControlNet 的论文,觉得还挺有趣就写一下笔记吧。在以往的 AI 绘画中我们通常使用输入 prompt 来生成我们图像,这里会有一个问题就是使用 prompt 通常不能完美的满足我们的需要,如何实现对绘图的控制,这就是 ControlNet 做的事情。
结构
ControlNet 是一种网络结构,可以增强特定任务下的预训练模型。ControlNet 对神经网络块中的输入条件进行操作从而控制整个神经网络,这里网络块指的是 resnet 块、CBN 块、多头注意力块、transformer 块等常用于搭建神经网络的层。其结构如下图所示。
ControlNet 锁住原始网络的参数,并且拷贝了一份可以训练的参数,除此以外还有额外的条件向量。采用拷贝而不是直接训练原始权重是为了避免数据集过小的时候过拟合并且保留从数十亿张图像中训练到的大型模型的质量。
神经网络块和 ControlNet 之间是通过零卷积(zero
convolution)进行连接,零卷积即 1*1 大小的卷积,其权重和偏差都被初始化为 0。这么设置使得一开始即使 ControlNet 不进行训练,ControlNet 部分的输入和输出都为 0 加到原始网络里面也不会对原始网络有任何影响。公式推导如下:
假定原始的神经网络,其中一层的定义如下,其中 为该层的输出, 为该层的输入, 为该层的参数, 表示该层的映射。
加入 ControlNet 后一层的表示方式如下,其中为新的输出, 为零卷积映射,和为两个零卷积的参数,为原始网络的权重复制。
当训练刚开始时,由于零卷积的效果公式会有下面的效果
因此在最开始的时候 ControlNet 就有原始网络的效果,后面就是在优化条件。
零卷积是怎么学习的
当一个卷积权重为 0,输入的梯度也会是 0,那么这个网络能学到参数吗?
假设有如下公式
此时梯度计算如下
当 时,梯度如下
因此只要一次梯度计算中 不为 0,那么 的梯度就不为 0,使得更新后的权重 不为 0,使得后续 的梯度不为 0,网络开始学习
整体结构
在 Image2Image 上 ControlNet 对 Stable Diffusion 的修改如下
训练
在 ControlNet 训练过程中,随机将 50% 的 prompts 替换成了空字符串,这有助于 ControlNet 从输入的条件向量中识别语义信息,这主要因为当 prompt 对 SD Model 不可见时,encoder 倾向于从输入的条件向量中学习更多语义以替代 prompt。
小规模训练
当计算量有限的时候,可以通过选择性的断开 ControlNet 和 SD Model 的部分连接加速训练,默认的模型如上所示,ControlNet 和 SD Middle Block、SD Decoder Block 1,2,3,4 相连接,当与 SD Decoder Block 1,2,3,4 的连接断开时可以在 3070TI 的笔记本上提升 1.6 倍速度,当输出结构和条件之间有关联时可以将这些连接重新关联。
大规模训练
当计算量和数据集较大时,过拟合的风险较低,可以先训练 ControlNet 到足够的迭代次数,然后解锁 stable diffusion 的全部权重共同训练。
条件变量
官方给的条件变量有 Canny 算子计算的原图边缘、霍夫变换计算的、姿态检测得到的还有用户涂鸦线稿,主要都是生成了一个条件,后续 stable diffusion 生成的图片都与条件有一定的相似度。
参考文献
Adding Conditional Control to Text-to-Image Diffusion Models