BudgetPix:像素空间扩散的算力能下调,下限却卡在主干结构上

一、绕开 VAE 换来了什么,又为什么把推理算力锁死了?

在一张 1024×1024 的图里,一片密不透风的树叶和一块什么都没有的晴空,会被扩散模型切成同样多的 token,拿到同样多的算力。这不是某个实现的疏忽,而是过去几年几乎所有扩散 Transformer 默认遵守的一条规则。

这套规则最经典的写法来自 DiT。它把输入图像切成固定大小 p×p 的方格,每一格线性嵌入成一个 token,token 数因此等于图像边长除以 patch 边长再平方,也就是 $(I/p)^2$。分辨率一涨,token 数按平方涨,注意力那一层的开销跟着一起涨。从 512 提到 1024,成本不是多花一点点,而是多花四倍。DiT 这正是 BudgetPix 反复引用的那条被绑定关系。这篇论文问的就是,这条绑定关系能不能松开。它来自 UIUC 和 Google 的联合团队,一共七位作者,2026 年 10 月挂上 arXiv,项目页给出了完整的方法概览,暂时还没有公开代码和权重。BudgetPix

DiT 架构

图注:左半是条件 latent DiT 的流程,输入 latent 被分解成 patch,逐层经过若干 DiT block,最后由线性解码器输出噪声与协方差的预测;右半并排画了四种条件注入方式的 block 变体,分别是 in-context、cross-attention、adaLN 与 adaLN-Zero。图中能直接看到 patchify 把一张图变成固定数量的 token 这一操作。DiT

这条规则为什么在今天格外难绕开?答案藏在扩散模型绕了一大圈又回到像素空间这件事里。早期为了把算力压下来,主流做法是先把图像送进一个更小的空间,在低维 latent 上跑去噪,LDM 和后来的 Stable Diffusion 走的都是这条路。LDM 2025 年之后,一批工作开始把扩散搬回像素空间直接做,JiT 是其中最有代表性的一个,它让网络直接输出干净的图 x 而不是噪声,才压住了高维像素训练的不稳定。JiT 这段来回的意义,不在于哪种空间更好,而在于它把去噪从低分辨率推回了原始分辨率。

这一步换回了更清晰的纹理和端到端可训的梯度,但也把固定网格原样带了回来。LDM 省算力靠的是把分辨率压下来,如今这条退路没了;DiT 写下的固定 patch 化规则,在像素空间执行得更彻底。于是去噪直接跑在 1024×1024 的像素上,token 数完全由分辨率决定,内容复杂度插不上话,算力也就跟着被锁死。从潜空间退回像素空间,换来的是质量,付出的是可调性。这是 BudgetPix 要撬动的那颗钉子。

二、一块天空和一片树叶,凭什么要用同样多的 token?

BudgetPix 的答案很朴素,让图像自己决定 token 该放在哪。

具体做法是给每个格子算一次像素强度直方图,再用直方图估一个 Shannon 熵。熵高意味着这块区域像素值杂乱、细节多;熵低意味着这块区域平坦、几乎没内容。规则很直接。某个格子的熵不超过阈值,就把它保留成一个 token;一旦超过,就把这个格子四等分,对每个子格重复同样的判断,直到切到最小的 p×p 为止。这样递归下来,整张图被不同尺度的方块完美铺满,粗的地方一个 token 代表一大片,细的地方一路切到最小格。BudgetPix

这棵树展开的方式,很像一张地图分配细节的方式。城市中心画到街道和门牌,远郊只画一条主干道,没有哪个制图师会给每平方公里分配同样的笔墨。这里的“复杂度”是局部熵,“笔墨”就是 token。天空那种熵低到几乎为零的区域,一个粗 token 就够了;树叶那种每一格都在跳动的区域,会被一路切碎到最小尺度。这个对应关系是逐项对上的,因为四叉树和地图分层用的是同一个结构,都是在同一张画布上按局部信息量决定网格的疏密。

阈值里其实藏着一根旋钮。每个尺度 s 有自己的阈值 τ_s,再叠加一个全局偏移 δ。两者一起决定递归在哪一层停下,也就决定了一张图最终需要多少个 token。想让模型省着用、token 更少,就把全局偏移 δ 调大——阈值整体上移,更多格子保持粗颗粒;想多花点算力换质量,就把 δ 调小。这就是算力可调的物理来源。

熵引导四叉树切分

