ControlNet:给扩散模型加上空间控制
ControlNet 用「零卷积」把一份可训练的副本接到冻结的 Stable Diffusion 上,让边缘图、深度图、姿态、分割图直接控制生成,且不到 5 万张图也能稳定训练。
快速答案
ControlNet 给一个大型预训练文生图扩散模型加上空间控制——边缘、深度、人体姿态、分割图——既不用重训,也不会把原模型搞坏。它冻结原始 Stable Diffusion 权重,把编码器复制成一份可训练副本,再用「零卷积」把两者连起来:这些卷积层的权重初始值精确为零。因为第一步注入的信号是零,模型一开始就是 Stable Diffusion 的精确复刻,之后才慢慢学会响应条件。最关键的实用结论是:它在小数据集上也能稳定训练——不到 5 万张图——而朴素微调在这种规模下要么过拟合,要么崩掉。
问题:文字描述说不清「手要摆在这里」
像 Stable Diffusion 这样的文生图模型擅长内容,却拙于空间布局。你很难用提示词可靠地说清「一个人正好摆这个姿势、地平线在这个高度、这栋楼的轮廓保持不变」。设计师和画师想做的是:画一张草图、给一张深度图、描一根姿态骨架,让模型据此补全。最直接的办法——拿(条件,图像)成对数据全量微调整个模型——在实践中行不通:成对数据集本就很小,而对一个十亿参数模型在小数据上做全量微调,会毁掉它从数十亿张图里学到的丰富生成先验。
锁住基座,只训练一份副本
ControlNet 的核心动作是绝不碰原始权重。它让可投产的 Stable Diffusion 保持冻结,只把编码器块复制出一份可训练副本。冻结分支保留模型已经掌握的一切;可训练副本学着读取新的条件输入。两者融合在一起,于是真正干生成重活的还是原网络,副本只负责把它往空间约束的方向推。这正是单张 GPU 就能训出一个可用 ControlNet 的原因——你学的是一个控制适配器,而不是一个全新的图像模型。
零卷积
让这套方案稳定的关键,在于那层连接:一个权重和偏置都初始化为零的 1x1 卷积,放在可训练副本的前后。第一步训练时,零权重卷积输出零,于是条件分支毫无贡献,合并后的网络逐字节就是原版 Stable Diffusion。没有任何随机噪声被注进这个精心预训练好的模型,所以训练不会一开局就把它腐蚀掉。随着梯度流动,这些零层把权重从零推开,控制信号逐渐淡入。作者还指出:穿过零卷积的梯度通常并不为零,所以这一层是真的在学,而不是卡死不动——正是这个细节,把它和「单纯把某个分支静音」区分开来。
关键结果
- 一套架构,多种条件。 同一配方适用于 Canny 边缘、Hough 直线、HED 软边缘、用户涂鸦、人体姿态(Openpose)、深度图、法线图、语义分割、卡通线稿——每一种都在 Stable Diffusion 上单独训练成一个 ControlNet。
- 小数据可训。 作者报告在不到 5 万张图的数据集上仍能稳定训练,也能扩到 100 万张以上;零卷积的初始化正是让小数据不至于崩掉的原因。
- 可组合。 多个 ControlNet 可以叠加(比如姿态加深度),且条件在有没有文字提示时都能用。
- 不灾难性遗忘。 因为基座冻结,模型保住了全部生成质量;论文里的消融实验显示,把零卷积换成普通初始化会损害结果。
为什么重要
ControlNet 是「画一张草图、得到一张受控图像」从研究 demo 变成标准工作流的原因。它把扩散模型从只能靠提示词碰运气的老虎机,变成可被指挥的工具;而「冻结基座加可训练副本」这套模式,如今已是给大模型加能力又无需重训的默认做法——在思路上和适配器、LoRA 相邻,只不过它作用在空间结构上。对任何搭图像管线的人来说,它就是手头已有的布局和你重训不起的模型之间那座桥。
局限与存疑
ControlNet 是外挂,不是免费午餐。每种条件都要单独训练一个模型,并配一个自己的预处理器(边缘检测器、姿态估计器、深度网络),所以你的控制质量被那个现成标注器的质量卡死——姿态估歪了,结果就歪。它控制的是结构而非语义:它会忠实地照着深度图生成,却可能忽略提示词里的细节;条件和提示词相互冲突时还会打架。它继承了冻结基座的全部偏见和失败模式,而不会修正任何一个。至于那份小数据鲁棒性,虽然真实,前提仍是你脚下踩着一个在网络级数据上预训练好的冻结模型——ControlNet 并不能省掉上游那笔成本。
常见问题
ControlNet 是怎么在不搞坏 Stable Diffusion 的前提下加上控制的?
ControlNet 冻结原始 Stable Diffusion 权重,只训练一份编码器副本,两者用零初始化的卷积相连。训练一开始,控制分支输出为零,于是网络的表现和未改动的原模型完全一致,之后才逐步学会新条件,而不会覆盖掉原有先验。
ControlNet 里的零卷积是什么?
零卷积是权重和偏置都初始化为零的 1x1 卷积层,放在 ControlNet 可训练副本的两侧。它让条件分支的贡献从「无」开始,这样就没有有害噪声触及预训练模型;随着训练,它把权重从零推开,模型逐渐学会使用条件。
ControlNet 能用哪些条件?
ControlNet 已被训练用于 Canny 边缘、HED 软边缘、用户涂鸦、直线、人体姿态、深度图、表面法线、语义分割、线稿等等。每一种都是单独训练出来的 ControlNet,且多个可以在一次生成里组合使用。
ControlNet 需要超大数据集吗?
不需要。论文报告 ControlNet 在不到 5 万张图的数据集上也能稳定训练,同时也能扩展到 100 万张以上。正是零卷积的初始化方式,让小数据训练不至于损害冻结的基座模型。
一句话:冻住你信得过的模型,训练一份用零连接的副本,让空间控制悄悄淡入,而绝不腐蚀原始模型。阅读 arXiv 原文。