mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
4343 字
12 分钟
AdaGen: Learning Adaptive Policy for Image Synthesis

Accepted by TPAMI

ECCV 2024 论文 AdaNAT 的扩展版

边看边写的,待整理

引言#

AdaGen想解决的是“对于已经存在的多步生成器,怎样在每一步、针对每个样本,自动决定最合适的生成策略(policy)”

PixPin_2026-04-02_14-15-06

四类看起来很不一样的生成模型:MaskGIT、autoregressive、diffusion、rectified flow。表面上它们机制不同,但有一个共同点:都把复杂生成拆成很多小步来做。MaskGIT每次只补一部分 token,diffusion 每次只去掉一点噪声,autoregressive 每次只生成下一部分内容,flow 也是逐步推进。

真正麻烦的不只是“生成要分很多步”,而是每一步都要设很多控制参数。页2的 Table I 把不同范式里每一步要设的那些东西全部列出来。MaskGIT 要设 mask ratio、sampling temperature、masking temperature、guidance scale;autoregressive 要设 temperature、guidance、top-k、top-p;diffusion 和 rectified flow 则要设 timestep 和 guidance scale。作者把这些每一步如何推进生成的控制量统称为 generation policy。

PixPin_2026-04-02_14-36-11

  • 手工 schedule 太复杂。步数一多,每一步还要配多个参数,人工设计 schedule 很快就失控。
  • 静态 schedule 太死板。现有方法通常给所有样本共享同一套预定义曲线,但不同样本难度不同、结构不同、生成状态也不同,一刀切不合理。existing works 是“generator + 固定 schedule”,AdaGen 则是在 generator 外面加一个 learnable 的 PolicyNet,按样本自适应地产生 policy。

怎么把这个想法落地。把 policy design 变成一个强化学习问题。原因很简单如果你想直接对整个多步生成过程端到端反传,代价太高,而且很多过程本身就不容易直接反传。所以把它改写成一个 MDP。当前生成状态是 state,当前这一步该怎么设参数是 action,最后图像质量是 reward。这样 PolicyNet 就成了一个 agent,它看当前生成到哪一步、图像现在长什么样,再决定下一步怎么走。页3的 Table II 和 Fig. 2 都是在服务这个思路。

PixPin_2026-04-02_14-43-26

reward 不能随便设计。直觉上可能会想,既然是 RL,那就直接拿 FID 或者现成的 reward model 当奖励不就行了?但发现不行。页3的 Fig. 3 给了三个对比:如果直接拿 FID 这种静态指标当 reward,policy 会去钻指标空子,不一定得到高视觉质量;如果拿预训练 reward model,当奖励又容易把样本往某一种风格上收缩,导致 diversity 下降。policy network 会 overfit reward。所以他们提出 adversarial reward model 不是用一个固定奖励,而是边训练 policy,边更新一个 discriminator 式的 reward model,让奖励本身动态变化,避免被 policy 过拟合。

  • inference-time refinement:训练时用过的辅助网络,比如 adversarial reward model,测试时不丢掉,而是拿来当感知质量评估器,帮助选更好的采样结果。
  • fidelity-diversity trade-off:他们再训练一个偏 fidelity 的 policy,然后用一个标量 λ 去和原 policy 混合,从而显式控制“保真度”和“多样性”的平衡。AdaGen 不只是在学 schedule,还在把 schedule 变成一个可控接口。

他们把 AdaGen 套到了五个代表性生成模型上,覆盖四种范式:MaskGIT、DiT、SiT、VAR 和 Stable Diffusion;数据集覆盖 ImageNet、MS-COCO、CC3M、LAION-5B。引言宣称 AdaGen 能带来 17% 到 54% 的生成性能提升,或者在保持相近性能时把推理成本降到原来的约 1/1.6 到 1/3.6。

方法#

Existing Policy: η(t)\text{Existing Policy: } \eta(t)AdaGenPolicy: ηϕ(st)\text{AdaGenPolicy: } \eta_\phi(s_t)

