扩散模型课程文档

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

Hugging Face's logo
加入 Hugging Face 社区

并获得增强文档体验

开始使用

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

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

开始本单元 :rocket:

本单元的步骤如下

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

:loudspeaker: 不要忘记加入Discord,您可以在 #diffusion-models-class 频道中讨论学习内容并分享您的成果。

微调

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

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

微调通常在新的数据与基础模型的原始训练数据有些相似的情况下效果最好(例如,从在人脸上训练的模型开始可能是您尝试生成卡通人脸时的好主意),但令人惊讶的是,即使域发生很大变化,其益处仍然存在。上面的图片是通过在 LSUN 卧室数据集上训练的模型 上进行微调生成的,并在 WikiArt 数据集上训练了 500 步。该 训练脚本 包含在内供参考,与本单元的笔记本一起使用。

引导

无条件模型无法对生成的内容进行太多控制。我们可以训练一个条件化模型(下一节将详细介绍),该模型接受额外的输入来帮助引导生成过程,但如果我们已经有一个想要使用的训练过的无条件模型怎么办?这时就出现了引导,这是一个在生成过程的每个步骤中评估模型预测值并对其进行修改的过程,从而使最终生成的图像更符合我们的喜好。

guidance example image

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

条件化

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

conditioning example

有多种方法可以传入这些条件化信息,例如

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

动手笔记本

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

到目前为止,您已经了解了开始使用附带笔记本的知识!使用上面的链接,在您选择的平台中打开它们。微调在计算上非常密集,因此,如果您使用 Kaggle 或 Google Colab,请确保将运行时类型设置为“GPU”以获得最佳结果。

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

类条件扩散模型示例中,我们展示了使用 MNIST 数据集创建类条件扩散模型的简短实际示例。重点是尽可能简单地展示核心思想:通过向模型提供有关它应该去噪的内容的额外信息,我们可以在推理时控制生成哪种图像。

项目时间

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

一些额外的资源

去噪扩散隐式模型 - 引入了 DDIM 采样方法(由 DDIMScheduler 使用)

GLIDE:走向具有文本引导扩散模型的逼真图像生成和编辑 - 引入了将扩散模型条件化为文本的方法

eDiffi:具有专家去噪器集合的文本到图像扩散模型 - 展示了如何将多种条件组合使用,以获得对生成样本类型的更多控制

找到更多很棒的资源?让我们知道,我们会将它们添加到此列表中。