学习 AI 绘画系列(6):Stable Diffusion模型微调

前言

扩散模型是非常强大的图像生成工具,但有时候无论如何调整提示词或优化超参数,都无法获得理想的结果。当调整提示词或优化超参数这种方法无效时,可以选择微调模型。

微调通常非常耗费资源,但是使用 Dream Booths 技术可以用较少的资源来微调Stable Diffusion。下面我们介绍,如何只使用少量图像微调Stable Diffusion模型,生成自定义的图像结果。

在前几篇学习 AI 绘画系列文章中,我们已经探讨了通过调整提示词和参数来控制扩散模型的输出。现在,我们将讨论如何教模型生成从未见过的主题图像。例如,我们将教模型生成梵高风格的画作。为此,我们需要学习两种新的微调扩散模型技术。第一种技术叫Dream Booth,它能用极少量的示例数据教扩散模型新主题。在下面的示例中,我们只用六张照片来微调模型。第二种技术是Laura,代表低秩适应(Low Rank Adaptation)。现在,让我们先了解Dream Booth技术。

所有的AI设计工具,模型和插件,都已经整理好了,👇获取~在这里插入图片描述

我们思考一个问题,使用小数据集来微调扩散模型是否会存在困难?有什么困难

**首先,数据的稳健性是个问题。**例如,六张Andrew的照片或许能生成一个不错的头像,但不足以涵盖Andrew在不同情境下的形象。

**其次,是语言漂移问题。**当我们微调模型时,需要在提升特定任务性能和避免损害模型其他任务表现之间找到平衡。如果我们用六张Andrew的照片,每张配上“一个名叫Andrew的男人的照片”这个提示词进行微调,模型对“照片”和“男人”的理解可能会偏向这个小数据集。这可能导致模型在生成非Andrew的图像时出现质量下降的情况,例如它可能认为所有男人都像Andrew,或者每张照片中都应该包含Andrew。Dream Booth在很大程度上通过利用扩散模型对世界的现有理解解决了这些问题。Dream Booth论文的作者称之为语义先验知识。类似于阅读新词时依赖上下文线索。当模型看到像“一个名叫Andrew的男人的照片”这样的提示时,它可能不知道Andrew长什么样,但它通常知道一个男人的照片应该是什么样子。它可以在训练中利用这些信息,使我们能够用更小的示例数据集进行训练。

Dream Booth的操作步骤如下:

首先,选择一个模型中很少见到的Token,例如用括号括起来的“V”。训练循环将覆盖模型与这个Token关联的信息。

然后,将这个稀有Token与另一个通常描述你主题类别的Token配对。例如,对于Andrew,我们可能选择Token对“[V] man”。然后,将包含这个Token对的提示词与Andrew的图像关联起来。例如,如果我们的数据集中有一张Andrew打篮球的照片,我们可能将其与提示词“一个名叫[V] man打篮球的照片”关联。模型就能够利用它对句子中所有其他词语的先验理解来指导其生成。

因此,即使数据集不是很全面,因为它知道一个男人打篮球的照片大概是什么样子,它也能识别出Andrew打篮球的照片与一般男人打篮球的照片之间的特定差异。微调后,模型应该将Token对“[V] man”专门与Andrew相关联。

这可能解决了小数据集的问题,但并没有解决语言漂移的问题。

你可能会认为我们几乎肯定会在训练过程中摧毁模型对“man”的定义。Dream Booth通过一种聪明的方式解决了这个问题。论文的作者创建了一种自定义的损失度量,称为先验保留损失(Prior Preservation Loss),它实现了一种有趣的正则化形式。先验保留通过惩罚模型远离其对世界的现有理解来解决这个问题。

一般来说,它的工作方式如下:创建一个带有提示的图像数据集,例如六张Andrew的照片,标题如“一个名叫[V] man的照片”。在Dream Booth文献中,我们称这些为实例图像和实例提示。在后面的代码示例中,将为每张图片使用单一提示词,但也可以尝试为每张图片编写自定义提示词。甚至可以使用BLIMP这样的模型自动生成图像标题,这在处理大量图像时非常有用。然后,选择一个能代表我们担心模型在微调过程中丧失的所有概念的提示词,在Dream Booth文献中称为类提示词。例如,如果实例提示词是“一个名叫[V] man的照片”,类提示词就是简单的“一个男人的照片”。使用类提示词,我们可以生成100到200张经过扩散处理的照片。有了这些照片,可以构建一个强大分布,这个分布代表了模型对这些提示词概念的先验理解。

在训练过程中,需要计算两个损失:

**首先是实例数据的损失。**即模型在给定修改过的Token对时重构这些Andrew图像的能力。

**其次是类数据的损失。**即模型在用类提示词提示时,模型生成的图像与先验分布的接近程度。类分布是直接从模型在进行任何微调之前抽样的,它为衡量模型漂移的程度提供了一个具体的基础。

