大模型微调技术: 从基于Stable Diffusion的绘画谈起

个人博客 :Sekyoro的博客小屋
个人网站 :Proanimer的个人网站

文生图和图生图应用已经出现一段时间了,目前常用的应用就是根据用户需求修改图片,事实上这就是一种自定义. 因为需要模型重新生成整张图或者部分图,要么通过prompt、reference image,也就是改变输入的方式;要么通过修改模型,也就是微调模型的方式. 因此诞生出了许多微调模型的方式,目前常用的微调库是huggingface/peft: 🤗 PEFT. 针对AI绘图应用的微调技术,倒是可以推出一道清晰的发展线. 这里简单整理一下.

Before LoRA

在大名鼎鼎的LoRA之前,绘画相关的微调技术主要有Textual Inversion2208.01618和DreamBooth2208.12242. 此外还有改变输入以及嵌入向量的Prefix TuningPrefix-Tuning: Optimizing Continuous Prompts for Generation和Prompt TuningThe Power of Scale for Parameter-Efficient Prompt Tuning,由于与AI绘图相关微调联系不大,这里不深入.

Textual Inversion

​ 文本到图像的模型为通过自然语言指导创作提供了前所未有的自由。然而,如何行使这种自由来生成特定独特概念的图像,修改它们的外观,或将它们组成新的角色和新的场景,尚不清楚。

​ 只使用用户提供的一个概念的3 - 5张图像,比如一个对象或一个样式,在一个冻结的文本到图像模型的嵌入空间中,我们学习通过新的"词"来表示它。这些"词"可以组合成自然语言句子,以直观的方式指导个性化创作。作者发现单个词嵌入足以捕获独特和多样的概念。

​ 将新概念引入模型的难点: 将新概念引入大规模模型往往是困难的。为每个新概念重新训练一个具有扩展数据集的模型是非常昂贵的,对少数例子进行微调通常会导致灾难性的遗忘更多的度量方法在面对新概念时冻结模型并训练转换模块以适应其输出。然而,这些方法仍然容易遗忘先验知识,或者与新学习的概念融合时面临困难。

​ 提出通过在预训练的文本到图像模型的文本嵌入空间中寻找新词来克服这些挑战 。考虑文本编码过程的第一阶段。在这里输入字符串首先被转换为一组token(词元,理解为词典中的不可再分的词)。然后将每个token替换为自己的嵌入向量,这些向量通过下游模型进行反馈。目标是寻找新的嵌入向量来表示新的、特定的概念

​ 用一个新的词(pseudo-word)表示一个新的嵌入向量,我们用S *表示。然后这个词像其他任何词一样被处理,并且可以用于为生成模型合成新的文本查询。因此,可以要求"一张沙滩上的S *照片"、"一幅挂在墙上的S *油画",甚至可以组成两个概念,如"一幅S * 1的S * 2的画"。

​ 重要的是,这个过程没有触及生成模型。在这样做的过程中,我们保留了在新任务上微调视觉和语言模型时通常会丢失的丰富的文本理解和泛化能力。

​ 为了找到这些词,将任务定为求逆运算,给出了一个固定的预训练文本-图像模型和一个描述概念的小( 3-5 )图像集。目标是找到一个单词嵌入,这样' A photo of S * '形式的句子将导致从我们的小集合中重建图像。这种嵌入是通过一个优化过程找到的,我们称之为"文本倒置"。

具体来说,首先选取若干张相关概念的照片,假设pikachu,对应输入的prompt类似An image of pikachu, A photo of pikachu,然后就照着LDM训练的方式在原本的预训练大模型上继续训练即可.

DreamBooth

​ DreamBooth的目的和Textual Inversion类似,扩展模型的语言-视觉词典,使其能够将新词与用户想要生成的特定主题绑定在一起。

