StableDiffusion이 나오고 얼마 되지 않아서 발견한 팁들로 발견한지 꽤 오래 되었지만 아는 사람이 거의 없는거 같아서 글로 적어본다.
과적합된 모델이란?
이 글에서 의미하는 과적합된 모델은 스타일이나 캐릭터 등의 subject를 드림부스나 LoRa, 파인튜닝등으로 학습한 모델에서 특정 단어를 넣으면 원래 의도와 다르게 같은 자세만 나오거나 같은 캐릭터만 나오는 모델을 의미한다.
이런 현상은 데이터셋의 크기가 작을때 자주 발생한다. 예를 몇가지 들어 보자면, 캐릭터의 사진이 모두 같은 자세를 취하고 있다면 캐릭터를 출력하면 해당 자세만 출력된다. 흑백 캐릭터 그림만 학습할 경우, 캐릭터를 출력하면 흑백으로만 나오게된다. 캐릭터를 학습하는데 데이터셋이 모두 같은 그림체일 경우, 다른 그림체로는 잘 출력하지 못한다. 그림체를 학습하고 싶은데 같은 캐릭터가 많이 포함되어 있는 경우, 그림체만 학습하는 것이 아니라 캐릭터도 같이 학습해버린다.
이런 과적합으로 인한 문제를 아래와 같은 방법으로 해결 할 수 있다.
어떻게 이 문제를 해결하는가?
Prompt Editing
이 방법은 편법이라고 할 수 있는 방법인데, Sampling step에서 과적합된 키워드가 적용되는 타이밍을 수정해 주는것이다.
WebUI에서는 Sampling Step 중간에 적용되는 프롬프트를 바꿀수 있는 Prompt Editing 이라는 기능 이 있다.
해당 기능은 프롬프트에서 아래와 같은 문법을 사용하면 적용할 수 있다.
from: 이전 프롬프트, to: 바꿀 프롬프트, when: 바뀌는 step
[from:to:when]
#예시(step이 100이라고 가정)
[man:monster:10] # 10 step 까지 man, 이후부터는 monster가 적용됨
[man:monster:0.5] #소수로 쓸 경우 비율을 의미한다. 100의 절반인 50step까지 man, 이후부터는 monster가 적용됨
# 추가 문법(꼭 단어를 모두 채울 필요는 없다)
[to:when]
[from::when]
#예시
[monster:10] #monster를 10step 이후부터 적용
[girl::0.1] #girl 을 10step까지만 적용
이 방법을 응용하여, 과적합된 무언가를 출력할때 해당 프롬프트를 조기에 종료하거나, 늦게 적용하는 것을 통하여 과적합 문제를 개선할 수 있다.
적용 방법
나는 아래와 같은 방식을 통해 해당 기능을 사용한다.
- 그림체나 스타일 같은 이미지에 전체적인 영향을 미치는 것이 과적합된 경우
[to:when] 문법을 사용하여 일정 스텝이후에 프롬프트를 적용하는 방식으로, 과적합에서 벗어나 더욱 창의성을 살릴 수 있다. 스타일 표현에는 적합하지만 특정 캐릭터 표현에는 부적합하다. 캐릭터 표현을 위해서는 다른 품질 프롬프트를 아래의 스킬로 약화시키는 것이 낫다 - 특정 캐릭터를 다른 스타일로 표현하되 변형이 적게 되는 것을 원할 경우
[from::when] 문법을 사용하여 style을 조기에 종료하여 스타일을 반영하되 style 적용 전 프롬프트의 디테일을 살릴수 있다.
예를 들어, [realistic::10], character 을 하면 전체적인 그림이 현실적으로 변하지만 캐릭터의 얼굴의 변형은 덜하게 표현이 가능하다
- 흑백으로만 학습되어 과적합된 그림을 컬러로 출력하고 싶을 때
예시를 들어보겠다. character가 흑백으로만 학습되어 color라는 프롬프트를 넣고 네거티브 프롬프트로 greyscale, monochrome을 넣어도 컬러가 나오지 않는 경우가 있다. 이때, [to:when] 문법으로 해당 캐릭터의 프롬프트를 [character:2] 처럼 조금 늦게 적용시키는 것이다. 이럴 경우, 1~2 스텝 동안에는 전체 이미지가 흑백이 아닌 컬러로 시작되게 되고, long-wavelength 특징이 노이즈에 강한 특성 덕분에 이전의 컬러가 다음 step으로 전이되어 흑백이 아닌 컬러 이미지를 출력 할 수 있게 된다.
*long-wavelength, short-wavelength 특징의 뜻에 대해서는 이전 글 참고
이전 step의 정보가 중요한 이 방법들을 사용할때는 eta가 매우 중요하다. 이전 글에서 설명했다시피, Latent diffusion model에서는 샘플링 과정에서 n번의 denoise 과정을 거치는데 denoise를 거치고나서 다시 약간의 노이즈를 준다. 이때의 noise의 양을 eta로 조절할 수 있다. 따라서, eta 값이 높을수록 이전 step에서의 정보가 더 많이 사라진다.
또한, 이 방법들을 사용하면 프롬프트가 변하는 step수를 어떻게 조절하느냐에 따라 어느정도로 학습한 프롬프트를 따를지를 조절가능하다.
이 외에도 더 응용하여 다양한 방식으로 그림을 개선할 수 있으니, 여러 방법을 시도해보기 바란다.
주의점
주의할 점은, 이 방법은 샘플링 과정에 관여하는 방법이므로 샘플러의 종류와 Step 수, eta 값에 큰 영향을 받는다는 것이다.
대강 실험해본 결과로는 euler a 샘플러 가 해당 방법을 적용할 때 가장 적합한 것으로 판단되었다. (모델이나 기타 설정에 따라 다를수도 있음)
다음 글은 계속 미루고 있었던 내가 개발한 Subject 학습에 드림부스보다 진보된 학습 방법에 대한 글로, Training 속도 향샹(더 적은 step 수에서 학습), Fidelity 개선 효과, 텍스트 토큰 효과 증대, 캡션과 동시에 학습 할 수 있는 새로운 학습 데이터 전처리 방법인, Prompt Augmentation에 대한 글이 될거 같다.
사실 절반 써놓고 모델의 성능 평가 프로그램 개발하는게 귀찮아서 한달 넘게 미루고 있었는데 그냥 이번에는 꼭 써야겠다.
'IT' 카테고리의 다른 글
[딥러닝] 클래스 밸런싱의 여러 방법과 Stable Diffusion 데이터셋의 멀티 레이블 클래스 밸런싱 (0) | 2023.09.11 |
---|---|
[하드웨어] 노트북 CPU 클럭 제한으로 쓰로틀링 방지하기(간헐적 렉 해결하기) (2) | 2023.06.30 |
[딥러닝]Stable Diffusion에서 너무 어두운 이미지를 학습하지 못하는 이유와 해결 방법(noise offset에 대하여) (0) | 2023.03.04 |
[딥러닝 연구] Classifier-Free-Guidance(CFG)와 Stable diffusion 파인튜닝 (0) | 2023.02.18 |
[딥러닝]Text to Image 모델 드림부스 학습의 Diversity를 높이는 방법 (4) | 2023.02.01 |