图注:从左到右,一张以松树和远景天空为主的自然图被递归四叉切分成多尺度网格,最右边那张与原图同尺寸,色块越细越深,表示切到越小的 p×p、token 越密。树冠到处是细节所以被切得很碎,大片天空只留下少数粗块。BudgetPix

把 token 的分配权交给图像自身的局部复杂度,得到的是一根可以事后调整的旋钮。但紧接着就冒出一个接口问题。这些长短不一的格子,怎么送进一台只认固定维度 token 的 Transformer?

三、切碎之后,长短不一的 patch 怎么挤进同一个 Transformer?

一台标准的扩散 Transformer 要求输入是一串维度统一的 token。四叉树切出来的却是粗细混杂的方块,最小的是 p×p,最大的是 np×np。BudgetPix 的办法是给细块和粗块各修一条路,最后汇到同一个出口。

最细的 p×p 走“细路径”,直接过一遍标准的 ViT 嵌入,和普通 DiT 没有区别。粗块走“粗路径”,同时做两件事。一路把它缩放成 p×p 再嵌入;另一路把它在内部拆成 n² 个子 patch,交给一个叫 Patch Aggregator 的模块汇总,让这一个粗 token 仍然保留它内部有哪些高频纹理。两路结果经过 MLP 和一个尺度混合器融合,输出跟细路径同维度的 token。BudgetPix

解码端对称。细 token 直接解码回像素;粗 token 先放大回它原本的 np×np 分辨率,同时由 Patch Refiner 在这一个 token 内部把它拆成 4×4 的子块,过一层 MLP 和两层轻量 self-attention 加 AdaLN,把丢掉的高频纹理补回去,再和放大后的结果融合。这个 refiner 只在粗 token 的内部工作,不是一个铺满整图的独立阶段,新增参数大约只有 1%,而且它的代价与图像分辨率无关。

值得强调的是这层外壳的身份。图里紫色的编码器和解码器是从零训练的,蓝色那台 Transformer 是真正的去噪主干,它从已有模型初始化,而不是从头训起。这里要分清的是,主干从已有模型初始化、外壳从零训练;是否及如何微调主干,需按论文的训练设置另行说明。论文并没有把这一步简化成一句“免重训”的结论。所以能确定的是,变长布局这套改造对主干足够透明,可以在一份已有权重上接着搭起外壳;主干在训练中究竟以什么方式参与,得照论文的训练设置看。

多尺度 Patch 编码与解码

图注:三栏流程。左侧紫色编码器同时处理细路径与粗路径,粗路径把 resize、Patch Aggregator 两条支流经 MLP 与尺度混合器融合成一个粗 token;中间蓝色 Transformer 处理变长 token 序列,标注为从已有模型初始化;右侧紫色解码器对称地把粗 token 放大,并让 Patch Refiner 在 token 内部用 4×4 子块补回纹理。BudgetPix

到这一步,机制的前半段已经闭合。可是还有一个更麻烦的问题没有回答。这些 token 的位置,到底是谁决定的?

四、画还没生成,模型怎么知道该把 token 放在哪里?

训练的时候,布局其实好办,因为你有真图。BudgetPix 直接对训练图算真实的熵图,按熵切出内容自适应布局。但问题在于,如果模型只见过这一种布局,推理时你一旦换预算、换切法,它就很可能没见过。所以作者在训练里混进了另外两种布局。

布局采样概率用什么熵图训练时扮演的角色
Uniform0.15不采样,直接用稠密均匀网格锚住权重,防止模型在反复切换布局时漂移
Random0.10单元值在 $[0, \log_2 K]$ 上均匀随机逼粗 token 也去覆盖真正的细节区,模拟低预算下的边界情况
Content-adaptive0.75训练图的真实熵图标准的熵引导四叉树,也是推理时最接近的那一种

后两种布局下 δ 会逐图重新采样,让训练覆盖大约从 25% 到 100% 的连续 token 区间。共享的 Transformer 必须见过各种长度组合,才敢在推理时被临时改预算。BudgetPix

这三套布局不是为了好看。如果只喂内容自适应布局,模型在推理时被临时换到别的预算,误差会沿着采样步数累积;Uniform 提供一个稳定的锚点,Random 则专门把粗 token 硬塞进细节区,逼它学会在预算极低时也尽量覆盖信息。三者按固定概率混着来,等于在训练阶段就把推理时可能出现的每一种预算提前演练了一遍。这也是为什么同一个检查点能在 25% 和 100% 之间来回切换而不需要重训。

