尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

[特殊字符] Diffusers 中的 Perturbed-Attention Guidance (PAG):免训练提升扩散模型采样质量

[特殊字符] Diffusers 中的 Perturbed-Attention Guidance (PAG):免训练提升扩散模型采样质量 Diffusers 中的 Perturbed-Attention Guidance (PAG)免训练提升扩散模型采样质量【免费下载链接】diffusers Diffusers: State-of-the-art diffusion models for image, video, and audio generation in PyTorch.项目地址: https://gitcode.com/GitHub_Trending/di/diffusers导读Perturbed-Attention GuidancePAG扰动注意力引导是一种全新的扩散模型采样引导技术由论文《Self-Rectifying Diffusion Sampling with Perturbed-Attention Guidance》论文编号 2403.17377提出。它的核心思路是在去噪过程中将选定自注意力层的注意力图替换为单位矩阵identity matrix从而构造出结构被破坏的中间样本再引导去噪过程远离这些退化样本以此逐步增强样本的结构性。PAG 最大的特点是不需要额外训练、不需要接入外部模块且在条件生成如文本引导与无条件生成场景下都能提升质量。本文以 Diffusers 仓库中的官方文档docs/source/en/api/pipelines/pag.md为主体结合仓库源码src/diffusers/pipelines/pag/与src/diffusers/models/attention_processor.py完整讲解如何在 SDXL 文生图、图生图、修复Inpainting、ControlNet、IP-Adapter 等场景中启用 PAG以及pag_applied_layers、pag_scale等核心参数的作用与底层实现原理。PAG 技术原理为什么扰动注意力能提升质量论文核心思想根据论文摘要PAG 的设计动机是现有的采样引导技术如分类器引导 CG、无分类器引导 CFG往往依赖类别标签或文本条件在无条件生成以及图像复原等下游任务如修复、去模糊中难以充分发挥作用。而 PAG 观察到自注意力机制天然能够捕获样本的结构信息。因此在去噪过程中把选定的自注意力图替换为单位矩阵相当于让每个 token 只关注自身从而得到一个结构退化的中间样本用这个退化样本作为引导基准让去噪过程远离退化样本即引导预测结果向结构更完整的方向偏移。论文在 ADM扩散模型骨干和 Stable Diffusion 上均验证了 PAG 在条件生成乃至无条件生成场景下的质量提升并显著改善了 ControlNet 空提示empty prompt、修复、去模糊等下游任务的表现。Diffusers 中的实现两个专用的注意力处理器在仓库的 src/diffusers/models/attention_processor.py 中PAG 通过两个继承自标准注意力处理器的专用 Processor 实现PAGIdentitySelfAttnProcessor2_0attention_processor.py#L5043用于未启用 CFG的场景。它将输入的 hidden states 沿 batch 维切成两份hidden_states_org走正常的 scaled dot-product attentionF.scaled_dot_product_attention路径hidden_states_ptb则走扰动路径——跳过to_q、to_k只经过to_v线性投影hidden_states_ptb attn.to_v(hidden_states_ptb)这等价于用单位矩阵作为注意力权重即每个位置只聚合自身的信息从而破坏结构特征。两条路径的输出再torch.cat拼接回 batch 维。PAGCFGIdentitySelfAttnProcessor2_0attention_processor.py#L5142用于启用 CFG的场景。输入被切成三份hidden_states_uncond无条件分支、hidden_states_org文本条件分支走正常注意力、hidden_states_ptb扰动分支仅过to_v。其中无条件分支与正常分支拼接后一起走scaled_dot_product_attention扰动分支单独处理。注意这两个 Processor 都要求 PyTorch 2.0 及以上版本因为依赖F.scaled_dot_product_attention代码中会在初始化时显式检查并抛出ImportError。PAGMixin引导公式与自适应缩放PAG 的核心逻辑封装在 src/diffusers/pipelines/pag/pag_utils.py 的PAGMixin中所有 PAG pipeline 都通过继承该 Mixin 获得能力_apply_perturbed_attention_guidancepag_utils.py#L100实现引导合成公式启用 CFG 时噪声预测被切为三份noise_pred_uncond / noise_pred_text / noise_pred_perturb最终预测为uncond guidance_scale * (text - uncond) pag_scale * (text - perturb)即 CFG 项与 PAG 项线性叠加未启用 CFG 时如无条件生成、ControlNet 空提示则退化为text pag_scale * (text - perturb)此时 PAG 成为唯一引导来源。_get_pag_scalepag_utils.py#L87实现自适应缩放若启用了pag_adaptive_scale则按pag_scale - pag_adaptive_scale * (1000 - t)随时间步t动态衰减小于 0 时截断为 0do_pag_adaptive_scaling属性要求pag_adaptive_scale 0 且 pag_scale 0 且已配置 pag_applied_layerspag_utils.py#L206。_set_pag_attn_processorpag_utils.py#L35遍历unet或transformer的全部子模块找到所有自注意力isinstance(module, Attention) and not module.is_cross_attention且模块名与pag_applied_layers中标识匹配的层为其挂上上述 PAG 处理器若某个标识找不到任何匹配层会抛出ValueError。从源码结构看PAG 不修改任何网络权重只通过替换 attention processor 与改动__call__中的噪声合成逻辑生效这正是免训练、免外挂模块的落地方式。安装与启用方式总览PAG 通过AutoPipeline家族集成启用方式是在from_pretrained时传入enable_pagTrue并可通过pag_applied_layers指定要应用 PAG 的层。在仓库的 src/diffusers/pipelines/auto_pipeline.py 中可以看到完整的映射关系文生图stable-diffusion-pag、stable-diffusion-xl-pag、stable-diffusion-xl-controlnet-pag、stable-diffusion-3-pag、hunyuan-pag、sana-pag、pixart-sigma-pag等auto_pipeline.py#L152-L174图生图stable-diffusion-pag、stable-diffusion-xl-pag、stable-diffusion-xl-controlnet-pag、stable-diffusion-3-pag等auto_pipeline.py#L219-L229修复stable-diffusion-controlnet-pag、stable-diffusion-xl-pag、stable-diffusion-pag等auto_pipeline.py#L254-L262。from_pretrained与from_pipe内部会根据enable_pag标志自动把普通 pipeline 类替换为对应的*PAGPipeline类参见 auto_pipeline.py#L544-L547 等处的类名替换逻辑对使用者透明。⚠️ 当前仓库支持 PAG 的 pipeline 有限主要包括选定的 SDXL 系列 pipeline、Stable Diffusion 系列、Stable Diffusion 3 系列、PixArtSigma、Sana、HunyuanDiT、Kolors与AnimateDiff等完整类清单见下文支持的 Pipeline 类一节。使用前请确认你的模型架构在支持列表内。通用任务文生图 / 图生图 / 修复Text-to-image文生图用AutoPipelineForText2Image加载 SDXL 并启用 PAGfrom diffusers import AutoPipelineForText2Image from diffusers.utils import load_image import torch pipeline AutoPipelineForText2Image.from_pretrained( stabilityai/stable-diffusion-xl-base-1.0, enable_pagTrue, pag_applied_layers[mid], dtypetorch.float16 ) pipeline.enable_model_cpu_offload()如果你已经有一个创建好的 pipeline也可以用from_pipeAPI 在不额外占用内存的情况下升级为 PAG pipeline两者会同时加载、随时可用pipeline_sdxl AutoPipelineForText2Image.from_pretrained(stabilityai/stable-diffusion-xl-base-1.0, dtypetorch.float16) pipeline AutoPipelineForText2Image.from_pipe(pipeline_sdxl, enable_pagTrue)生成时传入pag_scale。pag_scale越大图像结构越连贯、伪影越少但过大的引导强度与 CFG 类似会使纹理变平滑、出现轻微过饱和。官方 demo 中pag_scale3.0在多数场景表现良好pag_scale0时 PAG 被关闭。示例prompt an insect robot preparing a delicious meal, anime style for pag_scale in [0.0, 3.0]: generator torch.Generator(devicecpu).manual_seed(0) images pipeline( promptprompt, num_inference_steps25, guidance_scale7.0, generatorgenerator, pag_scalepag_scale, ).imagesImage-to-image图生图from diffusers import AutoPipelineForImage2Image from diffusers.utils import load_image import torch pipeline AutoPipelineForImage2Image.from_pretrained( stabilityai/stable-diffusion-xl-base-1.0, enable_pagTrue, pag_applied_layers[mid], dtypetorch.float16 ) pipeline.enable_model_cpu_offload()已有图生图 pipeline 时启用 PAGpipeline_t2i AutoPipelineForImage2Image.from_pretrained(stabilityai/stable-diffusion-xl-base-1.0, dtypetorch.float16) pipeline AutoPipelineForImage2Image.from_pipe(pipeline_t2i, enable_pagTrue)也可以直接从文生图 pipeline 切换到启用 PAG 的图生图 pipelinepipeline_pag AutoPipelineForText2Image.from_pretrained(stabilityai/stable-diffusion-xl-base-1.0, dtypetorch.float16) pipeline AutoPipelineForImage2Image.from_pipe(pipeline_t2i, enable_pagTrue)如果已有 pipeline 本身就启用了 PAG切换到图生图时 PAG 会自动保持启用pipeline_pag AutoPipelineForText2Image.from_pretrained(stabilityai/stable-diffusion-xl-base-1.0, enable_pagTrue, dtypetorch.float16) pipeline AutoPipelineForImage2Image.from_pipe(pipeline_t2i)生成示例注意strength控制重绘强度pag_scale 4.0 guidance_scale 7.0 url https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/sdxl-text2img.png init_image load_image(url) prompt a dog catching a frisbee in the jungle generator torch.Generator(devicecpu).manual_seed(0) image pipeline( prompt, imageinit_image, strength0.8, guidance_scaleguidance_scale, pag_scalepag_scale, generatorgenerator).images[0]Inpainting修复from diffusers import AutoPipelineForInpainting from diffusers.utils import load_image import torch pipeline AutoPipelineForInpainting.from_pretrained( stabilityai/stable-diffusion-xl-base-1.0, enable_pagTrue, dtypetorch.float16 ) pipeline.enable_model_cpu_offload()在已有修复 pipeline 上启用 PAG或从其他任务如文生图的 pipeline 转换pipeline_inpaint AutoPipelineForInpainting.from_pretrained(stabilityai/stable-diffusion-xl-base-1.0, dtypetorch.float16) pipeline AutoPipelineForInpainting.from_pipe(pipeline_inpaint, enable_pagTrue) # 或从文生图 pipeline 转换 pipeline_t2i AutoPipelineForText2Image.from_pretrained(stabilityai/stable-diffusion-xl-base-1.0, dtypetorch.float16) pipeline AutoPipelineForInpainting.from_pipe(pipeline_t2i, enable_pagTrue)生成示例img_url https://raw.githubusercontent.com/CompVis/latent-diffusion/main/data/inpainting_examples/overture-creations-5sI6fQgYIuo.png mask_url https://raw.githubusercontent.com/CompVis/latent-diffusion/main/data/inpainting_examples/overture-creations-5sI6fQgYIuo_mask.png init_image load_image(img_url).convert(RGB) mask_image load_image(mask_url).convert(RGB) prompt A majestic tiger sitting on a bench pag_scale 3.0 guidance_scale 7.5 generator torch.Generator(devicecpu).manual_seed(1) images pipeline( promptprompt, imageinit_image, mask_imagemask_image, strength0.8, num_inference_steps50, guidance_scaleguidance_scale, generatorgenerator, pag_scalepag_scale, ).images images[0]PAG 与 ControlNet 结合空提示下的结构控制PAG 的一大亮点是在ControlNet 搭配空提示无 prompt的场景下传统 CFG 无法生效而 PAG 依然可以显著提升生成质量。先创建ControlNetModel再连同 PAG 参数一起传入from diffusers import AutoPipelineForText2Image, ControlNetModel import torch controlnet ControlNetModel.from_pretrained( diffusers/controlnet-canny-sdxl-1.0, dtypetorch.float16 ) pipeline AutoPipelineForText2Image.from_pretrained( stabilityai/stable-diffusion-xl-base-1.0, controlnetcontrolnet, enable_pagTrue, pag_applied_layersmid, dtypetorch.float16 ) pipeline.enable_model_cpu_offload()已有 ControlNet pipeline 时可用AutoPipelineForText2Image.from_pipe(pipeline_controlnet, enable_pagTrue)直接启用。使用方式与普通 ControlNet 一致仅需额外传入pag_scale。下面的例子使用空 prompt 生成guidance_scale0完全依赖 PAG 与 ControlNet 条件from diffusers.utils import load_image canny_image load_image( https://huggingface.co/datasets/YiYiXu/testing-images/resolve/main/pag_control_input.png ) for pag_scale in [0.0, 3.0]: generator torch.Generator(devicecpu).manual_seed(1) images pipeline( prompt, controlnet_conditioning_scalecontrolnet_conditioning_scale, imagecanny_image, num_inference_steps50, guidance_scale0, generatorgenerator, pag_scalepag_scale, ).images images[0]参考仓库测试 tests/pipelines/pag/test_pag_controlnet_sdxl.py 与 tests/pipelines/pag/test_pag_controlnet_sd.py可以了解 ControlNetPAG 组合在 SDXL 与 SD 上的调用与校验方式。PAG 与 IP-Adapter 结合图像提示 结构增强IP-Adapter 可在不修改底层模型的前提下为扩散模型注入图像提示image prompting。PAG 与 IP-Adapter 可以同时启用用于减少伪影、改善整体构图from diffusers import AutoPipelineForText2Image from diffusers.utils import load_image from transformers import CLIPVisionModelWithProjection import torch image_encoder CLIPVisionModelWithProjection.from_pretrained( h94/IP-Adapter, subfoldermodels/image_encoder, dtypetorch.float16 ) pipeline AutoPipelineForText2Image.from_pretrained( stabilityai/stable-diffusion-xl-base-1.0, image_encoderimage_encoder, enable_pagTrue, dtypetorch.float16 ).to(cuda) # 或 mps、xpu、cpu pipeline.load_ip_adapter(h94/IP-Adapter, subfoldersdxl_models, weight_nameip-adapter-plus_sdxl_vit-h.bin) pag_scale 5.0 ip_adapter_scale 0.8 image load_image(https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/ip_adapter_diner.png) pipeline.set_ip_adapter_scale(ip_adapter_scale) generator torch.Generator(devicecpu).manual_seed(0) images pipeline( prompta polar bear sitting in a chair drinking a milkshake, ip_adapter_imageimage, negative_promptdeformed, ugly, wrong proportion, low res, bad anatomy, worst quality, low quality, num_inference_steps25, guidance_scale3.0, generatorgenerator, pag_scalepag_scale, ).images images[0]从源码看SDXL 系列 PAG pipeline 继承了IPAdapterMixin见 pipeline_pag_sd_xl.py#L28-L33因此 IP-Adapter 与 PAG 的叠加是原生支持的测试 tests/pipelines/pag/test_pag_sdxl.py 中也通过IPAdapterTesterMixin对组合能力做了覆盖。核心参数详解pag_applied_layers 与 pag_scalepag_applied_layers选择 PAG 作用的层pag_applied_layers是实例化 PAG pipeline 时的关键参数接受单个字符串或字符串列表每个字符串可以是唯一的层标识符或正则表达式完整标识符普通字符串down_blocks.2.attentions.0.transformer_blocks.0.attn1.processor完整标识符正则down_blocks.2.(attentions|motion_modules).0.transformer_blocks.0.attn1.processor部分标识符正则down_blocks.2或attn1标识符列表字符串与正则混用[blocks.1, blocks.(14|20), rdown_blocks\.(2,3)]⚠️官方警告由于支持用正则匹配层标识符使用不当可能引发非预期行为。官方推荐只使用blocks.{layer_index}与blocks.({layer_index_1|layer_index_2|...})两种形式其他写法虽然可行但可能绕过基础校验并产生意外结果。该参数在源码中的处理逻辑见 pag_utils.py#L151-L193为若非列表则包装为单元素列表逐项校验类型必须为字符串随后保存到self.pag_applied_layers。匹配时_set_pag_attn_processor会遍历 denoiser 的全部子模块用re.search(layer_id, name)做正则匹配并通过is_fake_integral_match防止blocks.1误匹配到blocks.10这类假整数匹配pag_utils.py#L58-L61。默认值只应用于 mid blocks中间块。修改此设置会显著影响输出因此官方建议在创建 pipeline 后使用set_pag_applied_layers方法动态调整寻找最适合你模型的层组合。示例prompt an insect robot preparing a delicious meal, anime style pipeline.set_pag_applied_layers(pag_layers) generator torch.Generator(devicecpu).manual_seed(0) images pipeline( promptprompt, num_inference_steps25, guidance_scaleguidance_scale, generatorgenerator, pag_scalepag_scale, ).images images[0]官方文档给出两组对照[down.block_2]与[down.block_2, up.block_1.attentions_0]说明叠加更多层会影响结构与细节的平衡需要针对模型与任务调优。pag_scale引导强度pag_scale是调用 pipeline 时传入的引导强度pag_scale0时 PAG 完全关闭增大pag_scale图像获得更连贯的语义结构、伪影更少过大时类似 CFG 的行为纹理变平滑、轻微过饱和官方 demo 常用pag_scale3.0可根据需求实验调整。其底层作用由_apply_perturbed_attention_guidance中的公式体现见上文PAGMixin小节PAG 项pag_scale * (noise_pred_text - noise_pred_perturb)把预测结果从结构退化样本方向拉开。此外还有pag_adaptive_scale自适应缩放系数启用后引导强度随去噪进程递减避免后期过度引导pag_utils.py#L87-L98。在 SDXL 的 PAG pipeline 测试配置中__call__签名要求包含pag_scale与pag_adaptive_scale两个参数见 test_pag_sdxl.py#L57-L59。支持的 Pipeline 类一览除通过AutoPipeline使用外也可以直接实例化以下 PAG pipeline均位于 src/diffusers/pipelines/pag/Pipeline 类对应源文件StableDiffusionPAGPipeline/StableDiffusionPAGImg2ImgPipeline/StableDiffusionPAGInpaintPipelinepipeline_pag_sd.py 等StableDiffusionControlNetPAGPipeline/StableDiffusionControlNetPAGInpaintPipelinepipeline_pag_controlnet_sd.py 等StableDiffusionXLPAGPipeline/StableDiffusionXLPAGImg2ImgPipeline/StableDiffusionXLPAGInpaintPipelinepipeline_pag_sd_xl.py 等StableDiffusionXLControlNetPAGPipeline/StableDiffusionXLControlNetPAGImg2ImgPipelinepipeline_pag_controlnet_sd_xl.py 等StableDiffusion3PAGPipeline/StableDiffusion3PAGImg2ImgPipelinepipeline_pag_sd_3.py 等PixArtSigmaPAGPipelinepipeline_pag_pixart_sigma.pySanaPAGPipelinepipeline_pag_sana.pyHunyuanDiTPAGPipelinepipeline_pag_hunyuandit.pyKolorsPAGPipelinepipeline_pag_kolors.pyAnimateDiffPAGPipelinepipeline_pag_sd_animatediff.py对应的测试覆盖位于 tests/pipelines/pag/其中 testing_utils.py 提供共享的PAGPipelineTesterMixin各模型测试如test_pag_sdxl.py、test_pag_sd3.py、test_pag_animatediff.py等据此验证 PAG 的启用、参数传递与确定性输出。总结与调参建议PAG 为扩散模型提供了一条零成本的质量提升路径免训练、免外挂模块仅通过替换自注意力处理器与调整噪声合成公式生效权重保持不变CFG 失效场景的救星无条件生成、ControlNet 空提示、图像复原修复/去模糊等场景中PAG 是少数能直接发挥作用的引导手段与现有生态无缝集成通过AutoPipelineenable_pagTrue一行启用支持from_pipe复用已有 pipeline且可与 ControlNet、IP-Adapter 叠加使用调参要点先固定pag_scale可从 3.0 起步再用set_pag_applied_layers尝试不同的层组合从默认的mid开始逐步叠加down/up块最后微调pag_scale与pag_adaptive_scale平衡结构强度与纹理细节。使用前请确认你的 PyTorch 版本不低于 2.0PAG 处理器依赖scaled_dot_product_attention并确认目标模型架构在当前仓库支持的 PAG pipeline 列表内。【免费下载链接】diffusers Diffusers: State-of-the-art diffusion models for image, video, and audio generation in PyTorch.项目地址: https://gitcode.com/GitHub_Trending/di/diffusers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表