솔직히 말하면 그냥 적정 값은 만드는 사람 맘임 ㅇㅇ, 너가 만든 LoRA가 최고야


그렇지만, 한번 알아보려고 한다. 


글 가장 밑에 사용된 LoRA 링크 있음


오늘 학습 대상으로 삼은 캐릭터는 아그네스 타키온(말딸)로 캐릭터 특징을 먼저 짚어본다면,


여자, 말 귀, 바보털, 적색 눈, 눈 사이의 머리, 갈색 단발, 오른쪽 귀에 퓨린 장식(왼쪽에 달리면 안됨) : 필수 특징

+ 레이스 복장으로 실험실 코트, 소매가 긴 코트, 노란색 스웨터, 스웨터 안쪽에 검은 셔츠, 검은색 짧은 넥타이, 스타킹, 하이힐, 등등

+ 짤엔 없지만 일상복으로 보라색 셔츠를 입고 있다.


따라서 학습을 진행할 때 agnes tachyon \(umamusume\)의 태그에다가


말 귀, 말 꼬리, 바보털, 적색 눈, 눈 사이의 머리, 갈색 단발, 오른쪽 귀에 장식을 학습을 시킬 것이기 때문에 필수 태그들은 txt에서 지우고 진행할 것임

 -> 이건 그냥 선택사항임. 캐릭터 LoRA로 할 거라 캐릭터 이름만 치면 되게 하려고


예시)

1girl, solo, animal ears, brown hair, horse ears, necktie, labcoat, hair between eyes, ahoge, smile, shirt, white background, looking at viewer, black necktie, red eyes, simple background, black shirt, collared shirt, upper body, short hair, closed mouth, horse girl, blush, bangs, single earring, earrings, sweater vest, sweater, twitter username, jewelry, coat
->agnes tachyon \(umamusume\), solo, labcoat, smile, white background, black necktie, simple background, black shirt, collared shirt, portrait, closed mouth, blush, sweater vest

볼드체 = agnes tachyon \(umamusume\)으로 대체됨

twitter username은 그림자 때문인듯?그리고 upper body와 portrait는 하나만 쓰게 수정함


0. 학습 설정


args와 bold체로 써진 옵션들은 자신의 상황에 따라 바뀌는 옵션들

---- training setting constants--------

total 128 images. 10x 32 images, 20x 32 images, 40x 32 images, 80x 32 images

=> 1 dataset = 4800 images

batch = 4 

=> 1200 steps / 1epoch, 10 epochs, 12000 steps 학습

unet lr = 1e-5, textencoder lr = 5e-6

scheduler = constant_with_warmup, warmup_step = 1200 steps(10%)

mixed_precision = save_precision = fp16

args = --cache_latents --gradient_checkpointing --max_token_length=150 --shuffle_caption --xformers --use_8bit_adam 

CLIP = 1, enable_bucket

NO flip ('오른쪽 귀'에 장식이 특징이기 때문에)

Base model : Animefull-pruned (NAI)

---- training setting variables ----

network dimension(rank) = 4, 16, 64, 128

network alpha = 1, 4, 16, 32

------------------------------------

사용된 프롬프트

공통masterpiece, best quality, agnes tachyon \(umamusume\),

기본값승부복일상복
 upper body
labcoat, white coat, sweater vest, yellow sweater, black necktie, sleeves past wrists, sleeves past fingers, black pantyhose, high heels,
necklace, purple off-shoulder shirt, bare shoulders, 
부정(worst quality, low quality:1.4)

사용된 프롬프트 구성은 [공통] + ([기본값]|[승부복]|[일상복]) + [부정]


이미지 출력 모델 : AbyssOrangeMix2-hard

VAE : kl-f8-anime2

DPM++ SDE Karras, 20steps, CFG 6.5, 512*768, seed 2489242838, eta 0.2, CLIP skip=1

더 자세한 사항은 exif 참고

------------------------


컴퓨터를 열심히 굴려서 학습을 완료했다. 밑에 예시와 함께 보자


1. alpha = 1. rank varies (r=4, 16, 64, 128)

network dimension기본값승부복일상복
r=4 (4.6MB)

r=16 (18MB)

r=64 (72MB)