如果在微调前后给出相同的提示模型生成的图像差异很大,就说明发生了一些漂移。可以将这两个损失结合起来,称为实例损失和类损失,给出一个综合损失度量。

我们从理论上了解了Dream Booth,现在让我们用代码实现它。

1. 我们使用Comet记录相关参数和指标。导入并初始化Comet

 !pip install -q accelerate torch diffusers transformers comet_ml
import comet_ml``   ``comet_ml.init(anonymous=True)

2. 导入并准备模型

import torch``   ``if torch.cuda.is_available():`    `model_name = 'stabilityai/stable-diffusion-xl-base-1.0'``else:`    `model_name = './models/runwayml/stable-diffusion-v1-5'``   ``# Define hyperparameters``   ``hyperparameters = {`    `"instance_prompt": "a photo of a [V] man",`    `"class_prompt": "a photo of a man",`    `"seed": 4329,`    `"pretrained_model_name_or_path": model_name,`    `"resolution": 1024 if torch.cuda.is_available() else 512,`    `"num_inference_steps": 50,`    `"guidance_scale": 5.0,`    `"num_class_images": 200,`    `"prior_loss_weight": 1.0``}
# Set new Comet experiment``experiment = comet_ml.Experiment()

大部分重点将在超参数上,如何调整它们以控制扩散模型的输出。在运行下面这些示例代码时我们根据是否有GPU导入不同的模型。如果有GPU,我们将使用Stable Diffusion XL,这是一个更大的稳定扩散模型,具有非常高的图像质量。如果运行在CPU上,我们将使用Stable Diffusion 1.5,这是一个较早的模型,仍能生成高质量图像,只是不如前者强大。

_代码中有实例提示和类提示,还设置了一个手动种子以确保结果可重现。可以看到,分辨率设置为有GPU时为124像素,无GPU时为512像素,因为不同稳定扩散模型在不同尺寸上表现更好。__推理步数(Inference Steps)_为50,引导强度(Guidance Scale)为5.0,默认生成200张类图像,先验损失权重为1.0。先验损失权重是一个数值,决定在计算先验保留时类损失的比例。如果我们只是为了学习不在项目中实操,可以将其设置为0。如果非常关心模型在训练过程中不漂移,可以将其增加到更高的值。

3. 生成类图像

from utils import DreamBoothTrainer``   ``trainer = DreamBoothTrainer(hyperparameters)``   ``# To run the training pipeline``trainer.generate_class_images()

_生成图像的代码需要 GPU 才能运行,而且需要的时间很长。上面用到的utils代码在文章的末尾。
_

为了节省时间,我们可以不生成类图像,从这里下载已有的类图像进行练习。

4. 下载类图像

import shutil``   ``# Get images``class_artifact = experiment.get_artifact('ckaiser/class-images-15')``class_artifact.download('./')``   ``shutil.unpack_archive('./class.zip', './class')``   ``   ``# Print some images``trainer.display_images("class")

# Get the instance dataset (images of Andrew)``andrew_artifact = experiment.get_artifact('ckaiser/andrew-dataset')``andrew_artifact.download('./')``   ``shutil.unpack_archive('./andrew-dataset.zip', './instance')``   ``# Print some images``trainer.display_images("instance")

我们可以看到图像的大小和质量差异很大,这不是一个经过大量预处理的图像数据集。这说明Dream Booth可以使用现有的数据有效的调整模型。

5. 初始化模型

tokenizer, text_encoder, vae, unet = trainer.initialize_models()
# Add noise to generate images in Stable Diffusion``from diffusers import DDPMScheduler``   ``noise_scheduler = DDPMScheduler.from_pretrained(`    `trainer.hyperparameters.pretrained_model_name_or_path,`    `subfolder="scheduler"``)

这里分享给大家一份Adobe大神整理的《AIGC全家桶学习笔记》,相信大家会对AIGC有着更深入、更系统的理解。

有需要的朋友,可以点击下方免费领取!

在这里插入图片描述

AIGC所有方向的学习路线思维导图

这里为大家提供了总的路线图。它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。如果下面这个学习路线能帮助大家将AI利用到自身工作上去,那么我的使命也就完成了:
在这里插入图片描述

AIGC工具库

AIGC工具库是一个利用人工智能技术来生成应用程序的代码和内容的工具集合,通过使用AIGC工具库,能更加快速,准确的辅助我们学习AIGC
在这里插入图片描述

有需要的朋友,可以点击下方卡片免费领取!

精品AIGC学习书籍手册

在这里插入图片描述

书籍阅读永不过时,阅读AIGC经典书籍可以帮助读者提高技术水平,开拓视野,掌握核心技术,提高解决问题的能力,同时也可以借鉴他人的经验,结合自身案例融会贯通。

在这里插入图片描述

AI绘画视频合集

我们在学习的时候,往往书籍源码难以理解,阅读困难,这时候视频教程教程是就很适合了,生动形象加上案例实战,科学有趣才能更方便的学习下去。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值