通过 InstructPix2Pix 对 Stable Diffusion 进行指令调优
本文探讨如何通过指令调优,教会 Stable Diffusion 模型遵循指令来转换或处理输入图像。通过这种方法,我们可以使用输入图像和一条“指令”来提示 Stable Diffusion,例如,“对自然图像应用卡通滤镜”。
![]() |
---|
图 1:我们探索 Stable Diffusion 的指令调优能力。在此图中,我们使用涉及不同变换和输入图像的提示来提示一个经过指令调优的 Stable Diffusion 系统。调优后的系统似乎能够学习输入提示中陈述的这些变换。图片在彩色和放大后观看效果更佳。 |
这种教 Stable Diffusion 遵循用户指令对输入图像进行编辑的想法,最初是在 InstructPix2Pix: Learning to Follow Image Editing Instructions 这篇论文中提出的。我们讨论了如何扩展 InstructPix2Pix 的训练策略,使其能够遵循更具体的指令,这些指令涉及图像转换任务(如卡通化)和底层图像处理任务(如图像去雨)。我们将涵盖以下内容:
我们的代码、预训练模型和数据集可以在这里找到。
引言与动机
指令调优是一种监督学习方法,用于教语言模型遵循指令来解决任务。它由谷歌在论文 Fine-tuned Language Models Are Zero-Shot Learners (FLAN) 中引入。你可能还记得近期的工作,如 Alpaca 和 FLAN V2,它们都是指令调优对各种任务带来益处的很好例子。
下图展示了指令调优(也称为“指令微调”)的构想。在 FLAN V2 论文中,作者们采用了一个预训练的语言模型(例如 T5),并在一组示例数据集上对其进行微调,如下图所示。
通过这种方法,可以创建涵盖许多不同任务的示例,这使得指令调优成为一个多任务训练目标。
输入 | 标签 | 任务 |
---|---|---|
预测以下句子的 情感:“这部电影 非常精彩。我一秒钟 都无法移开视线。” (情感) |
积极 | 情感分析 / 序列分类 |
请回答以下 问题。 氮气的沸点是 多少? |
320.4°F | 问答 |
将以下英文句子 翻译成德语:“I have a cat.” |
Ich habe eine Katze. | 机器翻译 |
... | ... | ... |
遵循类似的理念,FLAN V2 的作者们在一个包含数千个任务的混合体上进行指令调优,并实现了对未见任务的零样本泛化能力。
我们这项工作的动机部分来自 FLAN 系列工作,部分来自 InstructPix2Pix。我们想探索是否可以通过具体的指令和输入图像来提示 Stable Diffusion,让其按我们的需求处理图像。
预训练的 InstructPix2Pix 模型在遵循通用指令方面表现良好,但在遵循涉及特定转换的指令时可能会表现不佳。
![]() |
---|
图 4:我们观察到,对于输入图像(左列),我们的模型(右列)相比于预训练的 InstructPix2Pix 模型(中列),能更忠实地执行“卡通化”任务。有趣的是,第一行的结果显示,预训练的 InstructPix2Pix 模型几乎完全失败。图片在彩色和放大后观看效果更佳。查看原图。 |
但我们仍然可以利用 InstructPix2Pix 的发现来满足我们的定制需求。
另一方面,像 卡通化、图像去噪、图像去雨 等任务的成对数据集是公开可用的,我们可以借鉴 FLAN V2 的灵感,利用这些数据集构建带指令提示的数据集。这样做使我们能够将 FLAN V2 中探索的指令模板化思想应用到这项工作中。
数据集准备
卡通化
在我们早期的实验中,我们提示 InstructPix2Pix 执行卡通化任务,但结果未达到我们的预期。我们尝试了各种推理时超参数组合(如图像引导缩放系数和推理步数),但结果仍然不令人满意。这促使我们采用不同的方法来解决这个问题。
正如上一节所暗示的,我们希望从两个方面受益:
(1) InstructPix2Pix 的训练方法,以及 (2) 从 FLAN 借鉴的创建带指令提示的数据集模板的灵活性。
我们首先为卡通化任务创建了一个带指令提示的数据集。图 5 展示了我们的数据集创建流程:
具体来说,我们
- 要求 ChatGPT 为以下指令生成 50 个同义句:“将图像卡通化。”
- 然后,我们使用了 Imagenette 数据集的一个随机子集(5000 个样本),并利用一个预训练的 Whitebox CartoonGAN 模型来生成这些图像的卡通化版本。这些卡通化版本是我们希望模型学习的标签。因此,在某种程度上,这相当于将 Whitebox CartoonGAN 模型学到的偏差迁移到我们的模型中。
- 接着,我们按以下格式创建我们的示例:
我们最终的卡通化数据集可以在这里找到。有关数据集准备的更多细节,请参阅这个目录。我们通过对 InstructPix2Pix 进行微调来实验这个数据集,并获得了有希望的结果(更多细节见“训练实验与结果”部分)。
然后,我们继续探索是否可以将这种方法推广到底层图像处理任务,如图像去雨、图像去噪和图像去模糊。
底层图像处理
我们专注于 MAXIM 中探讨的常见底层图像处理任务。具体来说,我们针对以下任务进行了实验:去雨、去噪、低光照图像增强和去模糊。
我们从以下数据集中为每个任务抽取了不同数量的样本,并构建了一个单一的数据集,其中添加了如下提示:
任务 | 提示 | 数据集 | 样本数量 |
---|---|---|---|
去模糊 | “deblur the blurry image” (去除模糊图像的模糊) | REDS (train_blur 和 train_sharp ) |
1200 |
去雨 | “derain the image” (去除图像中的雨) | Rain13k | 686 |
去噪 | “denoise the noisy image” (去除噪声图像的噪声) | SIDD | 8 |
低光照 图像增强 |
“enhance the low-light image” (增强低光照图像) | LOL | 23 |
上述数据集通常以输入-输出对的形式提供,因此我们不必担心真实标签(ground-truth)。我们的最终数据集可在此处获取。最终的数据集如下所示:
总的来说,这种设置有助于与 FLAN 的设置进行类比,我们创建了一个包含不同任务的混合体。这也帮助我们一次性训练一个单一模型,使其在我们混合的任务中表现良好。这与底层图像处理中通常的做法有很大不同。像 MAXIM 这样的工作引入了一种能够对不同底层图像处理任务进行建模的单一模型架构,但训练是在各个数据集上独立进行的。
训练实验与结果
我们的训练实验基于这个脚本。我们的训练日志(包括验证样本和训练超参数)可在 Weight and Biases 上查看:
在训练时,我们探索了两种方案:
- 从现有的 InstructPix2Pix 检查点进行微调
- 使用 InstructPix2Pix 训练方法,从现有的 Stable Diffusion 检查点进行微调
在我们的实验中,我们发现第一种方案能帮助我们更快地适应我们的数据集(在生成质量方面)。
关于训练和超参数的更多细节,我们鼓励您查看我们的代码以及 Weights and Biases 上的相应运行页面。
卡通化结果
为了测试指令调优的卡通化模型,我们对输出进行了如下比较:
![]() |
---|
图 8:我们将我们的指令调优卡通化模型(最后一列)的结果与 CartoonGAN 模型(第二列)和预训练的 InstructPix2Pix 模型(第三列)的结果进行了比较。很明显,指令调优模型能更忠实地匹配 CartoonGAN 模型的输出。图片在彩色和放大后观看效果更佳。查看原图。 |
为了收集这些结果,我们从 ImageNette 的 `validation` 拆分中采样了图像。在使用我们的模型和预训练的 InstructPix2Pix 模型时,我们使用了以下提示:“生成图像的卡通化版本”。对于这两个模型,我们将 `image_guidance_scale` 和 `guidance_scale` 分别设置为 1.5 和 7.0,推理步数设置为 20。当然,还需要围绕这些超参数进行更多实验,以研究它们如何影响预训练的 InstructPix2Pix 模型的结果。
更多比较结果可在此处查看。我们用于比较这些模型的代码可在此处获取。
然而,我们的模型未能为 ImageNette 中那些在训练中见得不够多的类别生成预期的输出。这在某种程度上是预料之中的,我们相信可以通过扩大训练数据集来缓解这个问题。
底层图像处理结果
对于底层图像处理(我们的模型),我们沿用了与上述相同的推理时超参数:
- 推理步数:20
- 图像引导缩放系数:1.5
- 引导缩放系数:7.0
对于去雨任务,与真实标签(ground-truth)和预训练的 InstructPix2Pix 模型输出相比,我们的模型提供了令人信服的结果:
![]() |
---|
图 9:去雨结果(彩色和放大后观看效果更佳)。推理提示:“derain the image”(与训练集相同)。查看原图。 |
然而,对于低光照图像增强,结果还有很多待改进之处:
![]() |
---|
图 10:低光照图像增强结果(彩色和放大后观看效果更佳)。推理提示:“enhance the low-light image”(与训练集相同)。查看原图。 |
这种失败或许可以归因于我们的模型没有见到足够多的该任务示例,也可能需要更好的训练。我们在去模糊任务中也观察到了类似的结果:
![]() |
---|
图 11:去模糊结果(彩色和放大后观看效果更佳)。推理提示:“deblur the image”(与训练集相同)。查看原图。 |
我们相信,社区有机会探索底层图像处理的任务混合在多大程度上影响最终结果。增加任务混合中更具代表性的样本是否有助于改善最终结果? 我们将这个问题留给社区进一步探索。
您可以尝试下面的交互式演示,让 Stable Diffusion 遵循特定指令:
潜在应用与局限性
在图像编辑领域,领域专家脑中的想法(要执行的任务)与在编辑工具(如 Lightroom)中需要应用的操作之间存在脱节。有一种简单的方法可以将自然语言目标转换为底层图像编辑基元,这将带来无缝的用户体验。随着像 InstructPix2Pix 这样的机制的引入,可以说我们正在接近那个领域。
然而,挑战依然存在:
- 这些系统需要能够处理大型高分辨率的原始图像。
- 扩散模型经常会创造或重新解释指令,以在图像空间中进行修改。对于一个现实的图像编辑应用来说,这是不可接受的。
待解决的问题
我们承认我们的实验是初步的。我们没有深入探究实验中的明显影响因素。因此,我们在此列出一些在实验过程中出现的待解决问题:
当我们扩大数据集规模时会发生什么? 这对生成样本的质量有何影响?我们只用少量样本进行了实验。相比之下,InstructPix2Pix 是在超过 30000 个样本上训练的。
训练更长时间会产生什么影响,尤其是在任务混合更广泛的情况下? 在我们的实验中,我们没有进行超参数调优,更不用说对训练步数进行消融实验了。
这种方法如何推广到“指令调优”世界中通常进行的更广泛的任务混合中? 我们只涵盖了四种底层图像处理任务:去雨、去模糊、去噪和低光照图像增强。在任务混合中添加更多任务和更具代表性的样本是否有助于模型泛化到未见过的任务,或者任务的组合(例如:“去模糊图像并去噪”)?
动态使用同一指令的不同变体是否有助于提高性能? 对于卡通化,我们在数据集创建期间从 ChatGPT 生成的同义指令集中随机采样了一条指令。但如果我们在训练期间进行随机采样会发生什么?
对于底层图像处理,我们使用了固定的指令。如果我们对每个任务和输入图像都采用类似的同义指令方法会发生什么?
当我们改用 ControlNet 训练设置时会发生什么? ControlNet 也允许将预训练的文本到图像扩散模型调整为以附加图像(如语义分割图、canny 边缘图等)为条件。如果您感兴趣,可以使用本文中介绍的数据集,并参考这篇文章进行 ControlNet 训练。
结论
在这篇文章中,我们介绍了我们对 Stable Diffusion 进行“指令调优”的探索。虽然预训练的 InstructPix2Pix 模型在遵循通用图像编辑指令方面表现良好,但在面对更具体的指令时可能会失效。为了解决这个问题,我们讨论了如何准备我们的数据集以进一步微调 InstructPix2Pix,并展示了我们的结果。如上所述,我们的结果仍然是初步的。但我们希望这项工作能为研究类似问题的研究人员提供一个基础,并激励他们进一步探索那些待解决的问题。
链接
- 训练和推理代码: https://github.com/huggingface/instruction-tuned-sd
- 演示: https://huggingface.co/spaces/instruction-tuning-sd/instruction-tuned-sd
- InstructPix2Pix: https://huggingface.co/timbrooks/instruct-pix2pix
- 本文的数据集和模型: https://huggingface.co/instruction-tuning-sd
感谢 Alara Dirik 和 Zhengzhong Tu 提供的有益讨论。感谢 Pedro Cuenca 和 Kashif Rasul 对本文的有益审阅。
引用
要引用这项工作,请使用以下引用格式:
@article{
Paul2023instruction-tuning-sd,
author = {Paul, Sayak},
title = {Instruction-tuning Stable Diffusion with InstructPix2Pix},
journal = {Hugging Face Blog},
year = {2023},
note = {https://huggingface.co/blog/instruction-tuning-sd},
}