
1. 从生成到攻防为什么扩散模型需要对抗样本基线扩散模型这几年火到什么程度相信不用我多说了。从图像生成到视频合成从语音克隆到分子设计几乎每一个跟生成沾边的领域都能看到它的身影。但很多刚接触这个方向的同学容易忽略一个问题模型能生成逼真内容不代表它是安全的。当一个扩散模型被恶意输入欺骗生成结果完全偏离预期时这个模型还能被放心用在生产环境里吗这就要聊到对抗样本了。传统分类任务里对抗样本是在输入上加一点人眼看不出的噪声让模型给出错误分类。而在扩散模型这个体系下对抗攻击的逻辑更复杂也更值得深挖。因为扩散模型的输入输出空间都相当宽泛——你可以攻击它的文本编码器让它把一只猫理解成一只狗可以攻击它的潜空间表征让生成结果彻底乱掉甚至可以针对采样过程中的某一时间步做扰动造成全局崩溃。正因为攻击面广、攻击方式多样这个领域才催生了一批经典的baselines。这些baselines不只是给学术论文做对比实验用的它们更是理解扩散模型鲁棒性的入口。如果你正在研究扩散模型的安全问题、想在生成任务里加入对抗训练或者单纯想搞明白现有防御方法到底在防什么那这篇文章就是给你准备的。我会从扩散模型的相关基础说起逐个拆解那些绕不开的经典攻击方法包括针对潜在扩散模型的攻击思路、评估这些方法时容易踩的坑再把手上的实测经验一并分享出来。内容会偏实践公式点到为止重点是让你看完之后能明确知道某个baseline在什么场景下有效、在什么场景下失效、以及为什么。2. 先对齐基本盘扩散模型和对抗样本的底层逻辑在铺开讲baselines之前得先把两块底层逻辑对齐。不然很多方法设计出来之后你会觉得为什么要这么干很费解。2.1 扩散模型的两阶段结构与攻击面扩散模型尤其以潜在扩散模型LDM为代表的那一类基本可以拆成两个阶段。前向过程是把干净图像逐步加噪最后变成一个纯高斯噪声反向过程则是从高斯噪声出发通过去噪网络一步步还原出图像。看起来是单纯的加噪和去噪但实际工程里LDM还额外多了一个环节——先把图像通过编码器压缩到潜在空间在潜空间里完成扩散和去噪再通过解码器还原回像素空间。这个设计极大地降低了计算成本也让模型的应用范围扩大到了Stable Diffusion这样的超大模型场景。但同时也带来了一个新问题攻击面变多了。攻击可以发生在文本条件编码阶段比如对抗性提示词直接扰乱CLIP文本编码器对语义的理解。攻击可以发生在潜空间初始化阶段比如构造一个恶意的初始噪声张量让后续去噪全部走偏。攻击可以发生在采样过程比如在某个时间步的预测结果上叠加精心计算的扰动。攻击还可以发生在解码阶段让还原出的图像在像素层面出现异常。理解这些攻击面是理解baselines的前提。因为每个经典baseline往往只针对其中一个或两个攻击面做文章。2.2 分类任务对抗攻击与生成任务对抗攻击的本质差异传统图像分类的对抗攻击本质上是在输入空间里找一个邻域内的点让模型的Cross-Entropy损失变大。优化目标很直接评估方式也很直接——攻击成功就是分类标签变了。生成任务的对抗攻击完全不是这套逻辑。你没有一个明确的标签来判断攻击是否成功而是要回答一个更模糊的问题生成出的东西还是不是用户想要的这就带来两个麻烦。第一优化目标不好定。分类任务可以用交叉熵生成任务该用什么有人用CLIP分数作为代理指标有人用感知距离有人用结构相似度还有直接用下游任务精度来评估的。选不同的代理指标最后选出来的对抗样本就是完全不同的东西。第二约束条件不好定。分类任务里对扰动的约束通常是Lp范数球生成任务里由于攻击往往发生在潜空间或文本空间Lp范数的含义变得很微妙。一个在潜空间里看起来很小的扰动解码回像素空间可能就是一个巨大的语义漂移。这也是为什么扩散模型的对抗样本baselines不能直接照搬分类任务里的PGD、CW那些方法必须在扰动空间、优化目标、评估方式上重新设计。后面要讲的几种方法本质上都是在这个重新设计的过程中逐步沉淀下来的。3. 扩散模型攻击赛道的经典baselines逐个拆解这个方向从兴起到现在其实迭代出了好几代工作。我按时间线和攻击思路两条线来拆这样大家既能看出方法演进的轨迹也能明白不同方法之间的底层联系。3.1 直接优化采样轨迹的攻击DiffAttack首先要聊的是DiffAttack这套方法在扩散模型安全研究里属于旗帜性存在。它背后的核心洞察是扩散模型的采样过程是一个多步迭代过程任何中间时间步的微小偏差都可能被后续步骤放大最终导致生成结果的彻底漂移。DiffAttack的出发点就是主动利用这个特性来做攻击。它设计的对抗损失有一个很明显的特征——搜索多样性。攻击时不仅要让最终生成结果偏离预期还要让中间步骤的预测出现明显偏离。具体做法是对采样轨迹上的多个时间步同时施加攻击信号而不是只盯着最后一步的输出做优化。这样做有一个额外的好处即便防御方使用了某种去噪预处理把最后几步的扰动抹掉了一部分中间步骤已经被污染的轨迹仍然会让最终结果偏掉。我测试下来发现DiffAttack对使用DDIM采样的模型特别有效因为DDIM的采样轨迹相对确定反向过程可以被精确预测反过来看如果目标模型用了随机性较强的采样策略比如加了额外噪声的SDE求解器那DiffAttack的效果会有明显折扣。这个特性在对比实验里很容易被忽略很多人拿DiffAttack做完baseline就直接下结论说攻击有效或攻击无效却不看一眼目标模型的采样器类型这是要特别注意的。3.2 黑盒场景的通用攻击框架AdvDMDiffAttack是白盒攻击需要拿到梯度和模型参数。但实际场景里很多扩散模型服务只对外提供API你拿不到任何梯度信息。这就轮到AdvDM登场了。AdvDM解决的核心问题是怎么在完全黑盒的情况下生成对抗样本。它的思路很巧妙把攻击目标定义在一个更大的范围上让整个对抗样本的生成以预期图像分布与生成结果分布之间的距离最小化为目标而不是针对某一个具体的目标图像或单一采样轨迹。这样设计带来的一个巨大好处是对抗样本具有更强的迁移性——在黑盒模型上学到的扰动往往可以直接迁移到另一个未知模型上。我个人理解AdvDM的底层逻辑其实可以类比成分布层面的毒性攻击。它不追求让某一类图像生成失败而是致力于在更泛的层面让模型整体性能下滑。实际测试里如果攻击用的代理模型和目标模型结构比较接近AdvDM的迁移效果会相当可观但如果结构差异太大比如从UNet结构迁移到DiT结构攻击效果会明显下降。这也是当前黑盒攻击研究的普遍痛点。3.3 文本驱动的对抗攻击针对CLIP编码器的对抗提示词在潜在扩散模型里文本编码器是极其关键的入口。CLIP编码器把用户输入的文本映射成语义向量再通过CrossAttention去影响图像生成过程。那么很自然的一个攻击思路就是如果我能构造一段文本它在人类看来没什么异常但经过CLIP编码之后语义完全偏离生成结果不就崩了吗这组思路的代表方法是针对提示词优化的攻击手段。它们把离散的文本token当成一个连续向量来优化迭代更新token的embedding最终得到一段在embedding空间里被扰动过的对抗性提示词。这段提示词看起来可能还是一只红色的鸟但在模型的语义空间里已经被推向了一片模糊的噪点或某个不相关的概念。我实际复现过这类方法有一个比较深的体会对抗提示词攻击的难点不在优化本身而在于如何保持语义表面的一致。如果你完全不受约束地优化最后得到的可能是一串无意义字符人类一眼就能看出它是攻击输入。但真正有价值的对抗提示词需要在embedding空间和token空间的约束下做交替优化让它既符合人类语义、又能欺骗模型。这个平衡点是这类baseline的精华所在。3.4 通用攻击范式PGD类方法在扩散模型中的适配PGDProjected Gradient Descent投影梯度下降是分类任务里最经典的攻击方法很多研究者在刚开始涉足扩散模型对抗攻击时做的第一件事就是把PGD直接搬过来用。输入图像经过一个可微的扩散过程计算损失然后沿着梯度方向迭代更新输入再把输入投影回允许的扰动范围内。这个方法能用但效果会受到很大限制。原因也很直接扩散模型的迭代去噪过程非常深几十步的反向传播会导致梯度消失和梯度爆炸。尤其是当你使用DDIM的确定性采样时完整的反向传播要穿越几十个去噪网络计算图的深度惊人训练显存和时间的消耗都是巨大的。所以后续很多工作沿着PGD框架做适配时基本都在解决同一个问题——怎么在保证攻击效果的同时降低反向传播的复杂度。常见的做法包括只反传部分采样步长、使用代理梯度近似、或者把攻击信号投影到潜空间而不是像素空间。这些改进方案慢慢也演化成了后续很多baselines的底层构件。我自己的建议是如果你只想快速验证一个防御模型的有效性直接用简单适配后的PGD就足够了但如果你想严谨评估防御模型的上限还是应该搭配DiffAttack这类专门设计的攻击方法。因为PGD在扩散模型上受梯度估计误差的影响太大容易出现表面有效、实际脆弱的结论偏差。4. 典型攻击方法核心机制对比这么多方法摆在面前容易让人懵圈——到底该用哪个方法做baseline我建议你用下面这套表格来快速做决策。方法分类代表方法攻击背景核心优化空间主要适用场景主要局限轨迹攻击DiffAttack白盒多时间步采样轨迹对已知模型做高强度的针对性攻击评估对随机采样器效果下降明显分布级攻击AdvDM黑盒潜空间或像素空间的扰动分布迁移攻击、未知模型鲁棒性评估代理模型与目标模型结构差异大时效果大幅下降提示词攻击基于Embedding优化的方法黑盒/白盒文本token的embedding针对文生图模型的语义攻击需要保持语义表面一致性优化复杂度高PGD适配多种白盒像素空间或潜空间快速验证防御有效性反向传播深度大计算开销高这张表的用途不是让你记住每个方法的细节而是在设计实验时帮你对齐场景。比如说你的目标模型是开源的Stable Diffusion你又想做一个新的防御方法那DiffAttack应该进对比如果目标是评估黑盒API的安全性那AdvDM和提示词攻击必须安排上如果想要一个大而全的评估结果建议至少覆盖这四类方法里的三种。有一点必须反复强调baseline的选择直接影响你实验结论的可靠程度。如果只用PGD类的简单攻击做评测得出的模型很鲁棒结论很可能经不起推敲。真实世界中的攻击者不会只用最简单的招式。5. 潜在扩散模型的专属攻击视角与评估陷阱潜在扩散模型是当前扩散模型应用中最常见的一个子类但它和直接在像素空间做扩散的模型有很大区别。如果不理解这些区别你在做攻击评估时可能会出现实验做完结论却完全不对的情况。5.1 潜空间攻击的本质压缩域里的扰动放大LDM之所以效率高是因为它把图像从像素空间压缩到潜空间。这个压缩过程是有损的但也正是这个损给了攻击者可乘之机。在潜空间里一个相对小的扰动经过解码器放大之后在像素空间可能是一个结构性的大扰动。这个特性意味着潜空间攻击的扰动幅度衡量标准不能沿用像素空间的L2/Linf约束你要重新校准攻击预算。我在实测中经常遇到一个现象同样的攻击方法在像素空间做攻击扰动幅度看起来很大但攻击成功率不算高搬到潜空间做攻击后扰动幅度数值上很小攻击成功率却飙升。原因就在于潜空间的各个通道具有不同的语义重要性解码器对这些通道的敏感度也完全不同。所以如果你评估的模型是LDM我强烈建议攻击和防御的实验都同时汇报像素空间和潜空间的扰动指标。只报一边往往会让结论失真。5.2 代理指标陷阱CLIP分数不是万能的在扩散模型攻击评估里最常用的代理指标就是CLIP Score。攻击效果好不好看CLIP Score降了多少。但这个指标有一个系统性缺陷CLIP Score的变化很多时候反映的是风格偏移而不是内容错误。我做一个简单的例子你就能理解。把一张戴着帽子的狗的图片攻击过后CLIP分数可能从0.30掉到0.25但你仔细看生成的图狗狗依然清晰只是帽子从红色变成了蓝色。这算攻击成功吗从CLIP分数上看语义确实偏离了从人类感知上看猫咪还是猫咪狗还是狗只是局部属性变了。所以CLIP分数的落差无法精确反映对抗样本的实际威胁程度。这就是为什么评估扩散模型对抗攻击时应该搭配多个指标结构距离如LPIPS、语义保留度如FaceID相似度或物体检测置信度、以及人工评估。单独依赖CLIP分数极容易在高鲁棒性模型上得出攻击成功但人类完全没感知的结论。5.3 时间步采样策略对攻击成功率的影响扩散模型的反向过程通常要经过20到50步迭代攻击者没必要对每一个时间步都施加扰动。不同的baseline对时间步的选择策略差异巨大有的方法只在前期时间步施加攻击因为前期的去噪决定了图像的结构布局。有的方法只在后期时间步攻击因为后期决定的是纹理细节。有的方法均匀选取若干时间步攻击效果更均衡。有的方法则用注意力机制来动态选取最关键的时间步。这个差异带来的结果是同一个攻击方法在20步采样下表现很好换到50步采样下可能直接失效。很多研究者忽略了这个变量导致复现别人实验时攻击效果大打折扣。如果你设计自己的新攻击方法建议在论文里清晰说明时间步选择策略并至少对比两种时间步采样方案如果你只是拿这些baselines做评测那么至少要在相同的时间步设置下统一测试所有方法跨设置对比本身就是不可靠的。6. 基于Pytorch的实操参考跑通一套攻击baseline光讲理论不实践等于白看。下面我手把手带大家跑一个简化但完整的攻击流程。这里直接操作LDM框架采用的是类似DistDiffAttack的一种简化思路目的是让大家看明白攻击管线到底怎么搭起来的代码可以直接参考。6.1 环境准备和关键依赖这里假设你已经有基本的深度学习环境PyTorch 2.0以上一台带CUDA的GPU。需要额外安装的库很少关键就两个diffusers用来加载现成的扩散模型torchvision用来处理图像变换。pip install diffusers transformers accelerate torchvision如果是在国内网络环境huggingface_hub下载模型可能会出现各种奇怪问题建议提前配置镜像源。这一步卡住的人非常多特此提醒。6.2 加载预训练模型以Stable Diffusion v1.4为例这是LDM架构的经典形态。加载过程非常简单import torch from diffusers import StableDiffusionPipeline model_id CompVis/stable-diffusion-v1-4 pipe StableDiffusionPipeline.from_pretrained( model_id, torch_dtypetorch.float16, safety_checkerNone, ) pipe pipe.to(cuda)这里设置safety_checkerNone的目的是去掉NSFW过滤器因为在攻击实验里我们需要观察模型在对抗扰动下的完整输出分布安全过滤器会截断部分输出干扰最终评估。生成一张正常的基准图像prompt a photo of a cute cat sitting on a sofa with torch.no_grad(): image pipe(prompt, num_inference_steps50, guidance_scale7.5).images[0] image.save(clean.png)6.3 构造攻击损失定义对抗样本优化循环现在进入核心环节。这个简化版攻击的核心思路是固定文本条件不变优化一个对抗性的初始潜变量让采样出的图像与目标语义彻底偏离。我们用一个预训练的图像分类器或CLIP模型来提取预期图像的特征再让攻击后的生成图像在特征空间中离得越远越好。简化版本直接用MSE损失让初始潜变量偏离原始分布。def attack_ldm(pipe, prompt, eps0.05, num_iter20, lr0.01): # 使用固定的随机种子保证初始潜变量一致 generator torch.manual_seed(42) latents torch.randn( (1, 4, 64, 64), generatorgenerator, devicecuda, dtypetorch.float16, ) latents.requires_grad_(True) # 文本编码 text_input pipe.tokenizer( prompt, paddingmax_length, max_lengthpipe.tokenizer.model_max_length, truncationTrue, return_tensorspt, ) text_embeddings pipe.text_encoder(text_input.input_ids.to(cuda))[0] optimizer torch.optim.Adam([latents], lrlr) for i in range(num_iter): optimizer.zero_grad() # 从当前latents出发跑完整采样过程 # 为了简化这里只跑40步DDIM with torch.enable_grad(): # 重建采样需要绕过部分diffusers内部实现这里用pipe的scheduler pipe.scheduler.set_timesteps(40, devicecuda) latents_current latents.clone() for t in pipe.scheduler.timesteps: latent_model_input torch.cat([latents_current] * 2) with torch.no_grad(): noise_pred pipe.unet( latent_model_input, t, encoder_hidden_statestorch.cat([text_embeddings] * 2), ).sample # CFG noise_pred_uncond, noise_pred_text noise_pred.chunk(2) noise_pred noise_pred_uncond 7.5 * (noise_pred_text - noise_pred_uncond) latents_current pipe.scheduler.step( noise_pred, t, latents_current ).prev_sample # 解码 with torch.no_grad(): image pipe.vae.decode(latents_current / 0.18215).sample # 攻击损失让图像均值偏离正常范围 loss -image.mean() # 简化攻击目标 loss.backward() optimizer.step() # 投影约束 with torch.no_grad(): latents.data torch.clamp(latents.data, -eps, eps) return latents.detach()这段代码做了以下几件事初始化一个需要梯度的随机潜变量。手动遍历调度器的时间步执行完整的DDIM采样循环。使用CFGClassifier-Free Guidance合并条件与非条件预测结果。用image.mean()作为简化攻击损失的代表。每轮优化后对latents做投影约束确保不跑飞。实际使用时这个简化损失会比较粗糙因为它没有结合文本语义。更合理的做法是换成CLIP loss或感知损失。6.4 完整攻击流程汇总把上面几个模块串起来完整流程是clean_latents torch.randn( (1, 4, 64, 64), generatortorch.manual_seed(42), devicecuda, dtypetorch.float16, ) adv_latents attack_ldm( pipe, prompta photo of a cute cat sitting on a sofa, eps0.08, num_iter30, lr0.005, ) # 使用对抗latents生成攻击后的图像 with torch.no_grad(): pipe.scheduler.set_timesteps(50, devicecuda) latents_current adv_latents.clone() text_input pipe.tokenizer( prompt, paddingmax_length, max_lengthpipe.tokenizer.model_max_length, truncationTrue, return_tensorspt, ) text_embeddings pipe.text_encoder(text_input.input_ids.to(cuda))[0] for t in pipe.scheduler.timesteps: latent_model_input torch.cat([latents_current] * 2) with torch.no_grad(): noise_pred pipe.unet( latent_model_input, t, encoder_hidden_statestorch.cat([text_embeddings] * 2), ).sample noise_pred_uncond, noise_pred_text noise_pred.chunk(2) noise_pred noise_pred_uncond 7.5 * (noise_pred_text - noise_pred_uncond) latents_current pipe.scheduler.step(noise_pred, t, latents_current).prev_sample adversarial_image pipe.vae.decode(latents_current / 0.18215).sample # 保存结果对比两张图 from torchvision.utils import save_image clean_latents_for_decode clean_latents / 0.18215 with torch.no_grad(): clean_image pipe.vae.decode(clean_latents_for_decode).sample save_image((clean_image 1) / 2, clean_output.png) save_image((adversarial_image 1) / 2, attack_output.png)跑完之后你会得到两张图一张是正常采样得到的图一张是经过对抗扰动后生成的图。正常情况下他们应该有肉眼可见的语义差异比如猫的形态完全变形或者直接生成了完全无关的内容。6.5 代码运行中的常见报错与对应解法这段代码在实际跑的过程中有几个高频坑位我提前给你列出来。坑位一显存溢出OOM。因为整个反传过程要通过40步的UNet显存峰值会非常高。解决办法有两个降低采样的时间步数比如从40降到10或者开启梯度检查点。pipe.unet.enable_gradient_checkpointing()坑位二梯度全零。如果你发现loss一直不下降先检查有没有在不该加torch.no_grad()的地方误加。尤其是VAE解码器到损失函数这一段必须有梯度流通。坑位三图像全黑或全白。这种情况十有八九是解码时的缩放系数不对。Stable Diffusion系列模型的VAE输出要在/0.18215之后才能正确地送入scheduler这个缩放系数是固定值不同模型略有差异换模型时别忘了重新确认。坑位四调度器的timesteps与采样步数不一致。如果你在pipe.scheduler.set_timesteps(50)之后又手动改了步数可能会出现索引错位。解决方式是每次采样前重新设置timesteps。7. 实测避坑指南那些论文里不写但你一定会遇到的破事代码跑通了只是一个开始。真正让一个baseline发挥价值的取决于你有没有绕开下面这些坑。这些都是我一次次踩出来的价值不比任何论文代码低。7.1 随机种子的影响比你想的大得多采样过程中每一步都有随机噪声的参与即便你是用DDIM这样的确定性采样器初始潜变量也是随机的。这意味着攻击实验的可复现性天生就比较差。所以做实验时一定要固定三个地方的种子初始潜变量的生成种子。PyTorch的全局随机种子。NumPy的随机种子很多预处理库会依赖它。不固定种子的话两次实验之间的攻击成功率差异可能高达10个百分点以上。如果你发现实验结果波动巨大先怀疑种子再去怀疑方法本身。7.2 CFG系数对攻击难度的影响Classifier-Free Guidance的系数也就是guidance_scale直接影响生成结果的多样性。我测试下来guidance_scale越高模型越遵循文本条件攻击也越难成功guidance_scale越低生成结果更随机攻击效果更好。这意味着同一套攻击方法在guidance_scale7.5时可能只有20%的攻击成功率在guidance_scale2.0时可能冲到80%。这是一条被绝大多数baselines论文忽略的重要变量。做防御评测时我强烈建议测试多组CFG系数并逐一汇报结果。否则你无法判断模型鲁棒性提升是因为防御生效了还是因为CFG系数太高导致攻击变难了。7.3 解码器返回的图像范围如何对齐扩散模型的VAE解码器输出值域通常在[-1, 1]之间但经过clip之后可能会被截断。这个看似微小的细节会在多步采样时产生累积偏差。尤其在几十步的循环里数值如果始终处于极端值附近最终图像会出现色偏或条纹伪影。实测中最稳妥的做法是在保存图像或用CLIP评分之前手动对图像张量做一次(image 1) / 2的归一化。如果发现图像出现异常色偏先检查这一步有没有漏掉。7.4 对比实验一定要统一采样器前面提到过DiffAttack对DDIM有效但对SDE求解器效果会下降。这背后的原理是随机采样器引入了额外噪声攻击信号在噪声扰动下被稀释了。所以对比多个baselines时所有方法必须在同一个采样器、同一个采样步数、同一个CFG系数下跑否则比较出来的结论没有任何意义。8. 评估指标的正确打开方式别让CLIP分数骗了你评估一套攻击方法的时候量化指标是必不可少的。但扩散模型的评估指标并不像分类任务那样一目了然用错指标比不用指标更糟。下面把几个常用指标的适用边界说清楚。8.1 结构距离指标LPIPSLPIPSLearned Perceptual Image Patch Similarity衡量的是两张图片在感知层面的距离数值越大表示感知差异越大。在对抗攻击评测里LPIPS常被用来衡量攻击对生成结果的破坏程度。LPIPS的优势在于它比L2距离更贴近人类感知。但它对纹理细节的变化敏感对严重的语义错误反而不够敏感。比如一张图里的猫变成了狗但整体构图、色彩、纹理风格保持接近LPIPS可能只给出一个中等偏上的分数掩盖了语义层面的严重错误。所以LPIPS适合配合其他指标一起用单独使用会误导。8.2 语义一致性指标CLIP Score与它的局限CLIP Score是把生成图像和文本提示分别编码然后计算余弦相似度。它的优点是非常方便、无需人工标注缺点前面也说了对风格变化敏感、对具体的语义实体变化不敏感。一个更稳妥的使用方式是同时计算CLIP Score下降值和下降方向。如果CLIP Score降到很低至少说明攻击产生了某种跨模态的语义扰动但如果只是从0.3降到0.28那就需要额外看生成图像来确认这次攻击是否有实际威胁。8.3 面向特定任务的下游指标如果攻击的是真实业务场景里使用的扩散模型那还需要用下游任务指标来评估攻击的实际破坏力。人脸生成模型用FaceID相似度衡量身份保留程度。物体生成模型用目标检测器的置信度衡量关键物体是否被保留。图像编辑模型用编辑指令的遵循度做人工评估。这些指标通常比通用CLIP分数更能反映真实攻击威胁。做研究阶段的baseline对比时可能用不上但当你把方案落地到实际业务时就完全绕不开它们了。9. 防御视角下的baseline意义用攻击找短板聊了这么多攻击方法不代表这个话题的意义只是为了破解模型。事实上对抗样本baselines在模型防御研究中承担的角色远比攻击工具要重要得多。一个不具备对抗鲁棒性的扩散模型在实际部署中面临的风险是真实的。比如文生图模型被用于内容审核辅助场景时攻击者可以构造对抗提示词让生成结果绕过审核比如图像编辑服务如果被恶意构造的输入攻击生成结果可能严重偏离用户意图带来不可控的影响。防御方法大体上有这么几类思路基于对抗训练的方法、基于输入预处理的防御、基于采样过程修正的防御、以及基于检测器的防御。不管哪一类它们的评估环节都必须依赖对抗样本baselines。只有在强攻击下依然保持性能的防御才是真正可信的防御。所以我的建议是如果在做扩散模型相关的研究或者应用别只盯着生成效果好的指标一定要把鲁棒性评估纳入到测试流程里来。对抗样本baselines不是论文里的装饰品而是你判断模型是否可用的一把硬尺子。10. 关于baseline选型和实验结果解读的几点个人建议最后再分享一些我自己在实际项目里的体会算是给准备入坑的同学一些参考。第一不要迷信任何单一baseline。扩散模型的攻击和防御本质上是一个攻防对抗的博弈过程单一方法的评估结果只能代表非常有限的能力边界。做实验时尽量覆盖白盒、黑盒、文本驱动这三种大方向的攻击才能对模型的鲁棒性有一个全面的认知。第二复现baseline前先读透代码里的采样细节。很多baseline的论文写得非常模糊关键时刻只能靠读源码理解。通常最影响实验效果的都是那些看起来不打紧的实现细节比如时间步选择策略、梯度裁剪方式、投影约束使用的范数等。读代码花费的时间会以少踩坑的方式加倍还给你。第三合理的baseline选取逻辑是先明确你的威胁模型再选择对应的baseline。如果你关心的是API黑盒攻击就别用DiffAttack来证明模型安全如果你关心的是白盒安全性那AdvDM只能作为辅助参考。威胁模型定错了后续所有实验都会变得没有意义。说实话扩散模型的对抗样本方向到现在仍然有大量问题没有解决。多时间步攻击的计算效率瓶颈、黑盒攻击的迁移性问题、语义级攻击的统一量化标准这些都还属于开放问题。但正因如此这个方向在学术和工业场景里都有不错的研究价值。希望这篇文章能帮你把这几个经典baseline的来龙去脉理清楚在真正动手做实验的时候少走一些我已经走过的弯路。