본문 바로가기
AI

LoRA 훈련 필수 가이드 완벽정리

by 포커서 2024. 2. 17.
728x90

더 나은 LoRA를 만들고 싶은 분들은 꼭 읽어보세요. 

이 가이드는 필수, 기초, 심화 3가지 방법으로 읽을 수 있습니다.

필수: 복잡하고 어려운 것은 건너띄고 빨리 LoRA를 만들고 싶은 분에게 적절

기초:  LoRA를 준비할 때 알아야 할 개념에 대해 설명합니다. 

심화: 모델 훈련의 내부 작동을 설명하고 더 깊은 이해를 원하는 분에게 적절

 

1. Stable Diffusion 모델 이해

필수

스테이블 디퓨전(stable diffusion)은 이미 많은 것을 배워서 다양한 주제나 스타일을 알고 있습니다. 이걸 이해하는 중요한 포인트는, 스테이블이 이미 알고 있는 것과 새로 배워야 할 것을 구분하는 거예요.

새로운 개념(NC)

이 프로그램이 처음 보는 새로운 주제나 스타일 같은 거예요. 예를 들어, 모델이 전에 본 적 없는 특별한 그림 스타일이나 아이템이 있을 수 있어요. 이런 새로운 것을 배우게 하려면, 데이터에 새 정보를 추가해야 해요. 이를 위해 "활성화 태그"라는 특별한 태그를 사용해요.

수정된 개념(MC)

프로그램이 이미 알고 있지만, 조금 다르게 표현하고 싶은 것들이에요. 예를 들어, 프로그램이 알고 있는 그림 스타일을 조금 변형시키거나 다르게 해석하고 싶을 때 사용해요. 여기서는 새로운 걸 가르치는 게 아니라, 이미 알고 있는 걸 조금 바꾸는 작업이죠.

LoRA 모델을 훈련시킬 때는 이 프로그램이 이미 잘 아는 것과 부족한 부분이 무엇인지 알아야 해요. 그리고 그걸 바탕으로 훈련 데이터셋을 만들어서, 프로그램이 필요한 새로운 정보를 배우거나, 이미 알고 있는 정보를 더 잘 이해하도록 도와줘야 해요. 이런 식으로 새로운 개념과 수정된 개념을 이해하고 사용하면, 프로그램을 원하는 방향으로 더 잘 가르칠 수 있어요.

LoRA 종류

기초

LoRA, 즉 Learning Rate Adjustment 기법에는 여러 종류가 있는데, 이 중 기본적인 것부터 시작해볼게요. 이 튜토리얼을 쓰는 시점에, LoRA에는 여러 종류가 있어요. 예를 들면, 표준 LoRA(lierla/LoRA), LoCon, LoHa, DyLoRA, LoKr 같은 것들이죠.

표준이 아닌 LoRA 종류들은 그다지 추천하지 않아요. 대부분의 경우, 더 오래 걸리고 결과도 그저 그런 편이에요. 그래서 다른 종류에 대해서는 따로 설명하지 않을게요.

그냥 표준 LoRA 종류를 사용하는 게 좋아요.

만약 정말로 LoHA나 LoCon 같은 것을 만들고 싶다면, LoRA의 차원을 32 이하로 유지하는 것을 기억하세요.

 

스테이블 디퓨전 모델을 이해하는 것은 훌륭한 LoRA를 만드는 데 큰 도움이 됩니다. 여기에는 몇 가지 중요한 개념이 있어요:

스테이블 디퓨전 모델에 대한 이해

심화

잠재 공간 & VAE (변분 오토인코더)

512x512 픽셀의 이미지가 있다고 상상해 보세요. 이 이미지를 표현하기 위해 512x512 픽셀 각각에 대해 4개의 색상 채널(RGBA)을 고려해야 합니다. 총 4 x 512 x 512 = 1,048,576개의 개별 값을 다뤄야 하는 거죠. 모든 이미지에 대해 이렇게 많은 데이터를 다루는 건 매우 비효율적이고 계산 비용이 많이 들어요. 이 문제를 해결하기 위해 데이터 과학자들은 이미지의 데이터 크기를 줄이는 방법을 개발했고, 그중 하나가 잠재 공간이에요.

잠재 공간은 스테이블 디퓨전에 대해 생각할 수 있는 모든 이미지가 간단한 형태로 저장된 거대한 도서관 같아요. 복잡한 데이터(예: 이미지)를 더 간단하고 압축된 형태로 변환하는 수학적 공간이죠. 이를 통해 모델이 이미지를 효율적으로 작업하고 조작할 수 있어요.

이 압축을 가능하게 하는 도구가 바로 변분 오토인코더(VAE)예요. VAE는 이미지를 잠재 공간으로 압축하고 그것을 원래 형태로 재구성하는 방법을 배워요.

스테이블 디퓨전의 경우, 512x512 크기의 이미지는 64x64x4 = 16384 값으로 압축돼, 과정을 훨씬 더 효율적으로 만들어요.

텍스트 인코더, 토크나이저, 임베딩

스테이블 디퓨전에서 이미지는 텍스트 설명(프롬프트)을 기반으로 생성돼요. 이 과정에는 토크나이저, 텍스트 인코더, 임베딩이라는 세 가지 중요한 구성 요소가 포함돼요.

토크나이저: 복잡한 문장을 이해해야 한다고 상상해 보세요. 첫 번째 단계는 그것을 더 작고 다루기 쉬운 조각으로 나누는 거예요. 토크나이저가 바로 이런 역할을 해요. 프롬프트를 받아서 토큰이라고 부르는 더 작은 단위로 나눕니다. 이 토큰들은 단어, 단어의 일부, 또는 구두점일 수 있어요. 목적은 텍스트를 단순화해 모델이 처리하기 쉽게 만드는 거예요.

텍스트 인코더: 텍스트가 토큰화되면, 다음 단계는 이 토큰들을 모델이 이해할 수 있는 언어로 번역하는 거예요. 그게 바로 텍스트 인코더의 역할이에요. 토큰을 수치 벡터로 변환하는 번역가처럼 작동해요. 이 벡터들, 임베딩이라고 알려진 것들은 각 토큰의 본질을 포함한 수치적 표현이에요, 그것의 의미와 문장 내에서의 맥락을 포함해서요.

임베딩: 임베딩은 마법이 일어나는 곳이에요. 이들은 토큰화된 텍스트를 수치적 형태로 나타내는 벡터예요. 이것을 넓은 공간에서의 좌표로 생각해보세요, 각 점(또는 벡터)은 특정 단어나 구절뿐만 아니라 다른 단어 및 구절과의 관계도 나타냅니다. 이 임베딩이 중요한 이유는 모델이 수학적으로 텍스트 입력을 '이해'하는 방식이기 때문이에요.

UNET

UNET은 이미지 생성을 위한 주요 엔진으로, 세부 사항까지는 들어가지 않겠지만, 알아야 할 것은 임베딩과 잠재적으로 인코딩된 이미지를 섞어서 "노이즈" 예측을 출력하는 수학적 혼합을 만든다는 거예요. 이 노이즈 예측은 이미지에서 "노이즈를 제거하는" 데 사용될 수 있어요. LoRA를 훈련할 때, 예측을 하는 주요 구성 요소를 훈련시킬 거예요, 왜냐하면 이게 바로 이미지를 만들어내는 부분이니까요.

