cv.cm

AI · AI 기초

확산 모델(디퓨전 모델)은 어떻게 작동하나요?

11분 분량

핵심 답변

확산 모델은 노이즈를 제거하는 법을 배운 모델입니다. 학습할 때는 실제 이미지에 무작위 노이즈를 단계별로 더하고, 신경망이 그 노이즈를 예측하도록 훈련합니다. 이미지를 생성할 때는 순수한 노이즈에서 시작해 텍스트 프롬프트의 안내에 따라 단계마다 조금씩 노이즈를 걷어 내며 깨끗한 이미지를 완성합니다. 대부분의 이미지·영상 생성기가 이 방식으로 움직입니다.

한 줄 요약: 노이즈 지우는 법을 배우고, 순수 노이즈를 지운다

사진에 무작위 지직거림을 조금 더한다고 상상해 보세요. 조금 더, 또 조금 더 더하면 수백 단계 뒤에는 회색 눈보라만 남습니다. 이 방향은 쉽습니다. 컴퓨터는 수식 한 줄로 해냅니다.

확산 모델은 반대 방향으로 가도록 학습한 신경망입니다. 노이즈가 낀 이미지를 보고 더해진 노이즈를 추정하면 그것을 빼 낼 수 있습니다. 모든 노이즈 수준에서 이를 잘 해내는 네트워크라면, 순수한 무작위 노이즈에서 출발해 단계별로 걷어 낼 수 있습니다. 끝에 남는 것은 세상에 없던 새 이미지지만, 학습 데이터에 속할 법한 모습입니다.

이 아이디어는 2015년에 소개되었고, 2020년 DDPM(Denoising Diffusion Probabilistic Models) 논문으로 고품질 이미지에 실용화되었습니다. 이 글을 쓰는 시점에 Stable Diffusion, FLUX, Imagen, DALL·E 계열 모델과 Veo, Kling, Runway, Seedance 같은 대부분의 영상 생성기가 이 계열이나 가까운 방법을 바탕으로 합니다.

학습: 정방향 과정과 노이즈 예측기

학습에는 설명 문장(캡션)이 붙은 수백만 장의 이미지를 씁니다. 학습 예시마다 시스템은 같은 작은 연습을 합니다.

  1. 실제 이미지와 캡션을 고릅니다. 예를 들면 "벽돌 벽에 기대 세워 둔 빨간 자전거"라는 캡션이 붙은 사진입니다.
  2. 거의 깨끗한 상태부터 거의 순수한 노이즈까지, 무작위로 노이즈 수준을 정합니다.
  3. 그 수준만큼 이미지에 무작위 노이즈를 섞습니다. 이것이 정방향 과정(forward process)이며 학습이 필요 없습니다.
  4. 노이즈가 낀 이미지, 노이즈 수준, 캡션을 네트워크에 주고 더해진 노이즈를 예측하게 합니다.
  5. 예측을 실제 노이즈와 비교해 오차가 줄도록 네트워크의 가중치를 조정합니다.

이를 수십억 번 반복하면 네트워크는 블러가 어느 정도일 때든 이미지가 일반적으로 어떻게 생겼는지 배웁니다. 윤곽이 보통 어디에 가는지, 빛이 피부에 어떻게 떨어지는지, 자전거와 벽돌 벽은 어떻게 생겼는지를 익히는 것입니다. 학습 사진을 파일로 저장하지는 않고, 그 통계를 배웁니다. 한 번도 함께 본 적 없는 아이디어를 섞을 수 있는 이유이기도 합니다.

네트워크는 보통 이미지용 신경망의 한 종류인 U-Net이었습니다. 요즘 모델은 트랜스포머를 쓰는 경우가 많으며 이를 확산 트랜스포머(diffusion transformer)라고 부릅니다. 최근 일부 모델은 노이즈에서 이미지로 가는 직선 경로를 배우는 플로 매칭(flow matching)이라는 가까운 방법으로 학습하기도 합니다. 사용자 입장에서 아래 설명하는 개념은 같습니다.

생성: 역방향 과정, 한 단계씩

생성 버튼을 누르면 모델은 선을 긋거나 부품을 붙이지 않습니다. 다음과 같은 반복문을 실행합니다.

x = random_noise(seed)                  # start: pure static
for t in noise_levels_high_to_low:      # e.g. 30 steps
    predicted_noise = model(x, t, prompt)
    x = remove_some_noise(x, predicted_noise, t)
image = decode(x)                       # latent -> pixels

초반 단계에서는 피사체의 위치, 수평선, 주요 색상 같은 큰 형태가 정해집니다. 중반 단계에서는 형태와 조명이 더해집니다. 후반 단계에서는 머리카락, 천, 피부 모공 같은 미세한 질감이 더해집니다. 그래서 여러 실용적인 현상이 설명됩니다. 스텝 수를 너무 낮추면 이미지가 매끈하고 덜 완성돼 보입니다. 시드를 바꾸면 처음 노이즈가 달라지므로 구도 전체가 바뀝니다.

