}


你有没有想过这样一个场景:一个特别厉害的老师,想把自己的绝活教给一个学生,结果发现两人连基本的沟通语言都不一样。老师说的是法语,学生只会说日语,连最基础的"这个词是什么意思"都对不上。

这不是段子,这就是当前AI图像生成领域正在发生的真实困境。

FLUX.1-dev是个12B参数的大模型,效果好但太重,部署起来又贵又慢。SD3.5-Medium只有2.5B参数,五分之一大小,跑得快也省资源,但效果自然要打折扣。理想的做法是让FLUX这个大模型去"教"SD3.5-Medium,把自己的本事传给这个小个子学生。

问题是,这两个模型压根不是一家人。

核心问题:为什么"教学"这件事这么难

先说说AI图像生成里最先进的技术路线,叫做流匹配

流匹配*:一种让模型学习如何把随机噪声逐步转化成一张真实图片的技术,本质上是训练一个"速度场",告诉模型在生成图片的每一步该往哪个方向走。

FLUX和SD3.5-Medium都是基于流匹配的模型,但它们在三个关键地方完全不同。

第一个不同是VAE

VAE(变分自编码器)*:一种把图片压缩成更小的"潜空间"表示,再从潜空间还原回图片的编码解码器,模型实际的生成过程发生在这个压缩后的潜空间里,不是直接在像素上操作。

FLUX用自己的VAE把图片压缩成一套坐标系统,SD3.5-Medium用另一套完全不同的VAE压缩成另一套坐标系统。这就好比两家银行,一家用人民币记账,一家用日元记账,汇率还是浮动的,你直接把一家银行的账本数字搬到另一家银行去,那个数字完全没有意义。

第二个不同是模型架构本身,transformer的内部设计不一样,导致没法直接比较中间层的特征。

第三个不同,也是最容易被忽略的,是噪声时间表(noise schedule)。两个模型在"从纯噪声到清晰图片"这条路上,虽然都分成若干步,但每一步对应的噪声强度完全不同,这是由不同的shift函数决定的。也就是说,FLUX的第10步和SD3.5-Medium的第10步,噪声浓度根本不是一回事,你说"对齐第10步"其实是在拿风马牛不相及的两个状态做比较。

这篇论文里的研究者们把这两个障碍起了两个特别精准的名字:没有共享空间(no shared space),没有共享时钟(no shared clock)。

面对这样的双重错位,过去业界最好的做法叫做on-policy distillation

在线蒸馏(on-policy distillation)*:一种知识蒸馏方式,让学生模型在自己实际采样生成的轨迹上接受老师的纠正,而不是死记硬背老师提前准备好的固定样本,这样能避免"exposure bias"暴露偏差的问题,因为学生在真实部署时走的就是自己的路,不是老师规划好的路。

这个思路听起来很合理:老师不是给你一堆标准答案让你死记硬背,而是看着你自己做题,在你出错的地方随时纠正。问题是,过去所有的在线蒸馏方案都默默假设了一件事,老师和学生必须是同一个模型家族出来的,共享VAE、共享架构、共享时间表。这个假设从来没被明说过,因为大家默认这是天经地义的。

直到有人想拿FLUX教SD3.5-Medium,才发现这个假设根本立不住。

那研究者试过最直接的办法吗?试过。把老师生成的目标潜变量直接拿来当作学生的回归目标,或者退一步,把两边都解码成像素,再做像素级的均方误差(MSE)回归。结果呢?论文里说得很直白:这样的训练直接崩溃(collapse)。图1里那条"Latent MSE"的曲线,眼睁睁地往下掉,训练根本进行不下去。

为什么会崩溃?因为老师对学生生成的图片进行"精修"这个动作,本质上是一次随机的重新合成,它会保留大致的语义内容,但会重新绘制局部细节。你让学生去逐像素模仿这种带随机性的重绘,模型学到的会是所有可能重绘结果的模糊平均值,图片会变得一片模糊,训练信号本身就是噪音。这就好比你让一个厨师去精确复刻另一个厨师现场发挥的摆盘,而摆盘这件事每次都会有细节上的随机变化,你非要让厨师逐个摆件位置去对齐,最后学出来的只会是一堆位置的平均值,糊成一团,什么摆盘美感都没有了。如果不这样处理会怎样,答案已经写在实验曲线里了:训练直接失败,学生什么都没学到。

Any-OPD的解法:只在一个地方见面

面对这样的死局,这篇论文提出了Any-OPD

Any-OPD*:一种支持任意异构教师和学生模型对之间进行在线蒸馏的框架,核心思路是让两个模型只在一个第三方的、和两边都无关的表征空间里"见面",同时用连续噪声水平而不是步数索引来对齐两条轨迹。

它的设计思路可以概括成一句话:既然两个人语言不通,那就找一个两边都懂的翻译,而且这个翻译只翻译"意思",不翻译"用词细节"。

具体来说,Any-OPD用的翻译工具叫DINOv2

DINOv2*:一个通过自监督学习训练出来的视觉特征提取模型,能把任意图片编码成一个具有判别性的特征向量,这个特征对图片的细节变化不敏感,但对语义和结构变化很敏感。