LoRA를 훈련하는 마지막 프로세스는 다음과 같습니다.


2. 훈련준비

데이터 세트 & 캡션

필수

좋은 데이터셋을 얻는 방법에 대한 가이드는 이미 많아서 여기서는 따로 다루지 않을 거예요. 하지만, 애니메이션 에피소드의 스크린캡으로 이미지를 모으는 방법이 좋은 출발점이 될 수 있어요.

 

미꾸라지 한 마리가 물을 흐린다. 

이 속담은 데이터셋을 태깅과 딱 맞습니다. 만약 빨간 눈을 가진 캐릭터에 "파란 눈"이라고 태그한다면, 모델은 두 가지를 혼합하려고 할 거예요. 이런 식으로 "빨간 눈" 태그는 빨간색과 보라색 눈(때로는 파란색 눈도)의 혼합을 출력하게 될 거예요.

스테이블 디퓨전에게 없는 것을 있다고 거짓말 하지마세요. 

하지만 있는 것을 말하지 않는 것은 나쁘지 않아요.

 

활성화 태그(Activation tag)

필수

이 튜토리얼에서 사용할 중요한 개념 중 하나는 "활성화 태그"예요. 활성화 태그는 생성된 이미지에서 특정 기능이나 요소를 활성화시키는 역할을 해요. 활성화 태그가 포함되면, 모델은 해당 태그와 관련된 시각적 요소를 생산하거나 강조하도록 요청받게 돼요.

활성화 태그는 당신의 개념/캐릭터/스타일을 대표하는 고유한 태그여야 하며, 데이터셋의 캡션 파일에서 첫 번째 요소로 있어야 해요.

훈련 스크립트 / UI 

필수

훈련 스크립트나 사용자 인터페이스(UI)에 대해서도 알아볼게요. 어떤 훈련 스크립트나 UI를 사용하든 비슷한 매개변수를 가지고 있지만, 제안된 기능에서 조금씩 차이가 있을 수 있어요. 이 튜토리얼에서는 bmaltais가 만든 kohya-ss의 주요 매개변수에 대해 설명할 건데, 여기서 다루는 지식은 다른 모든 트레이너에도 적용된다는 걸 알아두세요.

스크립트 설치의 세부 사항까지는 다루지 않을 거예요. 만약 처음이라면, https://github.com/bmaltais/kohya_ss로 가서 설치 지침을 따라 해보세요.

 

LoRA, Dreambooth, Text inversion 의 차이

기초

딥러닝에서 모델을 특정 작업에 맞게 조정하는 것은 보통 "파인튜닝"이라고 알려진 과정을 포함해요. 이 방법은 모델이 큰 데이터셋에서 일반적인 특성을 이미 학습했고, 그것을 더 전문화된 작업이나 데이터셋에서 잘 수행하도록 조정하는 것을 활용하는 거예요. 하지만 스테이블 디퓨전 같은 모델의 맥락에서, 전통적인 파인튜닝은 자원 집약적이고 대부분의 사용자에게 실행 가능하지 않아요.

한정된 컴퓨팅 자원을 가진 우리에게는, 모델을 전문화하기 위해 각기 독특한 접근 방식을 가진 대체 기술이 사용돼요:

DreamBooth: 일반 파인튜닝과 그리 다르지 않지만, 보통 단일 개념에 초점을 맞춰요. 일반 파인튜닝과의 주된 차이점은 이전의 보존에 있어요(아래 섹션 참조).

Textual Inversion: textual inversion은 모델이 새로운 연관성을 배우도록 돕는 방법으로, 새로운 임베딩을 생성하는 거예요. 이 임베딩을 통해 모델은 독특하거나 틈새 개념과 더 잘 일치하는 이미지를 생성할 수 있어요.

LoRA: 이 기술은 모델의 가중치 전체가 아니라 작은 부분만 수정해요. Dreambooth보다 강력하진 않지만, 자원을 덜 사용해요. 현재 LoRA는 Dreambooth에 적용되어, Dreambooth에서 사용되는 모든 정규화 기술이 LoRA에도 적용된다는 것을 의미해요(아래 섹션 참조).

Pivotal Tuning: 기존의 LoRA와 TI(Textual Inversion)을 결합한 것으로 생각하면돼요. 새로운 임베딩과 그에 대한 훈련을 받게 돼요. 이는 "rare token" 사용의 필요성을 없애고 "개념 유출"을 방지함으로써 LoRA를 훈련하는 강력한 방법이에요. 단점은 새로운 임베딩을 제로부터 훈련해야 한다는 것이며(모델의 이전 지식을 사용할 수 없음), 이는 올바르게 얻기 어렵다는 것을 의미해요.

Hypernetwork: 현재는 구식이며, 알 필요도 없어요.

중추적 튜닝: TI와 결합된 고전적인 LoRA라고 생각하세요. 새로운 임베딩과 이에 대한 교육을 받습니다. 이는 "개념 출혈"을 방지하여 "희귀 토큰"(Dreambooth 섹션 참조)을 사용할 필요성을 제거하므로 LoRA를 훈련하는 강력한 방법입니다. 단점은 개념을 나타내는 새로운 임베딩을 처음부터 훈련해야 한다는 것입니다(모델의 사전 지식을 사용할 수 없으므로 올바르게 수행하기가 더 어렵습니다).

하이퍼네트워크: 더 이상 사용되지 않으며 이에 대해 알 필요도 없습니다.

학습을 위한 원본 모델

필수

훈련을 위한 소스 모델 선택에 대해 중요한 점을 알려드릴게요. 훈련을 위해 항상 bf16/fp16 가지치기(pruned) 모델을 사용하세요. 이유는 모델이 더 작아져 VRAM 사용량이 줄어들기 때문이에요.

선택에 있어서, 기본적으로 네 가지 옵션이 있어요: NAI, SD1.5, SD2.1, SDXL. 이들은 모두 베이스 모델이에요. 다른 체크포인트를 사용하지 마세요, 그러면 모델의 다양성이 떨어지고 일부 개념이 베이스 모델을 사용했을 때만큼 잘 렌더링되지 않을 수 있어요.

기본적인 가이드라인은 다음과 같아요:

  • 현실적인 용도로는 SD1.5, SD2.1, 또는 SDXL을 사용하세요.
  • 애니메이션/만화용으로는 NAI(애니메이션풀-파이널-가지치기) 또는 SDXL을 사용하세요.

훈련하는 동안, 샘플들은 모두 못생겨 보일 거예요. 특정 체크포인트를 A1111에서 사용할 때만 유용할 거에요. 

참고: 더 다운스트림(downstream) 모델을 사용하는 것이 pivotal tuning을 사용할 때 그렇게 나쁘지 않을 수 있어요.

드림부스(Dreambooth)는 무엇인가요?

기초

Dreambooth는 인공지능 모델의 특정 부분, 특히 Unet과 텍스트 인코더를 미세 조정하는 방법으로, 희귀 토큰과 정규화 이미지를 사용해 모델의 기존 지식을 유지하면서 새로운 개념을 추가하는 방법입니다. 결과적으로 나오는 Dreambooth 모델은 체크포인트가 됩니다.

