분류기 없는 가이던스
더 많은 작업
- Classifier-free guidance, CFG; 분류기 없는 가이던스
- 조건부 예측과 무조건부 예측의 차이를 키워, 확산 모델이 프롬프트나 클래스 조건을 더 강하게 따르게 하는 추론 기법
분류기 없는 가이던스(classifier-free guidance, CFG)는 확산 모델이나 플로 매칭 모델에서 한 신경망이 조건이 있을 때와 없을 때의 예측을 모두 내게 학습해 두고, 생성할 때 두 예측의 차이를 증폭하는 기법이다. 텍스트-이미지 생성기의 "가이던스 스케일"(CFG scale) 설정값이 바로 이 증폭 배율이다. 2021년 NeurIPS 워크숍에서 처음 발표되고 2022년 7월 조너선 호(Jonathan Ho)와 팀 살리만스(Tim Salimans)가 정식 논문으로 공개했다.[1]
별도 분류기를 학습할 필요가 없고 구현이 몇 줄이라, GLIDE, DALL-E 2, 이매진, 스테이블 디퓨전 등 대형 텍스트-이미지 모델이 모두 채택했다.[2] 대가는 다양성 감소와, 단계마다 신경망을 두 번 돌려야 하는 추론 비용이다.
조건부 확산 모델은 를 배우지만, 그대로 표본을 뽑으면 조건을 느슨하게 따르는 이미지가 많이 나온다. GAN의 절단 기법(truncation)이나 노멀라이징 플로의 저온 표본 추출처럼 "다양성을 조금 버리고 충실도를 올리는" 손잡이가 필요했다.
2021년 다리왈(Prafulla Dhariwal)과 니컬(Alex Nichol)은 잡음 섞인 이미지 에서 클래스를 맞히는 분류기 를 따로 학습하고, 그 기울기를 점수에 더하는 분류기 가이던스(classifier guidance)를 제안했다.[3]
이는 에 비례하는 분포에서 뽑는 것에 해당한다. 이 방법으로 ImageNet 256×256 FID 4.59를 얻어 확산 모델이 GAN을 넘었다는 평가를 받았지만,[3] 잡음 이미지용 분류기를 따로 학습해야 했다. 호와 살리만스는 또 분류기 기울기를 따라가는 것이 기울기 기반 적대적 공격과 비슷해서, FID와 IS가 좋아진 것이 실제 품질 향상인지 분류기 기반 지표를 속인 결과인지 의문을 제기했다.[1]
한 신경망 를 학습하되, 확률 로 조건 를 빈 값 (널 토큰, 빈 문자열 임베딩 등)으로 바꿔 넣는다. 그러면 같은 가중치가 조건부 모델 와 무조건부 모델 를 동시에 배운다. 원 논문은 ImageNet 64×64에서 를 비교해 0.1과 0.2가 비슷하게 좋고 0.5는 일관되게 나빴다고 보고했다. 모델 용량의 작은 일부만 무조건부 생성에 써도 충분하다는 뜻이다.[1]
단계마다 두 예측을 구해 다음처럼 섞는다.
이면 그냥 조건부 예측이고, 이면 무조건부 예측에서 조건부 예측 쪽으로 더 멀리 나간다(외삽). 점수로 쓰면 이고, 베이즈 정리로 괄호 안은 이다. 즉 생성 모델 자신이 암묵적으로 품고 있는 분류기 의 기울기로 분류기 가이던스를 흉내 낸다. 원 논문은 이를 "암묵적 분류기"(implicit classifier)로 설명하면서도, 실제 신경망 점수는 정확한 점수가 아니므로 이 해석은 영감일 뿐이라고 덧붙였다.[1]
원 논문의 ImageNet 실험에서 를 0에서 4까지 올리면 FID는 작은 값에서 최저를 찍은 뒤 나빠지고, IS(인셉션 점수)는 계속 올랐다. 128×128 모델에서는 일 때 FID가 분류기 가이던스를 쓴 ADM-G보다 좋았고, 에서는 가장 강한 절단을 건 BigGAN-deep보다 FID와 IS가 모두 좋았다.[1]
| 스케일 (diffusers 기준) | 경향 |
|---|---|
| 1 | 가이던스 없음. 다양하지만 프롬프트를 덜 따르고 형태가 흐트러지기 쉬움 |
| 7.5 안팎 | diffusers 스테이블 디퓨전 1.x 파이프라인 기본값. 린 등의 실험도 7.5를 기준으로 썼다 |
| 10 이상 | 프롬프트 충실도는 오르지만 색이 과포화되고 대비가 지나치며 구도가 비슷해짐 |
적정 값은 모델마다 다르다. 같은 파이프라인 계열이라도 스테이블 디퓨전 3 파이프라인의 기본값은 7.0,[5] DiT 클래스 조건 파이프라인은 4.0이다.[6] DiT 논문의 최고 FID 2.27도 스케일 1.5에서 나왔다.[7] FID처럼 분포 전체를 보는 지표는 낮은 스케일에서, 사람이 보는 한 장의 품질과 프롬프트 일치도는 높은 스케일에서 좋아지는 경향이 있다.
| 항목 | 분류기 가이던스 | 분류기 없는 가이던스 |
|---|---|---|
| 추가 모델 | 잡음 이미지용 분류기를 따로 학습 | 없음. 학습 때 조건만 무작위로 지움 |
| 적용 가능한 조건 | 분류기를 만들 수 있는 조건(주로 클래스) | 모델에 넣을 수 있는 모든 조건(텍스트, 이미지, 레이아웃 등) |
| 추론 비용 | 확산 모델 1회 + 분류기 순전파·역전파 | 확산 모델 2회(조건부, 무조건부). 배치로 묶어 한 번에 계산 |
| 기울기 출처 | 외부 분류기의 입력 기울기 | 생성 모델 자신의 두 예측 차이(역전파 없음) |
| 사전 학습 모델에 적용 | 분류기만 새로 학습하면 가능 | 조건 지우기로 학습된 모델이어야 함 |
GLIDE 연구는 텍스트 조건에서 CLIP 기울기로 유도하는 CLIP 가이던스와 분류기 없는 가이던스를 비교했고, 사람 평가자는 사실성과 캡션 일치도 모두에서 분류기 없는 가이던스 쪽을 선호했다.[8]
부정 프롬프트(negative prompt)는 CFG 식의 무조건부 항 자리에 "피하고 싶은 내용"의 조건 를 넣는 것이다.
외삽 방향이 "빈 조건에서 프롬프트로"가 아니라 "부정 프롬프트에서 프롬프트로"가 되므로, 결과는 부정 프롬프트의 특징에서 멀어진다. 별도 학습이 필요 없는 추론 기법이며, diffusers 파이프라인은 negative_prompt를 주지 않으면 빈 문자열 ""을 부호화해 무조건부 임베딩으로 쓴다.[4] 그래서 CFG를 끄면(guidance_scale 1 이하) 부정 프롬프트도 무시된다.
조건부·무조건부 입력을 배치 차원으로 이어 붙여 신경망을 한 번 호출하고, 결과를 반으로 나눠 섞는다. diffusers 스테이블 디퓨전 파이프라인의 실제 구조를 단순화한 것이다.[4]
import torch
@torch.no_grad()
def cfg_sample(unet, scheduler, latents, cond_emb, uncond_emb, scale=7.5, steps=30):
"""uncond_emb 자리에 부정 프롬프트 임베딩을 넣으면 부정 프롬프트가 된다."""
scheduler.set_timesteps(steps)
emb = torch.cat([uncond_emb, cond_emb]) # (2B, L, D)
for t in scheduler.timesteps:
x_in = torch.cat([latents] * 2) # 같은 잠재를 두 번
x_in = scheduler.scale_model_input(x_in, t)
eps = unet(x_in, t, encoder_hidden_states=emb).sample
eps_uncond, eps_cond = eps.chunk(2)
eps = eps_uncond + scale * (eps_cond - eps_uncond) # CFG
latents = scheduler.step(eps, t, latents).prev_sample
return latents
# diffusers 0.3x~0.41 기준. 최신 판은 torch_dtype 대신 dtype 인자도 받는다.
import torch
from diffusers import StableDiffusionPipeline
pipe = StableDiffusionPipeline.from_pretrained(
"stable-diffusion-v1-5/stable-diffusion-v1-5", torch_dtype=torch.float16
).to("cuda")
image = pipe(
"a watercolor painting of a lighthouse at dawn",
negative_prompt="blurry, low quality, text, watermark",
guidance_scale=7.5, # 1이면 CFG 꺼짐
guidance_rescale=0.0, # 0.5~0.75로 올리면 과노출 완화(린 등)
num_inference_steps=30,
).images[0]
- 추론 비용 2배: 단계마다 두 번 계산해야 한다. 원 논문도 이를 잠재적 단점으로 들었다.[1] 가이던스 증류는 학생 모델 하나가 조건부·무조건부 결합 출력을 바로 내도록 학습해 이를 없앤다. 멍(Chenlin Meng) 등은 여기에 점진적 증류를 더해 픽셀 공간 모델은 4단계, 스테이블 디퓨전 같은 잠재 모델은 1~4단계로 비슷한 품질을 냈다.[2] FLUX.1 [dev]가 이런 가이던스 증류 모델이어서, diffusers의
guidance_scale(기본 3.5)은 신경망에 임베딩으로 들어가는 값이고 실제 CFG는true_cfg_scale과 부정 프롬프트를 함께 줄 때만 켜진다.[11] - 과노출: 스케일이 크면 출력 분산이 커져 이미지가 하얗게 타거나 과포화된다. 린(Shanchuan Lin) 등은 CFG 결과의 표준편차를 조건부 예측의 표준편차에 맞게 다시 조정하고 원래 결과와 비율 φ로 섞는 방법을 제안했으며, φ를 0.5~0.75로 두면 결과가 가장 좋았다고 보고했다.[12] diffusers에는
guidance_rescale인자로 들어가 있다.[4] - 가이던스 구간 제한: 잡음이 큰 초반에는 가이던스가 오히려 해롭고 끝 무렵에는 거의 필요 없으므로 중간 구간에만 적용하자는 연구가 있다. 이 방법으로 ImageNet-512 FID 기록이 1.81에서 1.40으로 좋아졌고 SDXL에서도 효과를 보였다.[13] diffusers ControlNet 파이프라인의
control_guidance_start/end도 비슷하게 단계 일부에만 제어를 거는 손잡이다. - 오토가이던스: 무조건부 모델 대신 같은 모델의 작고 덜 학습된 판으로 유도하면 다양성을 잃지 않고 품질만 올릴 수 있다는 보고다. ImageNet 64×64에서 FID 1.01, 512×512에서 1.25를 기록했다.[14]
- 다른 모델 계열: 같은 식은 플로 매칭 모델의 속도 예측에도 그대로 쓴다. 자기회귀 이미지·언어 모델에서도 조건부·무조건부 로짓의 차이를 키우는 같은 아이디어가 응용된다.
- ↑ 1.0 1.1 1.2 1.3 1.4 1.5 1.6 Jonathan Ho, Tim Salimans, 〈Classifier-Free Diffusion Guidance〉, 2022. NeurIPS 2021 Workshop on Deep Generative Models and Downstream Applications의 짧은 판을 확장. arXiv:2207.12598
- ↑ 2.0 2.1 Chenlin Meng 외, 〈On Distillation of Guided Diffusion Models〉, CVPR 2023. arXiv:2210.03142
- ↑ 3.0 3.1 Prafulla Dhariwal, Alex Nichol, 〈Diffusion Models Beat GANs on Image Synthesis〉, NeurIPS 2021. arXiv:2105.05233
- ↑ 4.0 4.1 4.2 4.3 Hugging Face, 〈pipeline_stable_diffusion.py〉, diffusers 소스 코드. github.com
- ↑ Hugging Face, 〈pipeline_stable_diffusion_3.py〉, diffusers 소스 코드. github.com
- ↑ Hugging Face, 〈pipeline_dit.py〉, diffusers 소스 코드. github.com
- ↑ William Peebles, Saining Xie, 〈Scalable Diffusion Models with Transformers〉, ICCV 2023. arXiv:2212.09748
- ↑ Alex Nichol 외, 〈GLIDE: Towards Photorealistic Image Generation and Editing with Text-Guided Diffusion Models〉, ICML 2022. arXiv:2112.10741
- ↑ facebookresearch, 〈DiT models.py〉. github.com
- ↑ Lvmin Zhang, Anyi Rao, Maneesh Agrawala, 〈Adding Conditional Control to Text-to-Image Diffusion Models〉, ICCV 2023. arXiv:2302.05543
- ↑ Hugging Face, 〈pipeline_flux.py〉 및 〈Flux〉 문서, diffusers. github.com
- ↑ Shanchuan Lin 외, 〈Common Diffusion Noise Schedules and Sample Steps are Flawed〉, 2023. arXiv:2305.08891
- ↑ Tuomas Kynkäänniemi 외, 〈Applying Guidance in a Limited Interval Improves Sample and Distribution Quality in Diffusion Models〉, NeurIPS 2024. arXiv:2404.07724
- ↑ Tero Karras 외, 〈Guiding a Diffusion Model with a Bad Version of Itself〉, NeurIPS 2024. arXiv:2406.02507