当前位置:首页 > AI图像类

为什么ControlNet几十张图就能学会控姿势?零卷积与锁权重的设计拆解

1周前 (10-05)AI图像类20

文生图模型早期有个很让人抓狂的槽点:画面能画出一整套,但姿势、边缘、深度这些"结构",基本靠运气。你让角色举右手,它偏举左手;你要一张建筑线稿,它给你涂成一团颜色。原因在于,提示词能描述语义,却很难精确约束空间结构——它们本来就是两种信息。

ControlNet 就是来解决这个问题的。它能让扩散模型在保持原模型能力的同时,额外接受一张"控制图"(姿态骨架、边缘线稿、深度图等)作为结构约束。更巧的是,它用几十张图就能训练,不用动原模型一分一毫。这篇拆解它靠什么做到这一点。

controlnet-cover.jpg

直接微调的做法,为什么走不通

要给模型加一个"结构控制"能力,看起来直接的做法就是把原模型拿去,在带控制图的数据上微调一遍。

这条路有两个坑。一是数据:能用于特定控制任务的高质量配对数据往往不多,姿态—图像配对、边缘—图像配对,收集成本都不低,量小就很容易过拟合。二是破坏:微调会改动原模型的权重,一旦数据分布偏了,模型原本丰富的通用生成能力会被悄悄磨掉,得不偿失。

所以理想的方案,得同时满足三件事:不用大量数据、不破坏原模型、能把控制信号真正注入进去。ControlNet 的思路,正是冲着这三点设计的。

锁住原模型,另开一段可训练副本

ControlNet 的设计有一条主线:原模型的权重一个都不动,全程冻结。为了让模型"多会一件事",它另建一组结构,专门负责处理控制信号。

做法是:从原模型里把编码器部分的权重拷贝出来,作为一份"可训练副本"。这份副本不是随便新建,而是从原模型复制来的,结构一致、起点相同。控制图先通过这个副本走一遍,再想办法和主网络的中间特征合到一起。

这样一来,主模型原有的生成能力被锁死保留,新增的控制能力则全部落在可训练副本上。训练时,只有副本里的参数会更新,主模型从头到尾不参与更新。

用一个公式概括它的输出结构:

y = F(x; Θ) + Z( F( x + Z(c_f; Θ_z1); Θ_c ); Θ_z2 )

其中:
  F(x; Θ)       冻结的原模型,Θ 不动
  c_f           外部控制图
  Z(·)          零卷积层
  Θ_z1, Θ_z2    零卷积的参数,训练初期为零
  Θ_c           可训练副本的参数

这个式子看着绕,核心就一句:总输出 = 原模型的输出,再加上"控制分支"贡献的一个修正项。控制分支的输入 c_f 先经过一层零卷积,和主特征相加后进入可训练副本,出来再经过一层零卷积,再合回整体。两条路径,一条锁死、一条可训,中间用零卷积当闸门。

零卷积:一个「从零开始」的闸门

前面反复提到的零卷积(zero convolution),是 ControlNet 里关键的一处设计。它本身就是一个普通的 1×1 卷积,特别之处在于初始化:权重全部置零,偏置也全部置零。

置零带来一个很直接的性质:训练刚开始时,无论输入是什么,零卷积的输出都恒为零。代入前面那个式子,训练起步时刻,修正项等于零,整个 ControlNet 的输出和原模型完全一致。

这一点为什么重要?因为它让训练有了一个"安全的起点"。模型不是从随机扰动开始学,而是从"等于原模型、零副作用"这个状态开始,逐步让零卷积的权重从零长出来,控制信号一点点渗入。整个过程平滑、可控,避开了"训练初期就破坏掉原模型输出"的风险。

换句话说,零卷积负责保证:无论你给它喂什么控制图,训练起步时它都先"闭嘴",等学会了再慢慢"开口"。这个从零起步的闸门,是 ControlNet 不用大量数据也不怕训坏的关键所在。

为什么小数据也训得动

有了"锁权重 + 零卷积"这套结构,小样本训练就顺理成章了。

训练时,原模型的权重被冻结,不参与反向传播,真正需要拟合的只有可训练副本加两个零卷积。这些参数要学的,不是"怎么画出一张好图"——那部分能力锁在原模型里,已经足够——而是"怎么把控制图和主特征对应起来"这一个相对窄的任务。

任务变窄,需要的数据量就大幅下降。几十张甚至更少的配对样本,往往就够让控制分支学到"骨架在这里,对应的人体轮廓就要画在那里"这种映射。这也是 ControlNet 常被提到的一点:它把"训练一个大模型"降成了"训练一个小附加件"。

常见的控制类型,对应的是不同的控制图

理解了架构,再看 ControlNet 支持的各种控制就顺了。它们其实都是同一个框架,区别只在于输给 c_f 的那张控制图长什么样。

给一张姿态骨架图,它学的就是"骨架怎么约束人体姿态";给一张边缘线稿,它学"线条怎么约束轮廓和构图";给一张深度图,它学"远近关系怎么约束空间层次"。因为框架是统一的,每一种控制类型只需换控制图、再训一个可训练副本即可,主模型始终复用那一份。

也正因为主模型可以不动,同一个开源模型上能叠出成组的 ControlNet 附件,按需加载,互不冲突。

小结

ControlNet 的思路,本质上是一套"增量式"的模型扩展策略。面对"既要新能力、又不想破坏旧能力、还缺少数据"这个三难处境,它给出的答案是:锁住旧的,另起一段可训练副本承载新的,再用零卷积这个"从零起步的闸门"让新旧安全地衔接起来。

这套打法的影响早已超出了姿态控制这一个应用。它说明了一件通用的事:给一个已经很强的大模型加新能力,未必非要动它本身,把新能力做成一个可训练的小附件、从零平滑地融进去,往往更稳也更省。日后看到各种"xxx-Net""Adapter"式的扩展,多半都能在 ControlNet 这里找到问题的原型。

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。