LORA 학습을 위한KOHYA가 업데이트 되면서 블록을 지정해서 학습시킬 수 있다고 하는 데, HOXY 해보신 분 계시면 방법과 결과를 구걸합니다.

  • 4 Apr. 2023, 2023/4/4: 4/4일에 메이저 업데이트 되면서 아래 내용이 추가되었습니다. 이건 바로 제가 원하는 겁니다. 얼굴만 스타일만 거시기만 학습시키는 것이 가능할 수 있다는 거죠. 학습이후 블록이니 하는 쌩쇼를 할 필요가 없을 수 있다는 겁니다.
  • Add options to train_network.py to specify block weights for learning rates. PR #355 Thanks to u-haru for the great contribution!

    • Specify the weights of 25 blocks for the full model.
      • No LoRA corresponds to the first block, but 25 blocks are specified for compatibility with 'LoRA block weight' etc. Also, if you do not expand to conv2d3x3, some blocks do not have LoRA, but please specify 25 values for the argument for consistency.
    • Specify the following arguments with --network_args.
    • down_lr_weight: Specify the learning rate weight of the down blocks of U-Net. The following can be specified.
      • The weight for each block: Specify 12 numbers such as "down_lr_weight=0,0,0,0,0,0,1,1,1,1,1,1".
      • Specify from preset: Specify such as "down_lr_weight=sine" (the weights by sine curve). sine, cosine, linear, reverse_linear, zeros can be specified. Also, if you add +number such as "down_lr_weight=cosine+.25", the specified number is added (such as 0.25~1.25).
    • mid_lr_weight : Specify the learning rate weight of the mid block of U-Net. Specify one number such as "down_lr_weight=0.5".
    • up_lr_weight : Specify the learning rate weight of the up blocks of U-Net. The same as down_lr_weight.
    • If you omit the some arguments, the 1.0 is used. Also, if you set the weight to 0, the LoRA modules of that block are not created.
    • block_lr_zero_threshold : If the weight is not more than this value, the LoRA module is not created. The default is 0.

update 1

일단 KOYHA_SS의 GUI에서 이렇게 입력했더니 지금 학습을 하고 있기는 합니다.
얼굴만 학습하라는 건데, 결과가 어떻게 될 지 무지 궁금합니다.


현재까지 뭐가 되기는 한데, 적용을 하면 결과가 원하는 것과 다릅니다.
학습은 빠릅니다. 
확실히 지시한 것만 학습한 다는 것 같습니다.
근데 결과가 예상과 너무 다릅니다.
아래 FACE가 블록에서 위의 학습과 같은 블록값입니다. 근데 아무것도 변하지 않아요. 아오 빡칩니다.

아무래도 KOHYA 교육에서의 lr_weight에서의 얼굴 블록 값이 제가 말씀드린 값(여기서 국룰인 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0)이 아닌 것 같습니다.다시 잘 살펴보고 허깅에서도 물어보겠습니다. 
혹시 얼굴만 학습시키는 웨이트 값이  0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0 이 아니라 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1 이 아닐까 하는 의심이 듭니다.


update 2

  • 제가 닭짓을 했습니다. down_lr_weight와 up_lr_weight를 헷갈린 겁니다. 역시 잘 읽어봐야 하는데...
  • up_lr_weight를 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0으로 하는 것이 맞을 것 같습니다.
  • 지금 3가지를 테스트 중입니다.
    • down_lr_weight 를 1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1 (뭔가 변해쓰,,, 근데 아직 멀었...)
    • up_lr_weight를 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0
    • down_lr_weight 를 모두 0으로 하고, up_lr_weight를 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0
    • mid_lr_weight는 저처럼 무식한 리니어가 아니라 오묘한 커브를 만들고 싶은 사람이 쓰면 될 듯

update 3

  • 테스트 결과입니다.



    • up_lr_weight 만을 제한한 것과  down_lr_weight 를 모두 0으로 하고, up_lr_weight를 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0 한 결과는 같습니다.
    • 근데 ALL에서 배경보다 얼굴에 집중되서 교육을 한 것은 확실한데, 배경이 완전하게 학습에서 배제된 것은 아닙니다. 만약 배경이나 스타일이 완전히 학습에서 배제되었으면 배경화면이 NONE과 같이 수평선이어야 하는데 뭔가 걸리적거립니다.
  • 현재까지의 테스트 결과는 원하는 부위에 더 집중을 하는 것은 가능한데, 나머지를 완전히 재끼고 학습시키지는 못한 다는 것입니다. (아님, 내가 또 뭐가 닭질2를 했거나)
  • HOXY, 베이스모델을 오리지날 SD15가 아니라 LOFI같은 것으로 하면 어떨 지 계속 시험할 예정입니다. 필터링된 것이나까 선별 학습효과도 좋지 않을 까 하는 개수작입니다.

