SD模型微调方法Textual Inversion详细介绍,包括数据集准备,模型微调过程,推理过程,优缺点等。
🌺系列文章推荐🌺
扩散模型系列文章正在持续的更新,更新节奏如下,先更新SD模型讲解,再更新相关的微调方法文章,敬请期待!!!(本文及其之前的文章均已更新)
扩散模型相关知识点参考:小白也能读懂的AIGC扩散(Diffusion)模型系列讲解
目录
Textual Inversion(embeddings模型)技术详解
Textual Inversion与Dreambooth的对比
Textual Inversion 与 Embedding Fine-Tuning 的区别
Embedding微调概要
Textual Inversion 和 Embedding fine-tuning 是两种常见的基于嵌入(embedding)微调方法,它们都涉及到对模型中的嵌入向量进行调整,用于增强图像生成模型(如 Stable Diffusion)的表现,特别是在引入新概念、新特征或自定义风格时。这两种方法有不同的适用场景和技术细节。
差异:
- Textual Inversion 是一种轻量级的微调方法,专注于为模型引入新的概念和词汇,而不修改模型的权重。它适合快速定制生成任务中的特定需求,如新对象、风格或专有名词的生成。
- Embedding Fine-Tuning 适用于大规模领域的微调,会修改模型的权重,通过调整模型现有的嵌入层权重,使模型能够更好地处理新的数据或任务。
Textual Inversion出现的原因
在文本到图像生成模型中,用户的创造能力通常受限于他们通过文本描述目标图像的能力【用户不会很好的描述他们的想法】。然而,想要引入新的概念到大型预训练模型中会面临几个挑战:
-
重新训练的高成本:若为每个新概念重新训练模型,尤其是使用扩展数据集,训练过程不仅消耗大量资源,还不具备可扩展性。
-
少样本微调的局限性:通过少量示例进行微调虽然可行,但很容易导致“灾难性遗忘”(Catastrophic Forgetting),即模型在学习新概念的同时丧失其对原有知识的记忆。【Dreambooth中的过拟合】
-
冻结模型权重,再通过转换模块引入新概念:这种方法容易导致模型遗忘先验知识,或在同时处理新旧概念时表现不佳。【灾难性遗忘是模型遗忘先验知识更严重的版本】
为了解决这些问题,Textual Inversion 方法通过在文本嵌入空间中学习新词来引入新概念。该方法仅需用户提供少量的训练数据,便能学习出一种新的嵌入向量,这些向量可以作为“新词”嵌入模型中。
Textual Inversion 的训练数据非常简洁,通常包括:
- 3-5 张图像,这些图像反映用户想要引入的概念。
- 占位符文本(如
[V*]
)用来表示新概念,无需手动标签或大量标注数据。
概要介绍
Textual Inversion(embeddings模型)技术详解
Textual Inversion技术是基于prompt-tuning的训练技术,比起基于fine-tuning训练技术【Lora、DreamBooth等】,基于prompt-tuning的训练技术更加轻量化(模型大小几kb-几mb左右),存储成本很低。
- Fine-Tuning 是对模型的权重进行全面或部分调整,使其能够在特定任务上达到最佳表现。它适合需要高精度表现的任务,但需要较大的数据集和计算资源。
- Prompt-Tuning 则是一种轻量化的调整方式,不会更改模型的权重,通过优化输入的提示嵌入向量来引导模型完成任务。它适合快速适应任务或领域,不需要过多数据和计算资源,但在某些复杂任务中,表现可能不如 Fine-Tuning。
在详细讲解Textual Inversion技术之前,让我们先回顾一下Text Prompt在SD系列模型中的处理流程:
如上图所示,我们输入的Text Prompt会先经过Tokenizer转换成Tokens,再经过Text Encoder输出embeddings特征,通过Attention机制注入到SD系列模型中,Textual Inversion技术就是作用于上图的Text Prompt过程中。
- Tokens 是处理自然语言复杂性、语义结构以及上下文信息的重要步骤,帮助将文本拆解为模型易于理解的单元。
- Embeddings 是连续的语义向量表示,捕捉词汇及其上下文中的语义信息,方便神经网络进行后续的推理和生成。
Textual Inversion技术的核心思路是基于3~5张特定概念(物体或者风格)的示例图像来训练一个特定的Text Embeddings模型,从而将特定概念编码到Text Embedding空间中。Text Embedding空间中的词向量是有足够的表达能力恢复出图像特征,同时Textual Inversion技术不需要对SD系列模型中的U-Net部分进行微调训练(SD模型参数冻结),只需要训练一个新的token embedding(下图中的 V∗ )就足够了,所以使用Textual Inversion技术不会干扰SD模型本身已有的先验知识。
我们首先需要定义一个特殊的关键词(下图中的 S∗ ),这个特殊的关键词与新的token embedding对应,在Textual Inversion训练过程中,会不断将包含特殊关键词的Prompt注入Stable Diffusion模型,在不改变SD模型参数的情况下,在SD模型中不断优化来表示特殊的关键字的embedding向量,最终得到对于特殊的关键词最佳映射的embedding向量。【【核心】】
完成训练后,我们就能获得一个包含主题编码或者风格编码的Text Embedding模型。
对风格进行编码训练的Text Embedding模型 除此之外,Textual Inversion技术可以在SD模型中同时注入多个概念,如下图所示:
使用多个Text Embedding模型将多个概念注入到SD模型中
核心概念
Textual Inversion 是一种通过学习词汇嵌入(embedding)来引入新概念的微调技术。这项技术可以通过提供少量样本图像来教会生成模型(如 Stable Diffusion)如何生成带有新特征或概念的图像,而不需要调整模型的主要权重。
- Embedding:Textual Inversion 会为一个新的“词”或“概念”学习一个独特的词汇嵌入(embedding),使得模型可以理解和生成与该概念相关的图像。
- 少量样本:只需要几个样本图像(通常少于 10 张)就能训练出有效的嵌入,使模型能够学习特定概念或个性化风格。
- 无须调整模型:在 Textual Inversion 过程中,核心的生成模型(如 Stable Diffusion)和 CLIP Text Encoder 的权重都是冻结的,不会被调整。它仅训练与新概念相关的词汇嵌入(embedding),使得模型可以通过这些词生成图像。
训练过程
训练过程的目的是:优化这个占位符的嵌入向量,使其在潜在空间中能够准确表示新的概念。
Textual Inversion 微调 和 Stable Diffusion(SD)模型训练 在前向传播和反向传播的基本原理上确实没有本质区别。两者的核心流程都涉及前向传播(生成预测输出)、损失计算(评估输出和目标的差异)、以及反向传播(根据损失更新模型参数)。但是它们在具体的优化目标上有关键的差异。【本节末尾会说有什么差异】
1. 选择预训练的文本到图像生成模型
常用的预训练模型包括 Stable Diffusion
2. 准备少量训练数据
训练数据是 Textual Inversion 微调的关键,通常包括以下内容:
-
少量图像数据:用户需提供 3-5 张图像,这些图像能够代表新的概念(如某个人物、某个物体或某种风格)。这些图像应尽可能多样化,例如涵盖不同角度、光照、背景等条件,从而帮助模型更好地泛化该概念。
-
占位符文本:为新概念创建一个自定义的占位符文本(例如
[V]
)。占位符是一个在模型词汇表中不存在的新词,它将在训练过程中代表新的概念,并且通过优化其嵌入向量来学习这个新概念。
3. 初始化占位符嵌入向量
-
随机初始化嵌入向量,使其在潜在空间表示:为占位符文本(如
[V]
)分配一个随机的嵌入向量。在模型的嵌入空间中,这个嵌入向量初始时没有语义信息。通过微调,这个嵌入向量会被优化,最终在潜在空间中代表所需的新概念。
- 使用小的随机值来初始化嵌入向量。通常选择正态分布或均匀分布,以保证嵌入空间的各维度不会有偏置。
- 选择与新概念相关的已有词语的嵌入向量作为初始值。例如,微调一个特定品种的“猫”概念,可以用“猫”这个词的嵌入作为初始值。
4. 前向传播与生成
在正式训练开始时,模型通过占位符嵌入生成图像:
- 占位符文本输入:将占位符(如
[V]
)与其他文本描述结合,例如 "a [V] sitting on a table"。 - 生成图像:生成模型通过当前的嵌入向量,生成与输入文本描述相符的初步图像。由于嵌入向量尚未被优化,最初生成的图像通常不具备目标概念的特征。
5. 损失函数计算
损失函数用于衡量生成的图像与参考图像之间的差异。常用的损失函数包括:
像素级损失:直接比较生成图像与参考图像的像素差异。这种方法简单但效果有限,特别是在图像中存在高层次语义信息时。
感知损失(Perceptual Loss):使用预训练的卷积神经网络(如 VGG 网络)来提取图像的特征,并比较生成图像和参考图像在特征空间中的差异。这种方法可以更好地捕捉高层次的图像特征,比如物体的形状、纹理、风格等。
对比损失(可选):有时会用对比损失或对抗性损失(如 GAN 判别器)来确保生成图像看起来更加逼真,并与参考图像保持一致。
对于 Textual Inversion 来说,损失函数仍然需要衡量模型的预测噪声与实际噪声之间的差距,因此均方误差(MSE) 依然是常用的损失函数形式。这意味着 Textual Inversion 可以使用与 Stable Diffusion 模型相同的噪声预测损失,下面是SD模型训练中使用的损失函数,:
6. 反向传播与嵌入向量优化
在计算出损失之后,通过反向传播来优化嵌入向量。具体步骤如下:
-
反向传播:根据损失函数的反馈,通过反向传播优化算法计算梯度,调整嵌入向量,使生成图像逐渐与参考图像匹配。
-
迭代优化:前向传播、损失计算、反向传播的过程会迭代进行。在每次迭代中,嵌入向量会进一步被优化,使得生成的图像越来越接近参考图像。【优化的是嵌入向量,不是权重】
7. 停止训练
训练过程中的目标是使嵌入向量收敛,生成图像能够充分捕捉参考图像的特征。当损失函数的值收敛或变化很小,且生成图像与参考图像的相似度较高时,训练可以停止。
-
停止条件:可以通过预设的训练轮数(epochs)或者监控损失值的变化情况来决定何时停止训练。
-
收敛判断:如果损失函数已经达到一个较低值,并且每轮迭代中的损失下降幅度逐渐变小,说明模型已经达到了最佳状态,嵌入向量的优化完成。
推理过程
训练完成后,嵌入向量已经学会了如何表示新概念。用户可以通过自然语言描述结合新嵌入向量来生成图像。
-
使用占位符生成图像:占位符文本(如
[V]
)可以与其他文本描述结合,生成符合用户需求的图像。例如,输入 "a beautiful painting in the style of [V]",模型将根据新的嵌入向量生成与该风格相关的图像。 -
验证结果:用户可以通过生成多个图像来验证嵌入向量是否准确表示目标概念。若生成结果符合预期,说明微调成功;若生成结果仍不理想,可以继续微调或微调其他参数。
Textual Inversion 微调 和 Stable Diffusion(SD)模型训练【或者说基于prompt-tuning微调和基于fine-tuning的微调的区别】 在 训练流程中几乎没有任何差别。但是它们在具体的优化目标上有关键的差异。
PT和FT的主要区别:优化对象不同
Textual Inversion 微调:优化的对象是嵌入向量(Embedding),而模型的权重保持冻结。也就是说,在每次迭代过程中,唯一被更新的是新概念的嵌入向量,模型的结构和参数不变。嵌入向量的作用是表示文本中的特定新概念(如人物、物体或风格),最终通过学习,这个向量可以捕捉到新概念的语义信息。
Stable Diffusion 模型的训练:优化的对象是模型的权重。在模型的标准训练过程中,每次迭代时,生成模型的所有可训练参数都会通过前向传播和反向传播进行更新,以提高模型在特定任务上的性能。模型会学习如何从噪声中重构图像,或者从文本描述中生成相应的图像。
详细对比
过程 Textual Inversion 微调 Stable Diffusion 模型训练 前向传播 占位符嵌入向量 + 自然语言描述 → 生成图像 文本描述或噪声向量 → 生成图像 损失计算 生成的图像与参考图像/目标图像的差异 反向传播 优化嵌入向量,使生成的图像更接近目标 优化模型权重,使模型更准确生成对应的图像 优化对象 嵌入向量,模型权重保持不变 模型权重,更新整个模型以提高生成能力 训练目标 让占位符嵌入向量能够表达新概念 让模型学习如何生成符合训练集的高质量图像 更新范围 只更新文本嵌入层中的新向量 更新整个模型的权重,包括卷积层和其他模块 计算资源 资源需求较少,训练速度快 资源需求大,需要大规模数据和长时间训练
优点
- 数据高效:只需要少量数据就能学会新概念。
- 模型冻结:不需要修改生成模型本身,避免了复杂的再训练过程。
- 灵活性强:用户可以通过引入新的词汇轻松扩展模型的能力,生成个性化的图像。
Textual Inversion与Dreambooth的对比
有人可能发现了,Textual Inversion与Dreambooth都是为了让模型学习一个新概念,及其相似,那么实现上有什么相同和不同?
- 数据量类似:需要的数据量和输入的格式【标识符+图像】一样
- 任务相同: 从任务描述来看基本上是一样的,都是仅使用3-5张用户提供的概念的图像将独特的对象注入新场景,将它们转换成不同的风格;
- 标识符类型不同:Textual Inversion是没有的单词,新加了单词;DreamBooth使用了稀有的单词重新和新主题关联。【“标识符+类别”和“类别”要成对出现】
- 微调方式不同:Textual Inversion属于prompt-tuning,仅微调嵌入,不修改模型权重,轻量级微调;DreamBooth属于fine-tuning,微调模型的权重部分,重量级微调,主要是Attention层。
- 效果不同:Textual Inversion的效果不如DreamBooth;Textual Inversion论文中实现了风格迁移,DreamBooth没做,但是理论上也可以做;
使用场景
- 定制化图像生成,例如学习一个人、物体、或艺术风格的概念。
- 提供个性化提示词,结合已有的模型生成更多样化的图像。
其他资料
diffusers | https://huggingface.co/docs/diffusers/training/text_inversion#training-script |
代码 | diffusers/examples/textual_inversion at main · huggingface/diffusers · GitHub |
Embedding Fine-Tuning
Embedding fine-tuning 是指在现有生成模型的基础上,微调输入层或词汇嵌入,使模型更好地适应某个特定任务或细分场景。与 Textual Inversion 类似,这种方法也关注于词汇嵌入的调整,但不仅仅是引入新的概念或对象,还可以让模型更好地处理已有的词汇,从而全面提升模型在特定任务或领域的表现。
核心概念
- 微调词汇嵌入:在 Embedding fine-tuning 中,我们对嵌入进行微调,使得它们能够更精确地表达特定领域或任务的文本输入特征。
- 更多数据:与 Textual Inversion 通常只需要少量数据不同,Embedding fine-tuning 可能需要更多的训练数据,以确保模型在特定领域上具有更好的泛化能力。
- 保持冻结的模型:在大多数情况下,核心的生成模型仍然是冻结的,只微调嵌入层或者微调 CLIP Text Encoder 的输入部分。
训练过程
- 提供一定规模的特定领域的数据集(可能是图像与文本对)。
- 通过调整词汇嵌入或 CLIP Text Encoder输入的权重,使得模型可以更好地理解特定领域的输入词汇。
- 微调后的词汇嵌入与模型将能更准确地生成与特定任务相关的图像。
优点
- 提高适应性:微调后的模型能够更加准确地处理特定领域的任务或生成特定风格的图像。
- 与大模型结合使用:它不需要训练整个模型,而是基于大模型的小规模微调,提升效率。
使用场景
- 细分任务的优化,比如专注于某个领域的图像生成(如医学图像生成、建筑设计等)。
- 对生成的图像风格进行特定领域的控制。
Textual Inversion 与 Embedding Fine-Tuning 的区别
- Textual Inversion:只训练一个或少数几个特定的新词汇嵌入,不会改变模型或 CLIP Encoder 的其他部分。主要用于通过少量样本学习新概念。不改变模型的结构,也不更新模型的参数
- Embedding Fine-Tuning:可以通过更大规模的训练数据来微调整个词汇嵌入或 CLIP Text Encoder 的输入层,使模型在特定任务上表现更好。用于针对某些领域的生成任务优化模型。结构不变,但会更新模型的嵌入层参数
总结
- Textual Inversion 适合于学习个性化或小范围的新概念,所需的数据量较少,并且不会修改模型本身。
- Embedding Fine-Tuning 更适合需要更广泛泛化能力的任务,使用更多数据进行词汇嵌入微调,可以使模型在特定任务上更为准确。会修改模型的权重。
微调和训练过程解释
Textual Inversion 相当于 使用CLIP训练了一个新概念,外挂在CLIP中,不会改变CLIP的参数,当推理时候输入这个新概念,会直接根据外挂的内容生成向量。
Embedding Fine-tuning相当于 微调 CLIP 模型的嵌入层,改变CLIP模型的参数,当推理时候输入这个新概念,会根据微调后的新参数的内容生成向量。