推理时的麻烦是一个典型的鸡生蛋。要按预算放 token,得先知道图哪里复杂;可图正是模型要生成的东西。BudgetPix 的处理分两步。先跑 n_w 步用 Uniform 网格,得到一个还很粗糙的中间预测;从这以后,每 m 步拿当前预测重新算一遍熵图,用二分搜索解出一个与目标预算对齐的偏移,得到新布局,再继续往下去噪。把布局更新放慢到每 m 步一次,是为了摊薄重算熵图的开销。

顺便说一句,“降低 token 数”并不是只有这一条路。ToMe 走的是另一条,它不动 patch 的几何布局,而是在 Transformer 内部按特征相似度把冗余的 token 合并掉,一只狗身上大片相似的毛发可以被并成一个 token。ToMe 它在 Stable Diffusion 上做 r=50% 的合并时,速度翻倍、显存大幅下降,FID 只升了 5.7 点。这条路线与 BudgetPix 的目标一致,但机制完全不同,一个是在既定布局里做减法,一个是把布局本身重写成可调的。

ToMe 的 token 合并

图注:三联图。(a) 一张狗的图像被标成彩色块,同色块表示被合并到同一个 token,狗的毛发被整体并成一个 token。(b) 标准 ViT block 的简化示意,ToMe 的合并步骤插在 attention 与 MLP 之间。(c) 二分图示意,token 被划成两半,每个 token 向另一半中最相似的那个连边,只保留最相似的若干条并合并。ToMe

布局从“给定”变成了“逐步估计”,这是整套方法能在推理时真正调预算的关键一步。接下来要问的是,它在不同的骨干上到底能省多少。

五、一个检查点,能同时扛住四个不同的骨干吗?

这个问题的答案,是一张四个骨干并列的算力质量表。它们覆盖了 256² 到 1024²、class-conditional 到 text-to-image、多步到 1-NFE 的不同设定。

骨干分辨率与任务压缩到的预算质量变化
MiniT2I-L/16512² 文生图25%GenEval 0.874,原模型 0.882
PixelDiT-T2I1024² 文生图25%GenEval 0.725(原模型同预算 0.323),DPG-Bench 83.7(原模型同预算 55.1)
pixel MeanFlow pMF-L/16256² class-conditional,1-NFE60%FID 3.46,原模型 2.65
JiT-L/32512² class-conditional50% 到 60%FID 显著低于 base 加 ToMe 加 FeatSim

先说最抢眼的一行。MiniT2I 在 512² 上只用四分之一的算力,GenEval 从 0.882 掉到 0.874。MiniT2I 这里要说清楚的是,这个差距是在 GenEval 这一个评测点上测到的一次小幅下降,它说明的是该点上的表现基本守住,还不能据此推断整体生成质量或其他指标同样没有变化。

pixel MeanFlow 那一行更极端。它本来就是一个 1-NFE 模型,1-NFE 的意思是整个生成过程只做一次网络前向。它学的是从起点到终点的平均速度场,而不是逐时刻的瞬时速度,所以能一步把噪声推到数据。MeanFlow 在只跑一次前向的设定下,token 预算的伸缩尤其有感,因为省下的算力没有第二次机会去摊平。就是在这样的设定里压到 60% 预算,FID 从 2.65 升到 3.46,论文自己称这是 0.8 点的 marginal 增长、接近零退化。

PixelDiT 那一行要单独看。它在 1024² 上压到 25% 算力时,GenEval 是 0.725、DPG-Bench 是 83.7;作为同一张表、同一预算下的对照,原模型只有 GenEval 0.323、DPG-Bench 55.1。这组差距是这张表的实测结果,至于其中细节的归因,表本身并没有给出解释,任何关于高频细节或微调的猜测都还待验证。可以确定的只有一件事,25% 是这张表为它报告的最低预算。为什么卡在 25%,下一章会讲。

JiT 那一行是跟 token 合并方法正面比。在 50% 到 60% 预算区间,BudgetPix 的 FID 明显低于 base 叠加 ToMe 与 FeatSim 的组合,说明在这个低预算段,重写布局比在布局内合并 token 更扛得住。消融也把两个组件的分工标了出来,50% 预算下 base 的 FID 是 60.61,加上 Patch Aggregator 降到 11.58,再加上 Patch Refiner 降到 8.30。BudgetPix

更值得记的是这个对比的设定。低预算下,按相似度合并 token 的方法会出现明显的区域塌陷,画面上本该有细节的位置被整片抹平,这正是重写布局这一派想绕开的那种失效模式。JiT 那一列的差距说明,当预算压到一半以下,光靠事后合并已经救不回画面,得从源头就决定 token 该落在哪。