자세히 설명하자면, 텍스트-이미지 모델인 스테이블 디퓨전은 처음에 방대한 데이터셋에서 다양한 개념을 학습하기 위해 훈련됩니다. 이 초기 훈련은 모델의 ‘사전 지식’을 형성하는데, 여기서 사전 지식이란 다양한 객체와 아이디어(예: 다양한 동물, 차량 등)에 대한 기본적인 지식을 말합니다. 이 상황에서 새로운 개념을 도입하는 것은 까다로울 수 있습니다. 전통적인 파인튜닝은 새로운 데이터에 기반한 모델 매개변수를 조정하는 것을 포함하는데, 이는 모델이 원래의 훈련을 일부 잊어버릴 수 있습니다(언어 이동). Dreambooth는 클래스별 사전 지식 보존과 희귀 토큰을 사용하여 모델의 사전 지식 손실을 완화하면서 새로운 개념을 추가할 수 있는 해결책을 제공합니다.

정규화 이미지/클래스별 사전 지식 보존(Regularization image)

Dreambooth는 모델의 원래 지식을 그대로 유지하는 특별한 방법을 사용합니다. 이는 새로운 개념과 같은 "클래스"에 속하지만 모델의 지식에 이미 포함된 이미지들로 모델을 훈련시키는 것을 포함합니다. 여기서 '클래스'란 엔티티(객체, 개념 또는 데이터 포인트와 같은)가 속하는 넓은 범주나 그룹을 의미합니다.

희귀 토큰(rare token)

새로운 개념을 도입할 때, Dreambooth는 모델이 이미 알고 있는 것과 강하게 연결되지 않은 희귀 토큰을 사용하는 것을 제안합니다. 이러한 약한 사전 연결 때문에, 언어 이동이 덜 영향을 미치게 되어 새로운 훈련이 모델의 기존 능력에 방해를 주지 않게 됩니다.

Dreambooth가 LoRA에 어떻게 적용되는가?

LoRA는 기존의 파인튜닝 방법과 함께 작동해야 합니다. 가장 일반적으로 사용되는 방법은 Dreambooth와 텍스트 인버전이지만, LoRA는 텍스트 인버전과 호환되지 않으므로 주로 Dreambooth와 함께 적용됩니다. Dreambooth와 함께 LoRA를 사용할 때의 주요 차이점은 모델을 세밀하게 조정하는 방식에 있습니다: LoRA는 조정해야 할 매개변수의 전체 수를 줄이고 모델의 Attention 계층을 특별히 미세 조정하는 데 초점을 맞춥니다. 이는 모델의 전체 유닛과 텍스트 인코더를 변경하지 않는다는 것을 의미합니다.

실제로, Dreambooth가 지향하는 원칙들은 LoRA에도 적용됩니다. LoRA 훈련에서 희귀 토큰이나 정규화 이미지를 생략하면 모델이 원래 훈련의 정확성을 잃기 시작하는 ‘언어 이동’이 발생할 수 있습니다. 이러한 요소를 포함하는 것이 필수는 아니지만, 훈련 중 이러한 잠재적 문제를 인식하는 것이 중요합니다.

LoRA를 사용할 때 주요 도전 중 하나는 여러 개념을 효과적으로 통합하는 것입니다. 일부 LoRA 모델은 훈련 데이터셋의 다양한 요소들이 모여 있는 형태의 이미지(일종의 "콜라주")를 생성하기도 합니다. 최고의 LoRA 모델은 고품질의 이미지를 생성하는 것뿐만 아니라 원본 모델의 광범위한 능력도 유지할 것입니다. 예를 들어, 특정 유명인에 맞게 모델을 조정하는 경우, 목표는 이 유명인의 변형(예: 머리 색상 변경)을 가능하게 하면서도 모델이 다른 유명인을 정확하게 인식하고 묘사하는 능력을 잃지 않게 하는 것입니다.

이를 위해 몇 가지 전략이 필요합니다:

  1. 정밀한 태깅과 데이터 준비: 다양한 개념을 통합하려면, 각 개념에 대해 명확하고 일관된 태깅이 필요합니다. 이는 모델이 각 개념을 분명히 구분하고 정확하게 학습할 수 있게 도와줍니다.
  2. 적절한 훈련 데이터의 선택: 모델이 다양한 요소를 적절히 학습하고 통합할 수 있도록, 관련성이 높고 다양한 훈련 데이터를 선택하는 것이 중요합니다. 이는 모델이 각 개념에 대해 더 균형 잡힌 이해를 개발하는 데 도움이 됩니다.
  3. 정규화 이미지의 사용: 다양한 개념을 학습할 때 모델이 원래의 지식을 유지하도록 하기 위해, 관련 개념이 포함된 정규화 이미지를 사용하는 것이 중요합니다. 이는 모델이 새로운 정보를 통합하면서도 기존의 지식을 유지하게 합니다.
  4. 희귀 토큰의 사용: 새로운 개념을 도입할 때 희귀 토큰을 사용하면, 모델이 기존 개념과 새로운 개념 사이의 혼동을 줄이고 각각을 더 정확하게 인식할 수 있게 합니다.
  5. 지속적인 평가와 조정: 모델의 출력을 지속적으로 평가하고 필요에 따라 훈련 접근 방식을 조정하는 것이 중요합니다. 이를 통해 모델이 여러 개념을 효과적으로 통합하고 있음을 확인하고, 필요한 경우 추가 조정을 할 수 있습니다.

이러한 접근 방식은 LoRA 모델이 여러 개념을 효율적으로 학습하고 통합하면서도 고품질의 이미지를 생성하고 원본 모델의 광범위한 능력을 유지할 수 있도록 도와줍니다.


3. 훈련 매개변(Parameter)

기본 파라미터 다운링크

https://gist.githubusercontent.com/Poiuytrezay1/14d146290a08afedc8ea07d7c79f2049/raw/06ffed6ed9ad75864f4e80d4560fd25d9c4815ac/base.json

조정할 파라미터

필수

훈련 매개변수를 조정하는 것은 모델 훈련에서 중요한 단계입니다. 여기에 kohya-ss에 대한 기본 설정이 있으며, 몇 가지 주요 매개변수를 조정할 필요가 있습니다

  1. Clip Skip: 이미지 생성 과정에서 특정 단계를 건너뛰는 설정입니다. NAI 모델에 대해서는 2를 사용하고, 다른 경우에는 1을 사용하세요.
  2. Learning Rate (LR): 모델이 학습하는 속도를 결정합니다. 동적 최적화(DAdaptation이나 Prodigy와 같은)를 사용하지 않는 경우에만 조정합니다. 보통 학습률을 조정하여 모델이 더 빠르게 학습하거나 더 세밀하게 학습하도록 할 수 있습니다.
  3. Network Dimension / Alpha: 이 매개변수는 모델의 네트워크 차원 또는 학습 중에 조정할 가중치의 양을 결정합니다. 4에서 32 사이(또는 1에서 16 사이)로 유지하는 것이 좋습니다. 이 범위 내에서 값을 조정하여 모델의 학습 능력과 자원 사용량 사이의 균형을 맞추세요.
  4. Keep N tokens: 이것은 데이터셋에서 활성화 태그의 수를 나타냅니다. 캡션을 섞을 때 앞쪽 N개의 태그를 유지하는 설정입니다. 여기서 '토큰'은 실제 토큰이 아니라 '태그'를 의미하는 것이므로 조금 혼동될 수 있습니다. 활성화 태그가 하나만 있는 경우 1로 설정하세요.

