Lua's Blog

Everythine will be fine.

0%

训练Lora时遇到的问题记事

本文包含什么

  • 以我个人经验为限的一些关于自制LoRA的踩坑经验

本文不包含什么

  • 不包含环境的搭建
  • 不包含手把手的教学
  • 不包含相关专业名词的解释

为什么有这篇文章

因为我多次尝试自制LoRA但是均以失败告终,且我一直找不到失败的原因,自我总结的失败原因包含:

  • 训练集不理想
  • tag不理想
  • 训练时超参数配置不理想

我自身并没有过多的机器学习的相关经验,网上我也没有找到详实的,附带训练集的教学资料,能够让我尽可能复现的别人已经成功的操作。

因此在我的尝试下,出现了这篇文章,我自认为勉强算是训练LoRA成功,同时我也会给出我的训练集。

关于训练集

这部分尽量选择清晰的图片,且尽量只包含你想要训练的部分。

例如想训练某个服装或某种穿衣风格,则图片中尽量只包含服装的部分,且背景尽量与服装主题能够区分,尽量不包含人脸等其他可能的干扰因素。

如果想训练某个长相风格的人脸,则图片中尽量只包含人像部分,而不要选择全身照、夜景照等干扰因素过多的图片。

我这次选择了训练一种特定的服饰风格,因此在微博上搜索了40张cosplay芭芭拉的照片,并进行设当裁剪后,交由deepbooru自动打标。

这里在进行裁剪时,由于我没经验,导致在后期使用时出现的一个坑,就是微博照片都会自带水印,而我裁剪后相当一部分图片保留了水印,因此这一部分被遗传到了LoRA中,导致在最终出图时,可能也会出现类似水印的特征。

关于训练

