一文搞懂ESD 4种训练方法:esd-x、esd-u、esd-all、esd-x-strict到底怎么选?
【免费下载链接】erasingErasing Concepts from Diffusion Models项目地址: https://gitcode.com/gh_mirrors/er/erasing
想给 Stable Diffusion 这类扩散模型"洗掉"某个不想要的概念——某位画家的风格、某个物体甚至裸露内容,ESD(Erasing Concepts from Diffusion Models)是目前最受欢迎的开源方案。打开项目你会看到--train_method参数里有 esd-x、esd-u、esd-all、esd-x-strict 四种 ESD 训练方法,它们分别微调模型的不同部分,擦除效果和副作用截然不同。本文用一张对比表加一份场景速查,帮你 3 分钟搞懂扩散模型概念擦除训练方法到底怎么选。
ESD是什么?扩散模型概念擦除原理速览
ESD 全称 Erasing Concepts from Diffusion Models,出自 ICCV 2023。它不需要重新训练整个模型,而是用"要擦除的概念"作为提示词,对模型权重做一次轻量级微调:让模型在被问到该概念时,把生成结果"拉回"到不包含该概念的普通状态,同时尽量不动其他生成能力。
如上图,训练流程非常轻量:准备概念文本提示(如 "Van Gogh")加随机时间步 t,冻结原始模型当"老师",微调模型当"学生",用 L2 损失让学生模型在概念提示下的预测,逼近原始模型在空白提示下的预测——概念就这样被"抽走"。默认 200 步迭代,单张消费级显卡十几分钟即可完成。
💡 新能力:除了整概念擦除,还支持属性级擦除,比如只擦掉"牛仔的帽子"而保留牛仔本身。
ESD能擦掉什么?三大典型应用场景
从官方示例可以看出,ESD 训练方法主要覆盖三类应用:
- 🎨 擦除艺术风格:让模型不再模仿某位画家的笔触
- 🚫 擦除裸露等不适内容:用于内容审核与安全合规
- 📦 擦除特定物体:如从风景图中去掉汽车
ESD 4种训练方法核心区别:一张表看懂
| 训练方法 | 更新哪些参数 | 擦除力度 | 副作用 | 推荐场景 |
|---|---|---|---|---|
| esd-x | 仅交叉注意力层 | 中 | 很小 | 通用首选 |
| esd-u | 交叉注意力以外的所有层 | 强 | 较大 | 全局性概念(如裸露) |
| esd-all | 全部 UNet 参数 | 最强 | 最大 | 概念彻底消失 |
| esd-x-strict | 仅交叉注意力的 K/V 投影 | 精准 | 极小 | 精确擦除某个属性 |
四种方法的本质差异就是"参数更新范围",具体由utils/esd_trainer.py中的select_parameter_names决定:范围越大,擦得越狠,模型被"误伤"的概率也越高。
esd-x:只微调交叉注意力层,最稳的默认选择
交叉注意力层是文本提示词"写入"生成过程的地方。esd-x 只更新这一层,让"概念提示词"失效,几乎不影响无关内容,在艺术风格擦除任务上效果尤其出色:
- ✅ 优点:效果好、误伤小、训练最快
- 🎯 适合:绝大多数场景,SD / SDXL / FLUX / FLUX.2 Klein 全部支持
python esd_sd.py --erase_concept 'Van Gogh' --train_method 'esd-x'esd-u:绕开交叉注意力,全局擦除更彻底
esd-u(旧名 noxattn)更新交叉注意力之外的其余层,不依赖文本注意力,从更底层改变模型对这类内容的响应。论文实验显示它在擦除裸露这类全局概念上更有效:
- ⚠️ 代价:改动面大,画质与风格稳定性可能下降;SDXL 下仍属实验性,可能产生伪影
- 🎯 适合:对擦除强度要求高、可接受小幅画质损失
esd-all:全参数微调,擦除最强但副作用最大
esd-all(旧名 full)对 UNet 全部参数微调,擦除力度最强,概念基本"物理消灭"。但模型也可能"学歪":无关内容质量下降、训练痕迹变明显。除非目标就是全局擦除,否则不建议优先使用。
esd-x-strict:只改K/V投影,精准擦除属性的利器
esd-x-strict 只微调交叉注意力层的 K 与 V 投影矩阵(to_k / to_v),是四种方法中改动范围最小的"手术刀",特别适合配合--erase_from做属性级擦除:
python esd_sd.py --erase_concept 'cowboy hat' --erase_from 'cowboy' --train_method 'esd-x'效果:牛仔还是牛仔,但帽子消失了。想"擦得干净又不误伤",可以换成更精细的 esd-x-strict。
到底怎么选?ESD训练方法选择速查
- 🤷 不知道选什么 → 直接
esd-x - 🚫 擦裸露/全局概念 →
esd-u - 💥 要概念彻底消失 →
esd-all - 🎯 擦某个属性(帽子、配饰等)→
esd-x-strict - ⚡ 用 FLUX / FLUX.2 Klein → 仅支持
esd-x与esd-x-strict
快速上手:3步跑通ESD训练
第一步,克隆仓库并安装依赖:
git clone https://gitcode.com/gh_mirrors/er/erasing cd erasing pip install -r requirements.txt第二步,按模型选训练入口(esd_sd.py/esd_sdxl.py/esd_flux.py/esd_flux2_klein.py),再按上文速查选训练方法:
python esd_sdxl.py --erase_concept 'Van Gogh' --train_method 'esd-x-strict'第三步,出图验证效果。用notebooks/下的推理 notebook(如esd_inference_sd.ipynb)加载微调后的 checkpoint 出图;批量评估可用evalscripts/generate-images.py配合data/目录的提示词 CSV,具体参数说明见README.md。
新手常见问题
esd-u 和 esd-all 有什么区别?两者都是"大范围"擦除:esd-u 不动交叉注意力层,esd-all 全动。esd-all 擦除更彻底,但模型退化也更明显。
旧代码里的 xattn / noxattn / full 是什么?历史别名,与新版完全等价:xattn→esd-x、noxattn→esd-u、full→esd-all、xattn-strict→esd-x-strict。
训练需要什么配置?单张消费级显卡即可,默认 200 步迭代、学习率 5e-5(SD)量级,通常十几分钟完成,checkpoint 以 safetensors 格式保存到esd-models/目录。
【免费下载链接】erasingErasing Concepts from Diffusion Models项目地址: https://gitcode.com/gh_mirrors/er/erasing
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考