필수 매개변수

필수

훈련에 필요한 주요 매개변수와 그에 대한 권장 값들을 제공해 드리겠습니다. 이러한 설정을 통해 "바로 사용 가능한(out-of-the-box)" 훈련 매개변수들을 실험해 볼 수 있습니다. 모든 "선택적(optional)" 매개변수는 필요한 경우를 제외하고는 비워두겠습니다. 일부는 [고급] 섹션에서 논의할 예정입니다:

  • Train batch size: VRAM이 허용하는 한 1-4 사이의 값을 권장합니다. 이상적인 배치 크기는 각 버킷의 이미지 수의 약수여야 합니다. 배치 정규화가 구현되지 않았기 때문에 높은 값을 피하세요.
  • Epoch: 10-100 사이를 권장합니다.데이터셋을 약간 오버핏하도록 목표를 설정하고 최적의 결과를 위해 초기 에폭을 선택하세요.
  • Save every N epoch: 1로 설정하세요. 나중에 최고의 에폭을 선택하는 데 도움이 됩니다.
  • Mixed/Save precision: VRAM 사용량을 줄이면서 fp32와 거의 동일한 품질을 제공하는 fp16(또는 혼합 정밀도 bf16)을 사용하세요.
  • Cache latents: ON으로 설정하세요. 이는 VRAM 사용량이 높아지는 대신 훈련 속도를 높이는 최적화입니다. VRAM이 제한적이라면 끄는 것을 고려하세요.
  • Cache latents to disk: OFF
  • LR Scheduler: "코사인(cosine)"을 사용하세요. 이는 빠른 수렴을 위해 사용되지만, 잘못 사용하면 재앙적일 수 있습니다.
  • Optimizer: [고급] 섹션에서 더 자세히 논의될 예정입니다. 적응형과 비적응형 두 가지 유형이 있습니다. 적응형 옵티마이저는 VRAM을 더 많이 사용하지만 학습률 조정을 단순화합니다. VRAM이 허용한다면, 추가적인 인자가 필요한 "Prodigy"를 권장합니다(세부사항은 Prodigy 섹션 참조).
  • LR Warmup: 0%로 설정하세요. Prodigy를 사용하는 경우, 스텝의 2-5%를 고려하세요. 이 설정의 정확한 영향은 복잡하며 여기서 완전히 탐구되지 않았습니다.
  • Max resolution: 특별한 상황을 제외하고는 모델의 기본 해상도(예: NAI의 경우 512x512, SDXL의 경우 1024x1024)를 고수하세요. 더 높은 해상도에서의 세부 사항을 목표로 한다면 해상도를 높이는 것이 도움이 될 수 있지만, 낮은 해상도에서는 결과가 나빠질 수 있습니다.
  • Stop text encoder training: 0. 이 설정은 특정 상황에서만 필요하며 일반적으로는 필요하지 않습니다.
  • Enable buckets: ON(최소/최대 해상도와 스텝에 대한 기본 매개변수 유지)
  • Gradient checkpointing: ON. 품질에 영향을 주지 않으면서 VRAM 사용량을 크게 줄일 수 있지만 훈련 속도가 느려질 수 있습니다.
  • Shuffle caption: ON
  • Flip augmentation: 대부분의 경우 OFF로 두되, 개념이 대칭적이고 데이터셋을 더 크게 만들 필요가 있는 경우 ON으로 전환할 수 있습니다.
  • Min SNR gamma: 5. 더 빠른 수렴을 위한 최적화입니다. 이 매개변수에 대한 자세한 설명은 전체 섹션을 필요로 합니다.
  • Noise offset type: Multires(때로는 Pyramidal이라고 함), 대조를 학습하는 데 더 좋습니다. Min SNR gamma와 마찬가지로, 전체 설명은 전체 기사가 필요합니다.
  • Multires noise iterations: 6-10이 좋은 값입니다.
  • Noise discount: 이 매개변수에 대한 충분한 실험을 하지 않았습니다. 보통 0.2-0.4를 사용합니다. 샘플링할 때 이미지가 매우 어둡다면 이 매개변수를 낮추세요.

오버핏 & 언더핏

필수

과적합(Overfitting)은 모델이 훈련 데이터를 너무 잘 배워버려 실제 데이터에 대해 일반화하는 능력이 떨어지는 현상을 말합니다. 반대로, 부적합(Underfitting)은 모델이 개념을 충분히 포착하지 못하는 경우로, 모델이 데이터의 중요한 패턴이나 구조를 학습하지 못해 성능이 좋지 않은 상태를 의미합니다.

스테이블 디퓨전에서 과적합의 징후로는 이미지가 포화되거나, 아티팩트(예상치 못한 혼란스러운 패턴이나 노이즈)가 가득하거나, 이상하게 변하는 경우를 들 수 있습니다. 부적합한 LoRA는 일관성 있게 개념을 재현하지 못하기 때문에 쉽게 파악할 수 있습니다. 과적합 사례를 보여주기 위해, LoRA의 가중치를 높은 값으로 설정할 수 있습니다. 포화되고 아티팩트가 가득한 것은 과적합의 징후입니다.

과적합과 부적합 사이에서 균형을 맞추는 것은 모델 훈련에서 중요한 과제입니다. 과적합을 방지하기 위해, 모델이 훈련 데이터에만 지나치게 의존하지 않도록 하고, 충분히 다양한 데이터로 훈련시켜 일반화 능력을 높여야 합니다. 반면, 부적합을 해결하기 위해서는 모델이 데이터에서 중요한 패턴을 충분히 학습할 수 있도록 더 많은 데이터를 제공하거나 모델 구조를 조정할 필요가 있습니다.

 

과적합을 피하는 방법

기초

과적합을 방지하는 방법은 여러 가지가 있습니다. 모델이 훈련 데이터에만 지나치게 적응하지 않도록 하여, 모델이 실제 데이터에 대해 더 잘 일반화할 수 있도록 돕습니다. 과적합을 피하는 몇 가지 기술은 다음과 같습니다:

  1. 정규화(Regularization): 모델이 너무 복잡해지는 것을 방지하기 위해 사용됩니다. 예를 들어, 드롭아웃(Dropout)과 최대 노름(Max Norm)과 같은 기술이 정규화에 속합니다. 드롭아웃은 훈련 과정에서 무작위로 뉴런의 일부를 무시함으로써 모델이 특정 데이터 포인트에 너무 의존하지 않게 만듭니다.
  2. 다양한 훈련 데이터 사용: 모델이 더 다양한 상황을 학습할 수 있도록 하여, 실제 세계의 다양한 시나리오에 더 잘 일반화하게 합니다.
  3. 조기 중단(Early Stopping): 모델이 과적합되기 시작하는 순간 훈련을 중단합니다. 즉, 검증 데이터셋에서 성능이 더 이상 개선되지 않을 때 훈련을 중지하여, 모델이 훈련 데이터에 과도하게 적응하는 것을 방지합니다.
  4. 교차 검증(Cross-Validation): 데이터셋을 여러 부분으로 나누고, 일부는 훈련에 다른 일부는 검증에 사용합니다. 이를 통해 모델의 성능을 더 잘 평가하고 과적합을 감지할 수 있습니다.
  5. 손실 그래프 분석: 훈련 손실과 검증 손실을 시간에 따라 그래프로 그리고, 두 손실 간의 차이를 관찰함으로써 과적합을 감지할 수 있습니다.