我使用了kohya_ss。这里我又踩了一个坑,出于习惯,一开始我是在Docker中运行(Windows宿主),但是一下子没想起来Windows Docker是通过虚拟机实现的,docker中的GPU通过wslg转发一层,导致GPU性能锐减的非常厉害,也就是说我浪费了很多时间等训练结果。:( sad

参数绝大多数与网上其他的基础教学一致(具体我使用的参数,在训练集下载中一并提供了),稍有不同的是,依据我之前的失败经验(我归结于过拟合)和浅显的tensorflow使用经验,我设置了一些避免过拟合的参数,比如:

  • Dropout caption every n epochs
  • Rate of caption dropout
  • Network dropout
  • Rank dropout
  • Module dropout

事实证明,我之前的失败确实过拟合了,但是这些参数也并没有挽救回来过拟合的的结果。(原因后说)

这里为了更好的控制训练中的状态,我将训练集的文件名命名为1_barbara,epoch为150,并且每10次保存一次。

这里的150也是参考了网上现有的一些教程,通常说需要至少每个图片让机器学习150次。

从我最后的试错经验来看,150并没有很明显的依据,这应该是出自经验的一个数字,但由于训练集的原因,并没有很高的普适性。

前期我过度迷信这个至少150次,导致训练结果实际上已经过拟,但是我却以为是欠拟合。因此还在继续调高训练次数。而我当时作出欠拟合的判断,来自于我浅显的tensorflow开发经验,由于损失函数反复振荡,我尝试调低学习率依旧振荡,没有收敛迹象。由于第一轮迭代时,损失函数只大约就在0.10.15之间,反复的振荡区间大概在0.050.15之间。

这里我犯了几个错误,一是LoRA本身就是微调模型,因此基础模型本身的准确率就已经足够高,所以单纯用损失函数判断是不准确的(或者说损失函数的粒度需要看的更细,比如到百分位、千分位),这与我之前用tensorflow做验证码识别是完全不一样的,不会出现一个从0.9到0.1这么大跨度的收敛过程。二是因为用的别人开发好的套件,因此在训练过程中没有校验集的参与,过拟现象非常容易产生。

关于校验

所谓校验,其实就是拿着训练出来的LoRA,出图看看效果,是不是符合自己的预期。我使用了以下参数出图,同时使用X/Y/Z plot横向对比一下不同迭代次数的LoRA效果:

1
2
3
4
5
Best quality,masterpiece,ultra high res,
1girl, (cos_barbara_v2:1),

Negative prompt: (nsfw:2), (wind:1.4), (bangs:2), (worst quality:2), (low quality:2), (normal quality:2), (side view:1.5), (from behind), hands, lowres, normal quality, ((monochrome)), ((grayscale)), skin spots, acnes, skin blemishes, (bad anatomy:2)
Steps: 20, Sampler: Euler a, CFG scale: 5, Seed: 3606640756, Size: 512x768, Model hash: fc2511737a, Model: chilloutmix_NiPrunedFp32Fix, AddNet Enabled: True, AddNet Module 1: LoRA, AddNet Model 1: barbara_v2-000010(7f204f601fb7), AddNet Weight A 1: 0.75, AddNet Weight B 1: 0.75, Script: X/Y/Z plot, X Type: AddNet Model 1, X Values: "barbara_v2-000010(7f204f601fb7),barbara_v2-000020(e3a0b2ec4351),barbara_v2-000030(17d39e7817fb),barbara_v2-000040(e03691a03d69),barbara_v2-000050(9023fb79b336),barbara_v2-000060(be8b51ff0c7a),barbara_v2-000070(18b8025ba929),barbara_v2-000080(8fc0ff282c57),barbara_v2-000090(605e18578d44),barbara_v2-000100(83af2b9646c2),barbara_v2-000110(89d7812466f6),barbara_v2-000120(42f258cd7b4d),barbara_v2-000130(80787aa22eb2),barbara_v2-000140(deaaeede1671),barbara_v2(ffe4a1d865d8)", Version: v1.3.2

xyz_plot

从结果中可以发现,其实迭代10次,就基本已经有我需要的目标风格服饰了,40次时就已经有过拟合的迹象了(面部扭曲,场景与训练素材高度雷同)后面更多次数的迭代甚至出现了和训练图一模一样的动作。

最终我就选择了迭代10次的模型,并进行多次快乐抽卡:

1
2
3
4
5
Best quality,masterpiece,ultra high res,
1girl, (cos_barbara_v2:1),

Negative prompt: (nsfw:2), (wind:1.4), (bangs:2), (worst quality:2), (low quality:2), (normal quality:2), (side view:1.5), (from behind), hands, lowres, normal quality, ((monochrome)), ((grayscale)), skin spots, acnes, skin blemishes, (bad anatomy:2)
Steps: 20, Sampler: Euler a, CFG scale: 5, Seed: 3318734022, Size: 512x768, Model hash: fc2511737a, Model: chilloutmix_NiPrunedFp32Fix, Clip skip: 2, ENSD: 31337, AddNet Enabled: True, AddNet Module 1: LoRA, AddNet Model 1: barbara_v2-000010(7f204f601fb7), AddNet Weight A 1: 0.75, AddNet Weight B 1: 0.8, Version: v1.3.2

grid

从结果来看,服装风格基本已经都有我训练的要素了,虽然并不是都很像,但是这里其实就是取舍问题了,需要更强的相似性就可以尝试性选择迭代次数更多模型,或者选择更高的权重。

但从图中看,我觉得权重还可以调低,因为好几个图的姿势与训练集高度雷同,也就是动作被训练出来了,但是着装风格的权重不够。要解决这个问题,可能需要在训练过程中加入正则化,而这又是另一个话题了。

同时为了验证模型的泛化能力如何,我尝试指定一些图中的细节,在正向提示词中加入black hair,尝试要求绘制黑头发的人,正向提示词为:(其他不变)

1
2
3
Best quality,masterpiece,ultra high res,
1girl, (cos_barbara_v2:1),
black hair,

black hair

看起来效果还行。再试试指定要求绿头发(green hair),并且来个悲伤的表情(sad)

1
2
3
4
Best quality,masterpiece,ultra high res,
1girl, (cos_barbara_v2:1),
green hair,
smail

green hair  & smail

看起来似乎还不错,那测试就到这里吧,勉勉强强能打个60分及格。

总结

  • 不要过于迷信教程上给的各种参数数值,调高调低多试一试
  • 不要过分信任损失函数,更多的要以出图效果为准
  • 迭代次数不要过多,初期尽量以较少的迭代次数,并辅以x/y/z plot快速验证一下拟合情况

以上,是我自己的一些踩坑经历和经验总结。