MiniT2I 的采样结果

图注:一张 2 行 4 列的采样网格,八格都是 MiniT2I-L/16 针对同一个提示词独立生成的。每格是一只白色卡通兔子坐在草地上,背景是深蓝星空、远处的树丛剪影和散落的萤火亮点。八格在头部朝向、耳朵角度和表情上有细微差异,可以作为像素空间输出的一个品质锚点。MiniT2I

算力可调不是某个骨干的特例,它在四个风格迥异的骨干上都成立。但省下来的比例不是一个定值,从 25% 到 60% 都有。这个差异由谁决定,就是最后一块拼图。

六、这条路线卡在哪,又凭什么说自己往前走了一步?

先说 25% 这个上限。PixelDiT 的结构是双层的。上面一层是 patch 级路径,把图切成 patch token 做全局语义;下面一层是像素级路径,每个像素一个 token,逐像素地恢复高频细节。PixelDiT 关键就在下面这一层,它必须跑在全分辨率上,开销与 token 缩减无关。你在 patch 级砍掉再多 token,这一层该花多少还是多少。所以 PixelDiT 在 1024² 上只能压到 25%,再往下压,全分辨率那一段就成了无法忽视的固定成本。

PixelDiT 的双层结构

图注:左半是 PixelDiT 的整体框架,底部是 pixel-level pathway,每个像素一个 token,经过若干 PiT block;顶部是 patch-level pathway,把图切成 patch token 经过若干 augmented DiT block;两层通过 semantic token 耦合。右半是 PiT block 内部,展示 pixel-wise AdaLN 与 pixel token compaction 的流程。PixelDiT

这就是标题那句话的由来。你能省多少算力,不由 BudgetPix 这套方法自己说了算,而由你所选骨干里最贵的那一段说了算。换成一个单层的、token 数全部可调的主干,固定开销更少会留下更大的潜在节省空间,实际可压到何处仍需实测,不能把这张表里的百分比直接挪到别的骨干上。

其余两处边界也要公平摆出来。布局是从模型对中间预测的熵里算出来的,那些模型此刻还看不见的区域,也就拿不到 token,鸡生蛋问题只是被缓解,没有彻底消除。另外论文公开了方法和项目页,但没有放出代码和权重,复现的门槛还在那里。

路线在哪一层动手怎么省代表
合并 tokenTransformer 内部按特征相似度合并冗余 token,布局不变ToMe
弹性隐接口latent 域用一组可学习 latent 当信息汇聚面,按重要性截前缀ELIT
改写布局像素域按局部熵重切 patch 网格,布局随预算变BudgetPix

第三行之外还要提一句,算力自适应这件事不是 BudgetPix 首创。早它七个月,ELIT 就在 latent 空间做过类似的事,用一组可学习的 latent token 当接口,训练时随机丢掉每组尾部的一部分,逼模型把重要信息压到前面,推理时按预算截前缀就得到不同算力的同一个模型。ELIT 两者的差别在域和机制,一个在像素空间重写网格,一个在 latent 空间调度接口。

把这个结论放回 2026 年的语境里,它的意义会更清楚。像素空间扩散这几年一直在解决“能不能做”的问题,从 JiT 的 x-prediction 到 PixelDiT 的双层结构,再到 MiniT2I 把参数压到十亿以内,路线本身已经站住了。下一个问题自然是“贵不贵、能不能调”,BudgetPix 补上的正是可调性这一块。它没有声称像素空间会取代潜空间,只是证明了同一份权重可以在不同算力档位之间平滑切换。

把这几条放在一起看,BudgetPix 的位置就清楚了。它把推理算力可调在像素空间做成了现实选项,代价是一副从零训练的轻量外壳,收益是同一份权重能在这些档位之间切换,而不必为每一个算力档位各训一份。可调的范围以论文的训练与实验为界:训练时的布局采样覆盖大约 25% 到 100% 的 token 区间,实验里实际报告的档位从 100% 一路降到 25%。超出这一段范围,它给出的是一条可调的路线,而不是任意预算都能工作的承诺。而它的上限写在骨干里,选型的时候,先看那一段全分辨率开销有多重。作者给出的自然下一步也很直白,与其从熵反推 token 该放哪,不如让模型自己学。

想深入可以读原文:BudgetPix: Compute-Adaptive Tokenization for Pixel-Space Image Diffusion — arXiv:2610.12307

参考文献

BudgetPix:像素空间扩散的算力能下调,下限却卡在主干结构上