3-2 LoRA训练详解
通过对LoRA训练的原理了解,进一步掌握LoRA训练!本指南涵盖了从原理到流程再到优化参数来训练LoRA。
Last updated
通过对LoRA训练的原理了解,进一步掌握LoRA训练!本指南涵盖了从原理到流程再到优化参数来训练LoRA。
Last updated
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
高级参数
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
样图分辨率(推荐):决定最后模型效果预览图的尺寸
SD1.5:512*512
SDXL:1024*1024
随机种子:控制随机生成的图,当使用同个随机种子与提示词,大概率会生成相同/相似的图
采样方法、提示词与负标签:主要展示最后模型效果预览图的效果
决定最后Lora的数量,如果设置为2,而Epoch(循环轮次)是10,则最后会保存5个Lora
Lora保存精度(Save precision):推荐fp16
学习率(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)打标设置
一般情况下,标签越靠前则该标签的权重越大,因此一般选择打乱标注
过拟合:由于数据集比较少或是AI过于精准的匹配到了数据集,导致lora生成的图像很大程度上与数据集相同,模型的泛化能力差
右上方的图像无论是外观还是姿势,都与左边数据集过于相同
过拟合原因:
数据集数量少
参数设置错误(标签、学习率、步数、优化器等)
防止过拟合:
适当降低学习率
缩短学习步长
降低Rank,提高Alpha
减少Repeat
使用正则化训练
增加数据集
欠拟合:模型在训练过程中未能充分学习到数据集的特征,最终导致出图不能很好的匹配数据集
可以看到,Lora出图未能很好的保留数据集中的特征——不相似
欠拟合原因:
模型复杂度低
特征量少
防止欠拟合:
适当提高学习率
延长学习步长
提高Rank,降低Alpha
增大Repeat
降低正则化约束
增加数据集更多特征(高质量)
一种避免图像过拟合的方式,添加额外的图像,提高模型的泛化力。正则训练集不应过多,否则AI会过多的学习到正则数据集导致与原本目标不一致,建议10-20张
例如:人像数据集中大多都是长发,可以在正则训练集添加短发;同样,如果数据集中全是同一个画风的图像,则可以在正则数据集添加一些其他画风的图,让模型更多样化,正则训练集不需要打标
*通俗来说,这样训练的Lora有点像数据集与正则数据集的结合体
AI学到的东西与实际的东西之间的偏差值,利用loss可以指导AI学习的方向,优化AI训练模型中的参数,因此,当loss较小时,AI学到的东西与实际的东西之间的偏差就比较小,这时候,AI学习的最像。只要loss逐步降低,一般就没什么大问题
三次元loss值一般在0.1-0.12,二次元loss值可以适当降低
通过loss值判断模型训练问题
目前的“微调模型”大概可以分为三种:Dreambooth输出的 Checkpoint大模型、Lora模型、以及Textual Inversion输出的 Embeddings 词嵌入模型,从模型大小、训练时长以及训练集要求等要素来看,Lora是“性价比”最高的方式,无论是画风、人物或是一些姿势调整,Lora都能发挥很好的作用
Epochs(轮数)
对数据集图片训练的轮数,新手建议填10,数据集图片太少的话觉得训练不足可以开高,若训练集太过庞大可减少训练轮数。
Repeats(步数):
对图片的学习次数,次数越多,效果越好,图片构成越复杂,越需要高的步数,但是步数太多容易过拟合,所以建议10,大概率可以避免过拟合,并且得到不错的训练结果。
注:如果训练出来不太像,可以酌情拉高epochs和repeats。
学习率是指每个步骤中改变的程度。如果指定一个大的值,学习速度就会加快,但是可能会出现最严重导致模型崩溃或无法达到状态的情况。如果指定一个小值值,学习速度会变慢,也可能达到最佳状态。在unet学习率与文本编码学习率分开设置时,总学习率自动失效。
unet是对随机种子生成的噪声图进行引导,来指导去噪的方向,找出需要改变的地方并给出改变的数据,学习率越高,拟合速度越快;过高容易学不到细节,而学习率过低容易导致欠拟合,生成的图片和素材完全不像。根据要练模型的种类和训练集情况,学习率各不相同,角色类训练建议0.0002左右。
本质上是把tag转化成unet能理解的embedding形式,由于sdxl的文本编码器已经经过充分的训练,因此在大多数情况下不需要进行进一步的训练,如无特殊情况,保持默认参数。
优化器(optimizer)是深度学习中用于调整模型参数以最小化损失函数的算法。在训练神经网络时,优化器根据损失函数的梯度信息来更新模型的权重,以使模型能够更好地拟合训练数据。默认的优化器AdamW可以正常完成SDXL训练,如果其他需求,也可以选择其他优化器,比如自适应学习率的Prodigy(懒人必备)。
Ir_scheduler(学习率调度设置)是指在训练过程中动态地调整学习率的一种策略或算法,如无特殊情况,选择constant 即可。
跟训练出来Lora的大小密切相关,就SDXL而言,32dim的lora大小为200M,16dim的大小为100M,8dim的大小为50M。角色类选择8dim即可。
一般设置为dim/2或者dim/4。如上面dim设为8,alpha可以设置为4。
训练时的分辨率 宽,高,可以是非正方形,但必须为64的整数倍。SDXL建议1024*1024或1024*768.
如果没有统一图片分辨率,请打开这个参数,他会自动将训练集的分辨率分类,每种分辨率或很接近的分辨率建立一个桶来存储图片,然后开始训练,这样就省去了我们前期的统一分辨率工作。如果已经统一图片分辨率,则无需打开。
两种噪声偏移皆是为了改善生成图片时图片过亮或过暗的情况,如果训练集中没有过亮或过暗的图片,可以不开启,如果开启则建议使用multires_noise_iterations,数值建议6-10。
需要和上方multires_noise_iterations参数一同启用,建议0.3-0.8。
指定几就使用文本编码器的倒数第几层输出,通常维持默认。