학습률에 대해 말하자면, 이는 신경망 훈련에서 중요한 매개변수 중 하나입니다. 모델이 데이터로부터 학습하는 속도를 결정합니다. 학습률이 너무 높으면 모델이 최적해를 지나칠 수 있고, 너무 낮으면 훈련에 너무 오래 걸리거나 부적합한 해에 머물 수 있습니다.

스테이블 디퓨전 LoRA의 경우, 이상적인 학습률은 대체로 1e-4에서 4e-4 사이에서 변동됩니다. 학습률 스케줄러와 학습률에 대해 더 알아보고 싶다면, https://www.jeremyjordan.me/nn-learning-rate/을 읽어보는 것을 추천합니다. 이 자료는 학습률과 학습률 스케줄러에 대해 조금 더 설명합니다.

학습률(Learning Rate)

기초

네트워크 랭크(또는 차원)와 알파는 LoRA와 직접적으로 관련된 매개변수입니다. 랭크가 높을수록 파일 크기가 증가하며(몇 MB에서 거의 GB까지), 기존 "Dreambooth" 훈련에 더 가까워집니다.

이를 직관적으로 이해해 보겠습니다:

오케스트라를 상상해 보세요. 각 섹션(현악기, 금관악기, 타악기 등)이 음악에 다른 차원을 추가합니다. LoRA는 이 오케스트라의 섹션을 조정하여 소리를 적응시키려고 합니다. 이는 악기를 수정하거나 새로운 연주자를 추가하는 것일 수 있습니다. "네트워크 랭크"는 섹션을 변경할 세부 정도와 유사합니다.

낮은 랭크: 이는 각 섹션에서 미묘한 조정을 하는 것과 같습니다(예를 들어, 소수의 연주자를 추가함). 각 연주자는 섹션의 소리를 미묘하게 변경할 수 있지만, 전체 작곡은 대체로 인식 가능하게 유지됩니다. LoRA에서 낮은 랭크는 신경망의 기존 가중치를 수정하는 요소가 적음을 의미하며, 이는 더 단순하고 제어가 가능한 적응을 이끕니다.

높은 랭크: 각 오케스트라 섹션에 훨씬 더 많은 연주자를 추가하는 것을 상상해 보세요. 더 많은 연주자는 각 섹션에서 더 풍부하고 미묘한 공연을 가능하게 하며, 이는 LoRA에서 더 높은 랭크와 유사하게, 네트워크의 가중치를 수정하는 더 많은 요소를 도입합니다. 이는 복잡성과 유연성을 증가시키지만 전체 작곡을 해칠 수 있습니다.

이 비유에서 "네트워크 알파"는 각 새로운 연주자가 자신의 악기를 연주하는 강도로 생각할 수 있습니다.

스테이블 디퓨전에서 낮은 랭크는 모델을 원래 상태에 더 가깝게 유지하면서 보수적인 조정을 의미합니다. 낮은 랭크가 항상 선호되는데, 이는 원본 모델의 적응성을 유지하고자 하기 때문입니다. 일반적으로, 이미지가 더 많을수록 랭크는 낮아야 합니다.

일반적인 권장 사항은 다음과 같습니다:

  • 네트워크 랭크: 4-32 (대부분의 경우 32 이상으로 가는 것은 필요하지 않음)
  • 네트워크 알파: 1 또는 랭크의 절반(네트워크 랭크가 32인 경우 16)

주의: 낮은 랭크와 알파는 동등한 세부 사항을 달성하기 위해 더 높은 학습률을 요구합니다. 적응형 옵티마이저는 이를 자동으로 처리해야 합니다.

 

Prodigy Optimizer 사용하기

기초

Prodigy 옵티마이저는 학습률에 대한 적응형 접근 방식을 제공하며, DAdaptation을 대체하는 직접적인 업그레이드이자 다른 옵티마이저들에 비해 명확한 승자입니다. 하지만 상당한 VRAM 사용량이 필요합니다.

필수 사항:

  • Learning Rate를 1로 설정: 이것은 매우 중요합니다. Prodigy는 훈련 중 학습률을 동적으로 조정합니다.
  • Extra Arguments: "Optimizer Extra Arguments" 필드에 다음 설정을 입력하면 좋은 출발점이 됩니다: "decouple=True", "weight_decay=0.01", "d_coef=0.8", "use_bias_correction=True", "safeguard_warmup=True", "betas=0.9,0.99".

Prodigy 매개변수 이해하기:

  • d_coef (범위: 0.1에서 2, 권장: 0.8): 변경해야 할 유일한 매개변수입니다. 이 매개변수는 학습률 변경 속도에 영향을 줍니다. 일반적으로 1 이하로 유지하세요. 데이터셋이 작은 경우 더 높은 값을 고려하세요. 모델이 아무것도 배우지 않고 과적합된다면, 이 값을 낮춰야 합니다.
  • weight_decay (권장: 0.01): 이는 데이터셋 학습에서의 감소 비율을 나타냅니다. 이는 손실 함수에 패널티를 추가하여 과적합을 방지하고, 모델의 단순성을 촉진하기 위해 더 작은 가중치 크기를 장려합니다. 훈련 중, 이 패널티 항목은 모델이 가중치를 작게 유지하도록 장려합니다. 이를 통해 weight_decay는 모델을 단순화하는 데 도움이 되며, 훈련 데이터의 노이즈에 맞추기보다는 새롭고 보이지 않는 데이터에 잘 일반화할 가능성이 더 높아집니다.
  • safeguard_warmup: warmup을 0보다 크게 사용하는 경우 True로 설정하세요. 그렇지 않으면 False입니다.
  • decouple: 이를 True로 설정 유지하세요.
  • betas: 스테이블 디퓨전에 대해 기본값인 "0.9,0.99"를 유지하세요. betas를 이해하려면 옵티마이저 메커니즘에 대해 더 깊이 파고들어야 하며, 이 가이드에서는 다루지 않습니다.

추가 매개변수

심화

두 가지 추가 매개변수가 있으며, 이들은 과적합을 방지하는 데 매우 유용하며 조정이 필요합니다:

가중치 규모 정규화 (Scale weight norms)

  • 권장 값: 1. 이 기술은 네트워크 내의 가중치 크기를 주시하고 너무 커질 경우 축소하는 것을 포함합니다. 이는 가중치를 균형 있고 관리 가능한 범위 내에서 유지하는 것과 같습니다. 가중치가 개별적으로 얼마나 큰지보다 서로 어떻게 비교되는지가 더 중요하기 때문에 이는 중요합니다. 이 방법을 사용하면 가중치의 평균 크기와 조정 빈도와 같은 유용한 정보를 얻을 수 있습니다. 이 접근 방식은 특히 과적합을 피하는 데 유리하며, 모델이 훈련 데이터의 노이즈와 기타 결함을 포착하는 것을 방지합니다. 가중치 스케일링 모니터링은 과훈련을 신호할 수 있습니다.

