3-2 LoRA训练详解

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

Lora有什么用?

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

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

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

*相比大模型(Checkpoint),Lora的体积更小,更节省时间与资源,并且在叠加大模型的基础上能够调整权重,实现不同的效果

训练过程

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

*以SeaArt训练人脸模型为例

准备数据集

在上传数据集时需要保持“多样化样本”的原则,也就是说,数据集应当是不同角度、姿势、光线等等,并且保证数据集的高清晰度,这一步主要是为了让AI认识图片

图片预处理

图片预处理主要分三个方面:(1)裁剪图片 (2)打标 (3)添加触发词

(1)裁剪图片

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

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

  • 中央裁剪:裁剪图片的中央区域

  • 聚焦裁剪:自动识别图片主体

*相比中央裁剪,聚焦裁剪更容易保留数据集的主体部分,一般推荐使用聚焦裁剪

(2)打标

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

打标方法:BLIP/Deepbooru

  • BLIP:自然语言标签,例如:“一个黑色头发的女孩”

  • Deepbooru:词组语言标签,例如:“一个女孩,黑色头发”

  • 打标阈值:越小描述的越精细,推荐0.6

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

*例如这里想要之后生成的图片都是黑色头发、黑色眼睛,就可以将这两个标签删除

(3)添加触发词

触发词(选填):触发Lora生效的提示词,相当于将人物特征的词条整合为一个词语

设置参数

基础模型(底模):尽量选择优质稳定且Lora画风更接近的基础模型,这AI能够更容易匹配特征并记录差异

推荐基础模型:

真实系:SD1.5、ChilloutMix、MajicMIX Realistic、Realistic Vison

二次元:AnyLoRA、Anything | 万象熔炉、ReV Animated

高级参数

(1) 训练参数

Repeat(单张次数):对一张素材的学习次数,次数越多,学习效果越好,但次数过多,也很容易造成图片固化。建议:二次元:8;真实系:15

Epoch(循环轮次):一个轮次=训练集数*Repeat,也就是对训练集的图片一共训练了多少步,如果训练集中有20张图片,Repeat(单张次数)为10,那么就会学习20*10=200步,当走完200步则经过了一个Epoch(循环轮次),如果Epoch(循环轮次)设置为10,那么Lora训练总共就会训练2000步。建议:二次元:20;真实系:10

Batch size(批量大小):同时学习的图片数量;当设置为2时,AI就会一次性学习2张图片,总时长也会相对缩短;但在同时学习多张图片时,AI对每张图片学习的精度也会相对下降

训练混合精度(Mixed precision):推荐fp16

(2)样图设置

样图分辨率(推荐):决定最后模型效果预览图的尺寸

SD1.5:512*512

SDXL:1024*1024

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

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

(3) 保存设置

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

Lora保存精度(Save precision):推荐fp16

(4)学习率&优化器

学习率(Learning Rate):指AI学习数据集图片的强度,学习率越高,AI就更能学习进去,但也容易造成出图不像,当数据集增加可以尝试降低学习率。推荐先从默认开始尝试,再根据训练结果,修改学习率,建议从较低的学习率开始逐渐增加,推荐0.0001

U-Net(unet lr):当设置了unet lr后,Learning Rate将不会生效,推荐0.0001

文本编码器学习率(text encoder lr):对tag的敏感程度,通常会将text encoder lr设置为unet lr的1/2或1/10

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

优化器(Optimizer):决定AI在训练过程中把握学习的方法,直接影响学习效果

推荐使用 AdamW8bit

  • Lion:新推出的优化器,最佳学习率通常比AdamW小10倍左右,

  • Prodigy:将学习率都设置为1,Prodigy将会自动改变学习率来取得最佳效果,适合新手

(5)网格

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

网格大小(Network Rank Dim):直接影响Lora的大小,Rank越大,训练中要微调的数据量就越多。128=140MB+;64=70MB+;32=40MB+

  • 推荐:复杂画风、三次元:64/128

  • 二次元画风或人物:8/16/32

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

网络Alpha(Network Alpha):可以理解为Lora对原模型权重的影响度,越接近Rank,则对原模型权重影响越小, 越接近0,则对原模型权重影响越明显,Alpha一般不超过Rank,目前一般将Alpha设置为Rank的1/2,如果设置为1,则将权重影响调整为最大

(6)打标设置

  • 一般情况下,标签越靠前则该标签的权重越大,因此一般选择打乱标注

训练问题

过拟合(overfitting))/欠拟合(underfitting)

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

右上方的图像无论是外观还是姿势,都与左边数据集过于相同

过拟合原因:

  1. 数据集数量少

  2. 参数设置错误(标签、学习率、步数、优化器等)

防止过拟合:

  1. 适当降低学习率

  2. 缩短学习步长

  3. 降低Rank,提高Alpha

  4. 减少Repeat

  5. 使用正则化训练

  6. 增加数据集

欠拟合:模型在训练过程中未能充分学习到数据集的特征,最终导致出图不能很好的匹配数据集

可以看到,Lora出图未能很好的保留数据集中的特征——不相似

欠拟合原因:

  1. 模型复杂度低

  2. 特征量少

防止欠拟合:

  1. 适当提高学习率

  2. 延长学习步长

  3. 提高Rank,降低Alpha

  4. 增大Repeat

  5. 降低正则化约束

  6. 增加数据集更多特征(高质量)

正则数据集

  • 一种避免图像过拟合的方式,添加额外的图像,提高模型的泛化力。正则训练集不应过多,否则AI会过多的学习到正则数据集导致与原本目标不一致,建议10-20张

例如:人像数据集中大多都是长发,可以在正则训练集添加短发;同样,如果数据集中全是同一个画风的图像,则可以在正则数据集添加一些其他画风的图,让模型更多样化,正则训练集不需要打标

*通俗来说,这样训练的Lora有点像数据集与正则数据集的结合体

损失值(loss)

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

三次元loss值一般在0.1-0.12,二次元loss值可以适当降低

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

总结

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

SDXL LoRA 参数设置

推荐训练参数

轮数与步数

Epochs(轮数)

对数据集图片训练的轮数,新手建议填10,数据集图片太少的话觉得训练不足可以开高,若训练集太过庞大可减少训练轮数。

Repeats(步数):

对图片的学习次数,次数越多,效果越好,图片构成越复杂,越需要高的步数,但是步数太多容易过拟合,所以建议10,大概率可以避免过拟合,并且得到不错的训练结果。

注:如果训练出来不太像,可以酌情拉高epochs和repeats。

学习率与优化器

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(分桶)

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

Noise_offest与multires_noise_iterations

两种噪声偏移皆是为了改善生成图片时图片过亮或过暗的情况,如果训练集中没有过亮或过暗的图片,可以不开启,如果开启则建议使用multires_noise_iterations,数值建议6-10。

Multires_noise_discount

需要和上方multires_noise_iterations参数一同启用,建议0.3-0.8。

Clip_skip

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

Last updated