Press "Enter" to skip to content

使用InstructPix2Pix进行指令调整的稳定扩散

本文探讨了指令调优,以教会Stable Diffusion跟随指令来翻译或处理输入图像。通过这种方法,我们可以使用输入图像和“指令”来提示Stable Diffusion,例如- 对自然图像应用卡通滤镜。

教会Stable Diffusion遵循用户指令在输入图像上执行编辑的想法是在《InstructPix2Pix: 学习遵循图像编辑指令》中引入的。我们讨论了如何扩展InstructPix2Pix的训练策略,以遵循与图像翻译任务(如卡通化)和低级图像处理任务(如图像去雨)相关的更具体的指令。我们涵盖了以下内容:

  • 指令调优简介
  • 背后的动机
  • 数据集准备
  • 训练实验和结果
  • 潜在的应用和限制
  • 待解决的问题

我们的代码、预训练模型和数据集可以在这里找到。

介绍和动机

指令调优是一种通过监督的方式教导语言模型遵循指令来解决任务的方法。它是由Google在《Fine-tuned Language Models Are Zero-Shot Learners (FLAN)》中介绍的。从最近的时候开始,您可能还记得像Alpaca和FLAN V2这样的作品,它们是指令调优对各种任务有益的很好的示例。

下图展示了指令调优的一个公式化(也称为“指令微调”)。在FLAN V2论文中,作者采用一个预训练的语言模型(例如T5)并在一个示例数据集上进行微调,如下图所示。

通过这种方法,我们可以创建涵盖许多不同任务的示例,这使得指令调优成为一个多任务训练目标:

借鉴类似的思路,FLAN V2的作者们在数千个任务的混合数据集上进行指令调优,实现了对未见任务的零-shot泛化:

我们之所以进行这项工作的动机部分来自FLAN系列工作,部分来自InstructPix2Pix。我们想探索是否可能使用特定的指令和输入图像来提示Stable Diffusion,以按照我们的需求对它们进行处理。

预训练的InstructPix2Pix模型在遵循一般指令方面表现良好,但在遵循涉及特定变换的指令方面可能存在不足:

但我们仍然可以利用InstructPix2Pix的研究结果来适应我们的定制需求。

另一方面,像卡通化、图像去噪、图像去雨等任务的配对数据集是公开可用的,我们可以借鉴FLAN V2的思路构建指令提示的数据集。这样做可以将FLAN V2中探索的指令模板思想转移到这项工作中。

数据集准备

卡通化

在我们的初步实验中,我们提示InstructPix2Pix进行卡通化处理,但结果并不符合我们的期望。我们尝试了各种推理时的超参数组合(如图像引导尺度和推理步骤数),但结果仍然不令人满意。这促使我们以不同的方式来解决这个问题。

如前一节所示,我们希望从两个方面受益:

(1) InstructPix2Pix的训练方法和(2) 从FLAN中创建指令提示的数据集模板的灵活性。

我们首先为卡通化任务创建了一个指令提示的数据集。图5展示了我们的数据集创建流程:

具体来说,我们:

  1. 要求ChatGPT为以下指令生成50个同义句:“卡通化图像。”
  2. 然后,我们使用Imagennette数据集的一个随机子集(5000个样本),利用预训练的Whitebox CartoonGAN模型生成这些图像的卡通化版本。这些卡通化版本是我们希望我们的模型从中学习的标签。因此,从某种程度上说,这相当于将Whitebox CartoonGAN模型学到的偏见转移到我们的模型中。
  3. 然后,我们按以下格式创建我们的示例:

我们的最终卡通化数据集可以在这里找到。有关数据集准备的更多详细信息,请参阅此目录。我们通过对InstructPix2Pix进行微调并进行了实验,得到了令人满意的结果(详见“训练实验和结果”章节)。

然后我们尝试将这种方法推广到低级图像处理任务,如图像去雨、图像去噪和图像去模糊。

低级图像处理

我们专注于在MAXIM中探索的常见低级图像处理任务。特别地,我们对以下任务进行实验:去雨、去噪、低光图像增强和去模糊。

我们从上述数据集中为每个任务选取了不同数量的样本,并添加了提示构建了一个单一数据集,如下所示:

上述数据集通常以输入-输出对的形式提供,因此我们不必担心真实值。我们的最终数据集可以在此处获得。最终数据集如下所示:

总体而言,这种设置有助于从FLAN设置中绘制类比,我们在其中创建了不同任务的混合。这也有助于我们训练单个模型一次,在我们混合的不同任务中表现良好。这与低级图像处理中通常的做法有很大不同。像MAXIM这样的作品引入了一个能够模拟不同低级图像处理任务的单个模型架构,但是训练是在各个数据集上独立进行的。

