> For the complete documentation index, see [llms.txt](https://docs.seaart.ai/guide-1/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.seaart.ai/guide-1/zhong-wen/3-jin-jie-zhi-nan/32-lora-xun-lian-xiang-jie.md).

# 3-2  LoRA训练详解

通过对LoRA训练的原理了解，进一步掌握LoRA训练！本指南涵盖了从原理到流程再到优化参数来训练LoRA。

**Lora有什么用？**

Lora（低阶微调矩阵）在保持大模型权重不变的情况下，对整个画面进行 微调 ，这时候就只需要调整lora来生成特定图像，而不需要调节整个大模型，对于一些AI从来没见过的图片就需要用到Lora来微调，这让AI绘画在一定意义上拥有了“可控性”。

{% content-ref url="/pages/9FwIe6h8FDa1ehdW2aKb" %}
[图像LoRA训练](/guide-1/zhong-wen/3-jin-jie-zhi-nan/32-lora-xun-lian-xiang-jie/tu-xiang-lora-xun-lian.md)
{% endcontent-ref %}

目前训练的模型都是在官方已经训练好的模型（SD1.5、SDXL）上做的“二次加工”，当然，也可以在别人做好的模型基础上进行“三次加工”。

{% content-ref url="/pages/KmVXhri8oMnAQrGdgPnF" %}
[视频LoRA训练](/guide-1/zhong-wen/3-jin-jie-zhi-nan/32-lora-xun-lian-xiang-jie/shi-pin-lora-xun-lian.md)
{% endcontent-ref %}

**模型训练：**&#x41;I先根据文本生成图像，再将这些图像与训练集中的图像进行比较，通过生成的差异度引导AI不断微调嵌入向量，让生成结果不断接近训练图像，最终让微调模型能够完全等同于训练图片的结果，也就是让将AI生成的图和数据集形成关联，最终越来越像

<figure><img src="https://751506775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI1niezbE5y99beoQQ5aL%2Fuploads%2FOfWuulpM7zyaE9UxBSHc%2F%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20240226121530.png?alt=media&amp;token=ef2a1131-1922-4b7a-bb12-6bbebe3f0927" alt=""><figcaption></figcaption></figure>

<mark style="color:red;">\*</mark>相比大模型（Checkpoint），Lora的体积更小，更节省时间与资源，并且在叠加大模型的基础上能够调整权重，实现不同的效果

## **训练过程**

> **五步：准备数据集-图片预处理-设置参数-监控Lora训练进程-训练完成**

<mark style="color:red;">\*以SeaArt训练人脸模型为例</mark>

### **准备数据集**

在上传数据集时需要保持<mark style="background-color:yellow;">“多样化样本”</mark>的原则，也就是说，数据集应当是不同角度、姿势、光线等等，并且保证数据集的高清晰度，这一步主要是为了让AI认识图片

<figure><img src="https://751506775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI1niezbE5y99beoQQ5aL%2Fuploads%2F5eqpHqw1XPNtck589FGv%2F%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20240225172929.png?alt=media&amp;token=eb7297db-79cf-4273-b373-29fc50b5414c" alt=""><figcaption></figcaption></figure>

### **图片预处理**

图片预处理主要分三个方面：**（1）裁剪图片 （2）打标 （3）添加触发词**

**（1）裁剪图片**

为了让AI能够更好的通过图片辨析对象，一般情况下，图片保持相同尺寸效果最好，可以根据出图效果选择512\*512（1:1）/512\*768（2:3）/768\*512（3:2）

裁剪方法：中央裁剪/聚焦裁剪

* 中央裁剪：裁剪图片的中央区域
* 聚焦裁剪：自动识别图片主体

<figure><img src="https://content.gitbook.com/content/I1niezbE5y99beoQQ5aL/blobs/r3dNKZjxxcGvvt7jwemp/%E8%81%9A%E7%84%A6%E8%A3%81%E5%89%AA.png" alt="Lora Training Process - Cropping images - Focus Crop"><figcaption><p>聚焦裁剪</p></figcaption></figure>

<figure><img src="https://content.gitbook.com/content/I1niezbE5y99beoQQ5aL/blobs/KN7WJl4MMAA1IF5bp8kS/%E4%B8%AD%E5%A4%AE%E8%A3%81%E5%89%AA.png" alt="Lora Training Process - Cropping images - Center Crop"><figcaption><p>裁剪</p></figcaption></figure>

<mark style="color:red;">\*</mark>相比中央裁剪，聚焦裁剪更容易保留数据集的主体部分，一般推荐使用<mark style="color:red;">聚焦裁剪</mark>

**（2）打标**

为了给数据集中的图片配上文字说明，让AI学习里面的文字

打标方法：BLIP/Deepbooru

* BLIP：自然语言标签，例如：“一个黑色头发的女孩”
* Deepbooru：词组语言标签，例如：“一个女孩，黑色头发”
* 打标阈值：越小描述的越精细，推荐0.6

<figure><img src="https://751506775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI1niezbE5y99beoQQ5aL%2Fuploads%2FHJgUggarkYqESLsmpgHA%2F%E6%89%93%E6%A0%87.png?alt=media&amp;token=9de483e8-48d9-4c56-9130-d6e1d3161ea6" alt=""><figcaption></figcaption></figure>

打标过程：删除需要固定的特征（人物特征...），让AI自主学习这个特征，同理也可以增加一些未来想要调整的特征（服装、饰品、动作、背景...）

<mark style="color:red;">\*</mark>例如这里想要之后生成的图片都是黑色头发、黑色眼睛，就可以将这两个标签删除

<figure><img src="https://751506775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI1niezbE5y99beoQQ5aL%2Fuploads%2FMaf4XsM13GTwbxL3Gb76%2F%E5%88%A0%E9%99%A4%E6%A0%87%E7%AD%BE.png?alt=media&amp;token=f12d0301-d225-4c1e-9d36-3ddc3e866305" alt=""><figcaption></figcaption></figure>

**（3）添加触发词**

触发词（选填）：触发Lora生效的提示词，相当于将人物特征的词条整合为一个词语

<figure><img src="https://751506775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI1niezbE5y99beoQQ5aL%2Fuploads%2FVUWw505Epo0cB3nxYvu4%2F%E8%A7%A6%E5%8F%91%E8%AF%8D.png?alt=media&amp;token=eb23476d-28b5-4a14-984a-42e9ec5c3d38" alt=""><figcaption></figcaption></figure>

### **设置参数**

**基础模型（底模）：**&#x5C3D;量选择优质稳定且Lora画风更接近的基础模型，这AI能够更容易匹配特征并记录差异

<figure><img src="https://751506775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI1niezbE5y99beoQQ5aL%2Fuploads%2Fj3mvxmbF4bwBTLRjCZR2%2F%E5%9F%BA%E7%A1%80%E6%A8%A1%E5%9E%8B.png?alt=media&amp;token=fee48027-7f8e-4325-9bb7-8fb2071d4e43" alt=""><figcaption></figcaption></figure>

**推荐基础模型：**

**真实系**：SD1.5、ChilloutMix、MajicMIX Realistic、Realistic Vison

**二次元：**&#x41;nyLoRA、Anything | 万象熔炉、ReV Animated

高级参数

#### **(1) 训练参数**

<figure><img src="https://751506775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI1niezbE5y99beoQQ5aL%2Fuploads%2FNWPIvjfDlyXRb2KxJPZP%2F%E8%AE%AD%E7%BB%83%E5%8F%82%E6%95%B0.png?alt=media&amp;token=a7d0523d-5a29-46a4-aba6-8bfec08fb430" alt=""><figcaption></figcaption></figure>

**Repeat（单张次数）：**&#x5BF9;一张素材的学习次数，次数越多，学习效果越好，但次数过多，也很容易造成图片固化。<mark style="color:red;">建议：二次元：8；真实系：15</mark>

**Epoch（循环轮次）：**&#x4E00;个轮次=训练集数\*Repeat，也就是对训练集的图片一共训练了多少步，如果训练集中有20张图片，Repeat（单张次数）为10，那么就会学习20\*10=200步，当走完200步则经过了一个Epoch（循环轮次），如果Epoch（循环轮次）设置为10，那么Lora训练总共就会训练2000步。<mark style="color:red;">建议：二次元：20；真实系：10</mark>

**Batch size（批量大小）：**&#x540C;时学习的图片数量；当设置为2时，AI就会一次性学习2张图片，总时长也会相对缩短；但在同时学习多张图片时，AI对每张图片学习的精度也会相对下降

**训练混合精度（Mixed precision）：**<mark style="color:red;">推荐fp16</mark>

#### **（2）样图设置**

<figure><img src="https://751506775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI1niezbE5y99beoQQ5aL%2Fuploads%2FQMLjZkHLN0EYNnAYOVts%2F%E6%A0%B7%E5%9B%BE%E8%AE%BE%E7%BD%AE.png?alt=media&amp;token=f476d90c-22d1-46e7-a88a-e27e0a50ff6a" alt=""><figcaption></figcaption></figure>

样图分辨率（推荐）：决定最后模型效果预览图的尺寸

<mark style="color:red;">SD1.5：512\*512</mark>

<mark style="color:red;">SDXL：1024\*1024</mark>

随机种子：控制随机生成的图，当使用同个随机种子与提示词，大概率会生成相同/相似的图

采样方法、提示词与负标签：主要展示最后模型效果预览图的效果

#### (3) **保存设置**

<figure><img src="https://751506775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI1niezbE5y99beoQQ5aL%2Fuploads%2FjyzalYXBucAdVK5jgGcu%2F%E4%BF%9D%E5%AD%982.png?alt=media&amp;token=8d370cd2-9186-4554-83eb-be3d678b11e4" alt=""><figcaption></figcaption></figure>

决定最后Lora的数量，如果设置为2，而Epoch（循环轮次）是10，则最后会保存5个Lora

Lora保存精度（Save precision）：<mark style="color:red;">推荐fp16</mark>

#### （4）**学习率&优化器**

<figure><img src="https://751506775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI1niezbE5y99beoQQ5aL%2Fuploads%2Fby0tql4cXgD1L7y6iGXl%2F%E5%AD%A6%E4%B9%A0%E7%8E%87.png?alt=media&amp;token=7be6567b-94de-4f45-b384-aee4f4ef5759" alt=""><figcaption></figcaption></figure>

**学习率（Learning Rate）：**&#x6307;AI学习数据集图片的强度，学习率越高，AI就更能学习进去，但也容易造成出图不像，当数据集增加可以尝试降低学习率。推荐先从默认开始尝试，再根据训练结果，修改学习率，建议从较低的学习率开始逐渐增加，<mark style="color:red;">推荐0.0001</mark>

**U-Net（unet lr）：**&#x5F53;设置了unet lr后，Learning Rate将不会生效，<mark style="color:red;">推荐0.0001</mark>

**文本编码器学习率（text encoder lr）：**&#x5BF9;tag的敏感程度，通常会将text encoder lr设置为<mark style="color:red;">unet lr的1/2或1/10</mark>

**学习率调度器（Lr scheduler）：**&#x4E3B;导学习率衰减，不同调度器对最终效果影响较小，一般直接默认“余弦”（cosine），也可以使用升级版“余弦退火”（<mark style="color:red;">Cosine with Reastart</mark>），会经过多次重启再衰减来充分学习数据集，从而避免学习过程中“局部最优解”干扰训练，如果采用“余弦退火”（Cosine with Reastart），需要将下面重启次数（Lr scheduler num cycles）设置为<mark style="color:red;">3-5</mark>

**优化器（Optimizer）：**&#x51B3;定AI在训练过程中把握学习的方法，直接影响学习效果

推荐使用 <mark style="color:red;">AdamW8bit</mark>

* <mark style="color:red;">Lion：</mark>新推出的优化器，最佳学习率通常比AdamW小10倍左右，
* <mark style="color:red;">Prodigy：</mark>将学习率都设置为1，Prodigy将会自动改变学习率来取得最佳效果，<mark style="color:red;">适合新手</mark>

（5）**网格**

<figure><img src="https://751506775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI1niezbE5y99beoQQ5aL%2Fuploads%2FDoRZer8I4PTVR7bmnZyk%2F%E7%BD%91%E6%A0%BC.png?alt=media&amp;token=ceed1198-5f17-478d-a941-53b1250b7474" alt=""><figcaption></figcaption></figure>

用于搭建一个合适的Lora模型基底，让AI输入数据

**网格大小（Network Rank Dim）：**&#x76F4;接影响Lora的大小，Rank越大，训练中要微调的数据量就越多。128=140MB+；64=70MB+；32=40MB+

* <mark style="color:red;">推荐：复杂画风、三次元：64/128</mark>
* <mark style="color:red;">二次元画风或人物：8/16/32</mark>

维度过高会让AI学习太深，会学到很多无关的细节，类似于“过拟合”

**网络Alpha（Network Alpha）：**&#x53EF;以理解为Lora对原模型权重的影响度，越接近Rank，则对原模型权重影响越小， 越接近0，则对原模型权重影响越明显，Alpha一般不超过Rank，目前一般将Alpha设置为<mark style="color:red;">Rank的1/2</mark>，如果设置为1，则将权重影响调整为最大

（6）**打标设置**

<figure><img src="https://751506775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI1niezbE5y99beoQQ5aL%2Fuploads%2F54dOA3GmH8NI166927LG%2F%E6%89%93%E6%A0%87%E8%AE%BE%E7%BD%AE.png?alt=media&amp;token=0015f312-6cd1-4917-af30-b9652485babc" alt=""><figcaption></figcaption></figure>

* 一般情况下，标签越靠前则该标签的权重越大，因此一般选择<mark style="color:red;">打乱标注</mark>

## **训练问题**

### **过拟合（overfitting)）/欠拟合（underfitting）**

**过拟合：**&#x7531;于数据集比较少或是AI过于精准的匹配到了数据集，导致lora生成的图像很大程度上与数据集相同，模型的泛化能力差

<figure><img src="https://content.gitbook.com/content/I1niezbE5y99beoQQ5aL/blobs/BuCv26ruUz475KDOMv9n/b798b362-37d3-4e15-b784-397ac082563a.png" alt="Lora Training Process - Training issues - Overfitting"><figcaption></figcaption></figure>

右上方的图像无论是外观还是姿势，都与左边数据集<mark style="background-color:yellow;">过于相同</mark>

**过拟合原因：**

1. 数据集数量少
2. 参数设置错误（标签、学习率、步数、优化器等）

**防止过拟合：**

1. 适当降低学习率
2. 缩短学习步长
3. 降低Rank，提高Alpha
4. 减少Repeat
5. 使用正则化训练
6. 增加数据集

**欠拟合：**&#x6A21;型在训练过程中未能充分学习到数据集的特征，最终导致出图不能很好的匹配数据集

<figure><img src="https://751506775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI1niezbE5y99beoQQ5aL%2Fuploads%2FONJsvKaHj4IHyO0ABfqi%2F%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20240808185414.png?alt=media&amp;token=d650a514-1302-41db-a794-72be18dfbdab" alt=""><figcaption></figcaption></figure>

可以看到，Lora出图未能很好的保留数据集中的特征——<mark style="background-color:yellow;">不相似</mark>

**欠拟合原因：**

1. 模型复杂度低
2. 特征量少

**防止欠拟合：**

1. 适当提高学习率
2. 延长学习步长
3. 提高Rank，降低Alpha
4. 增大Repeat
5. 降低正则化约束
6. 增加数据集更多特征（高质量）

## **正则数据集**

* 一种避免图像过拟合的方式，添加额外的图像，<mark style="background-color:yellow;">提高模型的泛化力</mark>。正则训练集不应过多，否则AI会过多的学习到正则数据集导致与原本目标不一致，建议<mark style="color:red;">10-20张</mark>

<figure><img src="https://751506775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI1niezbE5y99beoQQ5aL%2Fuploads%2FYGo6H8pATG9RRKGQoiDs%2F%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20240808185638.png?alt=media&amp;token=922129d4-d747-45fb-a7df-80cc3b1c0996" alt=""><figcaption></figcaption></figure>

例如：人像数据集中大多都是长发，可以在正则训练集添加短发；同样，如果数据集中全是同一个画风的图像，则可以在正则数据集添加一些其他画风的图，让模型更多样化，<mark style="background-color:yellow;">正则训练集不需要打标</mark>

<mark style="color:red;">\*</mark>通俗来说，这样训练的Lora有点像数据集与正则数据集的结合体

### **损失值（loss）**

AI学到的东西与实际的东西之间的<mark style="background-color:yellow;">偏差值</mark>，利用loss可以指导AI学习的方向，优化AI训练模型中的参数，因此，当loss较小时，AI学到的东西与实际的东西之间的偏差就比较小，这时候，AI学习的最像。只要loss逐步降低，一般就没什么大问题

三次元loss值一般在<mark style="color:red;">0.1-0.12</mark>，二次元loss值可以<mark style="color:red;">适当降低</mark>

通过loss值判断模型训练问题

<figure><img src="https://751506775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI1niezbE5y99beoQQ5aL%2Fuploads%2FNtGLlMH8YPnTsd5Ga14U%2F%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20240808185839.png?alt=media&amp;token=d2a4777a-9ec4-47aa-a9c8-f15eaf1f05a8" alt=""><figcaption></figcaption></figure>

## 总结

* 目前的“微调模型”大概可以分为三种：Dreambooth输出的 <mark style="background-color:yellow;">Checkpoint大模型、Lora模型</mark>、以及Textual Inversion输出的 <mark style="background-color:yellow;">Embeddings</mark> 词嵌入模型，从模型大小、训练时长以及训练集要求等要素来看，Lora是“性价比”最高的方式，无论是画风、人物或是一些姿势调整，Lora都能发挥很好的作用

<figure><img src="https://751506775-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI1niezbE5y99beoQQ5aL%2Fuploads%2FyDaS2wIMkaFNAkvSkNyn%2F%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20240226150705.png?alt=media&amp;token=3a1b7f7a-c041-4272-8c9b-cfc41d2af447" alt=""><figcaption></figcaption></figure>

## SDXL LoRA 参数设置

### 推荐训练参数

### 轮数与步数

Epochs（轮数）

对数据集图片训练的轮数，<mark style="background-color:yellow;">新手建议填10</mark>，数据集图片太少的话觉得训练不足可以开高，若训练集太过庞大可减少训练轮数。

Repeats（步数）：

对图片的学习次数，次数越多，效果越好，图片构成越复杂，越需要高的步数，但是步数太多容易过拟合，<mark style="background-color:yellow;">所以建议10</mark>，大概率可以避免过拟合，并且得到不错的训练结果。

<mark style="background-color:yellow;">注：如果训练出来不太像，可以酌情拉高epochs和repeats。</mark>

### 学习率与优化器

#### learning\_rate（总学习率）：

学习率是指每个步骤中改变的程度。如果指定一个大的值，学习速度就会加快，但是可能会出现最严重导致模型崩溃或无法达到状态的情况。如果指定一个小值值，学习速度会变慢，也可能达到最佳状态。在unet学习率与文本编码学习率分开设置时，总学习率自动失效。

#### Unet\_lr（unet学习率）:

unet是对随机种子生成的噪声图进行引导，来指导去噪的方向，找出需要改变的地方并给出改变的数据，学习率越高，拟合速度越快；过高容易学不到细节，而学习率过低容易导致欠拟合，生成的图片和素材完全不像。根据要练模型的种类和训练集情况，学习率各不相同，角色类训练建议0.0002左右。

#### text\_encoder\_lr（文本编码学习率）:

本质上是把tag转化成unet能理解的embedding形式，由于sdxl的文本编码器已经经过充分的训练，因此在大多数情况下不需要进行进一步的训练，如无特殊情况，保持默认参数。

#### optimizer（优化器）：

优化器（optimizer）是深度学习中用于调整模型参数以最小化损失函数的算法。在训练神经网络时，优化器根据损失函数的梯度信息来更新模型的权重，以使模型能够更好地拟合训练数据。默认的优化器AdamW可以正常完成SDXL训练，如果其他需求，也可以选择其他优化器，比如自适应学习率的Prodigy（懒人必备）。

#### Ir\_scheduler（学习率调度设置）：

Ir\_scheduler（学习率调度设置）是指在训练过程中动态地调整学习率的一种策略或算法，如无特殊情况，选择constant 即可。

### 网络设置

#### 3.1 network\_dim (Network Dimension):

#### network\_dim（网络维度）

跟训练出来Lora的大小密切相关，就SDXL而言，32dim的lora大小为200M,16dim的大小为100M，8dim的大小为50M。角色类选择8dim即可。

#### network\_alpha

一般设置为dim/2或者dim/4。如上面dim设为8，alpha可以设置为4。

### 其他设置

#### Resolution(分辨率)

训练时的分辨率 宽,高，可以是非正方形，但必须为64的整数倍。SDXL建议1024\*1024或1024\*768.

#### Enable\_bucket（分桶）

如果没有统一图片分辨率，请打开这个参数，他会自动将训练集的分辨率分类，每种分辨率或很接近的分辨率建立一个桶来存储图片，然后开始训练，这样就省去了我们前期的统一分辨率工作。<mark style="background-color:yellow;">如果已经统一图片分辨率，则无需打开。</mark>

#### Noise\_offest与multires\_noise\_iterations

两种噪声偏移皆是为了改善生成图片时图片过亮或过暗的情况，如果训练集中没有过亮或过暗的图片，可以不开启，如果开启则<mark style="background-color:yellow;">建议使用multires\_noise\_iterations，</mark>数值建议6-10。

#### Multires\_noise\_discount

需要和上方multires\_noise\_iterations参数一同启用，建议0.3-0.8。

#### Clip\_skip

指定几就使用文本编码器的倒数第几层输出，通常维持默认。
