Stable Diffusion工作的工作核心就是文本编码器(CLIP)和噪声预测器(U-Net),文本编码器负责将文本提示词转换为嵌入向量,而噪声预测器负责将噪声图扩散为图像。
Textual Inversion(文本反演)只微调了文本编码器,因而效果没有那么好。
大白话:文本编码器相当于“翻译官”,只需把文字转成机器能理解的密码,规则相对固定。
而Dreambooth会将文本编码器和噪声预测器一起微调,由于训练噪声预测器是为了从带噪声的图像中预测原始噪声,Dreambooth为了能够同时去微调这里面的所有参数,所以Dreambooth才会有那么高的配置需求。
大白话:噪声预测器像“侦探”,要从一团模糊的马赛克(噪声图)中猜出原始图片的模样,还得结合文字提示和时间线索,难度飙升!

训练会让模型里以向量形式存储的像素分布规律发生改变,执行运算时,它们会被用来调节算法的运行逻辑,从而输出不同结果,因而也叫模型的“权重”。
模型权重:在深度学习中,模型的权重(weights)是指神经网络中的参数,这些参数用于调整和学习模型的行为,以便能够对输入数据进行有效的映射和提取有用的特征。
模型权重是AI通过学习海量图片和文字后形成的“内部参数”,就像人脑的神经连接强度。它决定了模型如何把文字描述(如“一只猫”)转换成具体图像。权重越准确,生成的图片就越符合要求

在这个复杂的网络里,各种权重以一种特殊形式——“矩阵”储存在一起,就像excel表格里的数据一样。
"矩阵"指的是神经网络各层中存储模型知识的核心参数结构。这些参数决定了模型如何处理输入数据(比如文字或图片)。

那LoRA有什么用呢?
LoRA主要做两件事:
一件是“冻结”原始模型的权重,在旁边单独起了一个“微调权重”来进行训练。
“冻结主路,开旁路”:LoRA不碰原始模型庞大的参数(冻结),而是在旁边加一条由小工具(A和B矩阵)组成的“旁支小道”(微调权重)。训练时只调整这些小工具。

另一件则是在对这个微调权重进行训练的时候,“偷工减料”了下。
“小工具是压缩包”: 这条旁路小道上用的小工具(A和B矩阵)本身是经过“压缩”处理的(低秩分解)。它们通过“先压缩数据再解压”的方式(B * A)来模拟一个大工具的效果,从而大大减少了需要训练的参数数量,实现了“偷工减料”的高效训练。
简单的说,LoRA就是在不影响主模型效果的情况下打的一个“小补丁”,而这个“小补丁”为了省性能,所以采用了压缩数据进行训练,然后解压还原数据的方式。
假设这里有一个权重矩阵一共有1000行1000列,它们在对矩阵做微调的时候,并不需要计算全部行列,只需要处理开头的2行和2列,跳出来的模型在处理任务时,表现和微调1000行1000列差不多。

tips:矩阵的“秩”是一个线性代数里的概念,描述了这个矩阵中的信息丰富度和多样性。在“低秩适应”的常经理,行列数的降低伴随着秩的降低。
LoRA创建了两个额外的“转换器”:
一个把原始参数从“满秩”状态下转换成“低秩”


另一个又将“低秩”参数转换回“满秩”

所以,我们只需要让模型学习这两个“小矩阵”里的数据变化就行。

Kohya训练器前言介绍
训练脚本是由一位叫做kohya开发者制作的sd-scripts(即kohya_ss),后面有另一位开发者(@bmaltais)帮他把这个脚本制作成了更好操作的图形界面。
Kohya_SS项目地址:github.com/kohya-ss/sd-scripts
由@bmaltais 制作的Kohya GUI:github.com/bmaltais/kohya_ss
参数指南(训练参数详解):github.com/bmaltais/kohya_ss/wiki/LoRA-training-parameters

国内大佬开发的丹炉:
秋葉aaaki的SD-Trainer:网页链接
朱尼酱的赛博丹炉:网页链接
这些丹炉所使用的脚本(和kohya GUI)在底层逻辑上是一致的,所以这期教程也适用这些大佬制作的训练程序。
提示:这期教程仅提供KohyaGUI的安装教学,如果你对其他“丹炉”感兴趣,可以根据up视频简介区里提供的信息找到对应大佬的视频收看并按照指引下载安装。

Kohya安装
三个前置软件:Python、Git、Visual studio
注意:随着时间变更,安装程序的前置要求与具体步骤都可能发生变化,采用“整合包”式的丹炉一般无需安装前置环境应用,具体以开发者的说明为主。
up视频下方有安装包,自行获取

除了安装Python时需要勾选“添加路径到系统变量”,其他基本上不用管。


接下来就是使用Git clone进行官方程序的安装。

安装的同时去看up视频下方简介区的资料文档,里面包含了所有安装所需的脚本命令。
05:57 Kohya训练器安装
训练器安装全流程指引:gf66fxi6ji.feishu.cn/wiki/Q4EYwQl2riWw25kdN3hc5xuEnIe
包括如何安装Kohya、安装CUDNN加速版本、安装汉化补丁、常见问题怎么解决……

安装完毕后,敲5回车,启动训练器界面

后续每次进入界面,都可以通过这里进入(敲5即可)

示例:以《原神》里的凝光为例,去训练人物风格。基本流程:准备训练集、建立文件夹、设置参数
底模解析:Stable Diffusion模型版本分析
项目设置:概念文件夹的作用和意义
示例:以《原神》里的凝光为例,去训练人物风格。