네트워크 드롭아웃 (Network dropout)

  • 권장 값: 0.1-0.5. 훈련 중에 네트워크에서 뉴런의 부분집합(그리고 그들의 연결)을 임의로 "드롭"합니다. 즉, 활성화의 임의로 선택된 세트가 0으로 설정되어 네트워크가 단일 뉴런에 의존하지 않는 더 견고한 특징을 학습하도록 강제합니다. 드롭아웃을 사용함으로써, 네트워크가 모든 뉴런에 학습을 분배하도록 장려하며, 이는 보이지 않는 데이터에서 더 잘 수행하는 더 일반화된 모델로 이어집니다.

이 두 매개변수를 조정함으로써, 모델이 과적합 없이도 효과적으로 학습하고, 새로운 데이터에 대해 더 좋은 일반화 성능을 보이도록 할 수 있습니다. 과적합을 방지하는 이러한 기술들은 모델의 견고성을 높이고, 실제 세계에서의 성능을 개선하는 데 도움이 됩니다.


4. 훈련, 테스트, 문제해결

최고의 에포크 고르는 법

기초

최고의 에포크 고르는 법 간단히 말해서, 두 가지 방법이 있어요:

  1. LoRA 모델을 훈련시킬 때, 샘플링이라는 걸 해보세요. 샘플링이란, 훈련 중간중간에 모델이 어떻게 작동하는지 이미지 몇 개를 만들어 보는 거예요. 이렇게 만들어본 이미지들 중에서, 내가 생각한 개념이나 아이디어를 제일 잘 표현하는 시점의 이미지가 나온 에포크를 고르면 돼요. 이 방법은 본인의 눈과 이해도를 많이 의지해야 해요.
  2. Tensorboard라는 도구를 써보세요. (bmaltais UI에서 버튼을 클릭해서 열 수 있어요) 여기서는 모든 에포크 동안의 손실값(모델이 얼마나 잘못 추측하고 있는지 보여주는 값)을 그래프로 볼 수 있어요. 손실값이 잠깐 낮아졌다가 다시 올라가는 지점, 즉 '지역 최소값'을 찾는 게 목표예요. 이 지점들이 바로 좋은 에포크 후보들이죠. 아래 그래프를 보면, 손실값이 좀 들쭉날쭉한데, 빨간색으로 표시된 에포크들이 내가 고른 에포크들이에요. 이 방법은 숫자와 데이터를 기반으로 좋은 에포크를 찾는 데 도움을 줘요.

둘 중 어느 방법을 선택하든, A1111에서 실험해볼 몇 개의 에포크를 골라야 해요. 이를 위해, 원하는 모든 개념과 에포크를 포함하는 그리드를 만들어보세요. 너무 일찍 나온 에포크(아직 모자란 에포크)나 너무 늦게 나온 에포크(너무 많이 훈련된 에포크)는 빼고요. 그리고 남은 에포크 중에서 가장 잘 맞는 것 같은 걸 골라서, 좀 더 복잡한 문제에 적용해보세요.

테스트와 문제해결하기

기초

[초보자] 문제 해결하기

LoRA 모델을 훈련할 때 knxo의 가이드에 따르면, 세 가지 접근 방식이 있어요: 유동적(fluid), 반정적(semi-static), 정적(static)입니다. 주관적이긴 하지만, 반정적 방식이 종종 최고예요. 이 방법은 관련된 개념을 태깅하고 관련 없는 것들을 제거하는 신중한 균형을 포함해요. 과정은 간단해요: 원하는 개념, 캐릭터, 스타일을 정확히 나타내는 활성화 태그가 될 때까지 "부분"을 나타내는 태그를 계속 제거하세요.

참고: 이 원칙은 SD1.5와 SDXL 모델에도 동일하게 적용됩니다.

 

많은 이미지에 '배꼽' 태그가 있음을 볼 수 있어요. '배꼽' 태그가 자주 사용된다는 것은 프롬프트에 포함되지 않을 경우 LoRA가 생성된 이미지에서 배꼽을 가려야 한다는 것을 의미하며, 이는 기본 모델이 배꼽이라는 개념을 이해하기 때문에 태그된 인스턴스와 태그되지 않은 인스턴스 사이의 구분을 강조하게 됩니다. 활성화 태그를 사용할 때마다 옷차림에 배꼽이 보이길 원한다면, 아마도 데이터셋에서 '배꼽' 태그를 제거해야 할 겁니다.

'배꼽' 태그와 함께 이미지를 생성해 테스트해본 결과, 옷차림이 더 정확하게 나타났습니다. 마찬가지로, 팔에 예상치 못한 재킷 같은 커버링은 '쇄골' 태그 때문이었습니다. 

목표는 이런 식으로 문제를 찾아내고 해결하는 것입니다. 문제가 더 이상 없을 때까지 반복하세요. 그러면 LoRA가 준비될 거예요.

 

태그를 제거하는 것만으로 충분하지 않을 때는 어떻게 해야 할까요?

실제로, 태그 제거만으로 해결할 수 없는 문제가 발생할 수 있어요. 예를 들어, 어떤 개념은 다른 개념보다 훈련하기 어렵거나, 데이터셋에 개념을 가르치기 위한 데이터가 부족할 수 있어요. 이 경우 몇 가지 해결책이 있습니다:

문제를 해결하기 위해 데이터셋에 특정 태그를 추가하세요. 이 작업은 철저하고 완벽하게 수행되어야 합니다. 추가하는 태그가 수정된 개념인지 아니면 새로운 개념인지 기억하세요. 새로운 개념은 많은 이미지가 필요합니다!

훈련에 방해가 되는 이미지를 제거하세요. 이는 잡기 어려울 수 있지만, LoRA를 철저히 테스트하거나 데이터셋의 일부분만 가지고 훈련함으로써 가능합니다. 나쁜 이미지 하나가 최종 LoRA에 큰 영향을 미칠 수 있습니다.

특정 개념을 훈련시키기 위해 새 이미지를 새 폴더에 추가하세요. 예를 들어, SD가 재현하기 어려운 특정 헤어스타일을 가진 캐릭터를 훈련시킨다면, 이 헤어스타일을 가진 캐릭터의 이미지를 찾아 데이터셋에 추가하는 것이 도움이 될 수 있습니다(다른 캐릭터일지라도요!)

부족한 개념의 반복 횟수를 변경하세요. 이를 할 때, 너무 많은 반복(최대 다섯 번이 절대적인 최대)을 설정하지 마세요. 그렇지 않으면 LoRA가 이러한 이미지에 과적합될 수 있습니다.

이 팁들이 여러분이 자신의 LoRA 문제를 해결하는 데 도움이 되길 바랍니다.

다중 개념 및 데이터셋 균형 맞추기

심화

이전 섹션에서 우리는 Arcane Jinx 개념의 옷차림에 "분홍색" 아티팩트가 있는 문제를 보았습니다. 이 문제는 개념이 서로 섞이는 현상, 즉 컨셉 블리딩 때문입니다. 설명해 드리겠습니다.

