走进ESD训练核心:Erasing Concepts from Diffusion Models损失函数与训练步逐行拆解

发布时间:2026/8/21 16:06:40
走进ESD训练核心:Erasing Concepts from Diffusion Models损失函数与训练步逐行拆解 走进ESD训练核心Erasing Concepts from Diffusion Models损失函数与训练步逐行拆解【免费下载链接】erasingErasing Concepts from Diffusion Models项目地址: https://gitcode.com/gh_mirrors/er/erasing想让 Stable Diffusion 再也画不出梵高风格、再也生成不了某个物体靠的正是 Erasing Concepts from Diffusion Models扩散模型概念擦除简称 ESD技术。这篇 ESD 训练教程会带你走进训练核心把损失函数公式和每一次训练步的代码逻辑逐行拆解让新手也能看懂概念擦除到底是怎么学出来的。ESD 概念擦除的本质只改参数不改数据ESD 训练的思路非常巧妙不重新收集数据集也不修改提示词而是微调扩散模型自身的参数让模型在某个概念的提示下主动偏离原来的输出方向。训练时同时维护两份参数——一份是冻结的原始模型base一份是可训练的学生模型student代码里通过PreparedComponent的use_base()/use_student()在前后向之间无缝切换对应文件utils/esd_trainer.py。上图就是 ESD 训练的整体框架左侧微调模型参数 θ右侧冻结原始模型 θ*两者在同一张带噪潜变量 x_t 上做噪声预测最后通过 L2 损失把学生模型的预测修正到目标方向——这正是概念擦除的数学根基。ESD 损失函数公式逐项拆解一行代码背后的三重预测训练主循环中真正算损失的只有一行loss F.mse_loss(step_result.model_pred.float(), step_result.target.float())这是标准的均方误差MSE损失但真正的精髓藏在target里。它的计算出现在utils/esd_trainer.py的每个家族适配器中公式统一为target ε_from − η · (ε_erase − ε_null)其中 η 就是negative_guidance默认 2。逐个符号拆开看ε_erase用待擦除概念如 Van Gogh作提示冻结模型预测出的噪声代表模型对该概念的既有认知ε_null用空提示词预测的噪声代表无条件的基线输出ε_from用erase_from概念预测的噪声。这是 ESD 的进阶玩法——你可以只从牛仔里擦掉牛仔帽而不是抹掉整个牛仔。未指定时 ε_from 就等于 ε_erasemodel_pred学生模型在概念提示下的噪声预测。训练目标一目了然让学生模型在概念 c 下的输出向不含 c 的方向靠拢即把概念带来的那部分噪声增量ε_erase − ε_null按系数 η 减掉同时用 ε_from 作为锚点锁定其余内容不变。这样擦除就做到精准、只动该动的地方。ESD 训练步逐行拆解一次迭代的 6 个关键动作以 SD 家族的training_step为例一次训练步utils/esd_trainer.py第 415 行起可以拆成 6 步随机时间步采样run_till_timestep random.randint(0, num_inference_steps - 1)在 0~49 之间随机选一个去噪进度让模型在各个噪声强度上都被矫正擦除更彻底冻结模型采样潜变量 x_t把学生参数换回 base 参数在torch.no_grad()下用采样函数从噪声跑到指定时间步得到一张带噪潜变量 x_t作为后续所有前向的共享输入三次无梯度前向冻结的 base 模型分别用概念、空提示、erase_from 三种提示词对同一张 x_t 预测噪声得到 ε_erase、ε_null、ε_from切换到学生模型use_student()后恢复梯度学生模型在概念提示下前向得到model_pred计算损失按上面的公式组装target再做 MSE反向传播与更新loss.backward()后执行optimizer.step()Adam 优化器只更新被选中的学生参数。这个过程在 SD、SDXL、FLUX、FLUX.2 Klein 四个家族中完全同构只是采样器、时间步计算和注意力模块的调用方式不同这正是本项目共享同一套训练核心的设计亮点。训练方法怎么选esd-x、esd-u、esd-all、esd-x-strict擦哪里决定了擦除的精度与副作用。train_method参数通过select_parameter_names决定哪些参数进入学生模型训练方法更新范围适用场景esd-x仅 cross-attentionattn2最常用擦除指定概念且副作用小esd-x-strict仅 attn2 的 to_k / to_v更精准适合风格类擦除esd-u除 cross-attention 外的其余参数全局擦除副作用较大esd-all整个 UNet/Transformer最强擦除但可能损伤画质selfattn仅 self-attentionattn1SD 专属研究用通常一条经验法则先试 esd-x不够精准再上 esd-x-strict。SDXL 下使用 esd-u / esd-all 时代码会主动给出警告因为它们会更新 UNet 的很大一部分容易让整体画质明显退化。训练循环与模型保存200 步出一枚概念擦除模型训练入口esd_sd.py、esd_sdxl.py、esd_flux.py、esd_flux2_klein.py把命令行参数打包成ESDConfig后统一交给run_esd_trainingutils/esd_trainer.py第 1161 行。默认只跑 200 次迭代配合这些工程优化训练非常轻量VAE 与文本编码器在缓存好 embedding 后直接卸载到 CPU训练显存几乎减半支持 bfloat16、梯度检查点与 TF32SD 的默认学习率 5e-5SDXL 的 esd-x 为 2e-4训练完成由utils/esd_checkpoint.py保存为.safetensors文件命名形如esd-Van_Gogh-from-Van_Gogh-esdx.safetensors并内嵌train_method、erase_concept等元数据加载时能自动识别目标是 unet 还是 transformer。ESD 训练效果长什么样三大应用场景训练出的概念擦除模型能直接用于图像生成。下图中可以看到 ESD 在三个方向的典型应用——擦除裸体内容、擦除艺术风格、擦除特定物体对艺术风格这类主观概念ESD 的效果同样直观——Original SD 保留梵高/Thomas Kinkade 等风格而经过 ESD 训练后模型输出的画面不再带有目标风格量化评估上ESD 在 NudeNet 裸露部位检测任务中的表现也相当突出绝大多数部位的暴露率下降接近 100%快速开始一条命令训练你的概念擦除模型安装依赖后在项目根目录直接运行python esd_sd.py --erase_concept Van Gogh --train_method esd-x如果想做从牛仔中擦掉牛仔帽这种属性级擦除加上--erase_from cowboy即可。FLUX 用户则改用python esd_flux.py --erase_concept monster --train_method esd-x --negative_guidance 2。训练好的模型可参考notebooks/下的推理 notebook 加载使用。总结一下ESD 训练的核心就是用冻结原模型的三种噪声预测组装出一个擦除目标再让学生模型用 MSE 去逼近它。理解了这条损失链路和 6 步训练循环你就真正掌握了 Erasing Concepts from Diffusion Models 的原理也能自信地调参、换基座模型、扩展自己的擦除场景了。【免费下载链接】erasingErasing Concepts from Diffusion Models项目地址: https://gitcode.com/gh_mirrors/er/erasing创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考