训练实验和结果

我们的训练实验基于此脚本。我们的训练日志(包括验证样本和训练超参数)可在Weight and Biases上找到:

  • 卡通化(超参数)
  • 低级图像处理(超参数)

在训练时,我们探索了两个选项:

  1. 从现有的InstructPix2Pix检查点进行微调
  2. 从使用InstructPix2Pix训练方法的现有稳定扩散检查点进行微调

在我们的实验中,我们发现第一个选项有助于我们更快地适应我们的数据集(就生成质量而言)。

有关训练和超参数的更多细节,请查看我们的代码以及Weights and Biases上的相应运行页面。

卡通化结果

为了测试经过指导调整的卡通化模型,我们进行了以下输出的比较:

为了收集这些结果,我们从ImageNette的验证集中采样了图像。在使用我们的模型和预训练的InstructPix2Pix模型时,我们使用了以下提示:“生成图像的卡通化版本”。对于这两个模型,我们将image_guidance_scaleguidance_scale保持为1.5和7.0,推理步骤的数量为20。确实还需要进行更多关于这些超参数的实验,以研究它们对预训练的InstructPix2Pix模型结果的影响。

这里还有更多的比较结果。我们用于比较这些模型的代码在此处可用。

然而,我们的模型未能为ImageNette中的类别产生预期的输出,这在一定程度上是可以预料的,我们认为通过扩大训练数据集可能可以减轻这一问题。

低级图像处理结果

对于低级图像处理(我们的模型),我们遵循与上述相同的推理时间超参数:

  • 推理步骤数量:20
  • 图像指导比例:1.5
  • 指导比例:7.0

对于去雨任务,与基准和预训练的InstructPix2Pix模型的输出相比,我们的模型提供了令人信服的结果:

然而,对于低光图像增强任务,它还有很大的提升空间:

这种失败可能是由于我们的模型没有足够多的示例用于该任务以及更好的训练。我们也注意到在去模糊方面有类似的发现:

我们相信社区有机会探索低级图像处理任务混合对最终结果的影响。增加更具代表性的样本是否有助于改善最终结果?我们将这个问题留给社区进一步探索。

您可以尝试以下交互式演示,使稳定扩散遵循特定的说明:

潜在应用和限制

在图像编辑领域,领域专家的想法(要执行的任务)与编辑工具(如Lightroom)中需要应用的操作之间存在脱节。能够将自然语言目标轻松转化为低级图像编辑基元的简单方法将带来无缝的用户体验。随着InstructPix2Pix等机制的引入,可以说我们正在逐渐接近这个领域。

然而,仍然存在一些挑战:

  • 这些系统需要适用于大尺寸高分辨率的原始图像。
  • 扩散模型经常在图像空间中发明或重新解释指令以执行修改。对于真实的图像编辑应用来说,这是不可接受的。

开放问题

我们承认我们的实验还是初步的。我们没有深入剖析我们实验中的明显因素。因此,在这里我们列举了我们实验过程中出现的一些开放性问题:

  • 如果我们扩大数据集会发生什么?这会对生成样本的质量产生什么影响?我们只尝试了少数几个示例。作为对比,InstructPix2Pix是在超过30000个样本上进行训练的。

  • 在任务混合更广泛的情况下,训练时间更长会有什么影响?在我们的实验中,我们没有进行超参数调整,更不用说对训练步数进行剖析了。

  • 这种方法对于常见的“指令调整”领域中更广泛的任务混合有何泛化能力?我们只涵盖了四个低级图像处理任务:去雨、去模糊、去噪和低光图像增强。是否通过添加更多任务和更具代表性的样本来帮助模型对未见任务进行泛化,或者通过任务的组合(例如:“对图像进行去模糊和去噪”)来帮助模型泛化?

  • 在运行时使用同义指令的不同变体是否有助于提高性能?对于卡通化,我们在数据集创建过程中从ChatGPT生成的同义指令集中随机抽样一个指令。但是,如果我们在训练过程中进行随机抽样会发生什么?

    对于低级图像处理,我们使用固定的指令。如果我们按照类似的方法为每个任务和输入图像使用同义指令,会发生什么?

  • 如果我们使用ControlNet训练设置会发生什么?ControlNet还允许将预先训练的文本到图像扩散模型调整为以附加图像为条件(例如语义分割图、Canny边缘图等)。如果您有兴趣,可以使用本文中介绍的数据集,并参考本文进行ControlNet训练。

结论

在本文中,我们介绍了我们对“指令调整”稳定扩散的探索。虽然预训练的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},
}
Leave a Reply

Your email address will not be published. Required fields are marked *