​ 给定一个主体的几幅图像,目标是将主体植入模型的输出域,使其能够用唯一的标识符进行合成。为此提出一种技术,用稀有的标记标识符表示给定的主题,并微调一个预训练的、基于扩散的文本到图像框架。

​ 给定一个对象的3 - 5图像,微调一个文本到图像的扩散模型,输入图像与一个包含唯一标识符且对象所属类名为( e.g . , ' A [ V ] dog ')的文本提示配对,并行地应用一个特定于类的先验保存损失,该损失利用了模型在类上的语义先验,并鼓励它使用文本提示中的类名生成属于该对象类的多样实例。

​ 相比于textual inversion,它对模型而不只是embedding进行了微调,同时增加了新的损失, 对于同类但不同具体实例的图像进行训练.
E x , c , ϵ , ϵ ′ , t [ w t ∥ x ^ θ ( α t x + σ t ϵ , c ) − x ∥ 2 2 + λ w t ′ ∥ x ^ θ ( α t ′ x p r + σ t ′ ϵ ′ , c p r ) − x p r ∥ 2 2 ] \begin{array}{l} \mathbb{E}{\mathbf{x}, \mathbf{c}, \epsilon, \epsilon^{\prime}, t}\left[w{t}\left\|\hat{\mathbf{x}}{\theta}\left(\alpha{t} \mathbf{x}+\sigma_{t} \boldsymbol{\epsilon}, \mathbf{c}\right)-\mathbf{x}\right\|{2}^{2}+\right. \\ \left.\lambda w{t^{\prime}}\left\|\hat{\mathbf{x}}{\theta}\left(\alpha{t^{\prime}} \mathbf{x}{\mathrm{pr}}+\sigma{t^{\prime}} \epsilon^{\prime}, \mathbf{c}{\mathrm{pr}}\right)-\mathbf{x}{\mathrm{pr}}\right\|_{2}^{2}\right] \end{array} Ex,c,ϵ,ϵ′,t[wt∥x^θ(αtx+σtϵ,c)−x∥22+λwt′∥x^θ(αt′xpr+σt′ϵ′,cpr)−xpr∥22]

LoRA era

如果说上面几种方法都集中通过新的输入修改embedding,那么LoRA就是修改其中涉及重要计算模块的部分,比如Linear或Conv层 .

LoRA作为AI绘画模型微调技术不得不提的一环,一经提出就带来了一股LoRA潮An Overview of the LoRA Family. LoRA, DoRA, AdaLoRA, Delta-LoRA, and... | by Dorian Drost | Towards Data Science.

此外LoRA也可以结合上面的修改embedding方法达到更好的效果.

LoRA

神经网络包含许多执行矩阵乘法的密集层。这些层中的权重矩阵通常具有满秩。在适应特定任务时,Aghajanyan等研究表明,预训练的语言模型具有较低的"特征维度"(rank),即使随机投影到较小的子空间,仍然可以高效地学习 。受此启发,假设权重的更新在适应过程中也具有较低的"内在秩" 。对于一个预训练的权重矩阵W0∈Rd×k,用一个低秩分解W0 + Δ \Delta ΔW = W0 + BA来约束它的更新,其中B∈Rd×r,A∈Rr×k,秩为r=min( d , k)。在训练过程中,W0被冻结,不接受梯度更新,而A和B包含可训练参数。

​ 注意W0和∆W = BA都乘以相同的输入,并且它们各自的输出向量按位求和。

对于h = W0x,修正前向传递得到h = W0x +∆W x = W0x + BAx

​ 对A使用随机高斯初始化,对B使用零初始化,因此在训练开始时,W = BA为零。然后用α/r对∆W x进行缩放,其中α为r中的常数。

​ 在使用Adam进行优化时,如果对初始化进行适当的缩放,则调整α与调整学习率大致相同。因此,简单地将α设置为r,并不对其进行调整。这种缩放有助于减少当我们改变r时重新调整超参数的需要.

​ 在训练时,加上lora,冻结预训练模型,训练一个包含A和B的MLP,它更新参数时需要减去这个模型的参数

