狗都能看懂的ControlNet论文详解

前言

原始的DDPM开启了图像生成的新方式,一个问题也随之出现,它无法控制生成的图片,虽然之后有类似CLIP的多模态大模型可以通过文本提示构建图片。但仅仅通过提示词很难精确地控制画面的布局、姿态、元素等。生成匹配的结果需要大量的尝试,也即我们说的“抽卡”。本文作者考虑是否有一个方法对结果进行控制,比如绘画师的草图,深度图,人体姿态图等。

Intro.png

相关的工作

微调神经网络

  • HyperNetwork:是一种源于自然语言处理(NLP)领域的方法,旨在训练一个小型循环神经网络来影响大型网络的权重。截至ControlNet发布前,这个方法已经被应用在GAN中了。
  • Adapter:Adapter是一种用于迁移学习的技术,旨在通过引入少量可训练的参数,将预训练模型快速适应到新任务或新领域。
  • Additive Learning:为了网络能够适应新任务的同时,不会忘记原有知识而提出的相关方法(知识遗忘)。Side-tuning就是其中的一个方法,原理大概是会加入一个辅助的分支,两个分支结果的输出比例使用 α 来调节,在训练过程当中,这个比例可以变化。
  • Low-Rank Adaptation (LoRA):LoRA应用就很广泛了,基本所有的大模型再训练都是用这个方法,在不破坏原始特征的情况下,用极小的资源就可以训练出一个模型。通过控制数据集,实现特定物体的生成。
  • Zero-Initialized Layers:全零初始化网络层也被应用在ControlNet中,虽然有很多研究表明,高斯初始化权重比用零初始化更安全,但全零初始化能使微调开始的时候保持模型原有的输出。

图像扩散

  • Image Diffusion Models:最早起源于DDPM,加上VAE技术,在潜空间里对变量进行扩散,大大减少内存占用。利用CLIP模型实现文本对结果的控制,商业化的产品有DALL-E2Midjourney
  • Controlling Image Diffusion Models:利用Textual Inversion、DreamBooth技术等技术,对特定概念进行注入,也可以在一定程度实现对结果的控制。

图像到图像的转换

GAN的各种变体,如Conditional GANs、StyleGANs等。

ControlNet原理

controlnet-brief.png

从上图中可以看出,原始的Block是串行的结构, x x x作为输入, y y y是输出,而ControlNet则是从原始模型中新增一条旁路出来,将权重拷贝过来,同时在输入和输出的位置,加上两层全零初始化的卷积。而原始的权重是锁住的,其实本质上不参与训练。这样设计的好处有两点:

  1. 全零卷积:不会破坏原始Stable Diffusion模型的从大规模数据集的中学习到的特征
  2. 拷贝权重:从原始模型的基础上学习

可以看到,这两个设计是相辅相成,互相制约。

关于全零卷积会不会导致梯度消失,发生权重一直不更新的问题。我一开始也有这样的疑问,可能也是很多人问了作者同样的问题,作者在ControlNet的代码仓里也有写相关的FAQ,具体推导:

Zero Convolution Layer的初始权重 W W W和偏置 b b b都设为零:
W = 0 , b = 0 W = 0, b= 0 W=0,b=0
因此,初始时他的输出 y y y为:
y = W ⋅ x + b = 0 ⋅ x + 0 = 0 y = W \cdot x + b = 0 \cdot x + 0 = 0 y=Wx+b=0x+0=0
在神经网络中,梯度是通过 链式法则 计算的。假设损失函数为 L L L,我们需要计算 L L L对权重 W W W的梯度, ∂ L ∂ W \frac{\partial L}{\partial W} WL。反向传播时 ∂ L ∂ W \frac{\partial L}{\partial W} WL的计算公式为:
∂ L ∂ W = ∂ L ∂ y ⋅ ∂ y ∂ W \frac{\partial L}{\partial W} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial W} WL=yLWy
其中:
∂ y ∂ W = x \frac{\partial y}{\partial W} = x Wy=x
因此:
∂ L ∂ W = ∂ L ∂ y ⋅ x \frac{\partial L}{\partial W} = \frac{\partial L}{\partial y} \cdot x WL=yLx
可以看到,梯度 ∂ L ∂ W \frac{\partial L}{\partial W} WL并不直接依赖于 W W W,而是依赖于 ∂ L ∂ y \frac{\partial L}{\partial y} yL x x x,损失函数对输出的求导不会为零(除非预测和实际完全一样),输入 x x x更不可能为零。所以实际上在权重更新完一次之后,Zero Convolution Layer就不会为全零了