前者 η(t)\eta(t)只依赖步数 tt 的预定义 schedule;后者 ηϕ(st)\eta_\phi(s_t)依赖当前状态 sts_t 的可学习 policy。

作者的第一个动机叫 Automatic Policy Acquisition。因为多步生成一旦步数多起来,要配的 policy 参数会迅速爆炸。论文直接举例:如果 MaskGIT 有 T=32T=32 个生成步骤,而每步要配 4 个参数,那么就有 128 个 policy 参数要设计。人工写 schedule 很快会变成试错工程。

第二个动机叫 Adaptive Policy Adjustment。静态 schedule 是全体样本共享的,但不同样本难度不同、当前生成状态不同,理应采取不同策略。这里你可以用控制理论的视角理解:传统 schedule 更像 open-loop control,AdaGen 更像 feedback control。前者不看系统当前输出,后者根据当前状态闭环调节。这个“从时间函数到状态条件策略”的转变,其实就是本文最本质的建模创新。

目标函数:

J(ϕ)=Expθ(xηϕ)[r(x)]J(\phi)=\mathbb{E}_{x\sim p_\theta(x\mid \eta_\phi)}[r(x)]

固定一个预训练生成器 pθp_\theta,只训练 policy network ηϕ\eta_\phi,希望最终生成图像的质量评分 r(x)r(x) 尽可能高。注意这里训练的不是生成器参数 θ\theta,而是 policy 参数 ϕ\phi

为什么不用普通梯度直接做。

  1. 第一,图像质量函数 r()r(\cdot) 可能根本不可导。
  2. 第二,MaskGIT 和 AR 这类模型有离散 token sampling,梯度会断。
  3. 第三,就算 reward 和生成过程都可导,现代生成模型也是长链式多步过程,把整条轨迹完整反传一遍,代价会非常高。

State sts_t:当前状态不是抽象概念,而是两部分组成。第一部分是当前生成步 tt,告诉你已经走到第几步了;第二部分是当前的中间生成结果。对 MaskGIT 来说是当前 partially masked token sequence xtx_t;对 AR 是当前已经生成的前缀 x1:tx_{1:t};对 diffusion / rectified flow 是当前 ODE 轨迹上的中间样本 xκtx_{\kappa_t}

Action ata_t:是“这一步的 generation policy 参数”。例如 MaskGIT 的 mt,τt,ζt,wtm_t,\tau_t,\zeta_t,w_t,或者 diffusion 的 κt+1,wt\kappa_{t+1},w_t

Transition P(st+1st,at)P(s_{t+1}\mid s_t,a_t):状态转移由冻结的生成器来完成。对 diffusion 和 rectified flow,因为一步是数值 ODE solver 推进,所以转移更接近确定性的;对 MaskGIT 和 AR,因为包含 token sampling,所以转移是随机的。也就是说,生成器本身在 RL 里扮演 environment dynamics。Policy 只负责下达“这一步怎么走”,真正把状态从 sts_t 变成 st+1s_{t+1} 的,是预训练好的 backbone generator。

Reward R(st,at)R(s_t,a_t):作者用的是 terminal-only reward。也就是只有最后 t=Tt=T 时 reward 非零,中间步骤都不给显式 reward:

R(st,at)I(t=T)r(x),R(\boldsymbol{s}_t, \boldsymbol{a}_t) \triangleq \mathbb{I}(t=T) \cdot r(\boldsymbol{x}),

这表示他们只关心最终生成图是否好,不直接给中间状态打分。这个设计很合理,但代价是 reward 很稀疏。后面 value function 就是在帮忙解决这个稀疏信用分配问题。

MDP 定义好以后作者把 policy 写成

at=ηϕ(st).a_t=\eta_\phi(s_t).

这说明 policy network 输入当前状态 sts_t,输出本步动作 ata_t,也就是本步 sampling policy。为了训练时有探索,作者没有直接拿这个确定性输出,而是把它当成高斯分布的均值,写成

