人人都能理解的StableDiffusion,使用Kohya_ss训练LoRA设置的详细说明(2)
作者: 人人都能理解的AI 来源: 人人都能理解的AI
誰でもわかるStable Diffusion Kohya_ssを使ったLoRA学習設定を徹底解説 - 人工知能と親しくなるブログ[1]
这次,我将大致解释 LoRA 的工作原理,然后使用 kohya_ss 来解释 LoRA模型训练的设置。
- 这篇文章非常长,请耐心阅读。
本文仅解释kohya_ss各个设置的含义。有关“准备学习图像的方法”、“如何为图像添加Tag”以及“如何执行训练”等方面的说明将在另一篇文章中进行。我计划在以后的文章中详细解释训练的执行方法。
3.5 Advanced Configuration 高级配置
从现在开始,进入位于“高级配置”部分的选项。
ALT
3.5.1 Weights、Blocks、Conv 权重、块、转换
这些是 U-Net中每个块的“学习权重”和“排名”设置。选择每个选项卡将显示相应的设置界面。
这些设置适用于高阶炼丹师。如果您不想或者不懂怎么设置,可以将所有选项留空。
3.5.2 Weights: Down LR weights/Mid LR weights/Up LR weights
从U-Net结构图中可以看到,U-Net总共由25个块组成:12个IN块、1个MID块和12个OUT块。
如果你想改变每个块的学习率权重,你可以在这里单独设置。
这里的权重是“学习的强度”,表示为0到1之间的数字,其中0表示“根本不学习”,1表示“以Learningrate中设置的学习率学习”。您可以改变学习的强度。
如果权重设置为0.5,则学习率将为Learningrate的一半。
“Down LR Weights”指定12个IN块中每一个的权重。
“Mid LR 权重”指定MID 块的权重。
“Up LR 权重”指定 12 个 OUT 块中每一个的权重。
3.5.3 Weights: Blocks LR zero threshold
我解释说“LoRA添加了一个神经网络”,但是添加一个权重太小的神经网络是没有意义的(也就是说,它几乎没有学到任何东西)。因此,您可以设置“不要向权重太小的块添加神经网络。”
神经网络不会添加到未超过此处设置的权重值的块中。例如,如果您在此处指定0.1,则神经网络将不会添加到权重设置低于 0.1的块(请注意,排除目标还包括指定的值!)。
默认值为空白,在这种情况下为 0(不执行任何操作)。
3.5.4 Blocks: Block dims, Block alphas
在这里,您可以为IN0-11、MID和OUT0-11这25个块中的每一个设置不同的rank(dim)值和alpha值。
Rank值和alpha值请参见Network Rank和Network alpha的解释。
具有较高等级的块预计能够保存更多信息。该参数值必须始终指定 25 个数字,但由于 LoRA 将 Attention块作为学习目标,IN0、IN3、IN6、IN9、IN10、IN11、OUT0、IN1 其中 Attention块不存在,因此设置 IN2(数字 1、4、 7、11、12、14、15 和16)在学习过程中被忽略。
此设置适用于高级用户。如果你不特别介意的话,可以留空。如果未指定,“网络排名(维度)”和“网络 Alpha”值将应用于所有块。
3.5.5 Conv: Conv dims, Conv, alphas
LoRA训练的Attention块有一个名为“Conv”的神经网络,它也是通过额外的学习进行更新的(参见文章顶部的注意力层结构图)。这是一个称为“卷积”的过程,其中使用的“过滤器”的大小是1x1 正方形。
另一方面,除了 Attention 之外的一些块(Res、Down 块)和 OUT 中的一些Attention 块使用 3x3 滤波器进行卷积。本来这不是LoRA的学习目标,但是通过指定这个参数,Res块的3x3卷积也可以作为学习目标。
由于学习目标的数量增加,可以进行更精确的LoRA学习。
设置方法与“Blocks: Blocks dims, Blocks alphas”相同。
3x3 Conv 存在于所有 25 层中。
此设置适用于高级用户。如果你不特别介意的话,可以留空。
3.5.6 No token padding
添加到训练图像中的Tag以 75个Token为单位进行处理(“Token”基本上可以被视为“单词”)。
如果Tag长度少于 75 个标记,则在标题后添加所需数量的终止符,以使其与75 个标记对齐。这称为“填充”。
此处您可以指定不执行Tag填充。
默认关闭。基本上,你可以把它去掉。
3.5.7 Gradient accumulation steps
通常在每次读取批次时更改权重(或“学习”),但也可以一次对多个批次进行学习。该选项指定一次学习多少个批次。
这与增加批次数量具有类似的效果(不是相同的效果!)。
例如,如果批量大小为 4,则一批中同时加载的图像数量为4。换句话说,每读取四张图像就进行一次学习。如果将梯度累积步数设置为2,则每2个批次执行一次学习,因此每读取8张图像就会执行一次学习。这与批次号8 的工作原理类似(但不一样!)。
增加该值会减少学习次数,使处理速度更快,但会消耗更多内存。
默认值为 1。
3.5.8 Weighted captions
目前最流行的Stable Diffusion使用环境是“Stable Diffusion WebUI”,它有独特的Prompt写法。例如,如果您在提示中指定“black cat”时想要非常强调“Black”这个词,则可以将要强调的词括在括号中,例如“(black:1.2) cat”并输入“:number” ” 在单词之后。该数字的倍数的单词将被强调。
此选项还允许您在训练图像的标题中使用此表示法。
如果你想写一个复杂的标题,你可能想尝试一下。
默认关闭。
3.5.9 Prior loss weight
Prior loss weight决定了训练过程中对“正则化图像”的重视程度(详细信息请参见上面正则化文件夹的解释)。
当该值较低时,正则化图像被认为不太重要,并且生成的 LoRA显示训练图像的更多特征。
如果您不使用正则化图像,则此设置没有任何意义。
这是一个介于 0 和 1 之间的值,默认为 1(也关注正则化图像)。
3.5.10 LR number of cycles LR循环数
如果您为调度程序选择“Cosine with restart”或“Polynomial”,则此选项用于指定调度程序在学习期间应运行多少个周期。
如果此选项的数量为 2 或更高,则调度程序将在一次训练期间运行多次。
在Cosine with restart和Polynomial中,学习率随着学习的进行逐渐减小到0,但是如果循环数为2或更多,当学习率达到0时,学习率被重置并重新开始。
下图(源)是重新启动的余弦(紫色)和多项式(浅绿色)之间学习率变化的示例。
在紫色示例中,循环数设置为 4。在浅绿色示例中,循环数为 1。
由于在确定的学习步骤内执行了指定数量的循环,因此循环数量增加得越多,学习率变化就越大。
默认为空,如果留空则为 1。
学习率变动的例子
重新启动的余弦で「LR 循环数 = 4」(紫)
多项式中的“LR power = 2”(浅绿色)
3.5.11 LR power
这是当调度器设置为 Polynomial 时的一个选项,这个数字越大,初始学习率就越陡。(上图中浅绿色线的斜率变得更陡。)
当power为1时,它与线性调度器具有相同的形式。
注意不要让数字太大,因为学习率会卡在接近 0 的位置,导致学习不足。
默认值为空,在这种情况下将为 1(即与线性调度程序相同)。
3.5.12 Additional parameters 附加参数
如果您想要修改 kohya_ss GUI上未显示的学习设置参数,请在此处将其作为命令输入。
通常您可以将其留空。
3.5.13 Save every N steps 每N步保存一次
每次完成此处指定的步骤数时,都会创建并保存 LoRA 文件。
例如,如果学习步骤总数为 1000,而您在此处指定 200,则 LoRA 文件将在第200、400、600 和 800 个步骤结束时保存。
另请参阅“保存每 N 轮”以获取有关保存 LoRA 进度的信息。
默认为0(不保存中间LoRA)。
3.5.14 Save last N steps 保存最后 N 步骤
当您指定“每 N 个步骤保存一次”以在学习时保存 LoRA时,可以使用此选项。
如果您只想保留最近的 LoRA 文件并丢弃旧的 LoRA文件,您可以在此处设置“要保留 LoRA 文件的最近步骤数”。
例如,假设总学习步骤为 600,并且您使用“每 N 个步骤保存一次”选项指定每100 个步骤保存一次。然后,LoRA 文件将在第 100、200、300、400 和 500步保存,但如果指定“每 N 步保存为 300”,则仅保存最近 300 步的 LoRA文件。换句话说,在第500步,早于第200(=500-300)步的LoRA(即第100步LoRA)将被删除。
默认值为 0。
3.5.15 Keep n tokens
如果您的训练图像有Tag,您可以随机打乱tag中逗号分隔的单词(有关详细信息,请参阅随机打乱Tag选项)。但是,如果您想保留开头的单词,则可以使用此选项指定“将第一个〇 个单词保留在开头”。
该数字的第一个字始终固定在开头。
默认值为 0。如果“Shuffle caption”选项关闭,则此选项无效。
此处的“单词”是指以逗号分隔的文本。无论分隔文本包含多少个单词,它都算作一个单词。对于“黑猫,吃,坐”,“黑猫”是一个词。
3.5.16 Clip skip
文本编码器使用一种称为“CLIP”的机制,它由 12 个相似的层组成。
文本(token)最初通过这12层转换为数字序列(向量),最后一层出来的向量被发送到U-Net Attention块。
然而,一家名为“Novel AI”的服务独立开发的模型,俗称“Novel AI模型”,采用了独特的规范,使用倒数第二个而不是最后一个层级的输出向量。这一规范适用于从 Novel AI 模型派生出的其他模型。因此,需要指定基础模型使用 CLIP 的哪个层级输出向量进行训练。
“Clip skip”指定此“从末尾算起的第 XX 层号”。
将其设置为 2 将倒数第二层的输出向量发送到 Attention块。如果为1,则使用最后一层的输出向量。
如果基础模型使用 Novel AI 模型(或模型混合),最好将其设置为2。在其他情况下,1 就可以了。
3.5.17 Max Token Length
指定Tag中包含的最大标记长度。
这里的“Token”不是指字数;Token的数量大约等于字数的1.5倍。请注意,逗号也算作一个标记。
您很少会使用超过 75个标记的标题,但如果您认为tag太长,请在此处指定更高的数字。
3.5.18 Full fp16 training (experimental)
如果打开上述选项“混合精度”(fp16或bf16),则在训练期间将使用32位和16位数据的混合,但如果打开此选项,则所有权重数据将是16-位(fp16格式)。虽然节省了内存,但某些数据的准确率减半,因此学习准确率也可能会下降。
默认关闭。除非您真的想节省内存,否则可以将其关闭。
3.5.19 Gradient checkpointing
通常,在训练过程中,每次加载图像时都会一次性修改和更新大量神经网络权重。通过修改这种“一点一点”而不是“一次全部”,可以减少计算过程并节省内存。
这个选项指定逐步进行权重计算。无论将其打开或关闭,都不会影响LoRA的训练结果。
默认关闭。
3.5.20 Shuffle caption
如果您的训练图像有Tag,它们很可能会写成一系列逗号分隔的单词,例如“black cat, eating, sitting”。“Shuffle caption”Tag选项每次都会随机更改逗号分隔单词的顺序。
一般来说,Tag中的单词越接近开头就越重要。因此,如果单词的顺序是固定的,后面的单词可能不会很好地学习,或者前面的单词可能会与训练图像形成意想不到的联系。希望可以通过每次加载图像时更改单词的顺序来纠正这种偏差。
如果标题是句子而不是逗号分隔,则此选项没有任何意义。
默认关闭。
此处的“单词”是指以逗号分隔的文本。无论分隔文本包含多少个单词,它都算作一个单词。
对于“black cat, eating, sitting”, “black cat”是一个词。
3.5.21 Persistent data loader
训练所需的数据将被丢弃,并在每个时期后重新加载。这是保留它而不丢弃它的选项。勾选此选项将加快新一轮的训练的开始速度,但会消耗更多内存来保留数据。
默认关闭。
3.5.22 Memory efficient attention
勾选此项将减少 VRAM和进程attention的使用。与下一个选项“xformers”相比,速度较慢。如果您没有足够的VRAM,请勾选它。
默认关闭。
3.5.23 Use xformers
如果您使用名为“xformers”的Python库,您可以减少VRAM的使用并执行Attention块处理,但代价是速度略有下降。如果您没有足够的VRAM,请打开它。
默认开启。
3.5.24 Color augmentation
“Augmentation”的意思是“图像增强”。通过每次对训练图像进行轻微处理,我们人为地增加了训练图像的多样性。
当颜色增强打开时,图像的色调每次都会随机地轻微变化。预计学习到的 LoRA在色调上会有轻微的变化。
如果启用“Cache latents”,则不可用。
默认关闭。
3.5.25 Flip augmentation
将此选项勾选后,图像将被随机左右翻转。这样做可以让模型学习到左右对称的人物或物体,对于想要学习这些特征的情况会很有帮助。
默认关闭。
3.5.26 Min SNR gamma
LoRA学习中,会在训练图像中添加各种强度的噪声进行学习(详细内容略),但根据添加噪声的强度,学习会变得更接近或远离学习目标,使学习变得稳定. 引入最小 SNR gamma来补偿这一点。尤其是在学习没有大量噪声的图像时,系统可能会明显偏离目标,因此要尽量抑制这种跳跃。
我将省略细节,因为它们很复杂,但这个值可以设置在 0 到 20 之间,默认为0。
根据提出该方法的论文,最佳值为 5。
目前尚不清楚它的效果如何,但如果您对训练结果不满意,尝试各种值是个好主意。
3.5.27 Don’t upscale bucket resolution
默认情况下,bucket大小设置为 256 到 1024像素之间(或者,如果您使用“最大分辨率”选项指定最大分辨率,则该分辨率优先)。垂直或水平超出此尺寸范围的图像将被放大或缩小以适合指定范围(同时保持纵横比)。
但是,当打开此选项时,将忽略存储桶大小范围设置,并根据训练图像的大小自动准备存储桶,从而加载所有训练图像而不进行缩放。然而,即使在这个时候,也有可能会裁剪部分图像以将大小与Bucket 分辨率步骤(稍后描述)相匹配。
默认开启。
3.5.28 Bucket resolution steps
如果使用Bucket,请在此处指定每个存储桶的解析间隔。
例如,如果您在此指定 64,则每个训练图像将根据其大小按 64像素分类到单独的桶中。这种分布是垂直和水平进行的。
如果图像大小不完全是Bucket指定的大小,则多出的部分将被裁剪。
举例来说,假设最大分辨率为512像素,桶的步长为每64像素,那么桶的大小将分别是512、448、384等等。而对于一个500像素的图像,它将被放入448像素大小的桶中,为了使尺寸相符,多出来的52像素将被裁剪掉。
默认值为 64 像素。
如果你把这个值设置得太小,bucket的分布就会变得太细,最坏的情况下,你最终会遇到每张图像只有一个bucket的情况。
请注意,每个批次始终从同一个bucket中加载图像,因此如果bucket中的图像太少,则批次数量会无意中变小。
3.5.29 Random crop instead of center crop
如上所述,中等尺寸的图像会被分类到bucket中,然后裁剪一部分以保持尺寸一致,但通常会裁剪图像以保持图像的中心。
打开此选项将随机确定图片的哪一部分将被裁剪。如果您想将学习范围扩展到图像中心之外,请打开此选项。
当cache latent选项打开时,无法使用此选项。
3.5.30 Noise offset type
这个选项用于指定在对训练图像添加额外噪声时使用的方法。在训练期间,一定会给图像添加噪声(这里省略了详细信息),而这些噪声最好是“难以预测”的,因此通过添加更多噪声来增加这种“难以预测”的性质。”
默认为原始。多分辨率以稍微复杂的方式添加噪声。
3.5.31 Noise offset
这是当噪声补偿类型选择“原始”时的选项。如果您在此处输入大于 0的值,则会添加额外的噪声。值范围从 0 到 1,其中 0 根本不添加噪声。1增加了强烈的噪音。
有文章称,添加约0.1的噪声可以使LoRA的颜色更加鲜艳(亮度变得更加清晰)。默认值为0。
3.5.32 Adaptive noise scale
与Noise offset选项配对使用。如果您在此处指定一个值,则由Noise offset指定的附加噪声量将进一步调整并放大或衰减。根据图像中当前的噪声量自动调整放大(或衰减)量。该值介于-1 和 1 之间。指定正值将增加附加噪声量,指定负值将减少附加噪声量。
默认值为 0。
3.5.33 Multires noise iterations
当噪声偏移类型选择“Multires”时,这是一个选项。如果您在此处输入大于 0的值,则会添加额外的噪声。
多分辨率会产生各种分辨率的噪声,并将它们加在一起以创建最终的附加噪声。在此指定要创建的“各种分辨率”的数量。
默认为0,为0时不添加额外的噪声。如果要使用建议设置为6。
3.5.34 Multires noise discount
与多分辨率噪声迭代选项结合使用。该值用于在一定程度上减弱各分辨率下的噪声量。0 到 1之间的值。数字越小,噪声越弱。顺便说一句,衰减量根据分辨率而变化,并且低分辨率的噪声被衰减很多。
默认值为 0,使用时将其设置为0.3。通常建议0.8。如果训练图像较少,建议将值降低到0.3左右。
3.5.35 Dropout caption every n epochs
通常,图像和Tag是成对训练的,但也可以在特定时期仅训练“没有标题的图像”而不使用标题。
此选项允许您指定“不在每个时期使用tag(退出)”。
例如,如果您在此处指定 2,则将每 2 个 epoch(第 2 个 epoch、第 4 个epoch、第 6 个 epoch…)执行一次不使用说明的图像学习。
当学习没有tag的图像时,LoRA有望学习到更全面的图像特征。您还可以期待防止过多图像特征与特定单词关联的效果。但是,请注意不要使用太多的标题,因为LoRA 可能最终不会出现任何提示。
默认值为 0,这意味着没有tag丢失。
3.5.36 Rate of caption dropout
它类似于上面的每n个epoch的Dropout Caption,但它允许您将图像训练为“没有字幕的图像”,而无需在整个学习过程的一定比例中使用字幕。
您可以在此处设置没有标题的图像的百分比。0是“学习时始终使用字幕”的设置,1 是“学习时从不使用字幕”的设置。
哪些图像被学习为“没有标题的图像”是随机确定的。
例如,如果通过加载 20 张图像,每张图像 50 次来进行 1 epoch 的 LoRA训练,则图像训练总数为 20 张图像 x 50 次 x 1 epoch = 1000次。此时,如果将tag丢失率设置为 0.1,则学习将作为“无tag的图像”执行1000 次 x 0.1 = 100 次。
默认值为 0,这将学习所有带有tag的图像。
3.5.37 VAE batch size
将“Cache latents”选项打开后,可以将压缩后的图像数据保留在主内存中。而“VAE batch size”选项则用于设置一组压缩图像中包含的图像数量。通常情况下,VAE batch size应该与批处理大小(Batch size)相匹配,因为它们一起用于一次性训练指定数量的图像。
默认值为 0,在这种情况下,它设置为与批量大小相同的数字。
3.5.38 Save training state
如果训练图像数量、迭代次数和 epoch 数量较多,LoRA训练将需要很长时间。
如果您打开此选项,您可以中断学习并在稍后恢复。
学习期间的进度数据保存在名为“last-state”的文件夹中。
3.5.39 Resume from saved training state
如果您想恢复中断的学习,请在此处指定“最后状态”文件夹的位置。
要恢复学习,必须保存学习进度数据。
3.5.40 Max train epoch
指定训练的最大epoch数。基本上,您可以使用 Epoch选项指定Epoch数,但当达到此处指定的Epoch数时,学习始终会结束。
默认为空。您可以将此字段留空。
3.5.41 Max num workers for DataLoader
该选项指定读取数据进行学习时使用的CPU进程数。每次增加此数字时,都会启用子进程并提高数据加载速度,但增加太多实际上可能会变得低效。
请注意,无论您指定多大的数量,都不会超过正在使用的CPU的并发执行线程数。
默认为0,表示数据只能由主CPU进程读取。
3.5.42WANDBAPI[2] Key WANDB API 密钥
有一种机器学习服务称为“WandB”(Weights&Biases)。这是一项以图表和记录形式显示学习进度并在线共享学习日志以便找到最佳设置的服务,kohya_ss现在也可以使用此服务。
但是,您需要一个帐户才能使用此服务。创建帐户后,您可以从https://app.wandb.ai/authorize获取“API密钥”。如果您在此处输入获取的API密钥,您将在学习过程中自动登录,并能够链接WandB服务。
关于WandB我就不多说了,但是那些立志成为“LoRA 炼丹师”的人可以尝试一下。
3.5.43 WANDB Logging WANDB 日志记录
此处可以指定是否使用WandB服务记录学习状态日志。
默认是关闭的,如果关闭的话,日志会以一个名为“tensorboard”的工具的形式记录。
3.6 Sample images config 示例图像配置
ALT
如果您想在学习时了解使用 LoRA生成图像是什么样子,请在此处输入图像生成提示。
然而,由于LoRA的学习时间相对较短,因此可能不需要太多图像生成测试。
3.6.1 Sample every n steps 每n步采样一次
指定学习过程中要生成图像的步骤。例如,如果指定 100,则每 100步生成一张图像。
默认为 0,表示不生成图像。
3.6.2 Sample every n epochs 每n个epoch采样一次
指定您想要在训练期间生成图像的时期。例如,指定 2 将每 2 个 epoch生成一个图像。
默认为 0,表示不生成图像。
3.6.3 Sample sampler 样品取样器
指定用于图像生成的采样器。这里指定的许多采样器与 Stable Diffusion Web UI 提供的采样器相同,因此请参阅 Web UI 说明网站了解详细信息。
默认为 euler_a。
3.6.4 Sample prompts 提示示例
在此输入Prompt。
但是,您可以在此处输入其他设置以及提示。如果要输入其他设置,请使用两个减号和字母的组合指定设置,例如“–n”。例如,如果你想在Negative Prompt提示中输入“white,dog”,你可以写“–nwhite,dog”。
最有可能使用的设置如下。
–n: 否定提示
–w:图像宽度
–h:图像高度
–d:种子
–l:CFG 比例
–s:步数
默认为空。当该字段为空时,示例描述将显示为暗淡,因此请参考。
4. 概括
我们解释了 LoRA 的机制(Stable Diffusion的附加学习方法之一),以及用于执行 LoRA 学习的工具 kohya_ss 的设置。
需要配置的设置太多,可能看起来很混乱,但首先,简要学习推荐的设置,然后根据您的学习结果一点点更改设置。
请参考此处的说明,旨在创建更高精度的 LoRA。
参考资料
[1] 誰でもわかるStable Diffusion Kohya_ssを使ったLoRA学習設定を徹底解説 - 人工知能と親しくなるブログ: https://hoshikat.hatenablog.com/entry/2023/05/26/223229#LoRAの仕組みを知ろう
更多AI工具,参考Github-AiBard123,国内AiBard123