扩散模型对抗样本baseline实战:从PGD到DiffPure攻防全解析

发布时间:2026/9/8 2:24:19
扩散模型对抗样本baseline实战:从PGD到DiffPure攻防全解析 我第一次试着把分类器上那套成熟的PGD攻击直接搬到Stable Diffusion上时生成结果直接糊成了一团五颜六色的噪点。不是攻击失败是成功过了头——扰动确实让图像偏离了但那种偏离完全不可控也没有语义。后来我才意识到扩散模型对抗样本这潭水和传统对抗样本完全不是一回事而所谓baselines也不是能随便平移过来的。这篇文章我想整理一下这几年做生成模型安全评估时反复用到的几组经典baselines。我会按攻击对象而不是按年份来讲因为同样是扩散模型对抗样本这个关键词背后可能完全不是同一个任务有人想让扩散模型生成错误内容有人想用扩散模型造扰动去打分类器还有人想穿透DiffPure这类净化防御。三者想要的东西不同能直接对比的baseline也就不同。1. 先把赛道盘清楚三种问题设定决定了baseline怎么选1.1 第一种设定扩散模型本身是攻击目标这一类最直观攻击者给真实照片、prompt文本或条件向量添加微小扰动让生成器G的输出失控。失控怎么定义大致有三类让img2img生成结果在语义上断裂。比如给一张戴帽子的猫加扰动后生成结果里帽子消失或者猫变成了另一类物体。让text2img在特定prompt下无法生成某个概念。比如扰动一张图让模型在训练/编辑过程中学不到这张图的内容也就是所谓概念删除或不可模仿。给输入图像加一层不可感知的对抗扰动让扩散模型拒绝完成指定的编辑操作。这类工作在图像版权保护场景里非常活跃典型代表是AdvDM、Photoguard那一系。注意这类设定有个特点对抗样本的错误不是分类器输出一个错误标签而是生成图像的分布发生语义偏移。所以评估指标不再是accuracy drop而是目标达成率、CLIP Score偏移、扰动感知度LPIPS、生成质量FID等。很多做分类对抗样本的人第一次切过来会很不适应因为没有唯一正确标签这个概念攻击目标只能自己用某种损失函数去定义。1.2 第二种设定扩散模型是攻击武器分类器是目标这一类把扩散模型当成攻击工具。传统PGD生成的扰动经常是高频噪声视觉上明显跨模型迁移性也差。扩散模型的一大优势是它学习过真实图像流形知道什么样的图像看起来自然。利用这个先验我们可以让扩散模型在采样过程中生成对抗扰动而不是在像素空间硬编码噪声。这类方法在论文里经常叫attack via generation或者diffusion-based adversarial perturbation。评估指标主要是黑盒迁移率、扰动LPIPS、查询次数。作为参照经典baseline往往是MI-FGSM、PGD这些不带生成先验的方法。1.3 第三种设定扩散模型成了防御工具攻击要穿透净化扩散模型也可以反过来用于防御。DiffPure是这条线最经典的baseline先用前向加噪把输入图像中的对抗扰动冲淡成噪声再用反向去噪恢复干净样本。因为扰动幅度通常远小于图像主成分加噪-去噪之后扰动会被破坏掉分类器看到的就是一张接近干净的图。在这个设定下扩散模型对抗样本baseline指的是专门用来攻击净化器的一类方法。朴素PGD在DiffPure上效果很差原因后面会细说。所以这个细分赛道里被反复拿来做对比的是DiffAttack、Backward AD这些方法。如果你在论文里提出一个新的防御方案但没有在这几个攻击baseline下报告结果审稿人基本不会认为你的防御是真鲁棒。以上三种设定之下baseline的选择逻辑完全不同。下面按从朴素到复杂、从传统到扩散原生的顺序把几组经典方法逐个拆开讲。2. 从分类器时代继承的经典FGSM/PGD/CW在生成场景下的变形2.1 像素空间迭代攻击的朴素移植最直接的baseline就是把分类任务里的迭代攻击损失函数换掉其余照搬。以PGD为例攻击生成模型G的通用形式是给定输入x和攻击损失L比如让生成结果与原始输出语义距离最大化迭代更新δ ← clip(δ α * sign(∇_δ L), -ε, ε)关键在L怎么选。实际工作中最常见的几种MSE损失L -||G(xδ) - G(x)||_2最大化输出像素差。LPIPS损失L -LPIPS(G(xδ), G(x))用感知距离替代像素距离。目标语义损失如果想让输出包含某类物体就用CLIP模型算生成结果与目标文本的相似度然后最大化相似度。分类器损失如果攻击对象是生成图像分类器就直接用分类器交叉熵。这类baseline实现成本最低只要把扩散模型当成一个黑盒函数做梯度回传就行。但代价也很明显扩散模型本身是多步采样、随机噪声驱动的计算图非常深反向传播一次需要跑完整条去噪链。我在8卡A100上批量攻击1024张256x256的图一个PGD迭代要跑50步DDIM显存占用接近40GB速度慢到让人怀疑人生。2.2 把战场搬到latent空间和文本嵌入空间如果用潜在扩散模型LDM系列比如Stable Diffusion直接在像素空间加扰动其实是比较笨的做法。LDM前面有个VAE图像先被压缩到latent空间再去噪。这给了攻击者一个更聪明的选择在latent特征上做迭代攻击。latent空间的维度远低于像素空间迭代次数和显存开销都会下降。更妙的是VAE本身有压缩和去相关的效果latent空间上加同样幅度的扰动反映到像素空间往往是更平滑、更语义化的变化。有时像素空间8/255的扰动会被人类肉眼察觉但latent空间等价的扰动在语义层面影响大得多。另一个经典变形是把扰动加到文本嵌入空间。text2img场景下prompt embedding的维度是77x768远低于图像空间。攻击者可以对文本编码器输出加一个小Delta让生成结果彻底偏离原意。这个做法在不可信提示威胁模型下非常自然扰动也不需要满足像素级不可感知约束通常用CLIP相似度来控制语义偏移程度。需要注意这三个空间的幅度阈值完全不可通。你在像素空间设定的eps8/255放到latent空间后可能要么毫无作用要么直接把图像搅成噪点。必须针对每个空间单独标定扰动预算这是做baseline对比时必须写清楚的地方否则别人根本没法复现。2.3 适合用这类baseline的时机与局限像素/嵌入空间的迭代攻击最大的价值是作为整个攻击谱系里的朴素参考点。它反映的是不引入任何生成先验时攻击能达到什么水平。论文里通常用它作为下界参考证明新方法比朴素PGD强。但它的局限也很明显。第一攻击不自然扰动里塞满了高频噪声人类肉眼能感知也容易被简单防御检测。第二迁移性差在生成模型A上优化的扰动搬到生成模型B上效果大幅下降。第三在随机性面前不稳定扩散模型每步都有随机噪声单次采样得到的梯度方差极大攻击经常陷入局部震荡。所以纯粹做生成攻击研究的人一般不会把像素PGD当成最终目标而只是把它当作一个baseline。下面讲的这两类方法才是更贴近扩散模型特性的攻击思路。3. 让扩散模型参与攻击AdvDiff与SDS类baseline的逻辑3.1 AdvDiff让采样过程直接输出对抗扰动以AdvDiff为代表的一类方法思路和PGD完全不在一个维度不再把扰动当成一个需要在像素空间优化的变量而是把它当成一个需要从数据分布中采样出来的对象。具体做法上这类方法通常会利用预训练扩散模型的条件采样能力。在反向去噪的每一轮迭代里除了无条件/条件去噪项之外再把攻击目标比如让目标分类器产生错误分类的梯度作为引导项注入进预测噪声的更新中。从随机噪声出发沿着既能保持自然图像流形、又能让分类器犯错的方向逐步采样最终得到的扰动或对抗图像是直接从生成模型流形上长出来的。这个思路深受classifier-guided diffusion启发。要理解它为什么工作可以想象两个搜索空间PGD在像素空间里硬搜索如同在黑夜里举着手电筒找一条隐蔽的小路AdvDiff这类方法则让一个熟悉地形的向导带着你走向导知道哪些地方是真实的图像分布走出来的路径天然平滑自然。实际效果上这类方法产出的扰动LPIPS显著低于像素PGD跨模型迁移率也更高。原因也不难理解在数据流形附近搜索到的对抗极值点往往比像素空间的高频噪声极值点更宽不会轻易被另一个模型的决策边界过滤掉。许多论文在报告黑盒攻击效果时都会拿AdvDiff作为强baseline来对比。3.2 SDS梯度把目标函数从生成结果回传到输入空间SDSScore Distillation Sampling最初是DreamFusion用来做3D生成的方法核心公式非常简洁∇_θ L_SDS w(t) * (ε_pred(z_t, t, y) - ε) * ∂z/∂θ其中ε_pred是扩散模型预测的噪声ε是实际加入的噪声两者之差可以理解为当前生成结果与文本条件y匹配程度的梯度。这个梯度不要求完整反向传播整条去噪链只需要一次前向拿到噪声预测即可。对抗样本社区很快发现SDS是个好工具。攻击时把输入图像的扰动或prompt embedding作为优化变量θ定义目标函数比如让生成结果与目标文本更近、或者让生成结果中不包含某个物体然后用SDS把梯度传回θ。相比PGD要展开整个UNet反向链SDS的计算量小了一个数量级这让大规模扰动搜索变成了现实。一个典型应用是语义移除攻击给一张包含人物的照片加上扰动使img2img生成结果里检测不到人。使用CLIP或目标检测器的损失作为外层引导内层用SDS估计去噪方向对应的梯度迭代几十轮之后你拿到的对抗扰动在视觉上几乎不可见但Stable Diffusion对这张照片的编辑能力会被严重抑制。3.3 为什么这类方法常被当作风向标AdvDiff和SDS这两类方法有一个共同点它们没有把扩散模型当成一个不可知的黑盒而是充分挖掘了扩散模型内部对图像分布的理解。这带来的变化是颠覆性的——对抗扰动第一次可以和自然共存。在对比实验中这两类方法通常处在传统攻击和最新攻击之间的位置因此被当作风向标方法类别扰动自然性跨模型迁移性计算开销像素PGD低低中latent/文本PGD中中低AdvDiff类高高高SDS类高中偏高低这个表格符合我在实际对比中的经验。如果某个新攻击方法在自然性和迁移性上连AdvDiff都打不过那它很可能只是在某个特定防御上过拟合了。所以我在自己的实验框架里永远会保留至少一个扩散引导类方法作为对照。4. 攻防闭环DiffPure净化器与DiffAttack等攻击baseline的对抗4.1 DiffPure为什么能当防御baselineDiffPure在2022年ICML上提出思路干净得漂亮对抗扰动通常是高频、小幅度信号那我在输入上先加大量随机噪声让图像退化成接近纯噪声的状态再用反向扩散过程重新生成一张干净图。由于对抗扰动相比图像主成分能量小得多加噪之后扰动信息会被噪声吞没去噪恢复出来的图像自然就把扰动洗掉了。它之所以成为防御baseline是因为在CIFAR-10等标准benchmark上DiffPure不需要对抗训练就能达到很高的鲁棒准确率而且理论上可以适配任意下游分类器。防御方只需要有一组预训练扩散模型权重即可。代价是每个测试样本都要跑几十步反向采样推理开销比单纯分类器大了几个数量级。在对实时性要求不高的场景里这个代价可以接受。4.2 攻击随机净化器的难点梯度期望与不可导采样攻击DiffPure的第一个障碍是随机性。输入x加扰动δ之后DiffPure的输出是随机变量因为反向去噪要从一个随机采样的初始噪声开始。攻击者的真实目标是在噪声分布上求期望max_δ E_{z~N(0,I)} [ C( purify(xδ, z) ) ]朴素PGD用一次采样估计这个期望梯度方差大到完全不可用。我做过实验单次采样得到的梯度方向经常是乱的迭代几次后扰动直接发散。你必须用多次采样求平均梯度但每次采样都要跑完整条去噪链计算量随之翻几倍。第二个障碍是梯度不可导。扩散模型的反向去噪里包含很多随机采样算子直接用自动微分回溯梯度会被随机性截断。靠重参数化技巧也只能缓解部分问题。这两个障碍是理解DiffPure初期看起来无敌的关键。不是它真的不可攻破而是当时的攻击baseline根本不适合随机净化器这个设定。这引出了专门攻击净化器的新一代方法。4.3 DiffAttack与Backward AD绕过随机性的两条路针对扩散净化器的攻击baseline里DiffAttack和Backward AD是两条最典型的路线。DiffAttack的思路是把随机性化为可导。它重新设计了对净化过程的梯度计算方法让随机采样步骤可以通过自定义梯度算子参与反向传播同时在不同去噪时间步上聚合多个损失引导攻击往不同时间尺度上同时生效。配合对梯度幅度的几何约束能显著压低随机性带来的方差。在实际评测中DiffAttack能把DiffPure的鲁棒准确率从接近90%打到很低的水平这也是它在后续文献里被反复用作攻击baseline的原因。Backward AD走的是另一条路利用概率流ODEPF-ODE的确定性形式把随机SDE净化过程替换成可微的确定性轨迹再用伴随方法把梯度精确地回传到输入起点。它得到的梯度更准代价是计算更昂贵时间成本大概是普通PGD的几十倍。这两种方法说明了一件事攻击随机净化器不是调大PGD步数就能解决必须从结构上绕开随机采样造成的不可导。你在评测新防御时如果只用朴素白盒PGD来测得到的鲁棒性数据基本没有参考价值。4.4 评估防御时攻击baseline至少要有哪几个结合我实际评测防御模型的经验攻击baseline至少应该包含三个层面白盒期梯度攻击。在净化期望上做多次采样的PGD这是最朴素的强攻击用来估算防御在该威胁模型下的理论上界。可微近似攻击。DiffAttack或Backward AD二选一。如果新防御在这些方法面前没有明显鲁棒性下降说明它只是挡住了一部分简单攻击。迁移攻击。用替代模型生成对抗样本再拿到目标防御上测试。这模拟的是更现实的黑盒场景。只报白盒攻击会高估防御只报黑盒攻击又说明不了防御上限。三个层面摆在一起才能客观定位一个新防御方法的位置。这个评估规范现在基本成了这个领域论文的标配。5. 自己搭一套baseline对比实验配置、指标与那些容易踩的坑5.1 最小可复现的评测pipeline附伪代码针对Stable Diffusion的img2img攻击一个最小可运行的PGD-baseline伪代码大致如下import torch def attack_pgd_ldm(vae, unet, tokenizer, text_encoder, x, prompt, target_prompt, eps8/255, alpha2/255, steps50, denoise_steps20): # x 为输入图像范围 [0,1] adv x.clone().requires_grad_(True) with torch.no_grad(): cond text_encoder( tokenizer(target_prompt, return_tensorspt).input_ids.cuda() ).last_hidden_state for i in range(steps): z vae.encode(adv).latent_dist.sample() z z * vae.config.scaling_factor z_out run_ddim(unet, z, cond, stepsdenoise_steps) out vae.decode(z_out / vae.config.scaling_factor).sample out torch.clamp((out 1) / 2, 0, 1) # 反归一化到 [0,1] # 攻击目标让生成图像与目标文本特征更接近 from clip import load # 示意 clip_model, _ load(ViT-B/32, devicecuda) loss -clip_similarity(clip_model, out, target_prompt) loss.backward() grad adv.grad.detach() adv.data torch.clamp(adv alpha * grad.sign(), x - eps, x eps) adv adv.detach().requires_grad_(True) return adv几个关键点vae和unet都设成eval模式并冻结所有参数。攻击过程中任何参数更新都会让你的baseline失真。run_ddim里固定scheduler类型和步数。DDIM和DPM-Solver的对比结果可能差距很大同一个实验里不要混用。CLIP模型只用来算损失它的梯度不需要传到文本编码器。所以文本编码器部分的梯度可以关掉。扰动预算eps要在攻击前后做一致的处理。图像归一化到[0,1]还是[-1,1]会直接影响eps的含义代码里必须明确。5.2 指标怎么选别只盯着攻击成功率在扩散模型对抗样本实验里我最反感只报一个ASR的做法。攻击成功只是第一步还要看攻击带来了多少副作用。下面这张表是我做实验时固定会输出的指标组合指标含义说明ASR / 攻击成功率攻击目标达成比例必须同时说明目标定义和阈值L2 / L∞ 扰动范数扰动强度像素空间的经典约束LPIPS感知不可见性比L2更贴近人眼判断迁移率跨模型/跨结构成功率黑盒场景的核心指标FID / KID生成图像质量评估攻击后输出是否失真单样本攻击耗时计算成本扩散模型攻击容易被人忽略多次运行方差稳定性随机种子敏感度尤其最后两项很多论文不报导致复现时候对不上。扩散模型攻击天然带随机性同一组参数在不同种子下ASR能差十几个百分点。不报方差baseline对比就没有统计意义。5.3 我在复现中踩过的几个坑坑一随机种子没有固定。这是最常见的翻车点。扩散模型反向采样、VAE编码、噪声注入每一步都有随机性。攻击代码里如果忘了设全局种子或者把不同baseline放在不同随机状态下运行结果基本不可比。我的做法是固定所有相关种子并且每个配置至少跑三组种子报告均值和标准差。坑二VAE数值范围没处理好。Stable Diffusion的VAE decoder输出范围是[-1,1]直接转成[0,255]保存会有严重色偏。正确做法是(x1)/2*255。这个看似小问题实际会影响CLIP指标和人工评估进而影响整个baseline结论。我在对比latent空间扰动和像素空间扰动时就曾因此吃过亏。坑三显存占用失控。整条去噪链反向传播需要把每步UNet中间激活都存下来显存开销极其夸张。我的经验是先把batch size降到1再用梯度检查点最后的兜底方案是只对最后几步去噪做反向传播前面用no_grad。这样会让梯度有偏但作为baseline是可以接受的。坑四文本嵌入攻击时扰动到了padding位置。文本输入有padding token如果扰动加到这些位置后续经过attention层时可能产生无法预测的语义泄漏。正确做法是根据attention mask把padding位置的梯度mask掉。坑五不同baseline之间没有统一采样器。DDIM 100步攻击和DPM-Solver 20步攻击虽然都在攻击同一个模型但数值表现可能有系统差异。一定要在方法的Method部分写清楚采样器类型、步数、调度器参数否则读者复现时的baseline对比会失真。如果让我给刚接触扩散模型对抗样本研究的人一个最小行动清单我会说先把像素空间PGD和SDS这两类最朴素的baseline跑通它们能帮你建立对攻击任务的直觉。再上AdvDiff、DiffAttack这些重武器它们能帮你理解生成先验带来的迁移性增益。最后再做防御评测时至少同时覆盖白盒、可微近似和迁移攻击三个层面。对抗样本研究在分类器时代已经足够成熟但到了扩散模型这里很多东西都要重新校准。扰动预算、评价指标、随机种子、采样器每一个细节都可能让你的baseline与别人差出一大截。多花一点时间把这些基础打牢后续做新方法时才会走得更快。