LoRA

LoRA的全称是Low-Rank Adaptation of Large Language Models,可以理解为stable diffusion(SD)模型的一种插件,和controlNet一样,都是在不修改SD模型的前提下,利用少量数据训练出一种 画风/人物/物品,实现定制化需求,所需的训练资源比训练SD模要小很多。LoRA最初应用于NLP领域,用于微调GPT-3等模型(也就是ChatGPT的前生)。由于GPT参数量超过千亿,训练成本太高,因此LoRA采用了一个办法,仅训练低秩矩阵(low rank matrics),使用时将LoRA模型的参数注入(inject)SD模型,从而改变SD模型的生成风格,或者为SD模型添加新的人物/IP。用数据公式表达如下,其中 \(W_0\) 是初始SD模型的参数, \(BA\) 为低秩矩阵也就是LoRA模型的参数, \(W\) 代表被LORA模型影响后的最终SD模型参数。整个过程是一个简单的线性关系(1),可以认为是原SD模型叠加LORA模型后,得到一个全新效果的模型。

(1)\[W = W_0 + BA\]

训练图片准备

如何选取一个好的数据集?

  1. 高质量(人物细节充足, 包括细节充足的3D模型截图) > 低质量(细节不充足, 模糊, 包括细节较少的人物建模)

  2. 多角度, 表情, 体位的训练集 > 只有正面和少量侧面的训练集 > 只有正面的训练集

  3. 不同的原图 > 差分(有较大区别) > 差分(只有表情变化) > 镜像原图

  4. 同一张原图分别裁剪成 远中近 > 纯自动处理原图

  5. 不同服装同角色的训练集放到不同concept里 > 不同服装同角色的训练集放到一个concept里

  6. 不同服装相同角色得在一个epoch内, repeat * 图片总数相近 > 不同服装相同角色得在一个epoch内, repeat * 图片总数相差较大, 或不同图片数采用了相同repeat

  7. (这一条是最近六十多次尝试的情况下得到的结果, 样本量较少不一定有普遍性, 请把每个模型都进行尝试, 寻找你想要的哪一个)  (打全标)同一训练集下Epoch在(8-20) > 同一训练集下Epoch在(5-7) > 同一训练集下Epoch在(21-40) > 同一训练集下Epoch在(>40)  (自定义剔除部分特征与单标+体位视角标)同一训练集下Epoch在(6-10)  > 同一训练集下Epoch在(4-5) > 同一训练集下Epoch在(10-15) > 同一训练集下Epoch在(>15)

  8. 图片数量多的训练集, 可以按照需要适度提高repeat

  9. lora模型在画与训练集分辨率比例相同的图片时, 可以出更好的效果, 比如说你是512*768的训练集, 换下来就是2:3, 那你画2:3的图片是, 比例畸形和丢细节的概率会下降。生成与训练集同长宽比例的图 > 正方形训练接的图生成长方形比例的图 > 比例差距较大的图(如2:3训练集的lora画3:2的full body图片)

  10. 在没有明显关系的数据集内切不可把人物切碎, 不然会出鬼图.(后面素材剪切介绍会详细说)

如何判定素材质量

  1. 细节是否清晰。有没有出现细节反转(例如瞳色反转), 原图分辨率。

  2. 如果是3D模型图, 就要看模型是细节较多的建模还是细节较少的改模, 细节多可以提高3D模型图片的比重, 占比30%左右已经算是比较高的了, 这部分的作用是补全人物在不同身位的细节, 不用担心lora认不出这是人的哪部分, 他甚至能帮你把鞋底的花纹都给学了

  3. 训练集分辨率在原图原生支持的情况下高点比较好, 高分辨率可以提高细节的精细程度, 但是不宜过高, 我觉得最长边900-1024之间已经是极限了, 再提升已无明显收益, 当然你有钱嗯造, 那你喜欢就好. 一般不建议最短边小于512, 小于512出来的图片, 丢细节几率太高(不是绝对, 实践出真知)

  4. 模型nsfw性能与原始训练集有无nsfw有关, nsfw请放在一个独立的concept中,因为lora内不存在的标签, 就会在底膜里提取, 且nsfw数据集不可过多

如何判定模型质量

  1. 模型的细节还原程度

  2. 在输入训练集原始prompt的基础上, 进行小量且明显的修改(例如衣服样式 颜色)。如果生成的图像变化不大 或者 并未按prompt要求输出,则大概率是过拟合了

  3. 检查不同concept之间是否出现了融合, 出现了融合会出现二合一, 严重影响还原度

  4. 使用时尝试多个不同的底模, 测试模型泛化性, 如果画风污染严重, 一般是过拟合了, 第二种可能就是数据集实在过少且过于单一.

  5. 个人认为触发词形lora和多token调用的lora没有孰优孰劣, 我只看还原度, 但是触发词形确实可以提高调用效率, 只是需要在数据集处理上多花时间.

图片打标

主要有三种打标方法:

  1. 全标:tagger打出来的标不做删标处理, 直接放进去训练。

  2. 自定义剔除部分特征

  3. 单标+体位视角标

全标

全标的意思就是tagger打出来的标不做删标处理, 直接放进去训练, 因为在训练时, lora脚本会自动把图片拆分, 把相对应的部分加入到tag中, 在调用的时候, 就可以直接用tag调用所需的部分。 全标一般用在风格训练中,为了省事快速地炼人物模型也可以使用。

  1. 不用处理tag少了一步麻烦

  2. 训练过程中的损失函数能真实地反应拟合程度, 观感上拟合度会稳定提高.

  3. 过拟合的可能性是三种训练方法里最低的

  1. 画风污染可能性偏大

  2. 调用较困难

  3. 需要训练较高epoch

Hint

训练画风的时候可以直接使用全标。

手动寻找这些tag中属于人的部分, 处理分为下面几步:

  1. 删掉与想要生成的concept无关的tag。例如,对于训练角色,需要模型学习角色特征, 如long hair, hair_between_eyes, wings之类的删掉,这样模型就会把这些特征与concept绑定。当角色还需要和服装绑定, 就需要把服装tag也删掉, 比如角色一定穿水手服,那么school_uniform这种tag就需要删除。

  2. 需要保留的部分: (1)人物动作, 如: stand, sit, lying,holding之类; (2)人物表情, 如: smile, close eyes之类; (3)背景, 如simple_background, white_background之类; (4). 图片类型, 如full_body, upper_body, close_up之类

  3. 添加触发词

  1. 可以使用触发词触发, 方便使用。

  2. epoch次数需求较少。

  1. 容易删漏了, 有些时候一下不注意触发词触发的图像会少部分细节

  2. 训练过程中损失函数可能会失效, 实际效果要看试渲染图才知道(其实也不算是缺点)

Hint

任何需要删除tag后进行训练的模型, 那他在训练中的损失函数参考性就下降了,所以你在训练的过程中很可能会出现损失值在较高位振动的情况, 这是这种训练方法很容易导致的情况, 所以该训练方法下不看损失率, 只看试渲染图.

单标+体位视角标

只保留触发词和人物动作体位视角tag。

  1. 标签处理简单暴力, 处理的时候很方便。

  2. 可以使用触发词触发, 方便使用。

  3. epoch次数需求较少。

  1. 训练过程中损失函数可能会失效, 实际效果要看试渲染图才知道(其实也不算是缺点)


Reference

https://www.bilibili.com/read/cv22274249/