Any-OPD只取DINOv2里的CLS token

CLS token*:Transformer架构里用来汇总整张图片全局信息的一个特殊向量,可以理解成"这张图片整体讲的是什么"的浓缩表示。

学生和老师各自用自己的VAE把图解码出来,两张图各自过一遍DINOv2,只比较两个CLS向量之间的余弦距离。这个操作完全绕开了VAE坐标系统不一致的问题,也绕开了架构不一致的问题,因为DINOv2从头到尾不需要知道学生和老师内部是怎么工作的,它只看最后吐出来的图片长什么样。

这个设计有个特别聪明的副作用:换老师不用改代码。你把FLUX换成任何别的教师模型,只要它能生成图片,这套流程一个字都不用改,因为DINOv2从始至终没碰过任何一个模型的内部结构。这就好比一个翻译官只看两个人说完话之后各自画的画,画得像不像,而完全不关心两人各自说的是哪国语言、用的是什么方言。如果这个翻译官非要去比对两人说话时的每一个音节,那换个说另一种语言的人来,翻译官就得重新学一套规则,麻烦到爆。

那噪声时间表的错位怎么解决呢?答案是不再按步数索引对齐,而是按噪声强度这个连续量本身来对齐。

具体地说,学生走完自己的完整生成流程之后,会把生成的图片重新送回老师那边,老师用一个叫做噪声再合成(noise-and-denoise)的操作对这张图进行精修:先往图片上加一定强度的噪声,再用老师自己的采样过程把它重新去噪出来。这个操作论文里叫做投影(projection)

投影算子(projection operator)*:把学生生成的样本重新加噪、再交给老师去噪,本质上是把这个样本朝着老师所认为"更好的样本"方向拉一把,加噪的强度越大,拉动的幅度也越大。

加噪强度选小了,老师几乎不改变原图,学生学不到什么新东西;加噪强度选到最大,老师几乎是把整张图重新画一遍,这时候这张"精修图"已经和学生原本的构图没什么关系了,等于是拿了一张不相关的图强行当作目标,梯度信号里全是噪音。论文的实验(表2)证实了这一点:加噪强度设在低到中等区间(对应噪声水平约0.63以下)时各项指标表现最差,设到偏高区间时表现最好。找到这个恰到好处的中间地带,是让"精修"真正起作用的关键。

回到学生自己的更新环节,这里论文用了一个巧妙的做法叫噪声水平匹配(noise-level matching),而不是按第几步对齐。因为学生和老师各自的时间表虽然步数编号对不上,但两边共享同一个连续的噪声浓度概念。老师这次精修改变的样本,其对应的噪声范围是从0一直到某个具体的σ值,那么学生这边,只要找到自己时间表里噪声水平大于等于这个σ值的那一段,把这一段重新跑一遍并让梯度流过去就够了,更早、更干净的那些步不用动。这就好比调音师给一段音频的中高频做了处理,你要在自己的混音软件里重新调整,只需要找到自己软件里对应中高频的那几个滑块去调,完全不需要管低频那部分,而且不同软件的滑块编号完全可以不一样,只要频率范围对上就行。

起跑前先热身:锚定阶段

光有以上机制还不够,论文里还发现了一个隐藏的坑:如果学生一上来就直接接受在线蒸馏,效果会打折扣,原因是学生自己生成的样本一开始离老师的分布太远,每一次梯度更新传递的信息量都很低,等于是在瞎子摸象。

所以Any-OPD在正式的在线蒸馏之前,加了一个热身阶段,叫做锚定(anchoring)

锚定阶段*:一个离线的预热步骤,先让老师生成一批目标图片,用学生自己的VAE把这些图重新编码进学生的潜空间,然后用标准的流匹配损失训练学生去拟合这些"翻译过"的目标,目的是先把学生的整体输出风格拉到老师的水平线上,不涉及逐样本的精确对应。

关键的巧思在这里:老师生成的图片,不是直接拿老师那套潜变量给学生当目标,而是先经过学生自己的VAE重新编码一遍,这样目标就自然落在学生能理解的坐标系统里了。这个操作本身信息损失几乎为零,因为VAE编码解码本来就是可逆的,只是换了一套"记账货币"。

论文的实验(图6)验证了锚定阶段的重要性:从锚定400步之后的检查点开始做在线蒸馏,效果全程压制锚定100步的检查点,即使后续两者接受的在线训练量完全一样。这说明锚定不是可有可无的加分项,而是决定后续训练成败的地基。地基没打好,上面盖多少层楼都补不回来。

实测效果:2.5B打平甚至反超12B

理论说了这么多,实际效果到底怎样?

论文选了一个几乎最极端的异构组合来验证:FLUX.1-dev(12B)当老师,SD3.5-Medium(2.5B)当学生。两者VAE不同、架构不同、噪声时间表也不同,可以说是把三个错位全占了。

根据实验数据(表1),蒸馏后的2.5B学生在多个指标上表现惊人:

PickScore从0.866涨到0.884,超过了12B教师的0.878。

HPSv3从9.12涨到10.97,虽然还没超过教师的11.19,但已经把差距从2.07拉近到0.22。

ImageReward从0.922涨到1.116,反超教师的0.971,涨幅接近教师自身相对基线的四倍之多。

这里有个特别值得琢磨的细节:为什么一个2.5B的学生模型蒸馏之后能在某些指标上反超12B的老师?论文给出的解释是,训练目标本身就不是"老师原本会生成什么",而是"老师如何精修学生自己生成的样本"。这意味着最终目标其实是学生构图加上老师渲染质感的结合体,训练把学生推向了一个两个原模型单独都到不了的位置。

DPG-Bench上的表现基本不变(84.58涨到84.71),论文对此的解释是这个基准测的是构图准确性,而蒸馏目标偏重的是人类偏好审美,教师FLUX在这一项上本身也没什么优势可以传递。这个解释在后续的对照实验里得到了印证:换一个在构图上更强的教师Z-Image之后,学生的GenEval分数(衡量物体-文本对齐)真的跟着涨了0.80分,DPG-Bench涨了0.95分。这说明学生学到的东西,会真实反映老师本身擅长什么,教师是什么样的人,学生就多少沾上什么样的气质。

消融实验:每一块拼图都不能少

论文做了相当详尽的拆解实验,来验证每个设计选择的必要性。

关于监督信号该用什么,图5的对比结果很有说服力:用潜空间MSE,训练在前几十步内就崩溃;用LPIPS(一种感知相似度指标),前期还行,但训练到后期开始退化,因为LPIPS依然依赖局部空间对应关系,而老师的随机重绘恰恰破坏了这种对应;只有DINOv2的CLS特征全程稳定,并且比更复杂的多层特征、加上patch特征的版本都更好或相当。这个结果说明,有时候更简单的表征反而更鲁棒,因为它对局部错位的容忍度更高。

关于教师精修的步数预算,图4展示的对比很直观:如果把教师去噪的步数从20步砍到10步,教师给出的目标图本身就带有明显模糊,而学生会原样继承这种模糊,说明教师的去噪质量上限直接决定了学生能学到的质量上限,教师自己没做好的功课,学生学不到干净的答案。

关于采样过程要不要加随机性,论文尝试了一种叫CPS的方法

CPS(Coefficients-Preserving Sampling)*:一种在采样步骤中引入随机扰动的技术,通过一个角度参数η控制噪声方向偏离模型预测方向的程度,常用于强化学习式的微调场景。

结果(图7)显示确定性的Euler采样(η=0)全程表现最好,加入随机扰动反而在训练200到300步之后开始拖累效果。论文给出的解释很直接:扰动会让训练时监督的轨迹和实际部署时学生真正会走的轨迹脱节,等于是在教一个学生做他实际上根本不会做的动作。这和强化学习里常见的"探索有益"直觉恰好相反,值得留意。

写在后面

读完这篇论文,最触动我的其实不是Any-OPD本身有多精妙,而是那个"没有共享空间、没有共享时钟"的问题命名方式。它把一个原本模糊的工程困境,拆解成了两个可以分别攻克的具体矛盾,这种拆解能力本身比解法更值得学。

有个细节我反复想了很久:学生能反超教师某些指标,这件事到底该怎么理解?论文的解释是训练目标本身就是"教师精修过的学生样本",不是教师原本的输出,这其实提示了一个更深的东西,蒸馏未必只是压缩知识,它也可能是在创造一种原本两个模型都单独达不到的组合状态。这让我想到,师徒关系里最好的传承,往往不是徒弟复刻师父,而是徒弟带着自己的底子,吸收师父的手法,长出一个谁都没见过的新样子。

论文没有回答的一个问题是:如果同时找两个风格不同的老师来教一个学生,会发生什么?论文末尾提了一句"组合互补的教师是自然的延伸方向",但没有展开。这个方向如果做成了,可能比现在的单教师版本更有意思,也更麻烦,因为两个老师之间怎么协调意见分歧,本身又是一个新的错位问题。

Q&A

Q1:Any-OPD是什么?

A:Any-OPD是一种支持任意异构教师和学生模型之间做在线蒸馏的框架,即使两个模型使用不同的VAE、不同的架构、不同的噪声时间表,也能让学生在自己生成的样本上接受老师的纠正指导。

Q2:为什么直接用教师的潜变量或像素做回归会失败?

A:因为不同模型的VAE坐标系统完全不同,教师潜变量在学生坐标系里没有意义;而像素级回归会因为教师精修时的随机重绘细节,导致训练结果趋向模糊平均值,实验中训练直接崩溃。

Q3:Any-OPD蒸馏效果如何,2.5B的学生模型能追上12B的教师吗?

A:能在部分指标上追平甚至反超。用FLUX.1-dev(12B)蒸馏SD3.5-Medium(2.5B)后,学生的PickScore从0.866涨到0.884,超过教师的0.878,ImageReward也反超教师,HPSv3差距从2.07缩小到0.22。