이 LoRA는 jinxdef, jinxarcane, jinxelf, jinxfirecracker, jinxrnd라는 태그를 가진 5가지 다른 옷차림으로 구성되어 있었습니다. 가장 유사한 옷차림(jinxdef와 jinxarcane)의 토큰을 살펴봅시다.

두 임베딩이 jin과 x라는 두 개의 토큰을 공유하고 있음을 볼 수 있습니다. 이 두 토큰은 훈련 시 나머지 부분인 def와 arcane과 함께 훈련됩니다. 즉, "jinx" 태그는 모든 옷차림에 의해 훈련되는 반면, def와 arcane 같은 사용자 정의 토큰은 고유한 옷차림에 대해 훈련됩니다. 이를 설명하기 위해 "jinx" 태그만 사용하여 이미지를 생성했는데, 이는 태그 간의 "융합"이 발생함을 강조합니다:

내 이미지는 한 번도 jinx로 태그되지 않았지만, LoRA는 정확히 jinx 이미지를 생성했습니다. 이 개념은 활성화 태그 외의 다른 태그가 훈련되었다는 것을 의미하며 중요합니다! 그렇다면 왜 jinxdef와 관련된 옷차림만 생성하고 다른 것들은 생성하지 않을까요? 단순히, 데이터셋에서 거의 60%를 차지하기 때문입니다.

간단히 말해서, 태그 jinxdef = jinx + def 개념입니다. 이는 jinxdef를 훈련할 때, jinxarcane으로 유출될 것임을 의미합니다. 내 사용 사례에서, 이러한 유출은 파란 머리, 쌍둥이 꼬리, 눈 등 jinx의 부분이 비슷하기 때문에 괜찮습니다. 하지만 옷차림과 같은 다른 부분에서는 이 유출이 파괴적입니다. 예를 들어 보겠습니다:

이는 태그 jinx와 def에 대해 생성된 두 이미지와 각각의 주목 히트맵입니다(DAAM 섹션 참조). 히트맵에서 볼 수 있듯이, jinx와 def는 옷차림과 얼굴에 모두 영향을 미칩니다. def가 얼굴을 변경하는 것은 괜찮지만, jinx가 옷차림을 변경하는 것은 받아들일 수 없습니다. 이는 jinxarcane과 같은 다른 활성화 태그가 jinx 태그 부분에 의해 옷차림이 약간 수정될 것임을 의미합니다. 이전 섹션에서 jinx arcane의 옷차림에 분홍색 아티팩트가 나타난 것은 jinxdef 옷차림이 jinx 토큰으로 유출된 결과였습니다.

참고: 이를 이용할 수도 있습니다. 예를 들어, "학교" 유니폼이 있다면, "jinxschool" 활성화 태그를 사용하여 "school"

태그를 이용해 이미지를 생성할 수 있습니다(학교 개념을 새 옷차림에 맞게 수정하는 것).

더 복잡한 개념에 대해서는, 이러한 "개념 유출"을 이해하는 것이 필수적입니다. 왜냐하면 그것들은 다른 모든 태그로부터 잠재적으로 유출될 수 있는 여러 새로운 간단한 개념으로 구성되어 있기 때문입니다. 부적절하게 태그되면, 어려운 개념은 결코 실현되지 않을 수 있습니다.

이제, 이를 어떻게 고칠까요? 세 가지 해결책이 있습니다:

1. 독점적 활성화 태그 사용: 예를 들어, jinxdef를 jinx로, jinxarcane을 arcane으로 태그할 수 있지만, 이는 "arcane" 개념을 Jinx Arcane을 나타내도록 수정하는 것을 의미합니다. 예를 들어 sks와 같은 "희귀" 토큰을 사용하여 이를 대처할 수도 있습니다.

2. 데이터셋 균형을 맞추기 위해 반복 횟수 수정: 이 경우, jinxdef가 jinxarcane보다 네 배 많습니다. jinxarcane의 반복 횟수를 3으로 설정함으로써, 두 옷차림 사이의 jinx 토큰 균형을 맞추고 문제를 더 이상 발생시키지 않습니다.

3. 새로운 임베딩을 생성하기 위한 핵심 조정 사용

제 경우에는 jinxdef와 jinxarcane이 서로의 이점을 얻기를 원하기 때문에, 두 번째 해결책을 사용할 것입니다. 다른 태그의 경우, 완전히 새로운 개념이기 때문에 세 번째 해결책을 사용해야 하지만, 대신 첫 번째 해결책을 선택했습니다.

DAAM을 사용하여 태그 문제 해결하기

심화

참고: 이 글을 쓰는 시점에서, 이 방법은 현재 kohya-ss에서 구현 중이므로, 곧 훈련 중에 사용할 수 있을 것입니다. 대안으로, 현재 DAAM 확장 기능을 https://github.com/toriato/stable-diffusion-webui-daam에서 A1111에 설치하여 이 기능에 접근할 수 있습니다.

DAAM은 생성된 이미지에 다른 태그가 어떻게 영향을 미치는지 시각화하는데 통찰력 있는 도구입니다. 특정 태그에 의해 가장 크게 영향받는 이미지 영역을 강조하는 열 지도(heat map)를 제공합니다. 이 시각화는 트레이너에게 매우 소중할 수 있으며, 각 태그가 이미지의 어떤 측면에 정확히 영향을 미치는지를 밝혀줍니다. 이해를 돕기 위한 예제를 보여드리겠습니다:

![DAAM heatmap example]

이 예제는 DAAM이 태그 영향력을 이해하는데 얼마나 명확한지를 보여줍니다. 열 지도는 색상 코딩을 사용하여 태그 영향력을 나타냅니다 — 영역이 더 붉을수록 태그의 영향력이 강합니다. 파란색을 띄는 영역은 영향력이 적거나 없음을 보여줍니다. 트레이너로서, 이는 여러분의 태그가 무엇을 학습했는지를 보여주고 다양한 문제를 수정하는 올바른 방향을 가리키는데 도움이 될 것입니다.

다음은 그러한 문제의 예입니다:

![Problem example with DAAM heatmap]

이 경우, 의도하지 않은 효과를 관찰할 수 있습니다: 열 지도에 눈 주위에 붉은 색조로 표시된 것처럼, 파란색 머리 태그가 눈 색깔도 변경합니다. 이상적으로, 파란색 머리는 머리 색깔에만 영향을 미쳐야 합니다.

LoRA 모델을 미세 조정할 때, 태그의 열 지도(MCs와 NCs)를 분석하기 위해 DAAM을 사용할 수 있습니다. 관련 없는 개념에 영향을 미치는 태그를 식별하세요. 이를 해결하기 위해, 특정 개념으로의 태그 유출을 조정하거나 특정 태그의 가중치를 수정해야 할 수 있습니다. 이러한 타겟팅 접근 방식은 각 태그가 이미지의 의도된 측면에만 정확하고 적절하게 영향을 미치도록 보장합니다.


5. 기타 방법들

AI방지 필터

필수

AI 방지 필터 AI 생성 콘텐츠, 특히 Stable Diffusion에서 고려해야 할 중요한 측면 중 하나는 AI 방지 필터의 존재입니다. 이 필터들은 모델이 데이터를 인간에게는 분명하지 않은 방식으로 잘못 해석하도록 만드는 취약점을 이용하도록 설계되었습니다. 가장 흔한 예로는 자체 제작된 가우시안 블러, 반복되는 모티프 또는 적대적 공격이 있습니다.