πϕ(atst)N(ηϕ(st),σI).\pi_\phi(a_t\mid s_t) \triangleq \mathcal N(\eta_\phi(s_t),\sigma I).

训练时从这个高斯里采样动作,测试时直接取均值,所以推理阶段又退回成确定性 policy。因为这些动作本质上是连续的调度参数,高斯 policy 是一个自然选择。论文后面的消融也显示,高斯 exploration 比 Beta 和 GMM 更稳,FID 分别是 4.54、5.25、4.97。

PPO 在 AdaGen 里具体是怎么工作的。先用当前 policy network 去跑一条完整生成轨迹。比如 diffusion 从噪声开始,到了第 tt 步,先看当前状态 sts_t,policy 给出这一步的 κt+1\kappa_{t+1}wtw_t,生成器按这个设置推进一步,得到 st+1s_{t+1}。这样一直走到第 TT 步,拿到最终图像 xx,计算最终 reward r(x)r(x)。这就得到了一整条 trajectory。PPO 正是拿这种“当前 policy 自己采样出来的轨迹”做更新,所以它是 on-policy。

然后看 PPO 损失里几个符号。

ρt(ϕ)=πϕ(atst)πϕold(atst)\rho_t(\phi)=\frac{\pi_\phi(a_t\mid s_t)}{\pi_{\phi_{\text{old}}}(a_t\mid s_t)}

这个比值表示:同一个动作 ata_t 在同一个状态 sts_t 下,新 policy 比旧 policy 更偏爱它多少。如果 ρt>1\rho_t>1,说明新 policy 更倾向于重复这个动作;如果 <1<1,说明新 policy 在压低这个动作的概率。

Vϕ(st)V_\phi(s_t)

是 value function,表示“从当前中间状态 sts_t 往后走,最终大概能拿到多高 reward”。在 AdaGen 里,它和 policy network 共享参数。你可以把它当成一个“中途质量预估器”。这在 terminal-only reward 的设定下尤其重要,因为中间状态本身没有显式 reward,value net 负责告诉你“眼下这个中间生成状态到底前景如何”。

A^t=R(sT,aT)Vϕ(st)\hat A_t = R(s_T,a_T)-V_\phi(s_t)

这是 advantage。最终实际拿到的终局回报,减去当前状态原本被预期能拿到的回报。如果 A^t>0\hat A_t>0,说明这次从 sts_t 出发所采取的动作序列,结果比 value net 原先预期更好;如果 A^t<0\hat A_t<0,说明更差。advantage 本质上就是“这次表现是超预期还是低于预期”。

最后是 PPO 的 clip。PPO 会优化

min(ρtA^t,  clip(ρt,1ϵ,1+ϵ)A^t).\min\big(\rho_t\hat A_t,\; \text{clip}(\rho_t,1-\epsilon,1+\epsilon)\hat A_t\big).

reward 不能是静态的,必须是跟着 policy 一起动的。这就是他们提出 adversarial reward modeling 的原因。形式上,他们引入一个 reward model rψr_\psi,把它做成类似 GAN discriminator 的东西,并建立一个最小最大博弈:

maxϕminψJ(ϕ,ψ)=Exfakepθ(xπϕ)[logrψ(xfake)]+Exrealpdata[log(1rψ(xreal))].\max_\phi \min_\psi J(\phi,\psi) = \mathbb E_{x_{\text{fake}}\sim p_\theta(x|\pi_\phi)}[\log r_\psi(x_{\text{fake}})] + \mathbb E_{x_{\text{real}}\sim p_{\text{data}}}[\log(1-r_\psi(x_{\text{real}}))].

这里的 rψ(x)r_\psi(x) 可以理解成这张图被判成真图的概率。policy network 希望让 fake image 的这个分数尽可能高,也就是尽量骗过 reward model;reward model 则希望把真实图和生成图重新分开,也就是把 real 往 1 推、fake 往 0 压。这样一来,policy 面对的就不再是一个固定评分器,而是会随着它变强而同步升级的。

