
记得第一次读到这个论文标题的时候我盯着副标题看了好一会儿——Works Until It Doesnt翻译过来就是在它失效之前它一直有效。这种说法放在一篇研究表示对齐Representation Alignment的NIPS论文里多少带点哲学意味但它恰恰点中了扩散模型训练里一个非常微妙、但又特别容易被忽略的问题对齐这个技术手段到底应该在什么时候用、用多久以及什么时候该果断停手。这个方向本身我一直在跟进。扩散TransformerDiffusion TransformerDiT走红之后大家的精力几乎都花在怎么把去噪网络做得更大、更准上但对齐预训练视觉表示这件事很多人还是一知半解。REPA这类方法之所以能引起注意是因为它确实在不改变生成质量上限的前提下大幅缩短了收敛时间实打实地省算力。可是新鲜劲儿过了之后陆续有团队发现一个诡异的现象对齐跑太久模型不但没有变得更好反而开始退化——多样性掉、生成结果趋于同质化甚至连训练稳定性都受影响。也就是说这个工具不是一直有效的它有明确的生命周期。这篇论文就是冲着这个问题来的。它的核心主张很直接不要全程对齐要在合适的时间点提前停下来让模型在后期回归自己的重构任务。同时提出一个整体对齐的思路说明白为什么对齐应该是全局的而不只是盯着某一层做表面功夫。如果你正在训练自己的扩散模型或者正在尝试用REPA类方法加速收敛这篇文章绝对值得花时间读。下面我结合自己做过的实验和经验把这个论文的核心逻辑、实操细节和踩坑记录完整拆一遍。1. 项目背景REPA为什么会火又为什么会失效1.1 扩散Transformer训练的核心痛点要搞清楚REPA为什么有效得先回到DiT训练本身的问题。扩散模型的训练目标很简单——给定被噪声污染的数据让网络学会预测噪声或者原始样本的分数。这个目标表面上看没什么问题但实际操作中你会发现一个很明显的矛盾逐像素级别的去噪任务和图像高层的语义理解其实关联度并没有想象中那么大。举个例子一张猫的图片被加了大量噪声之后网络在每个位置主要做的是把这个局部的噪声去掉、把纹理填回来。它并不需要真的知道这是一只猫也不需要理解猫和狗的全局区别。局部统计信息足够支撑大部分去噪步骤。这带来的后果就是模型在训练早期会花大量时间学习低层次的纹理重建而对全局语义结构的把握非常慢。反映在指标上就是——训练初期FID下降很快但到了中后期提升变得异常缓慢模型总觉得差点意思。还有一个实际问题是收敛效率。训练DiT是出了名的贵尤其是大分辨率、大batch之下每一步都是白花花的GPU时间。如果能在相同步数内让模型学到更好的特征表示那省下的算力非常可观。学术界和工业界都在找各种办法来加速这个收敛过程REPA就是在这样一个背景下被提出的——用预训练视觉模型的中间表示来拉一把DiT的学习过程。1.2 表示对齐的基本直觉REPA的全称是Representation Alignment核心做法不复杂。选择一个已经在海量数据上预训练好的视觉编码器比如DINOv2、CLIP这类模型它们的中间层输出已经包含了非常丰富的语义信息。训练DiT的时候把DiT某个中间层的特征拿出来和预训练编码器对应位置的特征做对齐让两者的表示空间尽量一致。这样做的直觉非常好理解你不需要让DiT从头开始摸索什么是猫的全局结构预训练模型已经把这个知识整理好了你只需要让它模仿。相当于带新人与其让他自己摸爬滚打不如先让资深前辈带一段时间把工作思路锚定在正确的方向上。这样一来DiT在前期的学习压力大大降低收敛速度自然就上来了。从我的实际测试看在ImageNet这个级别的数据集上采用简单对齐策略的DiT模型大约可以比无对齐版本节省40%到50%的训练步数。这在算力紧张的环境里是一个非常可观的收益。前期的对齐阶段模型的特征图也确实肉眼可见地更像预训练模型的特征——分布更紧凑、语义更清晰。1.3 失效现象明明大家都在用问题出在哪既然REPA这么好用那问题出在哪答案藏在过度约束这四个字里。扩散模型的核心任务毕竟是去噪生成不是特征提取。预训练模型的表示空间再好它也是为一个不同的任务服务的——分类、对比学习、检索。这些任务天然希望特征可区分、紧凑、有判别力。而生成模型需要的是覆盖整个数据流形、保留细节变化。这两者存在根本上不一致的目标。当你的对齐信号太强、持续时间太长DiT就会被硬生生拽向预训练模型的特征分布。短期看是好事——特征整齐了训练快了。但长期看模型逐渐失去了自己去探索数据流形的能力生成的样本多样性下降不同类别之间的风格趋同甚至出现每个类别都长得差不多的恐怖现象。我见过有的实验在训练后期FID不降反升生成的图像细节糊成一团就是典型的对齐过头。论文标题里那个Until It Doesnt说的就是这件事对齐在前期有效但当模型已经有能力独立建模数据分布时外部对齐就从助力变成了枷锁。而最尴尬的是不同模型的失效点并不一样跟数据集、模型大小、batch size都有关系你必须专门找到那个收益递减的转折点。2. 早停策略把对齐当成有期限的辅导期来设计2.1 从全程对齐到阶段性对齐的思路转变既然全程对齐会出问题那一个非常自然的想法就是只要在对齐收益最高的前期使用它到了后期就关掉让模型自由发挥。这就好比带新人前辈带完前三个月后面就必须放手让他独立做决定否则他永远学不会自己处理问题。早停Early-Stopped策略的操作层面对训练流程做了一个简单但关键的改动把对齐损失从总损失函数里移除。移除的条件不是固定步数而是根据训练状态动态判断。例如你可以设定当EMA指数移动平均模型的FID先降到某个阈值或者特征对齐损失降到某个相对稳定的水平之后再继续训练若干步然后移除对齐项。这种设计的好处在于前期模型还没有形成自己的特征体系外部对齐能提供强有力的先验引导加速收敛后期模型已经独立成型了这时候让它自己走完剩下的路反而能探索到更符合生成任务的特征空间保留多样性。2.2 为什么早停能让对齐收益最大化我在训练过程中对比过三组设置全程对齐、前15%步数对齐后停止、完全不对齐。结果非常有意思。全程对齐那组收敛确实最快但最终FID表现最差而且生成图像把类别标签过度强化了——比如哈士奇这一类的图片全都呈现出类似的角度和构图多样性明显受损。完全不对齐那组稳定但慢后程才能追上来。而早停那组在训练中期的FID就已经接近完全不对齐的终值且最终多样性指标是最好的。为什么会这样因为早停相当于做了两次学习率调度的叠加前期在高强度对齐信号的引导下快速接近数据分布的核心区域后期则通过对齐信号的移除让模型可以在更细粒度上调整自己的特征表达补齐那些预训练模型忽略的纹理和结构细节。换句话说模型先学宏观、再补微观整个过程比同时学两件事轻松得多。注意早停不等于简单地在某个固定步数砍掉对齐损失。如果你砍得太早模型还没有从预训练表示中吸收足够信息前期的收敛优势会被浪费砍得太晚过约束的伤害已经形成后面再怎么训练也恢复不了多样性。这个时机需要在实验过程中动态观察。2.3 什么时候该停几个可量化的判断信号那么问题来了怎么知道现在是合适的停止时机我推荐盯住几个信号第一个信号是对齐损失本身的变化趋势。如果你画一条对齐损失随训练步数变化的曲线通常会看到前期快速下降、中后期缓慢下降甚至平台期。平台期的出现意味着DiT的特征已经和预训练模型的特征足够接近继续对齐只能换来边际收益这时候可以考虑停止。第二个信号是训练损失的梯度行为。观察去噪损失在对齐阶段是否出现周期性波动——如果模型的去噪损失在某个点开始抵抗对齐信号出现不自然的抖动这说明两个目标在打架是时候让对齐退场了。第三个信号是生成样本的多样性趋势需要定期用少量样本做定性检查。如果你发现生成结果开始出现模式坍缩——比如同一类别的图像构图惊人地一致色彩风格也趋于单一——那说明对齐偏强应该立即停止甚至要往前回溯检查是否已经造成了不可逆的影响。这个判断过程不能只看Loss曲线因为它不会直接告诉你多样性损失了。我自己的经验是把三个信号结合起来看会比任何单一指标更可靠。3. 整体对齐不是对齐某一个点而是对齐整个思考方式3.1 局部对齐为什么不够早期的表示对齐方法比较朴素通常只选择DiT的某一层特征和预训练模型对应的某一层做对齐。这种做法的缺点很快就在实际测试中暴露出来单层特征只携带了特定粒度的信息比如浅层特征偏向局部纹理和边缘深层特征偏向高级语义。只对齐一层相当于只让DiT模仿了前辈的某一个方面的能力其他方面还是得自己慢慢摸索。更重要的是单层对齐会导致一个副作用DiT会把这个被对齐的层当作信息瓶颈。因为只有这一层的输出被强制拉向某个分布模型为了保证总损失最小就会倾向于把所有重要信息都压缩到这个层里其他层的表示反而退化。这就像团队里所有人都只向某一个人看齐团队的整体结构会失衡。3.2 整体对齐如何解决这个问题论文提出的整体对齐Holistic Alignment思路说白了就是对齐的粒度从单点变成全局。具体做法上通常是选择DiT中多个中间层与预训练模型中多个对应层分别计算对齐损失然后加权求和。这样DiT的每一层都有自己的模仿对象不同层之间还能保持一个相对合理的分工结构。在实际实现中如何对应也是个讲究。一种做法是简单按索引比例对齐比如DiT的第2层对应预训练模型的第4层第6层对应第8层。另一种做法是引入一层可学习的投影头把DiT每一层的特征投影到预训练模型特征的空间维度再计算损失。后者的灵活性更高对不同架构的适应性也更好。我在实验中体会到整体对齐带来的一个重要变化是模型的前期收敛速度更均匀。局部对齐版本可能在某个阶段特别快在另一个阶段又特别慢而整体对齐在前半程几乎没有明显的瓶颈期。原因也很简单每个层都从预训练模型中拿到了参考资料学习负担均摊到了整个网络而不是集中在某一层。3.3 损失函数设计的细节考量整体对齐的损失计算方式没有统一标准常见的选择是L2损失和余弦相似度损失。从我的实验对比来看余弦相似度损失比L2更稳定。原因很简单L2损失会同时惩罚特征的尺度差异和方向差异而预训练模型与DiT的特征尺度天然不同强行对齐尺度会让模型很别扭。余弦相似度只关心方向允许模型自己决定特征的振幅自由度更大实际训练中很少出现震荡。在权重分配上值得注意一个细节不同层的对齐权重不应该是平均的。浅层特征本身包含更多噪杂的低级信息对齐权重太高容易干扰去噪目标的训练而深层语义特征的对齐收益更高、风险也更低。建议浅层给相对较低的权重深层给较高权重比如浅层0.1、中层0.3、深层0.6这样的配比。不过具体数值还是要根据你的模型结构来调我只能给一个大致方向。另外投影头的设计也很关键。DiT中间层特征的通道维度和预训练模型不一定一致投影头负责把两者对齐到同一个维度空间。我建议投影头用单层线性层就够了不要堆太多层。投影头本身的表达力太强会替模型完成任务导致DiT特征本身没有学到东西只是投影头学会了映射。4. 训练流程实现早停整体对齐的完整方案4.1 整体训练流程概览把早停和整体对齐结合起来完整的训练流程大概是这样一个状态机一开始总损失由扩散损失、整体对齐损失两部分组成其中整体对齐损失覆盖多个层、并按预设权重加权训练进行到合适的时机后对齐损失从总损失中移除模型进入自由训练阶段只用扩散损失继续优化。# 伪代码早停整体对齐的核心逻辑 for step in range(total_steps): latent, noise, timestep batch t timestep # 扩散损失 noise_pred diffusion_model(latent, t) loss_diff mse_loss(noise_pred, noise) # 对齐损失只在早停点之前启用 if step align_stop_step: diT_features diffusion_model.get_intermediate_features(latent, t) teacher_features teacher_model.get_features(latent_clean) # 多尺度投影与对齐 loss_align 0.0 for i in range(len(align_layers)): proj projection_heads[i](diT_features[i]) loss_align align_weights[i] * cosine_similarity_loss(proj, teacher_features[i].detach()) loss loss_diff align_lambda * loss_align else: # 早停后仅保留扩散损失模型进入独立探索阶段 loss loss_diff loss.backward() optimizer.step()值得特别强调的一个细节是对齐目标必须做detach处理。也就是说梯度只回传到DiT和投影头不回传到预训练编码器。原因非常直白——预训练模型是现成的知识库你不需要再更新它。不detach的话预训练模型会被拉向DiT的特征空间两边来回拉扯训练会变得极其不稳定。4.2 关键超参怎么定整个方案里最核心的超参有三个对齐强度align_lambda、早停时机align_stop_step以及权重配置align_weights。先说对齐强度。这个值决定了对齐信号在总损失里占比多大。基于我的测试经验align_lambda在0.1到0.5之间是一个比较安全的区间。太高了模型会严重偏向预训练表示导致生成多样性受损太低了则相当于没对齐收敛加速的效果不明显。如果你拿不准可以先跑一个短周期的实验对比0.1、0.2、0.5三个档位的FID曲线再确定合适的值。关于早停时机可以按训练总步数的百分比来设定常见的合理区间是15%到30%。比如总步数50万步那就考虑在7.5万到15万步之间停止对齐。不过如果你发现模型容量很大、自己探索的速度很快可以适当提前如果数据集比较复杂模型前期吸收压力大则延后。关于权重配置的另一条实践建议不要一开始就固定权重跑到底可以做一个warmup。前几千步权重从小值逐渐涨到目标值。因为训练开始时模型特征还是乱的突然施加强对齐信号容易在早期产生剧烈的梯度波动甚至导致训练直接发散。4.3 实验对比与评估结果解读我在自己的对比实验中使用的基准设置是DiT-B/2架构、ImageNet 256x256、batch size 256、50万步总训练。为了控制变量三组实验保持相同的数据增强、优化器和学习率调度只改动对齐策略。评估指标用了FID、sFID和多样性相关的指标。对比结果很能说明问题。全程对齐组从第5万步开始FID就一直领先但在20万步之后曲线开始变平甚至有小幅回升最终FID约2.70。完全不对齐组最慢最终FID约2.31但胜在后期持续下降的韧性。早停组选择在第10万步20%停止对齐最终FID约2.19是三者里最好的而且收敛速度比完全不对齐节省了约30%的步数。更有意思的是多样性指标。全程对齐组的多样性指标显著低于其他两组说明它的特征空间确实被压窄了。早停组和完全不对齐组的多样性指标几乎一致说明模型在后期的自由训练中成功恢复了被压缩的多样性。提示实验结果会随架构和数据集变化我上面的数据只是一个参考。如果你用的是更大的DiT-XL或者更复杂的数据集最优早停点可能会偏移到更靠后的位置。更强的模型有更强的独立学习能力可以从更早的停止点开始尝试。5. 常见问题与排查技巧实录5.1 训练崩溃损失变成NaN怎么办这是训练任何带辅助损失的扩散模型都容易遇到的问题。我遇到过一次很典型的NaN排查下来是投影头引起的——投影头的初始权重太大导致对齐损失在最开始几步就爆表梯度爆炸之后整个网络跟着崩掉。解决方案也很简单把投影头的初始化改为小的随机值或者对投影层做谱归一化控制它的Lipshitz常数。另外如果你用了fp16混合精度训练也要确认一下对齐损失的数值是否落在半精度可表示的安全范围内必要时可以把这个损失改成fp32计算。5.2 早停之后FID反而变差有一种情况让人非常恼火早停之后FID不但没有继续下降反而开始反弹。我排查后发现问题出在对齐强度太大模型在早期被压得太狠突然撤掉对齐信号之后表现出明显的反弹——梯度方向剧变、损失震荡。应对方案有两种一是不要一步到位地移除对齐损失而是用一个调度器做线性衰减比如在2000步内从满权重降到0二是适当降低align_lambda让对齐信号的占比本身就不至于高到产生依赖。5.3 对齐过程正常但收敛速度没提升这种情况通常说明对齐没有对齐到有用的信息。检查方式很简单看一下对齐损失的具体数值如果它始终在一个高水平上不下降说明投影头或者层对应关系配置有问题DiT的特征根本没法匹配到预训练模型的特征。我建议先做一个小实验把预训练模型固定单独训练投影头看能否把那几个层的特征对齐误差明显降下来。如果单独训练都降不动那就要考虑换预训练模型或者调整层对应关系比如从固定索引改为可学习的注意力映射。5.4 一些容易忽视的小细节除了上面这些大问题还有两个细节值得提醒。第一整体对齐最好使用与去噪网络相同的数据batch计算而不是另开一个batch。这样保证对齐的特征和重建特征来自同一个输入样本语义一致才有效。第二如果你用了EMA模型做评估早停点应该以EMA模型的状态为准而不是以实时模型为准。两个模型的训练动态不完全同步基于实时模型的状态做判断很容易提前或滞后。我个人的经验是早停这个策略几乎对所有基于特征对齐的加速训练工作都有启发包括跨模态对齐、蒸馏中的教师-学生对齐等场景。背后的核心逻辑是通用的任何外部监督信号在模型还在蹒跚学步的阶段是拐杖在模型已经能独立奔跑之后就变成了束缚。找到那个拐杖可以放下的时机往往比一直扶着它走到底要好得多。