​ 测试时,模型的权重要加上LoRA的参数.

​ LoRA本身修改了微调时更新权重的方式,将更新的权重放到了一个可拆卸的模块中,同时由于只搭配预训练大模型中的某部分,使得微调过程更短,训练周期更短.

代码实现

参考LoRA/loralib/layers.py at main · microsoft/LoRA

python 复制代码
class LoRALayer():
    def __init__(
        self, 
        r: int, 
        lora_alpha: int, 
        lora_dropout: float,
        merge_weights: bool,
    ):
        self.r = r
        self.lora_alpha = lora_alpha
        # Optional dropout
        if lora_dropout > 0.:
            self.lora_dropout = nn.Dropout(p=lora_dropout)
        else:
            self.lora_dropout = lambda x: x
        # Mark the weight as unmerged
        self.merged = False
        self.merge_weights = merge_weights

对于Embedding,Linear以及Conv层有不同的具体实现. 但总体来说,在训练时,通过减去B@A更新参数. 在测试时权重加上LoRA层.

python 复制代码
class Linear(nn.Linear, LoRALayer):
    def __init__(self,
                 in_features: int,
                 out_features: int,
                 r: int = 0,
                 lora_alpha: int = 1,
                 lora_dropout: float = 0.,
                 fan_in_fan_out: bool = False,
                 # Set this to True if the layer to replace stores weight like (fan_in, fan_out)
                 merge_weights: bool = True,
                 **kwargs):
        nn.Linear.__init__(self, in_features, out_features, **kwargs)
        LoRALayer.__init__(self, r=r, lora_alpha=lora_alpha, lora_dropout=0, merge_weights=merge_weights)
        self.fan_in_fan_out = fan_in_fan_out
        if r > 0:
            self.lora_A = nn.Parameter(self.weight.new_zeros((r, in_features)))
            self.lora_B = nn.Parameter(self.weight.new_zeros((out_features, r)))
            self.scaling = self.lora_alpha / self.r
            self.weight.requires_grad = False # 禁止梯度更新
        self.reset_parameters()
        if fan_in_fan_out:
            self.weight.data = self.weight.data.transpose(0, 1)

LyCORIS

2309.14859] Navigating Text-To-Image Customization: From LyCORIS Fine-Tuning to Model Evaluation

提出了一系列用在Stable Diffusion中基于LoRA的微调方式并设计了benchmark测试

主要包括LoHA和LoKr,其实光看图就很容易明白. LoHA另外引入一套BA,并通过点乘得到最终的更新,论文解释这种方法得到的矩阵的秩大于一般的低秩分解. 而LoKr就直接使用矩阵直积了.

这方面还有很多魔改的各种微调,就不一一介绍了.

Adapters for preserving Identity

Adapter的实现和LoRA有类似点,但提出的目的不同与LoRA:LoRA强调用户拿几张个人照片让模型学习新的权重同时不过于遗忘已有知识,而Adapter的场景更偏向适应与融合.

IP-Adapter

tencent-ailab/IP-Adapter: The image prompt adapter is designed to enable a pretrained text-to-image diffusion model to generate images with image prompt.

针对现有的文本到图像扩散模型,提出了一种基于解耦交叉注意力策略的轻量级图像提示自适应方法IP-Adapter。

在图像编码器之后加入新的权重参数进行编码,并将编码后的特征用于训练一个新的cross attention layer. 论文的关键创新就是引入cross attention将图像特征用来微调模型.

给定图像特征ci,新的交叉注意力Z′′的输出计算如下
Z ′ ′ = Attention ⁡ ( Q , K ′ , V ′ ) = Softmax ⁡ ( Q ( K ′ ) ⊤ d ) V ′ \mathbf{Z}^{\prime \prime}=\operatorname{Attention}\left(\mathbf{Q}, \mathbf{K}^{\prime}, \mathbf{V}^{\prime}\right)=\operatorname{Softmax}\left(\frac{\mathbf{Q}\left(\mathbf{K}^{\prime}\right)^{\top}}{\sqrt{d}}\right) \mathbf{V}^{\prime} Z′′=Attention(Q,K′,V′)=Softmax(d Q(K′)⊤)V′

