Diffusion 课程文档

第二单元:微调、引导和条件控制

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始入门

第二单元:微调、引导和条件控制

欢迎来到 Hugging Face Diffusion 模型课程的第二单元!在本单元中,您将学习如何以新的方式使用和调整预训练的 diffusion 模型。您还将了解如何创建将附加输入作为条件控制的 diffusion 模型,以控制生成过程。

开始本单元 :rocket:

以下是本单元的步骤

  • 请确保您已注册本课程,以便在新材料发布时收到通知。
  • 通读以下材料,概述本单元的重点概念。
  • 查看微调和引导笔记本,了解如何使用 🤗 Diffusers 库在新数据集上微调现有的 diffusion 模型,以及如何使用引导修改采样过程。
  • 按照笔记本中的示例,分享您自定义模型的 Gradio 演示。
  • (可选)查看类别条件 Diffusion 模型示例笔记本,了解如何为生成过程添加额外的控制。
  • (可选)查看此视频,了解本单元材料的非正式讲解。

:loudspeaker: 不要忘记加入 Discord,您可以在 #diffusion-models-class 频道中讨论材料并分享您的作品。

微调

正如您在第一单元中可能看到的那样,从头开始训练 diffusion 模型可能非常耗时!特别是当我们追求更高的分辨率时,从头开始训练模型所需的时间和数据可能会变得不切实际。幸运的是,有一个解决方案:从已经训练好的模型开始!这样,我们从一个已经学会对某种图像进行去噪的模型开始,并且希望这能提供比从随机初始化的模型开始更好的起点。

Example images generated with a model trained on LSUN Bedrooms and fine-tuned for 500 steps on WikiArt

如果新数据在某种程度上类似于基础模型的原始训练数据(例如,如果您尝试生成卡通人脸,从在人脸上训练的模型开始可能是一个好主意),微调通常效果最佳,但令人惊讶的是,即使领域发生了很大变化,这种优势仍然存在。上图是从 在 LSUN Bedrooms 数据集上训练的模型生成的,并在 WikiArt 数据集上微调了 500 步。训练脚本包含在本单元的笔记本旁边,供您参考。

引导

无条件模型对生成的内容没有太多控制。我们可以训练一个条件模型(更多内容请参见下一节),该模型接受额外的输入来帮助引导生成过程,但是如果我们已经有一个训练好的无条件模型想要使用怎么办?这时就需要引导,这是一个过程,通过该过程,在生成过程的每个步骤中,模型预测都会根据某些引导函数进行评估和修改,从而使最终生成的图像更符合我们的喜好。

guidance example image

这个引导函数几乎可以是任何东西,使其成为一种强大的技术!在笔记本中,我们从一个简单的示例(控制颜色,如上面的示例输出所示)开始构建,到一个利用名为 CLIP 的强大预训练模型的示例,该模型使我们能够根据文本描述引导生成。

条件控制

引导是充分利用无条件 diffusion 模型的好方法,但是如果我们在训练期间有额外的信息(例如类别标签或图像标题)可用,那么我们也可以将其馈送到模型中,以便在模型进行预测时使用。这样做,我们就创建了一个条件模型,我们可以在推理时通过控制作为条件控制的内容来控制该模型。笔记本展示了一个类别条件模型的示例,该模型学习根据类别标签生成图像。

conditioning example

有许多方法可以传入此条件信息,例如

  • 将其作为 UNet 输入中的附加通道馈入。当条件信息与图像的形状相同时,通常使用此方法,例如分割掩码、深度图或图像的模糊版本(在恢复/超分辨率模型的情况下)。它也适用于其他类型的条件控制。例如,在笔记本中,类别标签被映射到嵌入,然后扩展为与输入图像相同的宽度和高度,以便可以将其作为附加通道馈入。
  • 创建嵌入,然后将其投影到与 UNet 的一个或多个内部层的输出通道数匹配的大小,然后将其添加到这些输出中。例如,时间步条件控制就是这样处理的。每个 Resnet 块的输出都添加了投影的时间步嵌入。当您有一个向量(例如 CLIP 图像嵌入)作为您的条件信息时,这很有用。一个值得注意的例子是 Stable Diffusion 的“图像变体”版本,它正是这样做的。
  • 添加可以“注意”作为条件控制传入的序列的交叉注意力层。当条件控制以某种文本形式出现时,这最有用 - 文本使用 transformer 模型映射到嵌入序列,然后 UNet 中的交叉注意力层用于将此信息合并到去噪路径中。我们将在第三单元中看到这方面的实际应用,届时我们将检查 Stable Diffusion 如何处理文本条件控制。

动手实践笔记本

章节 Colab Kaggle Gradient Studio Lab
微调和引导 Open In Colab Kaggle Gradient Open In SageMaker Studio Lab
类别条件 Diffusion 模型示例 Open In Colab Kaggle Gradient Open In SageMaker Studio Lab

现在,您已经掌握了足够的知识来开始使用随附的笔记本了!使用上面的链接在您选择的平台上打开它们。微调的计算量很大,因此如果您使用的是 Kaggle 或 Google Colab,请确保将运行时类型设置为“GPU”以获得最佳结果。

大部分材料都在微调和引导中,我们通过实际示例探讨了这两个主题。笔记本展示了如何在新数据上微调现有模型、添加引导以及如何将结果作为 Gradio 演示共享。有一个随附脚本 (finetune_model.py) 可以轻松地尝试不同的微调设置,并且有一个 示例 Space,您可以将其用作在 🤗 Spaces 上共享您自己的演示的模板。

类别条件 Diffusion 模型示例中,我们展示了一个简短的实际示例,说明如何使用 MNIST 数据集创建以类别标签为条件的 diffusion 模型。重点是以尽可能简单的方式演示核心思想:通过向模型提供关于它应该去噪的内容的额外信息,我们可以在稍后在推理时控制生成哪种类型的图像。

项目时间

按照微调和引导笔记本中的示例,微调您自己的模型,或选择一个现有模型并创建一个 Gradio 演示来展示您的新引导技能。不要忘记在 Discord、Twitter 等平台上分享您的演示,以便我们欣赏您的作品!

一些其他资源

Denoising Diffusion Implicit Models - 介绍了 DDIM 采样方法(由 DDIMScheduler 使用)

GLIDE: Towards Photorealistic Image Generation and Editing with Text-Guided Diffusion Models - 介绍了用于在文本上调节 diffusion 模型的方法

eDiffi: Text-to-Image Diffusion Models with an Ensemble of Expert Denoisers - 展示了如何将多种不同类型的条件控制结合使用,以更好地控制生成的样本类型

找到更多优质资源?请告诉我们,我们会将其添加到此列表中。

< > 在 GitHub 上更新