第一步:收集训练集
需要注意的是,训练集应当能尽量涵盖训练对象的“多样化样本”,

在这个示例中,up找了官方的角色立绘图、各种不同角度的游戏建模截图、还有还原度高的二创作品。



如果是训练单一人物,以20~30张的数量为宜。
请注意,理论上来说,训练模型需要的图片越多越好,但是,如果太多低质量的图片,训练起来效果也不会很好,所以需要遵循质量>数量原则,但也请注意,这里的高质量不单单指的是高分辨率,如果训练集里的所有图片都是单一角度、单一风格、单一场景,那么最终训练出来的效果也只能是这个单一角度、风格、场景的模型。
分辨率与清晰度
分辨率需不低于 512×512像素,推荐 768×768或更高(如1024×1024)。
图像需清晰无噪点、无压缩痕迹,避免模糊或低分辨率放大导致的失真。
内容质量
主体突出:构图简洁,避免杂乱背景干扰核心对象。
光线均匀:无过曝或过暗区域,确保细节可见。
特征明显:对象需具备可辨识的独特特征(如人脸五官、服饰细节)。
多样性与覆盖度
多角度/多姿态:包含正面、侧面、仰视、俯视等不同视角。
表情与状态:如训练人物,需涵盖喜怒哀乐等表情及站立、坐姿等姿态。
细节特写:针对关键部位(如脸部、手部、服饰)提供特写镜头。
数据一致性
风格统一(如全部为赛璐璐画风或写实风格),避免混合冲突风格导致模型混淆。
避免水印、版权标记或多人同框(除非专门训练群体场景)。
数量与质量平衡
LoRA:通常需 15-40张 高质量图片,过少可能导致欠拟合,过多相似图片易导致过拟合。
Dreambooth:5-10张 即可,但每张需高度多样化以覆盖预期生成场景。
关键原则:质量优于数量,20张高质量图优于200张低质图。

第二步:图片预处理
裁剪+打标
裁剪可以使用WebUI预训练(后期处理)中的智能裁剪即可

不过这个功能不是特别好用,可以对一些裁得不好的图片手动调整。

为什么要裁剪?
裁剪就是为了让AI能更好地通过图片辨析训练对象。
对于画幅太大、人物占比小的,可以考虑裁剪图片尺寸,聚焦在人物身体附近。

有些人物太瘦长,裁了会导致肢体丢失,那也可以不裁,大部分能裁剪就裁剪,但尺寸也不需要绝对固定在512像素上。

打标
打标最简单的方式就是使用WebUI后期处理中的BLIP和DeepBooru,但它们打出来的标通常不够准确和详细。

所以,好的打标方式就是使用WD 1.4 Tagger。
WD 1.4 Tagger:https://github.com/toriato/stable-diffusion-webui-wd-tagger

这个插件可以帮我们反推图片提示词来准确还原画面元素。

这里有一个批处理功能,可以一次性给一个文件夹里的所有图片打标,生成同名txt文件。

在训练LoRA时,“附加额外标签”可以帮助我们添加额外的字词,作为训练主体的“触发词”

这里可以是角色的姓名,也可以是其他的字词。

那么他就会出现在反推提示词的第一位。
more:在训练的过程中,排在前面的提示词对于AI而言有着更高的“权重”,建立的向量关联会更加稳固。

第三步:设置训练参数
在Kohya GUI中,选择LoRA训练标签,下面有三个步骤,分别是底模(模型来源)、文件夹、参数
1、选择合适的底模
底模:模型训练需要一个“基底”作为微调的起点。

同时Kohya提供官方模型的下载链接,选择这些选项会自动下载到本地文件夹并调用。

如果不想,可以选择Custom(自定义),然后在下面加载自己电脑上的模型。

SD v1、v2、XL模型对比:


不同版本模型之间的一些底层构造不同,因此训练哪个版本的底模,训练出的LoRA就只能与这个版本体系下的大模型一起使用。

简单说:要对二次元动漫风格类的图片进行微调时,使用Tagger反推会比较好。

使用风格中立的模型,拥有泛化能力强。与之相对应的,就是风格特别突出,如果你只想在这个风格上效果好,那么你得接受它的泛化能力没那么强。

2、文件夹
图片文件夹:存放训练集图片(与标注文件)位置
正则化文件夹:存放正则化图片位置
正则化图像是一种用于避免图像过拟合的方式,可填可不填。
输出文件夹:输出模型位置
日志文件夹:训练日志保存位置

小技巧:
新建一个文件夹,命名为训练项目的名字。

然后在里面新建三个文件夹,分别命名为Image(图像)、Models(模型)、log(日志)

注意:路径中最好不要有任何的中文和空格,如果有,可能会干扰一些脚本的执行。

我们处理好的训练集图片会被放在Image文件夹中的文件夹里。

而这里面的文件夹命名格式需要如图所示:
6_NingGuang
6代表图像重复训练的次数(Repeat),重复越多,AI学习的效果就会越“深刻”。
一般二次元的图片设置在5~10次,三次元的图片因为细节较为复杂,可以考虑设置在10~30之间。
NingGuang代表概念(concept),最好是打标时添加的触发词。
这个文件夹也被成为概念文件夹,在后续一些更为复杂的LoRA训练中,还可以建立多个不同概念文件夹,存放不同的训练集图片来植入多个概念,让LoRA学习更丰富的内容。

而models和log文件夹空着就行。他们后续会生成训练产出的模型和记录训练状态的日志。
回到Kohya训练器里,将这几个文件夹的名字填到对应的菜单里。
这里需要注意下,训练集图片的文件夹填写的是装有概念文件夹的文件夹(Image),而不是这个概念文件夹本身(6_NingGuang)