노이즈 예측을 조금 더 깨끗한 이미지로 바꿔 주는 규칙을 샘플러(sampler) 또는 스케줄러(scheduler)라고 합니다. DDPM은 작은 단계를 아주 많이 거쳤습니다. DDIM 같은 이후 방법은 더 큰 결정론적 단계로도 훨씬 적은 스텝에 비슷한 품질을 얻을 수 있음을 보여 줬습니다. 요즘 도구가 천 단계가 아닌 수십 단계면 되는 이유입니다.

텍스트 프롬프트가 이미지를 이끄는 방법

프롬프트는 먼저 텍스트 인코더, 즉 캡션의 의미를 표현하도록 학습한 언어 모델을 통해 숫자로 바뀝니다. 노이즈 제거 네트워크 안에서는 교차 어텐션(cross-attention)이라는 장치가 이미지의 모든 영역이 매 단계에서 프롬프트의 단어를 볼 수 있게 합니다. 얼굴이 되어 가는 영역은 "주근깨"나 "웃는" 같은 단어에 주목합니다.

이것만으로는 안내가 약합니다. 분류기 없는 가이던스(classifier-free guidance)가 이를 강하게 만듭니다. 매 단계에서 모델은 노이즈를 두 번 예측합니다. 한 번은 내 프롬프트로, 한 번은 빈 프롬프트로 합니다. 최종 예측은 둘의 차이 방향으로 더 멀리 나아갑니다. 가이던스 스케일(흔히 CFG 스케일)이 얼마나 멀리 갈지를 정합니다. 값이 높으면 프롬프트를 더 잘 따르지만 거칠고 채도가 과해 보일 수 있습니다. 값이 낮으면 더 자연스럽지만 프롬프트의 일부를 무시할 수 있습니다.

네거티브 프롬프트는 지원하는 도구에서 보통 두 번째 예측의 빈 프롬프트 자리에 들어갑니다. "blurry, watermark, extra fingers" 같은 단어에서 멀어지는 방향으로 이미지가 밀려납니다.

대부분의 모델이 잠재 공간에서 작동하는 이유

원본 해상도의 이미지에서 수백 번 노이즈를 제거하면 너무 느립니다. Stable Diffusion의 바탕인 잠재 확산(latent diffusion)은 먼저 이미지를 훨씬 작은 숫자 격자로 압축하고 다시 펼칠 수 있는 오토인코더를 학습시킵니다. 그다음 확산 모델은 그 작은 격자에서만 작업합니다. 예를 들어 한 변의 압축 배율이 8이면 512×512 이미지는 64×64 격자가 되어 처리할 위치가 64분의 1로 줄어듭니다.

모든 생성의 마지막 단계인 디코더는 깨끗해진 잠재 격자를 다시 픽셀로 바꿉니다. 이미지에 이상한 색 얼룩이 있거나 작은 얼굴이 뭉개져 보인다면 디코더의 압축이 원인 중 하나인 경우가 많습니다. 피사체가 화면을 더 크게 차지할수록 얼굴과 작은 글자가 나아지는 이유 중 하나입니다.

영상 확산은 같은 아이디어에 시간을 더합니다. 잠재가 프레임을 쌓은 묶음이 되고, 네트워크가 프레임들을 함께 노이즈 제거하여 움직임이 프레임 사이에서 일관되게 유지됩니다.

흔한 설정이 실제로 바꾸는 것

대부분의 생성기에는 이런 조절 항목 일부가 있습니다. 이름은 달라도 원리는 같습니다.

설정조절하는 것실제 효과
시드(Seed)시작 노이즈같은 시드, 같은 프롬프트, 같은 설정이면 같은 이미지가 나옵니다. 바꾸면 새로운 구도를 볼 수 있습니다.
스텝(Steps)노이즈 제거 횟수너무 적으면 흐릿하거나 덜 완성돼 보입니다. 어느 정도를 넘으면 시간만 늘고 품질은 거의 오르지 않습니다.
가이던스 / CFG 스케일프롬프트를 얼마나 강하게 따르게 할지높으면 프롬프트를 더 따르지만 거칠어 보일 수 있고, 낮으면 자연스럽지만 엇나갈 수 있습니다.
샘플러 / 스케줄러단계마다 적용하는 규칙속도와 미세한 질감이 바뀝니다. 다른 설정을 시험하는 동안에는 샘플러를 하나로 고정하세요.
네거티브 프롬프트멀어지게 할 대상반복되는 결함을 지우는 데 유용합니다. 목록이 길다고 도움이 되지는 않습니다.
강도(Strength, 이미지-투-이미지)입력 이미지에 더하는 노이즈의 양낮으면 내 구도를 유지하고, 높으면 대략의 아이디어만 남습니다.
해상도 / 화면 비율잠재 격자의 크기학습 크기에서 너무 멀면 피사체가 두 개로 겹치거나 몸이 늘어날 수 있습니다.