这一步你一定要理解它的本质:AdaGen 不是在直接做 GAN 生成,而是在做“对抗式 reward 学习”。真正生成图像的 backbone generator 是冻结的,不更新;参与博弈的,只是一个轻量的 policy network 和一个 reward discriminator。也正因为生成器冻结了,作者才强调它不会像普通 GAN 那样容易 mode collapse:没有对生成器权重的直接对抗压力,policy 也只是在调一小撮 sampling hyperparameters,而不是重写整个 image distribution。页3的 Fig. 2 和 III-D 后半段都在强调这个稳定性来源。

训练流程其实很简单。Algorithm 1 的训练流程可以压成两步循环。先用当前 policy 通过冻结生成器采样出 fake images,然后按 PPO 损失更新 ϕ\phi;再采一批 real images 和当前 policy 生成的 fake images,更新 reward model ψ\psi。也就是说,policy 更新和 reward model 更新是交替进行的:policy 在追逐 reward,reward model 在不断提高区分 real/fake 的能力。这样 reward 始终是一个“移动靶”,不容易被静态过拟合。

PixPin_2026-04-02_16-03-56

Action Smoothing,前面虽然有了 PPO 和 adversarial reward,但作者发现一个新问题:当 generation steps 变大时,训练会越来越不稳定。MaskGIT 从 T=8T=8 增加到 T=32T=32 后,优化曲线明显更抖,性能反而变差。作者把原因归结为动作空间维度随步数上升而急剧增大,policy 每一步都独立输出多个控制量,探索噪声一叠加,整条动作序列就会非常乱。

PixPin_2026-04-02_16-16-00

他们进一步做了一个很有意思的分析。当 T=32T=32 时,学出来的 action sequence 会出现大量锯齿状震荡;右边则把原始动作序列和一个非常简单的“首尾线性插值”策略做比较。结果是:在短 horizon 下,灵活的原始 policy 还能占点优势;但 horizon 一长,这种高自由度反而变成脆弱性,性能开始掉,而简单平滑的 linear policy 反而更稳,最后超过原始 policy。

作者给出的解释很合理。像 diffusion、flow、MaskGIT 这类 progressive generation,本来就是一个“从高不确定性逐步收敛到低不确定性”的过程。这样的过程天然更像低频、平滑的控制,而不像一串剧烈来回摆动的控制信号。可 PPO 里的式是逐步独立地往每个 action 上加 Gaussian noise,这种 temporally independent exploration 很容易产生高频抖动的动作轨迹。这也是为什么换 Beta 或 GMM 探索分布并没有本质解决问题——核心矛盾不是单步分布形式,而是时间上不连贯

作者想要的 smoothing 不是随便平滑,而是满足两个条件。他们把平滑写成一个变换:

a1:T=f(a~1:T),a_{1:T} = f(\tilde a_{1:T}),

其中 a~t\tilde a_t 是 policy 原始输出,ata_t 是真正执行的动作。这个 ff 必须满足两个条件。第一是 low-pass filtering,也就是要压制高频震荡;第二是 causality,即 ata_t 不能依赖未来的 a~t+1,a~t+2\tilde a_{t+1},\tilde a_{t+2}。这个要求很重要,因为如果当前动作依赖未来输入,你就破坏了前面 MDP 的时序因果结构。

在所有可能的 causal low-pass filter 里,作者选了最简单的单极点 IIR,也就是 EMA:

at=βat1+(1β)a~t.a_t=\beta a_{t-1} + (1-\beta)\tilde a_t.

这里的 β[0,1]\beta\in[0,1] 控制平滑强度。要特别注意,这个 EMA 不是参数 EMA,也不是模型权重的 teacher EMA;它是对 一条动作序列本身 做的平滑。也就是:第 tt 步真正执行的动作,不完全等于 policy 当前吐出来的 a~t\tilde a_t,而是和上一步执行过的动作做一个指数滑动平均。这样一来,动作序列就从“步步乱跳”变成“时间上连贯变化”。

