kimyongtae.com
홈 / 강의 / AI 이미지·애니메이션 생성, 원리부터 / 1단계. 생성 모델의 원리

1-6. CFG: 프롬프트를 얼마나 강하게 따를 것인가

프롬프트를 넣어 학습한 모델도 그냥 돌리면 프롬프트를 대충만 따른다. CFG는 "프롬프트가 있을 때의 방향"과 "없을 때의 방향"의 차이를 키워서 프롬프트를 강하게 따르게 만드는 기법이다. 네거티브 프롬프트의 정체도 여기서 밝혀진다.

문제

조건을 넣어 학습한 디노이저를 그대로 쓰면 그림이 밋밋하고 프롬프트와 느슨하게 맞는다. 모델은 "이 설명이 붙을 수 있는 그림 전부"의 분포에서 뽑기 때문이다. 그 안에는 설명과 간신히 맞는 그림도 많다.

우리가 원하는 것은 설명과 확실하게 맞는 그림이다.

생각

디노이저를 두 번 부른다.

두 방향의 차이가 "프롬프트 때문에 생긴 변화"다. 이 차이를 키우면 프롬프트를 더 강하게 따른다.

최종 방향 = 조건 없음 + s × ( 조건 있음 − 조건 없음 )

s가 CFG 스케일이다. 도구의 cfg 설정이 이 값이다. CFG는 classifier-free guidance의 줄임말이다.

숫자로 보기

어떤 픽셀에서 두 예측이 이렇게 나왔다고 하자.

s계산결과의미
00.2 + 0 × 0.30.2프롬프트를 무시한다
10.2 + 1 × 0.30.5조건 있는 예측 그대로. CFG를 안 쓴 것과 같다
30.2 + 3 × 0.31.1차이를 3배로
70.2 + 7 × 0.32.3차이를 7배로

s가 1보다 크면 두 예측의 바깥으로 나간다. 조건 없는 쪽에서 조건 있는 쪽을 지나 더 멀리 간다. "프롬프트다운 쪽으로 과장한다"고 생각하면 된다.

조건 없는 예측은 어디서 나오나

모델 하나로 둘 다 한다. 학습할 때 일부(보통 10% 안팎)는 프롬프트를 지우고 빈 채로 학습시킨다. 그러면 같은 모델이 프롬프트가 있을 때와 없을 때를 모두 배운다.

별도의 분류 모델(classifier)을 쓰지 않는다고 해서 이름이 classifier-free다.

값을 올리면 생기는 일

CFG결과
낮다 (1~2)프롬프트를 느슨하게 따른다. 자연스럽지만 밋밋하고 구도가 흐트러지기 쉽다
적당하다프롬프트를 잘 따르고 그림이 또렷하다
높다색이 과하게 진해지고 대비가 세진다. 윤곽이 딱딱해지고 "탄" 것처럼 보인다

높은 값에서 그림이 타는 이유는 숫자가 범위를 벗어나기 때문이다. 위 표에서 s = 7일 때 결과가 2.3이었다. 원래 예측은 0.2와 0.5였는데 한참 밖으로 나갔다. 이런 값이 쌓이면 색이 포화된다.

적당한 값은 모델마다 다르다.

모델 계열보통 쓰는 값
SD 1.57 안팎
SDXL과 그 파생 모델5~7
플로우 매칭 모델 (증류하지 않은 것)3~5
증류 모델1 (아래 참고)

네거티브 프롬프트의 정체

식을 다시 보자. "조건 없음" 자리에는 빈 프롬프트를 넣었다. 여기에 다른 프롬프트를 넣으면 어떻게 될까.

최종 방향 = 네거티브 + s × ( 포지티브 − 네거티브 )

"네거티브에서 멀어지고 포지티브 쪽으로 가는" 방향이 된다. 이것이 네거티브 프롬프트다. 별도의 기능이 아니다. CFG 식의 빈자리를 채운 것이다.

여기서 바로 나오는 사실이 둘 있다.

대가: 두 배 느리다

걸음마다 디노이저를 두 번 부른다. 20스텝이면 40번이다. 생성 시간이 두 배다.

CFG를 모델 안에 넣어 버리기

이 비용을 없애는 방법이 있다. "CFG를 적용한 결과"를 한 번에 내도록 모델을 다시 학습시킨다. 이것을 가이던스 증류라고 한다.

Flux dev가 대표적이다. 이 모델은 cfg를 1로 두고 쓴다. 대신 "가이던스"라는 숫자를 따로 입력으로 받는다. 그 숫자가 "CFG를 몇으로 준 것처럼 그려라"는 뜻이다. 디노이저는 걸음마다 한 번만 부른다.

대가도 있다.

설정이 안 맞을 때의 증상

모델을 새로 받으면 권장 CFG와 증류 여부부터 확인하자.

확인 문제

  1. 조건 없음 0.4, 조건 있음 0.1, s = 5일 때 최종 값은?
  2. CFG가 1일 때 네거티브 프롬프트가 효과가 없는 이유를 식으로 설명해 보자.
  3. CFG를 쓰면 생성 시간이 두 배가 되는 이유는?

풀이

  1. −1.1이다. 0.4 + 5 × (0.1 − 0.4) = 0.4 − 1.5.
  2. 네거티브 + 1 × (포지티브 − 네거티브) = 포지티브다. 네거티브 항이 서로 지워진다.
  3. 걸음마다 디노이저를 조건 있음, 조건 없음으로 두 번 부르기 때문이다.
← 1-5 텍스트 조건화: 프롬프트가 그림에 들어가는 길 1-7 증류: 몇 걸음 만에 그리게 만들기 →