模型输出文件夹:模型输出的名字

3、参数
3.1 快捷训练参数调试技巧:
选择预设
present(预设):预先设置好的参数预设。

选择训练时间(最大训练步长)
Max Train Steps(最大训练步长):控制训练何时停止
如果训练集规模在20~30张,那可以设置1200~1500之间,

然后点击训练就行。

在执行启动的命令行中,里面会开始输出各种训练相关的信息。而我们在图形界面(GUI)里输入的一切选项,会被转换为这样的命令,交给学习算法初始化各项设置。

在这个过程中,如果出现报错,多半是某些训练参数的设置不符合规格。
可以根据报错信息针对性查找解决方式。

在训练过程中出现的进度条,代表着程序正在处理训练集图片,把它们转化为潜空间里的“嵌入向量”,方便后续学习。

直到看到如下信息,就是训练正常在推进的标志了。

3.2 检测训练好的模型
进入新建的models文件夹里,

这里会存储着训练过程中生成的LoRA。

选择这个最终不带任何数字的模型(最特殊的那一个),它就是最终的训练成果了。

把它放入WebUI里的models中的LoRA文件夹内。

打开WebUI,在不加入训练的LoRA和加入训练的LoRA,写一份相同的提示词,在不改变其他参数的情况下生成。
没加入训练的LoRA时,生成的效果:

加入训练的LoRA时,生成的效果:

Kohya训练器中的参数众多,但不是所有参数都需要填的。例如这些标有“可选”(Optional)的选项,都可以默认留空。

如果选择了预设,部分没有用的选项也会被隐藏起来。

一、LoRA类型(LoRA Type)
在LoRA Type中,可以设置LoRA的类型。

LoRA虽然就是一种模型了,但是后续开发者在这个基础上对算法不断做改进,开发出许多“增强版”的LoRA,来实现更好的训练和推理效果。

由@琥珀青葉 开发的LyCORIS:github.com/KohakuBlueleaf/LyCORIS,翻译过来就是“LoRA除常规方法外的其他秩自适应实现”

目前,这套方法包含了LoCon、LoHa、LoKr、DyLoRA等其他几种算法,他们在训练的灵活度、多样性与还原性上有些许差异。
使用哪个?
Standard(传统LoRA):稳定性好
LoCon(加入卷积层控制):对训练集细节有更好的还原效果
LoHa(使用哈达玛积,对权重重新参数化):更好的泛化能力
LoKr(使用克罗内克积,对权重重新参数化):不同的算法,更好的泛化能力
IA^3(少量参数高效微调):轻量化学习,效果较为粗糙

二、训练步长(Training Steps)
这一行决定“时间”的参数,也可以叫做步长(Steps)
可以理解为,AI每学习一步,就是对训练集里的一张图片做了一次学习。

假设训练集里有30张图片,那就需要进行30步的训练。

在前面创建的Image文件夹里,6_NingGuang中的6代表着AI会把每张图片重复学习6次,30张*6次=180步,因此,学习完这些所有的图片需要走180步。
而每走完这样的“180步”,就被称为训练里的一个“轮次(Epoch)”

1个轮次(Epoch)的步数=训练集图片数*重复数(Repeat)
如果将炼模型比作做菜,那训练的总步长决定了我们什么时候把菜“起锅”。起锅早了,菜就没熟;起锅晚了,菜就糊了。

在本次LoRA人物训练这个场景中,up说在训练集规模不大的情况下(如20~30),按照默认参数训练约1200~1500步可以取得比较好的效果。
注:这个步数数值知识一个较为模糊的估计区间。训练的模型步数与许多其他的因素都有关联,例如训练的学习率、训练集数量和训练目的等。

如何控制训练步数?
方法一:直接定义总轮次数
Epoch(数量增加):总的轮次数
例如这里改成10,也就是一共要训练10个轮次,30张图片*6次*10轮=1800步,总共要训练1800步。

方法二:设置最大训练轮次数/最大训练步数,限制它在训练到一定阶段下自动停止。
Max Train Epoch(最大训练轮次):小于总轮次数时生效(小于Epoch数量时生效)
Max Train Steps(最大训练步数):小于最终步数时生效(小于训练集数量*批次数*轮次数时生效)

例如:
总轮次数为10轮,30张图片训练6次,也就是一共需要训练1800步。
当最大训练步数为1200步,那么最终训练的步数就会在1200步时停止训练。

如果不想去计算,可以将轮次数设置得很大,然后再去设置最大训练轮次数或者最大训练步数,靠后面这两个选项来操控它什么时候停止。

如果不设置的话,就会练完所有轮次再停止。

在Kohya的训练脚本中,并不是一定要训练完所有轮次才会输出结果的,因为AI的“知识水平”是在动态积累的,哪怕它只训练了一轮,其实都是具备根据模型输出一定结果的能力的。
每隔N轮保存(每N个Epoch保存):每隔几轮保存一次模型文件。

如果最终训练轮次数设置为10,每隔N轮保存设置为2

10/2=5,那么最终就会在输出模型文件夹里收获5个模型文件。
除了一个最终经过10轮训练的输出成品外,还有4个分别在第2、4、6、8轮保存下来了。

停止训练:随时可以在训练过程中暂停训练

训练批次大小(Batch Size):设置AI一次能学习几张图像

就像是在WebUI中一次生成几张图的那个批次大小。