얼굴만 살짝 바꾸기 위해서는 역시 아직도 DDETAIL을 쓸 수 밖에 없습니다. 


update 4

이 방법을 쓰니 확실하게 몸매와 주변은 학습이 정말 많이 빠졌네요. 이것만으로도 어는 정도 쌔빠지게 테스트한 보람이 있네요. (제길 얼굴 블록이 뭐냐고!!!!)


update 5 
드디어 서광이 보입니다. (눙물이 ㅠㅠ)

(쓰불) 닭질2가 있었습니다. 로라를 스탠다드가 아닌 라이코스로 사용하고 있다가 벌어진 닭질이었습니다.


모델에서 블록의 역할은  1:1로  정해놓은 것이 아니라, 일종의 블록들의 합과 차에 의해 모델링을 합니다.

그래서 '이건 무조건 없애고 저건만 꼭 집어넣어'라는 것 보다는 '이걸 더 강조하고 다른 건 개무시해라' 정도라고 해석해주세요.

후반부의 블록의 역할은 대충 이렇습니다. (사용한 로라이름은 사진 왼쪽위에 깨알만하게 써이쓰)
전반부는 더 오묘해서 제가 아직 헤매고 있는데, 다른 챈붕이 해주겠죠 뭐


스탠다드 로라 17개 블록 (out1,2,3이 스탠다드에는 없습니다)


LyCORIS 26개 블록



하여간... 다음과 같은 값을 사용하시면 일단 좋습니다. - 현재까지 핀포인트 학습을 위한 추천 파라미


for 스탠다드 로라 17개 블록

얼굴 얼굴피부 머리카락

--network_args "up_lr_weight=0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0" "down_lr_weight=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" 

얼굴 얼굴피부 

--network_args "up_lr_weight=0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0" "down_lr_weight=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" 

얼굴윤곽

--network_args "up_lr_weight=0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0" "down_lr_weight=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" 


for LyCORIS 26개 블록
얼굴 얼굴피부 머리카락

--network_args "up_lr_weight=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0" "down_lr_weight=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" 

얼굴 얼굴피부 

--network_args "up_lr_weight=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0" "down_lr_weight=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" 

얼굴윤곽

--network_args "up_lr_weight=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0" "down_lr_weight=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" 


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

LyCORIS 로라의 위의 파라미터 효과 (얼굴이 누군가와 비슷하다면 오해임. 유명인 아님. 암튼 아님.)

-----------------
일단 모든 블록 학습한 로라


OUT 3,4,5 블로만 학습한 로라 -  
  - 자세가 1도 변하지 않았음, 자세관련된 블록이 제껴진 것을 확인
  - diff가 사진으로 나오면 그 블록이 학습에서 완전히 제껴진 것인데, 345블록만 학습해도 다른 블록에도 영향이 감. (쓰블) 


OUT 3,4 블록만 학습한 로라 -  

  - 자세가 1도 변하지 않았음, 자세관련된 블록이 제껴진 것을 확인
  - 좀 더 얼굴에 변화가 집중됨

  - 역시 다른 블록에도 영향이 아직 있음


OUT 3 블록만 학습한 로라  - 말이 말이 아님, 에혀

잠정결론
핀포인트 학습은 아니지만, 로라를 만들 때 원하는 것에 집중하거나 제끼는 것이 가능해짐