r=128 (144MB)


말 귀, 바보털, 적색 눈동자, 오른쪽 귀의 특징이 agnes tachyon \(umamusume\)만 써도 나오는 것을 보니 특징은 잘 잡아 학습했지만


rank가 높아질수록 승부복에선 노란색 스웨터 안에 검은 셔츠를 입지 않음이 보임


이 글에서 알 수 있다시피, kohya_ss 방식에선 alpha값을 조정하지 않으면 높은 rank에서 학습률이 토막나 제대로 학습이 되지 않는다.


더군다나 나는 lr=1e-5로 대부분 1e-4근처의 학습률을 사용하는데 그것보다 더 낮은 학습률이다 보니 이런 점이 부각되어 보임.


그래서 alpha값들을 조정해 α/r = 1/4 = scaling로 고정하고 다시 학습을 해봤음.



2. scaling = alpha / rank = 1/4. alpha and rank vary.

(rank=4, alpha=1), (rank=16, alpha=4), (rank=64, alpha=16), (rank=128, alpha=32)

network dimension기본값승부복일상복
r=4 (4.6MB)
alpha = 1.




r=16 (18MB)
alpha = 4.



r=64 (72MB)
alpha = 16.



r=128 (144MB)
alpha = 32.

 

scaling을 1/4로 정한건 rank=4랑 똑같은 scaling을 해주기 위해서 고정한 거임


이젠 높은 rank에서도 승부복을 잘 표현했지만, 클릭해서 보면 살짝 뿌옇게 보인다. 


당연히 learning rate가 1e-5이지만 10epochs나 해서 과?적합스러운 결과를 보여주는 것이 당연함.


LoRA 가중치를 낮춘다고 해결되진 않았으나 다른 방법으로 해결할 방법이 있으니, CFG scale을 조정함으로써 해결이 가능하다.



3. CFG Scaling

network dimension기본값 CFG=6.5기본값 CFG = 5기본값 CFG = 3.5
r=4, alpha=1.



r=16, alpha=4.



r=64, alpha=16.



r=128, alpha=32.




스케일을 적절히 낮추니 높은 rank에서도 그림이 깨짐 없이 잘 나온다.


솔직히 오른쪽 귀에 작은 퓨린 장식은 손가락도 제대로 못 그리는데 오각형-육각형 서순에 맞게 잘 그릴 것이라고 기대도 안 하긴 했음


사용된 그림들 구도에 따라 오른쪽에서 보면 장식이 안 보일 수도 있고



4. 그래서 왜 이 글을 작성하게 되었나


rank 수에 따라 캐릭터 특징을 잡는 퀄리티가 차이가 있어 보임?


rank=4에서 귀를 3개나 그리는 찐빠가 있지만, 시드가 고정된 그림이라 발생한 문제고 밑에 짤들을 한번 보셈















scaling이 고정된 LoRA 4개로 각각 짤 4개를 뽑고 임의로 섞었음. 시드도 섞었고


위에 16개 중에 rank를 구분 가능할 수 있을까? 정답은 exif에 있으니 한번 맞춰보길 바람 ㅎㅎ



그래서 내 결론은 뭐냐


1. alpha값에 대해

그냥 rank값으로 고정하고 learning rate를 적절히 잘 수정을 해주는 게 편하다.


하는 일은 학습 시 scaling말곤 없으니 골아프게 hyperparameter 숫자 늘릴 이유가 있나 싶음


그리고 어차피 학습 안되면 학습 자료나 learning rate부터 수정할 거잖아.


다만, alpha를 기본값인 1로 설정 하면 learning rate를 더 높게 설정해줘야 하는 건 잊지 말고



2. rank값에 대해

위에서 4나 128로 만든 것의 차이가 보이면 자신이 선택한 숫자로 하면 되지만


구분을 못하면 굳?이 rank값을 높여서 용량 낭비를 할 이유가 있을까? 낮은 rank에서도 특징을 잘 잡는데


rank=4는 4.7MB로 좀 고화질 이미지 크기고 rank=128은 144MB로 32배정도 더 큼



3. 사용된 LoRA들

https://mega.nz/folder/wJMnlSKK#v2cPD9SaFIMNPW4nZCNYtQ


끝.