其中Q=ZWq,Z是文本编码后的特征,K'=cWk,c是图像特征,V=cVv

InstantID

instantX-research/InstantID: InstantID: Zero-shot Identity-Preserving Generation in Seconds 🔥

首先,采用人脸编码器代替CLIP提取语义人脸特征,并使用可训练的投影层将其投影到文本特征空间。将投影后的特征作为人脸嵌入。然后,引入解耦交叉注意力的轻量级自适应模块,以支持图像作为提示。最后提出IdentityNet对参考人脸图像中的复杂特征进行编码,并附加弱空间控制。在IdentityNet中,生成过程完全由人脸嵌入引导,无需任何文本信息。只更新新增加的模块,而预训练的文本到图像模型保持冻结,以确保灵活性。经过训练,用户可以自由地生成任意风格的高保真度的ID保持图像。

Towards Video Diffusion Models

CSUR] A Survey on Video Diffusion Models

生成图像已经不够了,可以通过prompt生成连续的多张图片,这样可以组成GIF甚至更长更高质量的视频.

比如AnimateDiff

相关资料

  1. 一文辨析清楚LORA、Prompt Tuning、P-Tuning、Adapter 、Prefix等大模型微调方法 - 知乎
  2. LoRA vs Dreambooth vs Textual Inversion vs Hypernetworks: Exploring the World of Stable Diffusion Fine-Tuning Methods
  3. Navigating Text-To-Image Customization: From LyCORIS Fine-Tuning to Model Evaluation | OpenReview
  4. KohakuBlueleaf/LyCORIS: Lora beYond Conventional methods, Other Rank adaptation Implementations for Stable diffusion.
  5. An Overview of the LoRA Family. LoRA, DoRA, AdaLoRA, Delta-LoRA, and... | by Dorian Drost | Towards Data Science
  6. 2106.09685
  7. [2309.14859\] Navigating Text-To-Image Customization: From LyCORIS Fine-Tuning to Model Evaluation](https://arxiv.org/abs/2309.14859)

如有疑问,欢迎各位交流!

服务器配置

宝塔:宝塔服务器面板,一键全能部署及管理

云服务器:阿里云服务器

Vultr服务器: Vultr服务器

GPU服务器:Vast.ai
代码练习平台

CodeCrafters CodeCrafters

相关推荐
这是一个懒人3 小时前
mac 快速安装stable diffusion webui
macos·stable diffusion
璇转的鱼10 小时前
Stable Diffusion进阶之Controlnet插件使用
人工智能·ai作画·stable diffusion·aigc·ai绘画
AloneCat20122 天前
stable Diffusion模型结构
stable diffusion
西西弗Sisyphus2 天前
Stable Diffusion XL 文生图
stable diffusion
霍志杰3 天前
stable-diffusion windows本地部署
windows·stable diffusion
昨日之日20063 天前
ACE-Step - 20秒生成4分钟完整歌曲,音乐界的Stable Diffusion,支持50系显卡 本地一键整合包下载
计算机视觉·stable diffusion·音视频
白熊1883 天前
【图像大模型】Stable Diffusion Web UI:深度解析与实战指南
ui·stable diffusion
西西弗Sisyphus5 天前
基于Stable Diffusion XL模型进行文本生成图像的训练
stable diffusion
阿维的博客日记5 天前
VAE和Stable Diffusion的关系
stable diffusion·vae
我算是程序猿6 天前
【2025最新】AI绘画终极提示词库|Midjourney&Stable Diffusion通用公式大全
人工智能·ai作画·stable diffusion·aigc·midjourney