update 6
(아오 왜 아이디어가 떠오르고 지랄이야)
타겟 블록이외에도 영향이 가는 현상을 없앨, 그야말로 핀포인트 학습이 가능 아이디어가 있습니다.
로라블록 원작자의 리포(https://github.com/hako-mikan/sd-webui-lora-block-weight)를 잘 보니까, 웨이팅에 마이너스 숫자를 쓰더군요. 0도 영향이 있다는 거죠. 이 부분입니다.

Effective Block Analyzer

This function check which layers are working well. The effect of the block is visualized and quantified by setting the intensity of the other bocks to 1, decreasing the intensity of the block you want to examine, and taking the difference.

Range

If you enter 0.5, 1, all initial values are set to 1, and only the target block is calculated as 0.5. Normally, 0.5 will make a difference, but some LoRAs may have difficulty making a difference, in which case, set 0.5 to 0 or a negative value.

그럼 제끼려는 블록파라미터도 0이 아니라 -1로 하면 되지 않을까하는 생각이 팡! (근데 불금이라서...)
혹시 테스트 하실 분은 참조하세요. 

update 7

된다!!!! 블록을 -1로 하니까 완전히 재껴집니다. 한가지 주의할 것은 같은 구역애들도 다 -1로 죽이면 조땐다는 것입니다.

--network_args "up_lr_weight=0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,-1,-1,-1, 1, 1,-1,-1,-1,-1, 1,-1,-1" 

이렇게 블록 2개만 살려두고 싸그리 죽여버렸더니, 학습결과가.... "nan" (뽕이다)

steps: 100%|██████████████████████████████████████████████████████| 640/640 [14:15<00:00,  1.34s/it, loss=nan

생각해보면 당연한 결과입니다. 

그래서 바다와 같이 넓은 마음으로 같은 동네 애들에게 .1이라는 리미트를 줍니다. 완전히 배제하지는 않지만 좀 빠지라는 거죠.

--network_args "up_lr_weight=0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,.1,.1,.1, 1, 1,.1,.1,.1,.1,.1,.1,.1" 


근데 , KOHYA도 지금 열라 매일 업데이트하고 있습니다.
이제는 블록뿐아니라 캡션에 웨이트를 주는 기능도 넣었어요. 

  • Added support for training with weighted captions. Thanks to AI-Casanova for the great contribution!

    • Please refer to the PR for details: PR #336
    • Specify the --weighted_captions option. It is available for all training scripts except Textual Inversion and XTI.
    • This option is also applicable to token strings of the DreamBooth method.
    • The syntax for weighted captions is almost the same as the Web UI, and you can use things like (abc), [abc], and (abc:1.23). Nesting is also possible.
    • If you include a comma in the parentheses, the parentheses will not be properly matched in the prompt shuffle/dropout, so do not include a comma in the parentheses.

(근데 네거도 먹는 지 진심 궁금합니다.)
사람들이 원하는 것은 같다는 거죠. 강조할 것(예 ㅅㄱ, 얼빡, 엉덩이, 혹시 손가락?) 만 강조하는 로라를 맹글고 싶다는....


이거이거 뭔가 되어가는 모양입니다. 스탠다드 로라의 GUI는 본격적으로 블록화를 집어 넣고 있어요. 블록뿐아니라  block dims (ranks) for variable rank  등 옵션질을 할수 있습니다.


오리지널모델에서 축소된 것이 로라인데...  TRANSFORMER, TRANSFORMER+ ATTENTION, ATTENTION is everything 이런 흐름들과 비스무리해지는 느낌입니다. "로라가 전부다!!! full 모델 필요음따" 일지도...

update 8

쓰불. 
죄송합니다.
up_lr_weight의 특정블록을 -1로 완전히 제끼는 거 하지 마세요.
상상할 수 있는 모든 기괴함이 나옵니다. 몸의 구조와 균형이 깨져 버려요.

얼굴만 학습시킨 로라를 적용하면, 저렇게 턱 밑에서 손이 막 또 나옵니다. 모델의 손발의 위치와 로라의 손발의 위치를 매칭할 수 없게 되어서 그냥 둘 다 그립니다.

결국에는 모델의 몸구조와 로라의 몸구조와 괴리가 생겨요. U-NET이 인체의 구조를 모델과 로라의 것을 섞어서 그립니다.
이런 기괴함을 원하지 않으면 필요없는 블록을 -1로 완전히 제끼는 거 하지마세요

심지어 DDetailer에서도 완전히 초보 impaint의 결과가 나올 수 있습니다.

그래서 


--network_args "up_lr_weight=0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,.1,.1,.1, 1, 1,.1,.1,.1,.1,.1,.1,.1" 이 옵션은 취소합니다.

그냥 초기 버전인 이거 쓰세요.

for 스탠다드 로라

--network_args "up_lr_weight=0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0" "down_lr_weight=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" 

for LyCORIS 26개 블록

--network_args "up_lr_weight=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0" "down_lr_weight=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" 
역시 merge block weighted에서 preset이 블록의 웨이팅이 뭐가 부드럽고, 심지어 IN과 OUT의 특정블록을 MID중심으로  발란스를 만들어 놓은 이유가 있습니다.
핀포인트 학습은 점점 미궁으로 빠져들어갑니다.


update 9

지금 열심히 테스트 중인 레이어 학습의 개념입니다. (https://rentry.org/BlockMergeExplained)

rule of thumb: Near middle high level concepts, away from the middle low level concepts. 

모델마다 레이어가 차이가 나는 이유가 concepts의 차이.
그러니까 실사, 반실사, 그림, 휴먼, 동물, 외계인, 괴물은 고유의 레이어 계층을 가질 수 있으......
그리고 M00 블록이 무지 중요함 - 몸의 구조가 괴기하게 뒤틀리는 것에 절대적으로 영향을 주는 블록이니까 학습과 머징시 반드시 제껴서는 안된다는 .....
이 모든 계층의 개념이 UNET에게는 그림 그리는 데 필요한 가 봅니다. 미친척하고 로라를 SD체크포인트 넣어보면, UNET이 인체를 온전하게 구성하지 못합니다. 인체에 대한 개념이 부족한거죠.

update 10

결국 새로운 로라나 모델을 만들 때 U-net layer를 만지작 거리는 것은, 새로운 모델의 베이스가 되는 모델을 학습시킬 때 만들어진 개념을 만지는 것인가봐. (내가 뭐라는 지 나도 몰라)


더구나 스까모델의 경우 개념이 엉켜있는 것 같아. 예들 들어 얼굴은 하위개념 (OUT03-OUT06 정도)인데 이것이 스까모델에서 중요한 개념(얼빡 최고 라는 개념)이 되면 중요해져서 OUT2-OUT4가 되기도 해. 그래서 스까모델을 베이스로 할 경우 블록을 이것저것 선택해봐야해. (대분분의 모델을 SD1.5를 베이스로 했다지만 옛날 이야기잖아. 솔직히 SD1.5 모델 엄청 구리게 학습되어있으니까 사람들이 엄청난 성형을 시키지. 요즘 모델에서 로라만 뜯어내는 것이 유행인데 이거 말 되. 아니 앞으로 이 방향으로 갈 것처럼 보여)


결국 원하는 개념을 위해 블록을 선택하는 것은 오리지널 학습 모델을 베이스로 하여 노가다를 적당히 하는 수 밖에 없는 것 같아. 노가다 이즈 마이미들네임. 희망적인 것은 그래봐야 모델별로 레이어가 변하는 것은 2-3개 정도만 움직이니까, 몽땅 휘저을 필요는 없는 것 같아.


그림체는 텍스쳐레벨이 중요해져서 사진과 그림이 구분되는 하위레벨(IN01-03정도)가 역할을 많이 하는데, 그림체는 우리가 생각하면 중요개념인데 AI에게는 그저 텍스쳐인가봐. 그래서 하위 IN레벨에서 텍스쳐를 하위OUT레벨에서 인체구조를 동시에 만지면 훔쳐오거나 바꿔치기가 가능할 지도 몰라. 단, 젠장 그림은 실사보다도 더 베이스모델마다 블록이 다 달라.


여기서 재미난 것이 모델의 가장 상위개념인 M00을 물뜯씹 활용할 수 있다는 거야.

그림체가 죽여주는 데 프롬을 안먹는 모델은 상위개념(개쌍마이웨이)이 강한 놈인 가봐. 그래서 이놈을 조교할 목적으로 
 - 그림체죽여주는데말안듣는 놈(A) vs 말잘듣는놈 (B)을 섞는거야.

 - 모든 블록을 .95(A):.05(B)로 섞고, 
 - M00만 .5(A):.5(A)정로 하면, 
그림체죽여주는데말안듣는놈이 나긋나긋해져서 프롬 잘 먹더라더라. 그림체는 거의 그대로 가지고 있고. 

실사모델에서 프롬 드럽게 안들어먹는 모델(비누 샴푸)을  LOFI와 함께 M00만 살짝 만졌더니 별에 별 프롬을 다 먹어. 
홀딱벗고 물구나무서기 시켜보고 있어. 

근데 이것도 케바케야. 거기에 이제는 clip skip도 엉켜있어. 
그림체죽여주는데말안듣는놈의 UNET만 남기고 (그림 그리는 화가는 유지) text encoder만 말잘듣는놈 것으로 홀랑 바꾸는 건(프롬 통역사만 교체)데 이것도 가능할 지도 몰라.


테스트하면 할 수록 미궁으로 빠져.

얼굴만 어떻게 해보려 했는 데, 이제 개념이 중요해졌어. 쓰블

머지블록의 프리셋에  cubic hermite, reverse 어쩌구 같은 것들이 있는 걸 보면, 아직 사람들이 우리와 같은 목적을 가지고 노가다 하고 있는 것이 확실해.


전공 완전 다른 내가 혼자 생쑈하면서 테스트하는 건데, 이미 마공이나 사공으로 빠진 것 같아. 이미 글렀어