如果训练批次大小设置为16,那么训练时长也会被缩短下来,但是所消耗的显存也会增加。
注:增大Batch Size至16,会使训练的总步数缩短到原来的1/16,但一次学习多张图片会导致单步学习速度下降。总耗时会变化为约原来的八分之一。

而另一种说法是,适当增大Batch Size有助于AI更均匀地“消化”图片特征,但可能会导致微调精度略微下降。

当训练批次大小大于1时,训练的总步数需要除以训练批次大小。(因为我们一次学习多张图像,所以学习步数也会相应下降)
训练集图片数量*图像重复训练的次数*总轮次数(Epoch)/训练批次大小
例如:
Batch Size=1时,训练10个Epoch,共1800步;
Batch Size=2时,训练10个Epoch,共900步。

三、学习率(Learning Rate)
学习率:AI学习训练集图片的强度
默认的学习率为0.0001,另一种在编程里的表述方式是1e-4。

e-4代表着10的负四次方,也就是0.0001
采用这种方法能较为精准控制数量级,同时避免输入上的误差。

好记的方式:
-6代表有6个0,9放到末尾。

学习率越高是不是越好?
答:当然不是啦!
学习率越高,越容易过拟合;学习率越低,越容易欠拟合。
过拟合(Overfitting):AI过于紧密或准确地匹配训练用的数据集,导致它无法良好地根据新的数据生成新的结果。
简单的说,就是AI不光把该学的东西学了,还学了不该学的东西。比如人物的无关特征、服饰、背景里的小装饰都学了进去。
而这样的结果就是画什么都像训练集里的图片。
欠拟合(Underfitting):没学到位
一般来说,只要参数设置得不是太离谱,都不会产生欠拟合。
例如:
正常的训练结果

过拟合的训练结果

欠拟合的训练结果

学习率怎么设置?
但这个没有唯一解,学习率设置需要与训练集图片复杂程度、训练集图片数量、训练步长、训练批次大小都有关系。
1、训练集图片复杂程度
简单任务:可尝试稍大学习率(如1e-4)。
复杂任务(如画风训练):需降低学习率(如1e-5),同时增加训练步数至3000~10000。
2、训练集图片数量
公式计算总步数:
总步数 = Epoch轮次 × Repeat重复次数 × 图片数量。
小数据集(20~30张):
总步数建议1200~1500,学习率保持1e-4。
大数据集(100~600张):
需降低学习率并延长训练轮次。
3、训练批次大小(Batch Size)
关系公式:2 * 训练批次大小(Batch Size) ≈ 2√2 * 学习率(Learning Rate),即批次增大时需同步提高学习率
但也需要注意的是,除非训练批次大小超过了10倍,否则没有特别必要去提高学习率。
4、训练步长(Training Steps)
学习率较高时需减少步长,避免震荡;学习率较低时需增加步长,确保充分收敛。
步长与学习率衰减联动:
前期(0~30%步数):较高学习率加速收敛。
后期(70%~100%步数):大幅衰减学习率。
复杂任务:总步数需增加,同时配合动态调度器(如Cosine with Restart)。
如果训练集里的图片比较简单,那么学习率就得小一点;如果训练集里的图片比较复杂,那么学习率就得大一点。
增加训练集里的图片,应该降低一些学习率;减少训练集里的图片,应该增加一些学习率。
训练样本的增加可能导致梯度下降算法在更新模型参数时需要更小的步长,因为更多的数据可能意味着更复杂的损失曲面。如果学习率过大,可能会导致训练不稳定或者错过收敛点。因此,一般会采取降低学习率的措施,或者开始就使用一个较低的学习率,逐渐增加直到能找到一个表现得更好的学习率数值。

学习率也与训练批次大小也有关,越大的Batch Size需要越大的学习率,因为把几张图拼在一起,AI接触到的信息就更多了

当Batch Size每增大到原来的2倍,学习率最好增大到原来的根号二(√2)倍(另外也有说法是2倍)

但琥珀青葉(LyCORIS作者)说,除非Batch Size的变化大到十倍以上,否则没有特别必要去调整学习率。
所以可以尝试学习率不变的情况下,如果增大训练批次,但效果不好的时候,再提高学习率。

文本编码器(Text Encoder)学习率:控制文本编码器的学习强度
文本编码器:将提示词映射为语义向量,影响生成内容的语义准确性(如物体属性、场景逻辑)。
Unet学习率:控制噪声预测器的学习强度
U-Net:负责噪声预测和图像生成,决定细节还原度(如纹理、结构)。
因为文本编码器对学习的敏感程度要远高于噪声预测器(文本编码器比噪声预测器好炼),所以,在专业的学习把控里,会把这两个分开设置,以追求更好的训练效果。

一般会将文本编码器的学习率设置为Unet学习率的二分之一到十分之一。但这个也不是准确的数值,需要根据具体实际讨论。

过拟合检测设置Text Encoder学习率和U-Net学习率:
文本编码器过拟合 → 生成结果依赖训练集标签词,替换同义词失效;
U-Net过拟合 → 输出图像与训练集构图/纹理高度雷同。

他们都是可选项(Optional),如果留空,那么U-Net的学习率等于上面输入的学习率。

然后将它的二分之一作为文本编码器的学习率输入进去训练。

如果下方的文本编码器和U-Net的学习率都填上了,那么上面的学习率就不会生效了,U-Net的学习率会覆盖这个数值。