大多数 RL 框架训练完以后,只保留 policy,critic 和 reward model 都扔掉。但 AdaGen 说既然 rψr_\psiVϕV_\phi 在训练里已经学会了“评估图像质量”和“评估中间状态前景”,那测试时为什么不用它们继续帮忙?

PixPin_2026-04-02_16-20-12

1)Repeated Sampling:拿 reward model 当最终裁判。最直接的做法是 repeated sampling。具体说,就是同一个条件下跑 MM 次完整生成,得到 MM 张候选图,然后用 adversarial reward model rψ(x)r_\psi(x) 给每张图打分,选分最高的那张输出。作者在页11的 Fig. 7 里专门展示了 reward model 的打分和视觉质量的对应关系:低质量样本分数低,高质量样本分数高,所以它确实可以当一个还不错的 perceptual evaluator。

2)Lookahead Sampling:拿 value network 当中途分支裁判。更有意思的是 lookahead。这个只在 转移是随机的模型 上有意义,比如 MaskGIT。因为当 P(st+1st,at)P(s_{t+1}\mid s_t,a_t) 本身有随机性时,你在当前动作 ata_t 下可以采出多个候选 next states:

st+1(1),,st+1(K).s_{t+1}^{(1)},\dots,s_{t+1}^{(K)}.

这时 value network Vϕ(s)V_\phi(s) 就能派上用场了。因为它本来就是 PPO 里的 critic,训练目标就是预测“从当前中间状态出发,最终大概能拿到多高回报”。所以测试时,作者让它来给这些候选 next states 打分,选

k=argmaxkVϕ(st+1(k)),k^*=\arg\max_k V_\phi(s_{t+1}^{(k)}),

然后只沿着最有前景的那条分支继续生成。这个过程本质上是在 sampling 过程中做一个轻量的 one-step lookahead tree search。

AdaGen 默认的 adversarial reward 是在追求一个较平衡的 fidelity/diversity。可实际使用时,用户有时更想要“极致保真”,哪怕牺牲一些多样性。所以作者又做了一层设计:再训练一个 fidelity-oriented 的 policy,然后和原 policy 做插值。

形式上很简单。原 policy 输出 ata_t,新的 fidelity-oriented policy 输出 ata_t',最终执行的是

atblend=(1λ)at+λat.a_t^{\text{blend}} = (1-\lambda)a_t + \lambda a_t'.

其中 λ[0,1]\lambda\in[0,1]λ=0\lambda=0 时完全用原 policy,偏 balanced;λ1\lambda\to1 时越来越偏向 fidelity。页12的 Fig. 8 把这个 blended policy 画得很清楚。但这一步真正聪明的地方不在推理公式,而在训练方式。作者不是单独训练 ata_t' 去追求 fidelity,而是每次训练时随机采一个 λU[0,1]\lambda\sim U[0,1],先用这个 λ\lambda 生成 blended action,再构造 blended reward:

rblend=(1λ)r+λr,r_{\text{blend}}=(1-\lambda)r+\lambda r',

其中 rr 是原来的 adversarial reward,rr' 是 fidelity-oriented reward,具体用的是 ImageReward。更关键的是:这个 blended reward 的梯度只更新 fidelity-oriented 的新 policy,原 policy 保持冻结。 这样一来,新 policy 实际上学到的是“在不同 λ\lambda 下,怎样和原 policy 组合,形成一条连续的 fidelity-diversity 光谱”。这就是为什么作者说,这个设计显式建立了控制参数 λ\lambda 和最终生成风格之间的映射。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

AdaGen: Learning Adaptive Policy for Image Synthesis
https://xuanyu.space/posts/2026-04-2-adagen/
作者
猫咪老师
发布于
2026-04-02
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时