本文包含什么
- 以我个人经验为限的一些关于自制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 | Best quality,masterpiece,ultra high res, |
从结果中可以发现,其实迭代10次,就基本已经有我需要的目标风格服饰了,40次时就已经有过拟合的迹象了(面部扭曲,场景与训练素材高度雷同)后面更多次数的迭代甚至出现了和训练图一模一样的动作。
最终我就选择了迭代10次的模型,并进行多次快乐抽卡:
1 | Best quality,masterpiece,ultra high res, |
从结果来看,服装风格基本已经都有我训练的要素了,虽然并不是都很像,但是这里其实就是取舍问题了,需要更强的相似性就可以尝试性选择迭代次数更多模型,或者选择更高的权重。
但从图中看,我觉得权重还可以调低,因为好几个图的姿势与训练集高度雷同,也就是动作被训练出来了,但是着装风格的权重不够。要解决这个问题,可能需要在训练过程中加入正则化,而这又是另一个话题了。
同时为了验证模型的泛化能力如何,我尝试指定一些图中的细节,在正向提示词中加入black hair,尝试要求绘制黑头发的人,正向提示词为:(其他不变)
1 | Best quality,masterpiece,ultra high res, |
看起来效果还行。再试试指定要求绿头发(green hair),并且来个悲伤的表情(sad)
1 | Best quality,masterpiece,ultra high res, |
看起来似乎还不错,那测试就到这里吧,勉勉强强能打个60分及格。
总结
- 不要过于迷信教程上给的各种参数数值,调高调低多试一试
- 不要过分信任损失函数,更多的要以出图效果为准
- 迭代次数不要过多,初期尽量以较少的迭代次数,并辅以x/y/z plot快速验证一下拟合情况
以上,是我自己的一些踩坑经历和经验总结。