四、优化器(Optimizer)
优化器:负责根据损失函数计算的梯度(即模型预测与真实值的误差方向)更新模型参数,使模型预测越来越准确。
简单来说,它决定了模型“如何学习”以及“学得多快多稳”
核心作用:根据模型预测的误差(损失函数),动态调整神经网络的“思考方式”(权重参数),让模型越学越聪明。
与学习率的关系:学习率是向导的步伐大小。步伐太大(高学习率)会越过宝藏,步伐太小(低学习率)会原地打转。优化器则负责智能调节步伐策略(如陡坡小步走、平路大步跑)。
向导(优化器)= 导航策略制定者
步伐(学习率)= 每一步的移动距离
地形坡度(梯度)= 预测误差的方向指引
可以这样理解,在一个地形图中,我们要找到最低点,这个最低点就是我们想要的模型。学习率就像是我们迈的步子(步长),而这个学习率是固定的,学习率太大,容易迈过这个最低点;学习率太小,容易原地打转。所以优化器就像一个向导,它会帮助学习率去动态调整步长,以到达最低点。

Kohya中常用优化器及使用方式
核心技巧:Kohya部分优化器(如Adafactor/Dadaptation)可自动调学习率,新手优先选它们!
1. Adafactor(节省显存的“极简主义向导”)
自动调整学习率,无需手动设置复杂参数,训练稳定且效果佳 。
对学习率不那么敏感,甚至可以不设置学习率,让它自动调整
在Kohya中,当你选择Adafactor时,可以将学习率设置为1.0或0.001等,它会基于这个值进行相对缩放
学习率(Learning Rate):设为 1(实际由算法自动缩放)
其他参数:默认即可
注意事项:虽然Adafactor非常节省显存,但它的“极简”策略有时也可能导致训练过程不如AdamW稳定,或者收敛速度稍慢 (Search Result 3)。
2. Dadaptation(“全自动”的“智能规划向导”)
自动适应模型不同部分的学习率(如文本编码器与UNET需不同速率),适合LoRA训练 。
学习率:1
UNET学习率:1
文本编码器学习率:0.5(避免文本侧过拟合)
3. Lion(信奉“大力出奇迹”的“激进派新生代向导”)
训练速度更快,适合大规模数据,但对学习率敏感,需根据数据量调整 。
学习率(Learning Rate) :Lion的学习率需要设置得比AdamW小很多,通常是AdamW的1/3到1/10 。例如,如果AdamW用1e-4,Lion可能需要用3e-5或1e-5。
权重衰减(Weight Decay) :与学习率相反,Lion的权重衰减需要设置得比AdamW大,同样是3到10倍。
安装:使用Lion优化器前,通常需要先在你的Python环境中安装相应的库:pip install lion-pytorch 。
给新手的建议:不推荐初学者一上来就使用Lion。它的参数调整更需要经验,设置不当很容易导致模型训练失败。建议在熟悉AdamW之后再来探索。
4. Prodigy/神童(全自动调参)
将学习率固定为 1,算法自动匹配最佳值,省心高效 。
5. AdamW / AdamW8bit(经验丰富、最值得信赖的“全能向导”)
经典优化器,广泛使用的优化器,效果稳健,但需手动调学习率,新手易设错 。
Learning Rate (lr):学习率,对于LoRA训练,通常设置为1e-4 (0.0001) 到 5e-5 (0.00005) 之间是一个不错的起点。
Optimizer Extra Arguments (额外参数):通常你可以留空。
weight_decay(权重衰减):可以设置一个很小的值如0.01或0.1来防止过拟合,但对于初学者可以暂时忽略。
关于AdamW8bit:这是AdamW的“轻装版”。它通过8-bit量化技术,减少显存占用。

在训练过程中,学习率并不是恒定不变的,而是随时间衰减的,这样在保证更好的学习效果的同时避免后期会过拟合。

把AI比作一个人,刚开始学习新东西,肯定需要更“用力”地记住他们。但经过一次次重复,后续没必要再用力去记住他们。
主导学习率衰减的东西是“学习率调度器”
学习率调度器:动态调控神经网络每次参数更新的调整幅度,解决固定学习率“前期慢如蜗牛,后期容易滑过终点”的痛点
初期·缓坡区:管家让你迈大步(高学习率),快速穿越平缓地带(加速前期收敛)
后期·陡峭区:管家让你走小步(低学习率),避免一脚踏空错过谷底(精细调参防震荡)

在Reddit讨论上,这个参数对最终训练效果影响不大(仅从loss上判断)。

Kohya中5大常用调度器详解
1. Constant(恒定调度器、常数)
行为:全程固定步伐(如始终0.0001)
适用场景:超短期训练(<10epoch)或调试阶段
新手建议:最简单的起点,但性能有限

2. Linear(线性衰减)
行为:从起点学习率直线下滑到零(如0.001→0)
操作公式:
当前学习率 = 初始值 - (初始值/总步数)×当前步数
优势:防止后期震荡

3. Cosine(余弦退火)
行为:按余弦曲线平滑下降(如从0.001→0.00001)
操作公式:
当前学习率 = 最小学习率 + 0.5×(初始值-最小值)×(1+cos(当前epoch/总epoch×π))
效果:最平衡的选择,适合80%常规训练

4. Cosine with Restarts(余弦重启)
行为:每N个epoch重置学习率(如每20epoch从0.001重新开始衰减)
作用:逃离局部最优陷阱,增强模型泛化力
警告:需配合足够epoch数(>50),新手慎用

选择余弦重启时,需要在学习率周期数中设置重启次数,才能让它生效。(3~5次,如果训练对象复杂,可以适当增大)

