1中文 https://tensor.art/articles/894212229950384481
2中文 https://tensor.art/articles/894214741432519505
4中文 https://tensor.art/articles/894482801078873091
在此说明一下,因为我的运行环境总是无法成功部署Kohya,所以使用的是第三方gui,大致上的设置应该是差不多的,我也对比了tensor的在线设置,只是简化了一些该有的还有。
优化器我测试了很多,在我的思路和运行环境和训练集设置的条件下,“Prodigy”的默认设置相比起来效果最好。但这不是绝对的,请根据你的个人体验调整。
梯度检查点建议始终开启。但梯度累积步数实际上并不需要,如果你的分辨率和dim不会超过显存限制,那是没必要开启的,如果超过了,开启了实际上也改善不了多少。另外如果开启实际上这里应该填写batch size的数值,而batch size应该设置为1。简单的说梯度累积步数是对batch size的模拟,最终的数值是两者的乘积。
暂时总结一下,我的“2boys lora”制作流程:
1、准备原素材训练单人lora,使用其生成质量较高的单人图。
2、将生成的单人图进行拼接,原素材的单人图如果是质量较好的也可以进行拼接。
3、将“A”“B”“AB”分别放入不同文件夹,根据图片数量和目标步数(800-1200左右)计算repeat。其中“A”和“B”的repeat相同。“AB”的步数是单人的20%-40%左右来计算repeat。
4、进行标签,注意标签排序,和拼接图需要特定标签标识“split screen”“collage”“two-tone background”等,后文会对这个环节进行补充。
5、设置好训练参数,epoch应该在10-16左右,一般情况下10完全足够。开始训练并观察loss值的走势和预览图。
我必须泼一盆冷水,完成上述步骤后,有可能训练出的lora还行,但更大几率不会得到一个令人满意的“2boys lora”,接下来要讲的可能更加啰嗦,但是这些分析我觉得还是应该写出来,方便理解、对比,我尽量理清逻辑。如前文所说双人lora生成时会有很多很多常见错误,以我浅薄的见解分析其原因,以及应对的方法,和无法解决的问题。
前文说lora训练中ai目前的学习逻辑并不是把“A,black hair,red eyes”当做一个真正的男孩,
而是把“1boy=A=black hair=red eyes”当成一个整体概念,当其中的所有提示词同时出现时,就会完整生成这个概念,但是当其中的提示词只出现一部分时,因为这些提示词作为一个整体概念具有高度关联性,尤其是“1boy”,就造成即使不写全也会带有其中部分特征。
这就是为什么如果lora中只含有“A”“B”单人图时无法生成正确的双人图,因为“1boy”同时包含A和B的特征,同理只有“AB”双人图时,“2boys=A+black hair+red eyes+B+blue hair+grey eyes”,
“A”或“B”同时包含“2boys”的部分信息。
请注意这里我用了“+”号而不是单人时的“=”号,经过测试后分析,“1boy”中因为提示词较少,所以这些特征就完全集合到一起,而“2boys”因为ai不懂是两个不同的男孩,更像是把这些特征分布到“一张白纸”,这张“白纸”就类似于两个“人形轮廓”,生成时把“A,black hair,red eyes,B,blue hair,grey eyes”随机涂到这个轮廓上。
即使“2boys”在任何检查点都是缺乏原生训练的,但加载“lora”使用时检查点的权重依然会大于lora。在测试中,不论单人图还是双人图,如果不设置“A”“B”“AB”来将人物本身诸如长相脸型肤色等不需要标记的特征“收集到一起”,那检查点中本身的“1boy”和“2boys”的信息会大幅影响,就造成“学不会”的现象。
所以在“2boys lora”中,需要设置这个人物触发词,有没有发现其中“悖论”,单人图时“A”包含了“A”所有特征,而在双人图时“A”并不完全完全等于“A”的特征,“A”实际上关联了所有“2boys+A+black hair+red eyes+B+blue hair+grey eyes”的信息。
那么在生成“2boys”时,“A”或“B”的触发词实际上就等于一个“暴击”的双倍触发,一个确定的“A”叠加一个不确定的“A”,再加一个确定的“B”和一个不确定的“B”。
这就是为什么使用双人lora时,总会特征混淆或是产生多余人物。不仅仅是因为检查点本身的性能对“2boys”支持不好。
为了尽可能缓解这种现象,“AB”在训练集中的权重要低于“A”“B”本身,权重越接近,混乱越多,经过测试,20%-40%是个相对合适的区间。
为什么会是个区间呢?更棘手的问题就出现了,不同角色的拟合进度是不一样的!前文已简单描述这一现象,单人学会的速度就有区别,而他们的双人图中,这种差异更加放大了混乱,步数多了会学混,步数少了也会是没有区别开。是的,在最终呈现的结果上,都是特征混合,没有区别开不同的两人。仅仅是我个人测试后的经验,如何来分辨这两种,仅仅是特征交换,比如发色瞳色交换,那就是学多了,特征比如脸型、发型、眼型等融合在一起那就是学少了。
请注意、请注意、请注意,这有个前提就是前文所讲最低图片数量:“A = B ≥20 ,AB≥15”,经测试低于这个数量时,已经跟权重比例没有关系了,是属于缺少信息而学不会。
再次声明:“如果你想制作的角色总是成双成对出现,有充足的的素材,随便就能超过100张双人图,那么完全不需要遵循本文的思路,只要加入少量单人图一起正常训练就好。素材越多越丰富,ai学到的不同场景下的信息更多,带来的结果就是人物更容易区别开,错误几率大幅减小。本文旨在介绍两个单人,缺少双人同框甚至单人素材时不得已而为之的一种思路。”换句话说,双人图足够多的情况下,就是完成了一个完整的“2boys”的概念置换,而素材缺乏时,只能完成部分置换,二次元里这种比方应该很好理解,笑哭。当然,在缺乏素材的情况下,通过前述“拼接”的方式做出超过100张也不是不行,只是真的操作起来比想象中的累多了。
说到这,突然想起来一件事,抱歉思维有些跳跃,但我写完后校对时好像也没其他地方更好放置这一段。那就是为什么有些检查点不认识的角色,只把他们的单人lora加载到一起可以正确生成对应的角色呢?
答案很简单,很多lora制作者使用自动截图脚本,或是其他原因,在训练集中本来就包含“2boys”“3boys”等等图片,那么在同个动画截图中有A有B,A角色的lora中就经由“2boys”和A角色以外的发色瞳色的标签“置换”了“B”的发型发色瞳色的概念,这种图在训练集中占比很低,而恰巧B的训练集也有类似图片,“B”也含有了“A”的特征,这种巧合就正好产生了类似单“2boys”lora的效果。如果是同作者同批次制作的C,但是C的训练集中没有类似的“2boys”图片,此时AC或BC就不会正确生成。这种现象也就更好理解ai并不是懂得两个不同的男孩,而是“2boys”和那些特征提示词共同组成了一个“连体婴”的概念。前文写的可以用faceless来生成图片用作训练集,就是利用这种现象,排除多余的因素来创造一个干净的“轮廓”。
另一个非常棘手的问题,关于标签,根据当前lora训练“不加标签会被ai学习成固有特征,加上标签会被学习成可替换特征”的原理,训练“1boy”时,哪怕只用“A”一个单独的触发词,而不对其他特征进行标签,只要素材足够,ai也能学会,最常见的也就是标签一下发色、瞳色,自动打标的话可能还有一些发型的描述诸如“hair between eyes”“sidelocks”和“雀斑”“虎牙”等都会进行标注,这些更详细的标签加上或者不加对“1boy”其实影响不大的,毕竟使用时只是为了生成“A”这一个角色。
但是在双人图的训练中,有些奇怪的事就出现了,
举个例子“fang”,如果“A”有虎牙,在闭着嘴的时候也会露出来,那么在训练“1boy”时,训练标签中加上“fang”,生成时使用“fang”效果会更好,比如说各种表情中都可以清晰的分辨出“fang”。
但是不加,ai也会“识别”这部分可能是“fang”,生成时也会出现“fang”,但是各种表情下这个“fang”就会很模糊,甚至只是一个粘在嘴唇上的什么东西,这种情况下使用“fang”提示词,ai仿佛就懂得这个“东西”确实是“fang”,就会生成清晰的内容。
而当训练“AB”时,如果不写“fang”,那么ai就会学成那种“不确定”的状态,虽然“A”有“fang”,但生成时这个部位会模糊不清,此时没办法通过加入“fang”提示词来生成清晰的“fang”,因为“B”也会被这个提示词影响。
那么训练标签中加入“fang”,则会被学成可替代的“fang”,而不是属于“A”的固有特征,生成时不使用“fang”,就完全不会有,而使用“fang”依然会影响“B”。
但是但是,不是所有这种标签都不能被固定,比如“A”是“hair between eyes”“sidelocks”的话,训练标签中加入时就基本可以固定到“A”。更奇妙的是,这类“标签”在没有标注的情况下,也可以在生成时使用并识别到相应角色且生成正确特征。那这成千上万的标签怎么可能知道哪个可以被“固定”哪个只是“可替换”,完全不可能,而且这只是illustrious2.0的表现,其他基础模型可能有其他情况。
毕竟是二次元,人物当然有千变万化的外表,将多样的特征进行标签可以学习的更细致,生成时更清晰准确,然而“2boys”完全不确定哪些标签可以被固定,所以只能不写,也就是只使用“人物触发词+简单的发色+简单的瞳色”来对人物进行标签,以保留人物各自的特征,并且最好不要只使用人物触发词而不用“附加标签”,这会增加人物混合几率。这里再次解释一下,有些多人物lora只使用人物触发词依然可以生成正确人物,并不一定是lora训练到位了,我测试了很多,绝大多数都是因为lora的触发词正好和检查点本身已识别的角色的触发词重合了,这种重合不需要100%,名在前和姓在前都是有效的。这些lora中的触发词,哪怕不使用那个lora,也可以单独用检查点进行生成,有些只能在特定检查点生成正确内容就是因为这个角色只有这个检查点识别了。这里就不贴图例了。
关于“标签”还有一些观察到的现象,illustrious2.0对于图片中没有进行标签的一些内容是会识别并进行拟合的,当使用这些未标记的内容的提示词时,生成内容就会趋近训练集图片中的相应部分。但找出具体是哪些就太难了。
概念类似的标签之间也会相互影响。这在服饰的训练中更加明显,比如“footwear”“shoes”“sneakers”,训练时只使用一种标签“sneakers”,生成时使用其他的也会生成训练时进行标签的“sneakers”。为了应对这种现象在生成“2boys”时造成的混乱,建议根据服饰等的具体样式找到danbooru上对应的标签,再根据这个标签起一个专属的名字,比如“某某的蓝色体恤”,而不是“blue shirt,short sleeves”等这类通用的。
同时上一段讲述的现象在服饰的训练中也会出现。在训练“1boy”时,可以详细的描述服饰的各种细节元素、各种配饰,将其“分解”以方便生成其他服饰时不会被专有服饰的特征所影响。而训练“2boys”时,详细标注服饰细节元素会使得生成时混乱不堪,因为有些标签可以被“固定”,有一些“可替换”,依然无法判断具体是哪些。所以训练“2boys”的服饰,如果想要保证穿着在正确的男孩身上,那么标签要尽可能的少。这样做的后果,生成其他服饰时必然会带有专属服饰的特征也是没办法的事情。
关于服饰还有另一个现象,illustrious2.0会根据标签的内容对图像上的“类似”内容进行“替代”,比如图中的是“tank top”,而标签中写“vest”,那么会无中生有的把图像中tank top转换成完全不一样的vest。
这种现象产生的其中一个原因就是自动标签时,对于同一种物品可能会被打上几种不同但类似的标签,如果没进行挑选和删减,那么训练完成后使用时就有一定几率带来这种混乱。
为了避免这种混乱,在illustrious2.0上还是尽可能的用danbooru的标准标签进行标注。
反过来其实也可以利用这种现象,故意把一些概念进行置换,emmmm,举一个色色的例子吧,就是标签时把“pexxs”替换成“small pexxs”,“正常”被替换是“小”,在生成时空出来的“正常”的“pexxs”就很奇妙的会产生“large pexxs”的效果,确实是会比正常标注“pexxis”时大。唉,为了避免被tensor删掉,你懂我在写什么。
但是,我怎么又写但是,这种现象依然只是在部分标签上才有,想利用它进行一些概念置换并不是很简单,完全不知道哪些有效。另外刚才说的起专属名字,也不是所有标签都可以通过专属名字进行拟合,有些即使写了“专属名字”,生成时会发现完全没有被学习,而换用“class token”时,则被正确学习。这依然无法找出到底是哪些标签会产生这种现象。有时候训练出的lora,人物不像或者缺少一些细节等等,怎么调感觉拟合度都不高,大概率就是本段介绍的这些现象发生了,但是无法判断具体是哪一个或者几个标签在捣蛋。总之如果真的遇到了,要么认真排查,要么就随缘吧。