网络结构

controlnet.png

整体的网络结构如上图所示,作者是以Stable Diffusion作为baseline。只拷贝Encoder部分,Decoder部分用零卷积初始化。原始输入是512 x 512分辨率下的,经过一个4层的小型卷积网络,进行下采样到64 x 64分辨率下进行扩散。

因为Stable Diffusion部分的权重是锁住的,所以它只提供前向推理结果。只有ControlNet部分需要训练。实际训练过程中,在A100(40GB)上,只会多23%的GPU内存占用,34%的时间消耗。

训练阶段

损失函数为:

loss-func.png

这里 z t z_t zt代表带有噪声的图像, t t t为时间步, c t c_t ct是文本引导词, c f c_f cf是任务相关的特定条件,即ControlNet输入。

作者还提到,训练过程中,会抹除50%的提示词信息。这种方法提高了ControlNet主动识别输入条件图像中的语义(例如边缘、姿势、深度等)的能力。

另外论文中还发现了一个有趣的现象。模型不是逐渐学会控制条件的,而是突然之间学会的。

sudden-train.png

如上图所示,ControlNet的输入是一个苹果植物,而在刚训练60K个step左右都还是苹果笔记本电脑。在6133个step时,模型就突然学会了。对于这个现象,作者在其个人博客上也解释为模型陷入了局部最优。推荐的解决方法是,在算力允许的情况下,扩大batch size,然后从头开始训练,不过一般增大到256之后,再增大也没什么影响了。

dataset-size.png

另外,文中还提及了,数据集大小对最终生成结果的影响。可以看到,数据集数量越大,其生成结果更精细。当然,这也是深度学习大力出奇迹的常态了。

推理阶段

Classifier-free guidance resolution weighting

Stable Diffusion依赖于一种称为无分类器引导(Classifier-free guidance)的技术来生成高质量图像。关于这部分,可以看看之前博客的讲解

CFG的公式为:
ϵ p r d = ϵ u c + β c f g ( ϵ c − ϵ u c ) \epsilon_{prd} = \epsilon_{uc} + \beta_{cfg}(\epsilon_c - \epsilon_{uc}) ϵprd=ϵuc+βcfg(ϵcϵuc)
ϵ p r d \epsilon_{prd} ϵprd代表模型最终的输出, ϵ u c \epsilon_{uc} ϵuc代表模型unconditional output(即纯噪声 + 无引导词的生成结果), ϵ c \epsilon_c ϵc代表带引导条件的输出(可以是提示词或ControlNet), β c f g \beta_{cfg} βcfg是可以调整的超参数。当控制图像通过ControlNet添加进条件图像时,它是可以被同时加到 ϵ u c \epsilon_{uc} ϵuc ϵ c \epsilon_c ϵc,或者只加入到 ϵ c \epsilon_c ϵc中。

下图中(a)是输入的Canny,当没有提示词的时候,无论是 ϵ u c \epsilon_{uc} ϵuc还是 ϵ c \epsilon_c ϵc,其guidance作用完全失效。如下图(b),但是如果只用condition,可能又会让指导过于强烈,如下图(c)所示。

cfg-rw.png

Resolution weighting是指在生成过程的不同分辨率层级上,根据实际需要调整每个分辨率层级的权重,从而影响生成过程中的图像细节和结构。这种加权方式有助于生成过程中更好地平衡细节与全局结构。

例如,假设你有一个多分辨率生成的扩散模型(如在训练过程中从低分辨率到高分辨率逐步生成图像),你可能会对每个分辨率阶段赋予不同的权重。低分辨率阶段可能更多关注大致结构,而高分辨率阶段更多关注细节,因此在低分辨率阶段可能使用较小的权重,而在高分辨率阶段使用较大的权重。