5. Polynomial(多项式衰减)
行为:按(1-当前步数/总步数)^幂数曲线下降
调参重点:幂数越大衰减越急(常用幂数=0.9~2)
适用场景:需要精细控制衰减节奏时

学习率调度器、优化器、学习率三者之间的关系
想象你在训练AI模型如同攀登一座未知高山(数据空间),目标是找到最低洼的谷底(最小损失值)。此时三个关键角色分工如下:

结论:
优化器决定怎么走(方向算法),调度器决定走多快(步伐策略),学习率是步伐的基准单位
调度器直接操控优化器的学习率参数,但不参与梯度计算和参数更新
高频问题解答
Q1 为什么优化器自带学习率调整(如Adam),还需要调度器?
Adam的自适应学习率是相对调整(根据梯度幅度缩放步长),但基础值仍固定
调度器直接改写基础学习率,实现全局策略调整(如从0.001→0.00001)
Q2 不设调度器会怎样?
固定学习率将导致:
后期参数在谷底反复横跳 → 损失值震荡不收敛
错过更精细的局部最优解 → 模型生成质量下降5%-15%
五、网络维度(Network Rank & Alpha)
Network Rank(Dimension,网络维度)
是什么:决定LoRA模型的"记忆容量",类似于模型能存储多少细节的"抽屉数量"。
影响:
数值越大(如128):模型能学习更精细的特征(如复杂画风、纹理),但文件体积更大(128对应约144MB模型),训练更慢且易学无关细节(过拟合)。
数值越小(如8):模型更轻量(文件仅约10MB),训练更快且省显存,但只能学简单特征(如人脸轮廓)。
新手建议:
角色训练:64-128
画风训练:32-64
避免盲目调高,优先试128
Network Alpha(网络Alpha)
是什么:控制模型权重的"缩放强度",防止学习过程中权重值过小被误删(归零)。
核心机制:
当权重值过小时,计算机会视为"无效"而舍弃,导致模型信息丢失。
Alpha通过放大权重值避免此问题(如原权重0.001 → 放大后保留)。
Alpha与Rank的联动:
Alpha必须 ≤ Rank(否则模型崩溃)。
Alpha/Rank比值:实际影响学习率强度(例Rank=128, Alpha=64 → 学习效果打5折)。
新手建议:
保守方案:Alpha = Rank(如128:128),此时Alpha不生效,简化调参。
进阶方案:Alpha = Rank/2(如128:64),可能提升泛化性但需调学习率。
总结
Rank决定 "学多细" ,Alpha决定 "学多稳"
他们的作用在于搭建一个合适的LoRA模型基底,被我们称之为一个“网络”(Network),供AI输入数据。

Rank:秩(与矩阵的“秩”是一个概念)
秩(Rank) 是线性代数中描述矩阵信息密度的核心指标,其本质是矩阵中线性无关向量(基)的数量,决定了矩阵所能张成的空间维度。
(X,Y,Z……)=(一维,二维,三维……)

Dim:维度的缩写(跟Rank是一样的)

Rank越高,我们从原始矩阵里抽出来的行列就越多,要微调的数据量就越多,那么就能容纳更复杂的概念。
它直接影响的是LoRA模型的大小,理论上,当Rank=128,LoRA模型的大小约为144M(标准);当Rank=8,LoRA模型的大小不到10M。
越大显存占用越高。
如何调整Rank值
高Rank值(如128、64):复杂画风、三次元物品、形象……
低Rank值(如32、16、8):二次元画风、二次元人物

维度过高的结果(过拟合)

不同LoRA类型的Rank、Alpha调整策略
1、标准 LoRA (Standard LoRA)
Rank设置建议: 32到128
Alpha建议设置为Rank的一半或更低(如 Rank=128, Alpha=64),以获得更稳定的训练效果。
2、LoCon (Low-Rank Convolutional Adaptation)
Rank设置建议: <=64
Alpha建议设置:1(代表不减弱,让微调权重发挥最大作用)
3、LoHa (Low-Rank Hadamard Product Adaptation)
Rank设置建议: <=32
Alpha推荐设置:1(代表不减弱,让微调权重发挥最大作用)

Network Alpha:用来调节LoRA对原模型影响作用的参数。

Alpha和Rank的比值等于我们使用LoRA时的“减弱权重”程度。

Alpha一般不接近Rank,它越接近Rank,则LoRA对原模型权重的影响越小。

Alpha越接近0,则LoRA对权重的微调作用越显著。

在选择LoCon、LoHa一类等带有对卷积层(Convolution)的控制的LoRA类型时。下面还会额外多出两个“卷积层”的Rank和Alpha设置。

新手留空就是了,它会自动把上面两个数值带入卷积层训练。

不同LoRA类型设置Rank、Alpha对照表(Nenly)
这个表格是根据二次元来设定的,如果是三次元的,尝试将它往上翻一倍来应用。
注:如果你希望以一组通用的设置开始尝试,请遵循大字的"最佳数值”;如果你需要根据结果反馈进行调整,请遵循小字提供的"参考范围”及软上限。
LoKr的维度控制里有一个额外的参数需要考虑,即LoKr因子(LoKr Factor)。
表格所示的维度数值为训练集在100张以下的基础情况。一般来说,训练集图片越多、越复杂,需要的Rank就会越高。

六、训练性能(Performance)
1、训练速度相关的选项:
混合精度(Mix Precision):用“半精度”加速训练,用“全精度”保障稳定
保存精度(Save Precision):决定最终模型文件的权重格式