좋은 테스트 방법은 시드를 고정하고 설정을 한 번에 하나만 바꾸는 것입니다. 그렇지 않으면 더 좋은 이미지가 내 변경 덕분인지 운 덕분인지 알 수 없습니다.

확산 방식과 다른 이미지 생성 방식

확산만 있는 것은 아닙니다. 자기회귀(autoregressive) 모델은 언어 모델이 글을 쓰듯 이미지를 토큰 순서대로 하나씩 생성합니다. 최근의 일부 멀티모달 모델이 이 방식을 씁니다. 예를 들어 cv.cm의 ai-image-generator는 자기회귀 모델인 Janus-Pro-1B를 WebGPU로 브라우저에서 384px 크기로 실행합니다. 설정 방식도 달라서, 확산 방식에서 말하는 스텝 수를 조절할 일이 없습니다.

예전의 GAN(생성적 적대 신경망)은 이미지를 한 번에 만들어 빨랐지만 학습이 더 까다롭고 결과가 덜 다양했습니다. 확산은 안정적으로 학습되고 폭넓은 이미지를 다루기 때문에 주류가 되었습니다. 가장 큰 단점은 속도로, 이미지 하나에 네트워크를 여러 번 통과해야 합니다. 증류(distilled) 모델은 다양성을 조금 희생하는 대신 스텝을 몇 번으로 줄입니다.

흔한 약점과 대처법

  • 손과 손가락: 손은 다양한 자세로 나오고 학습 사진에서 일부가 가려지는 경우가 많아, 모델이 흐릿한 평균을 배웁니다. 단순하고 잘 보이는 손 자세를 요청하거나, 나중에 손만 인페인팅(inpainting)하세요.
  • 이미지 속 글자: 모델은 철자가 아니라 글자를 모양으로 배웁니다. 최신 모델은 훨씬 나아졌지만, 글자는 짧게 하고 프롬프트에서 따옴표로 묶고, 글자 하나하나를 확인하세요. 중요한 글자는 나중에 편집기에서 넣는 편이 낫습니다.
  • 개수 세기: "사과 다섯 개"는 네 개나 여섯 개가 나오는 경우가 많습니다. 물체가 적을수록 안정적입니다.
  • 속성 번짐: 빨간 모자 때문에 셔츠도 빨개지는 식으로 색과 속성이 피사체 사이에 샙니다. 각 피사체를 하나의 분명한 구절로 묘사하거나 따로 생성하세요.
  • 복제: 모델이 유명하거나 자주 반복된 이미지를 거의 똑같이 재현하는 경우가 있습니다. 독창적인 작업이 필요하다면 작가 이름이나 브랜드 캐릭터를 프롬프트에 쓰지 마세요.

자주 묻는 질문

Stable Diffusion과 확산 모델은 같은 건가요?

아닙니다. 확산 모델은 일반적인 방법을 가리키는 이름이고, Stable Diffusion은 잠재 확산을 쓰는 오픈 모델의 한 계열입니다. 다른 많은 생성기도 확산을 사용합니다.

같은 프롬프트인데 왜 매번 다른 이미지가 나오나요?

생성할 때마다 시드가 정하는 다른 무작위 노이즈에서 시작하기 때문입니다. 시드를 고정하고 다른 설정을 모두 같게 하면, 같은 소프트웨어에서는 같은 이미지가 다시 나옵니다.

확산 모델은 학습 이미지를 복사해 저장하나요?

이미지 파일이 아니라 학습된 가중치를 저장합니다. 다만 연구에 따르면 유명하거나 자주 반복된 일부 학습 이미지는 거의 그대로 추출될 수 있어서, 드물게 거의 복제된 결과가 나올 수 있습니다.

AI 이미지는 왜 만드는 데 몇 초씩 걸리나요?

확산 모델은 스텝마다 큰 신경망을 한 번씩 실행하며, 이미지 하나에 수십 번 실행하는 경우가 많습니다. 더 빠른 모델은 적은 스텝으로도 되도록 학습되었고, 압축된 잠재 공간에서 작업하는 것도 시간을 아낍니다.

CFG 스케일은 어느 정도가 좋은가요?

모델에 따라 다릅니다. 예전 모델 중에는 범위의 중간쯤에서 잘 되는 경우가 많고, 일부 증류 모델은 아주 낮은 가이던스가 필요합니다. 도구의 기본값에서 시작해 시드를 고정한 채 조금씩 움직여 보세요.

AI 튜토리얼 전체