훈련 데이터셋에 AI 방지 필터가 포함된 이미지를 포함하는 것은 훈련에 치명적입니다! 데이터셋에 이러한 필터가 없는지 확인하는 것이 매우 중요합니다. 이러한 필터를 감지하는 것은 거의 불가능합니다. 대신, 잠재적인 AI 방지 필터를 자동으로 수정하고 정화하는 데 사용할 수 있는 스크립트를 여기에 제공합니다. 사용하려면 numpy와 opencv-contrib-python을 설치하세요(pip install). 사용 방법은 다음과 같습니다: python cleanup_antiai_filters.py --input_file_or_dir="이미지를 가진 디렉토리 경로". 이 스크립트는 이미지에 약간의 수정을 가하므로 신중하게 사용하세요.

참고: 깨끗한 데이터셋을 확보하는 대안적인 방법은 특정 날짜 이후의 이미지를 수집하지 않는 것입니다(2022년 이전은 대부분 괜찮습니다).

슬라이더/ LECO 훈련하기

기초

"슬라이더"는 특정 개념을 스펙트럼을 따라 조작할 수 있는 독특한 적응 기능입니다. 이것을 선택한 개념의 이미지 내 존재를 증가시키거나('긍정적' 방향) 감소시키는('부정적' 방향) 조절 다이얼처럼 생각해보세요.

슬라이더의 개념

긍정적 방향: 슬라이더가 긍정적 방향으로 움직일 때, 생성된 이미지에서 선택된 개념을 강화합니다. 예를 들어, '세부사항'의 양을 제어하는 개념이라면, 긍정적인 쪽은 매우 상세한 이미지를 생성합니다.

부정적 방향: 반대로, 슬라이더를 부정적 방향으로 움직이면 개념을 줄이거나 '지웁니다'. 같은 예를 사용하면, 부정적인 쪽은 더 단순하고 세부사항이 적은 이미지를 결과로 낳습니다.

참고: 슬라이더를 훈련시키기 위해 별도의 데이터셋이 필요하지 않습니다. 모든 것은 프롬프트 사용과 모델의 기존 지식에 관한 것입니다.

슬라이더 훈련 과정

슬라이더를 훈련하는 것은 Stable Diffusion을 창의적으로 사용하는 것에 관한 것입니다. 이것은 개념이 강화된 상태('긍정적' 측면)와 감소된 상태('부정적' 측면)에서 어떻게 나타나는지 비교 및 대조하는 것에 관한 것입니다. 작동 방식은 다음과 같습니다.

모델은 강화되지도 않고 감소되지도 않은 '중립' 상태로 식별되는 이미지를 생성하여 시작합니다. 그런 다음, 이 중립점을 사용하여 개념의 양쪽을 대표하는 프롬프트에서 두 이미지를 계속 생성합니다. 이 두 쪽에서 생성된 두 이미지 간의 차이를 평가합니다. 마지막으로, 이 개념과 관련된 가중치만 업데이트하여 모델의 출력을 강화된 상태 또는 감소된 상태로 이동할 수 있게 합니다.

슬라이더 훈련을 위한 도구

LECO: 현재 LECO(https://github.com/p1atdev/LECO에서 사용할 수 있음)와 같은 몇 가지 도구만이 슬라이더 훈련에 사용됩니다.

Kohya: Kohya의 sd-scripts에 비슷한 기능을 통합하기 위한 계획이 진행 중입니다.

참조: Stable Diffusion에서 기능을 지우거나 강화하는 개념은 https://github.com/rohitgandikota/erasing/tree/main과 같은 연구 및 도구에서 영감을 받았습니다.

프롬프트 작성

슬라이더를 훈련할 때, 프롬프트 선택이 중요합니다. 여기에는 다음이 포함됩니다:

대상: 수정하려는 핵심 개념을 대표하는 간단한 프롬프트 또는 태그(예: 얼굴 특징을 수정하는 경우 "소녀" 또는 "얼굴"). 이에 대해 생각하는 일반적인 방법은 수정하려는 개념의 "클래스"를 넣는 것입니다. Dreambooth 섹션을 따랐다면 이미 클래스가 무엇인지 알고 있을 것입니다. 모르는 경우, "클래스"는 수정하려는 특정 카테고리나 유형을 의미합니다.

중립: 종종 대상과 동일하며, 수정의 기준점으로 사용됩니다. 이는 대상을 조절하기 위한 시작점입니다.

부정적/긍정적: 이 프롬프트는 개념의 감소된 상태와 강화된 상태를 생생하게 나타내야 합니다. 일반적으로 이 부분에 대상 클래스를 포함하는 것이 최선입니다.

슬라이더를 훈련할 때, 훈련하려는 개념에 긍정적 또는 부정적 영향을 미치는 최적의 프롬프트를 찾는 것이 여러분의 역할입니다.

 

훈련시 VAE의 중요성

심화

이전에 VAE와 이미지 차원을 압축하여 효율성을 높이는 역할에 대해 논의했던 것을 기억하나요? 사실 이 과정은 이미지가 디코딩될 때 일부 정보 손실을 포함합니다. 이를 더 잘 이해하기 위해 다음과 같은 예시를 보여드립니다:

왼쪽은 원본 이미지(512x512)입니다. VAE에 의해 잠재 공간으로 압축되면(64x64), 이 이미지는 A1111과 같은 전형적인 이미지 생성 중에 원래 크기(512x512)로 다시 디코딩됩니다. 원본과 디코딩된 이미지 간의 차이는 분명히 큽니다. 번개는 사라졌고, 눈은 거의 인식할 수 없으며 입에서 눈에 띄는 손실이 발생했습니다.

훈련 중에는 Stable Diffusion이 왼쪽의 원본 이미지가 아닌 오른쪽의 디코딩된 버전을 복제하려고 시도한다는 것을 이해하는 것이 중요합니다. 데이터셋의 미세한 세부 사항(예: 눈)이 정확하게 재현되지 않는 문제를 겪고 있다면, 이것이 근본 원인일 수 있습니다.

이를 완화하기 위한 한 가지 해결책은 특정 VAE를 사용하여 훈련하는 것입니다.

중요: 대부분의 사용 사례에서 모델에 내장된 VAE로 훈련하는 것으로 충분합니다. 이 지식은 특정 스타일, 흔하지 않은 세부 사항, 또는 구별되는 VAE로 생성된 이미지를 가진 체크포인트나 LoRA를 훈련할 때 주로 유용할 것입니다.

직접 실험해보고 싶다면, 원본 이미지와 디코딩된 이미지 간의 차이를 시각화하기 위해 이 스크립트를 사용할 수 있습니다: https://gist.github.com/rockerBOO/f1b3c18f4b9fc161310b47d9cb39fcba. 사용법은 다음과 같습니다: accelerate launch debug_vae_from_images.py --pretrained_model_name_or_path="$model_name_or_path" --input_file_or_dir=$input_file_or_dir --output_dir=$output_dir --vae="$vae" --device=$device --batch_size=1

'AI' 카테고리의 다른 글

스테이블 디퓨젼 용어정리  (1) 2024.02.17