他们都有三个选项,无、fp16、bf16
无:FP32(全精度),文件较大,但兼容性最佳,适合后续微调或复杂任务。
fp16:半精度,兼容性强
bf16:半精度,稳定性好
保存精度设置时,以混合精度是什么格式,保存精度就用什么格式为主,避免格式转换误差

“FP”的全称叫做“Floating Points”,是一种在机器学习里进行编码存储的数据类型。

目前大多数机器学习框架采用的是FP32(32位浮点数),被称为“单精度浮点数”,因为它在训练过程中能提供稳定的性能。

在科研领域,需要追求数据的绝对准确,但在训练AI模型上,我们不需要那么准确,也能表现得很好,所以“FP16”——半精度浮点数就诞生了。

在训练时开启fp16,或者跑图时使用fp16的模型,都会提升计算速度并节约显存。

WebUI默认开启fp16运算的

而全精度和半精度的差距也不大

而bf16(Brain Floating Point)是fp16的变种,理论上比fp16更稳定,并且它们之间的差异比fp32和fp16之间的差异还要小。

所以,推荐设置为fp16,因为市面上大部分模型都是基于fp16训练出来的。

缓存变量(Cache Latents):将训练图像的潜变量(Latents)预先计算并缓存在显存(VRAM)中,避免每轮训练重复执行VAE编码。
适用场景:单次训练任务(无需重复使用数据集),且显存充足时推荐启用
缓存潜变量到磁盘(Cache Latents to Disk):将预计算的潜变量 保存到磁盘文件(如.npz格式) ,支持后续训练直接复用
适用场景:需反复使用同一数据集训练(如调参测试、多阶段训练),或显存有限时推荐启用
Latent:潜空间数据,被VAE转化为“向量模式”的训练图像

总结
缓存变量 → 显存加速:牺牲显存换单次训练效率,适合实验性任务。
缓存到磁盘 → 持久复用:牺牲首次预处理时间换长期效率,适合生产级迭代训练。
推荐策略:对核心数据集优先启用磁盘缓存,后续训练直接加载,最大化资源利用率

无论是否开启这两个选项,训练时,AI都会将训练集图片变成潜空间向量。
如果不开启,它就是在训练过程中一张一张地去转换的(拖慢训练速度)

打开缓存潜变量,它会在开始训练前,先把一次性把所有图片缓存到显存中,然后反复调用。

开启缓存潜变量,以牺牲显存换取训练速度提升。

后面的“缓存至磁盘”则是将这个潜变量同时保存到本地的硬盘里,方便后续使用同一训练集进行连续训练,不用反复缓存同一批图片的潜变量。

在高级选项(增强)中

交叉注意力(Cross Attention):是一种深度学习里面的学习机制,可以提高模型训练和推理的效率。

如果是N卡,请开启xformers,它可以降低训练过程中的显存需求并提升速度。

内存高效注意力(Memory Efficient Attention):会压缩一定量的显存使用,降低显存需求(低配福音)
但是这个没有xformers提升那么大,且对速度影响较大(变慢)

七、参数调试技巧
由于没有一套可适用所有训练的参数,哪怕同一套参数、同一个训练集,都不能做到完全相同的效果。所以下面是一些参数调整小建议:
过拟合怎么办?欠拟合怎么办?

一、如何监控训练进程
查看命令行,命令行就是启动Kohya训练器时打开的代码窗口,它和WebUI一样,它在后台是不能关闭的。

而每次训练时,它都会输出大量训练相关的参数。我们就可以根据这些参数判断训练信息。

训练通常是用步长度量进程的,那训练时间就等于跑完全部步数所需的时间。
在训练进入稳定后,进度条右侧会出现一个估计时间,它是使用当前训练的速度推测的。

“it/s”:即每秒的步数或迭代数(iteration/second)来描述

如果训练慢的话,可能会变成“s/it”,说明需要超过一秒的时间来训练一步。

二、loss值与拟合情况
avr_loss:训练的平均损失函数数值,俗称“loss值”

Loss值(损失值) :是一个衡量模型预测结果与训练目标之间差异的指标。可以简单理解训练模型画出来的图片和训练集有多“像”,而这之间的差异就可以被量化成一个“loss”数值。

而loss数值是动态变化的,被用来判断训练的拟合程度。
loss值越低,说明AI拟合程度就越高。


最理想的状态下,训练初期,loss值会比较高,在后面loss值慢慢降低,最后在一个相对的低位保持“震荡”
在Kohya中训练LoRA时,Loss值应呈现「快速下降→平缓收敛→小幅震荡」的三阶段趋势,且最终稳定在任务依赖的理想区间(如人像0.06–0.09)。

反之,如果loss值一直在提高或者高低乱飘,就说明训练欠拟合或者根本没拟合。


另一种情况就是loss值太过于固定,只在小数点后三四位小幅度变化,那这很有可能是过拟合了。

loss函数图表示意图
注:曲线形状仅为示意

不需要过度关注最终收敛的loss数值到底是多少,在不同的训练集和参数上,最终收敛的loss值可能有所不同。所以,重点在于loss值的变化“趋势”

loss=nan(损失值丢失?):不显示loss值,梯度爆炸,参数有问题。
出现这个问题一般是一些参数被误调到了极端大或小的值(通常是学习率)、或Batch Size、Rank等参数设置不当导致显存爆炸。
改进建议:调整参数,或者从默认参数开始调整。

三、TensorBoard使用与作用
TensorBoard:可视化监控工具,以更直观的方式展示模型训练过程里的各项参数变化的一个工具。
在训练按钮的下方,可以开启TensorBoard。

在命令行里会执行相关的指令。