Resolution weightingClassifier-free guidance 结合在一起的想法是,在每个分辨率阶段应用不同的引导强度。这样可以让低分辨率阶段(关注全局结构)和高分辨率阶段(关注细节)根据其重要性,灵活地引导生成过程。

作者的解决方法是,首先将条件图像给到 ϵ c \epsilon_c ϵc,并且根据每个block的分辨率 h i h_i hi,得到 w i = 64 / h i w_i = 64 / h_i wi=64/hi,Stable Diffusion和ControlNet之间的连接乘上一个系数 w i w_i wi i t h i^{th} ith是每个block的编号。通过减少CFG guidance的强度,可以得到更好的结果,如图(d)。

Composing multiple ControlNets

multi.png

在推理时,可以将多个ControlNet组合在一起使用,如上图所示,将Pose和Depth组合一起生成的结果。

Strength, Start, End

在实际使用时,还有Strength, Start_Percent, End_Percent的三个参数可以设置:

  • Strength:控制ControlNet对生成结果的影响强度,Strength=0时,ControlNet完全不起作用,,生成结果完全由主模型决定。Strength=1时,ControlNet的影响最大,生成结果会严格遵循 ControlNet 的引导
  • Start_Percent, End_Percent:控制ControlNet在扩散时生效的时间段,一般是组合使用的。Start_Percent = 0End_Percent = 0.5时鼓励模型在一开始遵循ControlNet的条件,而后续填充的部分更遵循Stable Diffusion生成。

More Trick

更多的技巧和使用建议,作者有在其Github的issue中提及,写的也很详细。这里就不展开讲解了。

总结

ControlNet是一种神经网络结构,但他没有提出全新的结构。反而是利用现有的技术,对其进行小小的改动,使得用户可以对图片进行更精准的控制。甚至在训练时,其训练数据可以直接使用现有的图文对进行训练,例如Canny,Hough Line等,都可以用现有的OpenCV直接生成对应的输入图。人工标注的部分非常少。所以作者其实只用了非常少的成本就获得了比较好的结果,不愧是获得了ICCV 2023最佳论文奖的论文。

### ControlNet 网络工作原理 #### 控制机制与架构设计 ControlNet 的核心在于其能够有效地控制大型神经网络的行为,特别是针对像 Stable Diffusion 这样的复杂模型。具体来说,在该框架内,Encoder 部分被复制并重新训练,而 Decoder 则利用 skip connection 来保持原有特征传递路径不变[^1]。 ```python class ControlNet(nn.Module): def __init__(self, encoder_layers, decoder_layers): super(ControlNet, self).__init__() self.encoder = nn.Sequential(*encoder_layers) self.decoder = nn.Sequential(*decoder_layers) def forward(self, x): encoded_features = self.encoder(x) output = self.decoder(encoded_features) return output ``` #### 特殊卷积层的应用 为了更好地调控图像扩散过程中的细节变化,ControlNet 引入了所谓的“零卷积”。这类特殊的卷积操作允许更灵活地调整不同尺度下的视觉效果,从而增强最终生成图片的质量。值得注意的是,“零卷积”的概念并非孤立存在;它与其他关于权重初始化的研究成果紧密相连,共同构成了现代深度学习技术的重要组成部分[^2]。 #### 类ResNet结构及其改进 从某种意义上讲,ControlNet 中的设计理念确实借鉴了许多 ResNet 的特点——尤其是那条贯穿始终的 shortcut/skip connections。不过在此基础上做了创新性的改动:不是简单地把输入直接传送到较深层次的位置,而是让这部分信息经过额外的学习阶段再汇合至主干流之中。这样做不仅保留了原始信号的有效成分,还赋予了整个体系更强的表现力和适应能力[^3]。 #### 效率考量 考虑到实际应用时资源消耗的问题,研究人员巧妙地优化了整体流程。通过仅对 UNet 结构里的编码器部分实施参数更新,并跳过解码端不必要的反向传播步骤,成功实现了性能提升的同时降低了运算成本约一半之多[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值