完毕后,TensorBoard会自动弹出在浏览器里(如果没有出现,可复制地址在浏览器打开)

loss/average(平均损失值):查看loss值变化趋势
以第一排第一张图表为准。

loss有什么有拟合、最终收敛到一个什么样的数值上,都能很直观地观察到。

SCALARS:调整曲线润滑程度。
我们可以在右侧的“SCALARS”中调整润滑曲线数值,以便能够更好的显示趋势。

如果有多次训练,可能会产生多条不同的函数曲线,可以在左边进行筛选过滤。

lr/TextEncoder(文本编码器学习率):查看文本编码器的学习率变化曲线。
lr/UNET(噪声预测器学习率):查看U-Net学习率变化曲线。
另一个则是学习率,以第二排的图片为准。
这部分只要优化器设置妥当,一般没有问题。

它就像是余弦函数的曲线一样慢慢降低的,就是我们设置的余弦调度器在发挥作用。


学习率预热(LR Warm Up) 是一种用于优化模型训练初期的技术策略。
核心逻辑:在训练开始时,让学习率从极小的值(接近0)逐步线性增加到预设的目标值,而非直接使用高学习率启动训练。
如果在Kohya训练器中设置了学习率预热的选项,还可以在开头观测到一个凸起来的曲线。表示在开头一定比例的步数里从0到1的提高学习率。目的是为了让AI在早期更高效地学习。
预热比例的设置是会在初始阶段逐渐增加学习率,但并非增加到一个比原来的数值更高的值,而是逐渐从0提高到目标学习率(即设定的初始学习率)。

四、生成训练过程中的样例图
在WebUI中训练Textual Inversion模型时,WebUI会每隔一段时间就能反馈一张图给我们看一看,反馈出来的图片就是样例图。

而在Kohya训练器中,在参数设置下方的最后一个标签——“样例”(Sample)里面,我们可以设置每隔多少步或每隔多少轮训练返回一张图像。

每n步采样一次(Sample every n steps):按训练步数间隔生成样本图像
一般设置为100~200
每n个轮次采样一次(Sample every n epochs):按训练轮次间隔生成样本
样本采样器(Sample sampler):指定生成样本图像的扩散采样算法
样本提示(Sample prompts):通过预定义提示词控制生成内容
--n "模糊的手" # 负向提示词(避免缺陷)
--w 512 # 图像宽度
--h 768 # 图像高度
--d 42 # 随机种子(固定可对比)
--l 7.5 # CFG Scale(提示词相关性)
--s 28 # 迭代步数
提示词推荐使用训练集某一张图像倒推出来的提示词做适当改动,放进来效果会比较直观。

tips:在类似“--w”的命令后输入一个空格,然后直接输入数值或提示词,无需输入括号。在这个提示词里,诸如“()”、“[]”一类的权重提示词符号不会起作用。

将相关提示词输入进去,尺寸为512*512,CFG为7.5,跑28步,还通过“-n”再加一些负面提示词。

开始训练以后,生成的样例图会被放在模型输出文件夹里的sample文件夹内。(……NingGuang/output/sample)

根据样例图分析模型训练情况
1、过拟合的样例图:
通常是生成的样例图连着好几张都过分接近训练集图片,并且发生明显的画风畸变(完全不像底模跑出来的风格)

2、欠拟合的样例图:
根本不像训练集图片,光靠底模也能直出一样。

3、维度错误(通常是过高)的样例图:
样图可能会非常混乱,但能看出一些学习的痕迹。

4、炸炉(?)的样例图:
把训练玩坏了。

甚至就是一张黑图。直接重炼。

通过查看样例图,虽然不会像在WebUI中上了各种手段后那样好看,但是可以保证这个训练至少是在往正确的方向进行的。

五、利用X/Y/X图标对比并检验成品
如果最终目标是练到1200步,我们让它每200步左右就保存一次,

那这样最后会出来6个包括最终成品在内的LoRA模型。

有时候,效果最好的不一定是最后的那一个,有可能那时候已经过拟合了,而一些“中间”的LoRA反而表现会更好。
如何测试LoRA模型?
1、将训练出的LoRA模型全部放进WebUI的LoRA文件夹中

2、在WebUI中设置一些列参数,可以自由设置

3、使用X/Y/Z图表脚本插件
XYZ图表可以进行对比出图的工具,在平时不知道某个提示词或模型权重以及某一项参数该如何设置时,都可以通过它来进行“对比”。

XYZ图表脚本插件使用方式
选好轴类型

设置轴值,轴值使用英文逗号分隔几个不同的数值
比如使用CFG的轴类型,轴值为2,4,6,8,10

它就能分别用这几个数值出图,并拼在一起形成一张对比图

示例1:提示词搜索/替换

模型后缀的数字,代表他们训练的轮次数,

为了方便替换,我们可以把最终成品也改成类似的格式

加载LoRA模型,复制触发词的数字尾缀。

然后粘贴到XYZ轴值里,之后把其他模型的尾缀号码都加上去,中间英文逗号分隔。它在运行的时候,就会根据一个一个轴值在提示词框中搜索字符串,每次运行就替换一次轴值。

生成后,我们就能看到在相同提示词、参数下,不同LoRA出来的效果大概是什么样的了。

示例2:权重

示例3:不同LoRA模型&权重

六、模型参数二次加载方式
当模型训练结束后,模型中有一个json文件,它记录了档次训练的所有参数信息。

即便关了电脑,我们依旧可以用Kohya最上方的参数文件选单加载,它会自动把所有参数同步,以便二次更改。
