← --library
이과 · 21이과

인공지능 및 생성형 AI

AI & Generative AI

단계1단계2단계3단계4단계5

5단계: 확산 모델과 멀티모달 생성형 AI


들어가며 — 지금까지 온 길을 돌아보며

1단계에서 너는 신경망이 어떻게 데이터로부터 패턴을 학습하는지 배웠다. 2단계에서는 CNN이 이미지의 공간적 특징을, Transformer가 시퀀스의 관계를 어떻게 파악하는지 익혔다. 3단계의 LoRA는 모델의 일부 가중치만 조정해서 효율적으로 파인튜닝하는 방법이었고, 4단계의 RAG와 에이전트는 외부 지식과 도구를 활용해 LLM의 한계를 넘는 법을 다뤘다. 이 모든 단계의 공통점이 무엇인지 잠깐 생각해봐라. 정답 예측이든 텍스트 생성이든, 모델은 언제나 "입력을 보고 출력을 추측하는" 조건부 확률을 학습하고 있었다. 그런데 이제 5단계에서 던지는 질문은 훨씬 야심차다. "아무것도 없는 순수한 잡음(noise)으로부터 의미 있는 이미지를 만들 수 있는가?" 이것이 확산 모델(Diffusion Model)의 핵심 질문이다.


1부. 이론적 기초 — 생성형 모델의 역사와 확률의 언어

생성 모델이란 무엇인가

분류기(Classifier)는 이미지가 '고양이인지 아닌지'를 맞히는 **판별 모델(Discriminative Model)**이다. 반면 **생성 모델(Generative Model)**은 "고양이처럼 생긴 이미지를 새로 만들어라"는 과제를 수행한다. 이 차이는 겉보기보다 훨씬 깊다. 판별 모델은 p(y|x), 즉 입력 x가 주어졌을 때 레이블 y의 확률만 학습하면 충분하지만, 생성 모델은 p(x) 전체, 즉 데이터 분포 자체를 학습해야 한다. 고양이 이미지가 우주에 존재하는 모든 가능한 픽셀 배열 중에서 어떤 분포를 이루는지를 배워야 한다는 뜻이다. 이것이 왜 어려운지는 간단한 숫자로 느낄 수 있다. 512×512 픽셀 RGB 이미지 하나의 가능한 조합 수는 256^(512×512×3)으로, 우주의 원자 수(약 10^80)를 비교할 수 없을 만큼 압도한다. 이 광활한 공간에서 '그럴듯한 고양이'가 모여 있는 작은 섬을 찾아 새 점을 샘플링하는 것이 생성 모델의 임무다.

GAN과 VAE — 확산 모델 이전의 시도들

이 문제를 먼저 해결하려 했던 두 접근법을 이해하는 것이 확산 모델의 가치를 제대로 느끼는 데 필수적이다. **GAN(Generative Adversarial Network)**은 Ian Goodfellow가 2014년 제안한 방법으로, 위조지폐범(Generator)과 형사(Discriminator)가 서로를 속이고 잡는 게임을 반복하며 점점 더 진짜 같은 이미지를 만들어낸다. GAN은 실제로 놀라운 화질의 이미지를 생성했지만, **모드 붕괴(Mode Collapse)**라는 고질적인 문제가 있었다. 위조지폐범이 형사를 특정 패턴 하나로만 속이는 법을 익혀버리면, 다양한 이미지 대신 비슷비슷한 이미지만 반복 생성하게 된다. 훈련 자체도 두 네트워크의 균형을 맞추는 게 까다로워 매우 불안정했다. **VAE(Variational Autoencoder)**는 2013년 Kingma와 Welling이 제안한 방법으로, 이미지를 작은 잠재 벡터(latent vector) z로 압축했다가 다시 복원하는 구조를 취한다. 3단계에서 배운 인코더-디코더 구조를 기억하는가? VAE는 그 잠재 공간에 정규분포를 강제함으로써 새로운 z를 샘플링하여 새 이미지를 만들 수 있게 했다. 하지만 잠재 공간을 너무 억지로 압축하다 보니 생성 이미지가 흐릿(blurry)해지는 경향이 있었다.

확산 모델의 아이디어 — 물리에서 온 영감

확산 모델은 완전히 다른 방향에서 접근했다. 철학적 출발점은 열역학의 확산(diffusion) 현상이다. 잉크 한 방울을 물에 떨어뜨리면 시간이 지나면서 점차 퍼져나가 균일한 분포가 된다. 이 과정은 되돌리기 어렵다. 하지만 만약 이 확산 과정을 수학적으로 완벽히 기술할 수 있다면, 역방향 — 균일한 잡음에서 원래의 잉크 방울로 — 도 수학적으로 기술할 수 있지 않을까? 이것이 2020년 Ho et al.이 **DDPM(Denoising Diffusion Probabilistic Models)**에서 구현한 아이디어다(Ho et al., "Denoising Diffusion Probabilistic Models", NeurIPS 2020). 핵심 직관을 단 한 문장으로 표현하자면: 이미지에 잡음을 조금씩 더해 완전한 가우시안 잡음으로 만드는 과정을 학습한 뒤, 그 역방향 과정을 신경망으로 근사하여 잡음에서 이미지를 복원한다. 이 발상은 GAN처럼 적대적 훈련이 필요 없고, VAE처럼 잠재 공간을 억지로 압축할 필요도 없다는 점에서 혁명적이었다.

[노트 기록] 생성 모델의 목표: p(x) 학습. GAN = 적대적 게임, VAE = 잠재 공간 압축-복원, Diffusion = 노이즈 추가 후 역방향 복원. 세 방법의 장단점 정리.


2부. DDPM — 수학과 직관의 만남

순방향 과정 (Forward Process) — 이미지를 잡음으로 만들기

DDPM은 크게 두 과정으로 구성된다. 먼저 **순방향 과정(Forward Process)**은 원본 이미지 x₀에 T번(보통 T=1000) 걸쳐 조금씩 가우시안 잡음을 더해가는 과정이다. 각 스텝 t에서의 전이 확률은 다음과 같이 정의된다.

q(xₜ | xₜ₋₁) = N(xₜ ; √(1−βₜ) xₜ₋₁ , βₜI)

여기서 βₜ는 미리 정해진 **노이즈 스케줄(noise schedule)**로, t가 커질수록 점점 더 많은 잡음을 더한다. √(1−βₜ)는 이전 신호를 약간 줄이고, βₜI의 공분산을 가진 가우시안 잡음을 더한다는 의미다. 직관적으로는, 원본 이미지에 매 스텝마다 미세한 소금(잡음)을 뿌리는 것과 같다. T번 반복하면 x₀이 어떤 이미지였든 간에 완전한 표준 정규분포 N(0, I)에 가까워진다.

이 과정에서 가장 중요한 트릭은 **닫힌 형태(Closed-form)**로 임의의 스텝 t의 xₜ를 직접 계산할 수 있다는 점이다. αₜ = 1−βₜ, ᾱₜ = ∏ₛ₌₁ᵗ αₛ 로 정의하면,

q(xₜ | x₀) = N(xₜ ; √(ᾱₜ) x₀ , (1−ᾱₜ)I)

이를 재매개변수화(reparameterization)하면 ε ~ N(0, I)를 사용해,

xₜ = √(ᾱₜ) x₀ + √(1−ᾱₜ) ε

로 표현된다. 이 공식의 의미를 천천히 읽어봐라. xₜ는 원본 신호 x₀와 순수 잡음 ε의 선형 결합이다. ᾱₜ가 1에 가까우면 신호가 강하고, 0에 가까우면 잡음이 지배적이다. 1000스텝 후에는 ᾱₜ ≈ 0이 되어 원본 이미지 정보가 거의 사라진다. 이 공식 덕분에 훈련 시 굳이 1단계씩 순서대로 노이즈를 더할 필요 없이, 임의의 t를 샘플링해 xₜ를 즉시 계산할 수 있다. 이것이 훈련 효율성의 핵심이다.

[노트 기록] 핵심 공식: xₜ = √(ᾱₜ)x₀ + √(1−ᾱₜ)ε. ᾱₜ의 의미: 시간 t에서의 신호 대 잡음 비율(Signal-to-Noise Ratio, SNR).

역방향 과정 (Reverse Process) — 잡음에서 이미지를 복원하기

역방향 과정 p_θ(xₜ₋₁ | xₜ)는 신경망이 근사해야 하는 부분이다. 베이즈 정리에 의해, x₀을 안다면 역방향 조건부 확률 q(xₜ₋₁ | xₜ, x₀)도 가우시안 분포임을 수학적으로 보일 수 있다. 그런데 우리는 훈련 시에만 x₀을 알 수 있다. 그러면 어떻게 신경망을 훈련시킬까?

DDPM의 핵심 통찰은 신경망에게 "xₜ에서 xₜ₋₁를 예측하라"고 가르치는 대신, "xₜ를 만들 때 더했던 잡음 ε를 예측하라"고 가르치는 것이다. 두 목표는 수학적으로 동치임이 증명되지만, 잡음 예측이 훈련을 더 안정적으로 만든다. 최종 훈련 손실 함수는 매우 단순하다.

L = E[||ε − ε_θ(xₜ, t)||²]

해석해보면: 실제로 더했던 잡음 ε와, 신경망 ε_θ가 xₜ와 타임스텝 t를 입력으로 받아 예측한 잡음의 차이(MSE)를 최소화한다. 이것이 전부다. GAN처럼 복잡한 두 네트워크의 균형을 맞출 필요도 없고, VAE처럼 ELBO를 최대화하는 복잡한 목적함수도 없다. 순수하고 단순한 노이즈 예측 문제다.

U-Net — 노이즈를 예측하는 신경망 구조

그렇다면 ε_θ는 어떤 구조의 신경망인가? DDPM에서 사용하는 네트워크는 2단계에서 의료 영상 분할(segmentation)에서 등장했던 U-Net이다. U-Net은 인코더가 이미지를 점점 작은 해상도로 압축하고, 디코더가 다시 원래 해상도로 복원하는 구조인데, 인코더와 디코더 사이에 **스킵 연결(skip connection)**이 있어 세밀한 공간 정보를 보존한다. DDPM의 U-Net에는 두 가지 추가 요소가 있다. 첫째, 타임스텝 t를 사인-코사인 임베딩으로 변환하여 네트워크에 주입한다(2단계 Transformer의 positional encoding과 동일한 아이디어다). 둘째, 각 블록에 셀프 어텐션(Self-Attention) 레이어를 추가해 이미지의 전역적 구조를 파악한다. 결국 ε_θ는 "노이즈가 섞인 이미지를 보고, 지금이 몇 번째 스텝인지 알면서, 어디에 얼마나 많은 잡음이 있는지 예측하는" 역할을 한다. 훈련 후 추론 시에는 순수 잡음 xₜ에서 시작해 1000번씩 ε_θ를 호출하며 한 스텝씩 이미지를 복원한다.

[노트 기록] DDPM 전체 흐름: (1) 훈련: x₀ 샘플 → 랜덤 t 선택 → xₜ = √ᾱₜ·x₀ + √(1−ᾱₜ)·ε → ε_θ(xₜ, t) 예측 → 손실 계산 (2) 추론: xT~N(0,I) → 1000번 역방향 → x₀ 획득.

DDIM — 더 빠른 샘플링

DDPM의 가장 큰 약점은 추론 속도였다. 1000번의 역방향 스텝이 필요하니 이미지 하나를 만드는 데 수십 초가 걸렸다. **DDIM(Denoising Diffusion Implicit Models, Song et al., 2020)**은 이 문제를 해결하기 위해 역방향 과정을 결정론적(deterministic)으로 바꿨다. 핵심 아이디어는, 매 스텝에서 확률적으로 잡음을 샘플링하는 대신 x₀를 직접 예측하고 그 예측치를 이용해 xₜ₋₁을 계산하는 것이다. 이 덕분에 1000 스텝 대신 50~100 스텝만으로도 비슷한 품질을 얻을 수 있다. 더 중요한 점은, DDIM이 결정론적이기 때문에 같은 초기 잡음으로 시작하면 항상 같은 이미지가 나온다. 이는 이미지 편집이나 보간(interpolation)에 매우 유용하다.


3부. Stable Diffusion — 잠재 공간에서의 확산

왜 잠재 공간인가

DDPM의 또 다른 문제는 **픽셀 공간(pixel space)**에서 직접 확산을 수행한다는 점이다. 512×512 이미지는 786,432차원의 공간이다. 이 고차원 공간에서 U-Net을 훈련하면 메모리와 계산 비용이 엄청나게 든다. Rombach et al.이 2022년 제안한 LDM(Latent Diffusion Model), 즉 Stable Diffusion의 핵심 아이디어는 간단하다. VAE로 이미지를 먼저 압축한 뒤, 그 작은 잠재 공간(latent space)에서 확산을 수행한다. 512×512 이미지가 VAE를 통과하면 64×64×4의 잠재 벡터로 압축된다. 픽셀 수로는 약 48배 줄어든 셈이다. 확산이 끝난 후 VAE 디코더로 다시 픽셀 이미지로 복원한다. VAE가 이미지의 지각적(perceptual) 특징을 이미 잘 압축해두었으므로, 확산 모델은 픽셀 수준의 세밀한 잡음 대신 의미 있는 특징들의 관계를 학습할 수 있다. 이것이 Stable Diffusion이 이전 방법들보다 훨씬 빠르고 효율적인 이유다(Rombach et al., "High-Resolution Image Synthesis with Latent Diffusion Models", CVPR 2022).

CLIP과 텍스트 조건부 생성

그런데 지금까지의 모든 설명은 "어떻게 이미지를 만드는가"에 대한 것이었다. "텍스트를 보고 그에 맞는 이미지를 만드는" 기능, 즉 **텍스트-이미지 생성(text-to-image)**은 어떻게 구현되는가? 여기서 2단계에서 배운 Transformer의 어텐션 메커니즘이 다시 등장한다. U-Net의 각 레이어에 크로스 어텐션(Cross-Attention) 레이어를 추가하고, 텍스트 프롬프트를 CLIP 텍스트 인코더로 인코딩한 임베딩을 조건(condition)으로 주입한다. CLIP(Radford et al., 2021, OpenAI)은 이미지와 텍스트를 같은 임베딩 공간에 매핑하도록 훈련된 모델인데, 덕분에 "a cat sitting on a red sofa"라는 문장이 실제 그런 이미지와 유사한 위치에 임베딩된다. U-Net은 노이즈를 예측할 때 이 텍스트 임베딩을 어텐션으로 참고하면서 "지금 복원하려는 이미지가 텍스트와 얼마나 일치하는지"를 반영해 잡음 예측 방향을 조정한다.

CFG — 텍스트와 얼마나 밀접하게 따를 것인가

텍스트 조건부 생성에서 매우 중요한 기법이 **CFG(Classifier-Free Guidance, Ho & Salimans, 2021)**다. 아이디어는 다음과 같다. 동일한 노이즈 이미지 xₜ에 대해 두 번 예측을 수행한다. 하나는 텍스트 조건이 있는 경우(ε_cond), 다른 하나는 텍스트 조건 없이 빈 프롬프트로(ε_uncond). 그리고 최종 노이즈 예측을 다음과 같이 구성한다.

ε̃ = ε_uncond + w × (ε_cond − ε_uncond)

여기서 w는 **가이던스 스케일(guidance scale)**로, 이 값이 클수록 텍스트 프롬프트를 강하게 따르는 이미지가 생성된다. 직관적으로, ε_cond − ε_uncond는 "텍스트 조건이 있을 때 없을 때와 비교해 잡음 예측이 어떻게 달라지는가", 즉 텍스트의 방향성이다. w가 크면 그 방향으로 더 강하게 나아가므로 텍스트에 더 충실하지만 이미지 다양성은 줄어든다. w ≈ 7~10이 일반적인 균형점이다. 이 개념은 4단계에서 배운 RAG와 유사한 맥락을 가진다. 외부 지식(텍스트)과 모델의 내재된 능력(무조건부 생성)을 어떻게 균형 있게 섞을 것인지의 문제이기 때문이다.

[노트 기록] Stable Diffusion 구성 요소: (1) VAE — 픽셀 ↔ 잠재 벡터 (2) CLIP 텍스트 인코더 — 텍스트 → 임베딩 (3) U-Net (LDM) — 잠재 공간에서 노이즈 예측 (4) DDIM 샘플러 — 빠른 추론. CFG 공식과 가이던스 스케일 w의 역할.


4부. 조건부 생성과 스타일 제어

ControlNet — 구조적 제어

Stable Diffusion이 텍스트만으로 이미지를 만든다면, **ControlNet(Zhang et al., "Adding Conditional Control to Text-to-Image Diffusion Models", ICCV 2023)**은 공간적 구조 정보를 추가적인 조건으로 제공한다. 예를 들어 포즈 스켈레톤, 깊이 맵, 에지 맵, 법선 맵(normal map) 등을 입력으로 주면, 텍스트 프롬프트에 맞으면서도 그 공간 구조를 따르는 이미지가 생성된다. ControlNet의 구현 방식이 독창적이다. U-Net의 인코더 절반을 그대로 복사하여 **별도의 제어 네트워크(control network)**를 만들고, 원본 U-Net 가중치는 동결(freeze)한다. 제어 네트워크에만 공간 조건을 입력하고, 그 출력을 원본 U-Net의 해당 레이어에 더(add)해준다. 이렇게 하면 원본 Stable Diffusion의 생성 능력은 그대로 보존하면서, 공간 조건에 대한 민감도만 추가로 학습할 수 있다. 이 구조는 3단계에서 배운 LoRA의 원리와 유사하다. 원본 모델을 직접 건드리지 않고 추가 모듈로 기능을 확장한다.

IP-Adapter — 이미지 프롬프팅

텍스트 대신 이미지 자체를 스타일/내용 조건으로 사용하고 싶을 때 쓰는 것이 **IP-Adapter(Ye et al., "IP-Adapter: Text Compatible Image Prompt Adapter for Text-to-Image Diffusion Models", 2023)**다. "이 이미지의 스타일로 새 이미지를 만들어줘"라는 요청을 구현하는 것이다. IP-Adapter는 참조 이미지를 CLIP 이미지 인코더로 인코딩한 뒤, 그 임베딩을 U-Net의 크로스 어텐션 레이어에 텍스트 임베딩과 분리된 별도의 크로스 어텐션으로 주입한다. 텍스트 조건과 이미지 조건이 각각 다른 어텐션 가중치로 처리되어 두 조건이 서로 간섭하지 않는다. 결과적으로 텍스트로 내용을 지정하고 이미지로 스타일을 지정하는 이중 조건부 생성이 가능해진다.

LoRA for Diffusion — 커스텀 스타일과 얼굴 학습

3단계에서 LoRA(Low-Rank Adaptation)를 이미 배웠다. LLM에서는 거대한 가중치 행렬의 업데이트를 두 저차원 행렬의 곱으로 근사했다. Stable Diffusion에서도 동일한 원리로 모델을 특정 스타일이나 인물에 맞게 파인튜닝할 수 있다. 예를 들어 특정 화가의 그림 2030장을 학습시키면, "in the style of [화가명]"이라는 프롬프트로 그 스타일의 이미지를 생성할 수 있다. 또는 특정 인물의 사진 510장을 학습시켜 그 인물의 얼굴로 다양한 장면을 생성할 수도 있다. Diffusion LoRA의 핵심은 U-Net의 어텐션 레이어(주로 크로스 어텐션과 셀프 어텐션의 q, k, v, out 프로젝션 행렬)에만 저차원 행렬을 추가하고, 나머지 가중치는 모두 동결한다는 점이다. 학습 파라미터 수가 전체의 0.1~1% 정도에 불과하므로, 소비자용 GPU(예: RTX 3090)로도 수 시간 내에 학습이 가능하다. Dreambooth(Ruiz et al., 2022, Google)는 같은 목적을 특수 식별자 토큰과 사전 보존 손실(prior preservation loss)로 구현하는 방법이다. LoRA와 Dreambooth를 결합한 형태가 현재 가장 널리 쓰이는 커스텀 모델 학습 방법이다.

[노트 기록] 세 가지 제어 기법 비교: ControlNet = 공간 구조 제어, IP-Adapter = 이미지 스타일/내용 조건, LoRA/Dreambooth = 모델 자체를 특정 스타일/인물로 파인튜닝. 각각이 '무엇을 고정하고 무엇을 학습하는지' 정리.


5부. 멀티모달 생성 AI의 최전선

비디오 생성 — 시간 차원의 확산

이미지 생성이 확산 모델로 해결되자, 자연스럽게 다음 질문이 나왔다. "비디오도 만들 수 있는가?" 비디오는 이미지의 시퀀스인데, 핵심 도전은 **시간적 일관성(temporal consistency)**이다. 프레임마다 독립적으로 이미지를 생성하면 캐릭터의 얼굴이 프레임마다 바뀌거나, 배경이 깜빡거리는 문제가 생긴다. **Video Diffusion Model(Ho et al., 2022)**은 3D U-Net(공간 2차원 + 시간 1차원)을 사용해 여러 프레임을 동시에 처리하며 시간적 일관성을 확보했다. Runway Gen-3, Kling, Sora 등의 상용 모델들은 이 기술을 기반으로 수십 초의 고품질 비디오를 생성한다. Sora(OpenAI, 2024)의 경우 비디오를 공간-시간 패치(patch)로 분할하여 Transformer로 처리하는 DiT(Diffusion Transformer) 아키텍처를 채택했는데, 이는 2단계에서 배운 Vision Transformer(ViT)를 확산 모델에 적용한 형태다. Transformer가 U-Net을 대체하는 이 흐름이 2024~2025년의 주요 트렌드다.

오디오 생성 — 소리의 확산

오디오 생성도 유사한 원리를 따른다. **MusicGen(Copet et al., Meta, 2023)**은 텍스트 또는 멜로디를 조건으로 음악을 생성하는 모델이다. 오디오를 직접 생성하는 대신, 오디오를 **스펙트로그램(spectrogram, 시간-주파수 표현)**으로 변환하거나, **EnCodec(Meta)**로 압축된 잠재 표현으로 변환한 뒤 언어 모델 방식(autoregressive)으로 처리한다. AudioCraft는 이 여러 모델을 통합한 프레임워크다. 텍스트-음악 생성의 경우 "a slow jazz piano piece with rain in the background"와 같은 프롬프트로 해당 느낌의 음악을 수초 내에 생성한다.

3D 생성 — 공간 속의 확산

3D 생성은 현재 가장 빠르게 발전하는 영역이다. **NeRF(Neural Radiance Field, Mildenhall et al., 2020, UC Berkeley)**는 여러 각도의 2D 이미지를 보고 3D 공간의 밀도와 색상 함수를 암묵적으로(implicitly) 학습하는 방법이다. 신경망이 3D 공간의 임의 좌표 (x, y, z, θ, φ)를 입력받아 그 위치의 색상과 투명도를 출력하도록 훈련된다. **DreamFusion(Poole et al., 2022, Google)**은 여기에 Stable Diffusion의 2D 지식을 활용했다. 텍스트로 설명된 3D 객체를 만들기 위해, 임의 각도에서 렌더링한 2D 이미지가 Stable Diffusion의 기준에서 "그럴듯하게" 보이도록 NeRF를 최적화한다. 즉, 2D 확산 모델이 3D 형태를 감독(supervise)하는 셈이다. 더 최근에는 **3D Gaussian Splatting(Kerbl et al., 2023)**이 등장해 NeRF보다 훨씬 빠른 렌더링(실시간 수준)을 가능케 했다. 3D 공간을 수백만 개의 작은 가우시안 타원체로 표현하여, 복잡한 신경망 forward pass 없이 GPU의 래스터라이제이션으로 직접 렌더링하는 방식이다.

[노트 기록] 멀티모달 생성 요약: 비디오 = 시간 차원 확장 + DiT 아키텍처 트렌드, 오디오 = 스펙트로그램/잠재 표현 + 언어 모델 방식, 3D = NeRF의 암묵적 표현 + DreamFusion의 SDS loss + 3DGS의 명시적 표현.


6부. 평가 지표 — FID와 CLIP Score

생성 모델의 품질을 어떻게 측정하는가? 분류 모델은 정확도(accuracy)로 평가하면 됐지만, 생성 모델의 "좋은 이미지"는 어떻게 정의하는가? **FID(Fréchet Inception Distance, Heusel et al., 2017)**는 실제 이미지 집합과 생성된 이미지 집합을 각각 Inception 네트워크의 잠재 공간에 임베딩하여, 두 분포의 **프레셰 거리(Fréchet distance)**를 측정한다. 두 다변수 가우시안 분포 간의 거리로 계산되며, FID가 낮을수록 생성 이미지가 실제 이미지와 비슷한 분포를 가진다. CLIP Score는 생성된 이미지와 텍스트 프롬프트 간의 CLIP 임베딩 유사도를 측정한다. 텍스트 조건부 생성에서 얼마나 프롬프트를 충실히 따랐는지를 측정하는 지표다. 이 두 지표를 함께 사용하면 (1) 이미지 자체의 품질과 다양성(FID), (2) 텍스트-이미지 정합성(CLIP Score)을 종합적으로 평가할 수 있다.


7부. 프로젝트 — 손으로 직접 생각하기

아래 세 프로젝트는 정답 없이 문제만 제시된다. 코드를 작성하기 전에 반드시 종이에 설계도를 먼저 그리고, 각 단계에서 "왜 이렇게 하는가?"를 스스로 질문하는 습관을 갖길 권한다. 각 프로젝트는 독립적으로 풀 수도 있고 순서대로 쌓아갈 수도 있다.


프로젝트 1. DDPM 순방향 과정 시각화기 구현 (약 15분)

배경: 확산 모델의 이해는 순방향 과정의 수학을 직접 구현하는 것에서 시작한다. xₜ = √ᾱₜ · x₀ + √(1−ᾱₜ) · ε 공식을 기억하는가? 이 프로젝트에서는 그 공식을 직접 구현하고, T 스텝에 걸쳐 이미지가 어떻게 잡음으로 변해가는지 시각화한다.

문제:

NumPy와 Matplotlib만을 사용하여 다음을 구현하라. 먼저 **선형 노이즈 스케줄(linear noise schedule)**을 구현한다. β_t를 t=1일 때 β_start=0.0001, t=T=1000일 때 β_end=0.02로 선형 보간하여 배열로 만들어라. 그 다음 αₜ와 ᾱₜ를 순서대로 계산하는 함수를 작성하라. 이제 임의의 RGB 이미지(직접 그리거나 NumPy로 합성한 패턴 이미지 가능)에 대해 t ∈ {0, 100, 200, 400, 600, 800, 1000}에서의 xₜ를 단번에 계산하고 시각화하라. 각 xₜ 이미지에서 신호 대 잡음 비율(SNR = ᾱₜ / (1−ᾱₜ))을 계산하여 제목에 표시하라. 마지막으로, 코사인 스케줄(cosine schedule, Nichol & Dhariwal, "Improved DDPMs", 2021에서 제안)과 선형 스케줄을 비교하여 ᾱₜ의 감소 곡선이 어떻게 다른지 그래프로 보여라. 코사인 스케줄이 왜 더 좋다고 주장하는지 SNR 그래프를 보면서 스스로 추론해봐라.


프로젝트 2. 미니 U-Net 기반 DDPM 훈련 (약 15분 설계 + 구현은 런타임 필요)

배경: 실제 고해상도 이미지를 훈련하려면 고성능 GPU가 필요하지만, 개념 검증(proof of concept) 수준의 미니 버전은 적은 자원으로도 가능하다. MNIST(28×28 흑백 손글씨)를 대상으로 미니 DDPM을 구현한다. 1단계에서 MNIST 분류기를 만들었던 것과 같은 데이터셋이다. 이번엔 분류가 아니라 생성이다.

문제:

PyTorch를 사용하여 다음을 구현하라. 첫째, T=300, β를 선형 스케줄로 설정한 DDPM 프레임워크를 구현한다. 타임스텝 임베딩은 2단계 Transformer에서 배운 사인-코사인 포지셔널 인코딩과 동일한 방식으로 구현하라. 둘째, 다음 구조의 미니 U-Net을 설계한다: 입력 채널 1개(흑백) → Conv 블록 (64채널) → Downsample (14×14) → Conv 블록 (128채널) → Downsample (7×7) → 병목(bottleneck) → Upsample (14×14) → Conv 블록 (64채널) → Upsample (28×28) → 출력 채널 1개. 각 Conv 블록에 타임스텝 임베딩을 GroupNorm과 SiLU 활성화 함수를 사용해 주입하라. 스킵 연결도 잊지 마라. 셋째, 훈련 루프를 구현하라. 각 배치에서 (a) 랜덤 타임스텝 t 샘플링, (b) 노이즈 ε 샘플링, (c) xₜ 계산, (d) U-Net으로 ε 예측, (e) MSE 손실 역전파. 넷째, 훈련 후 순수 가우시안 잡음에서 시작해 300스텝 역방향 과정으로 새 손글씨 이미지를 샘플링하는 코드를 작성하라. 생성된 이미지가 실제 MNIST와 얼마나 유사한지 FID 점수를 계산하라(cleanfid 라이브러리 사용). 어느 정도 에포크에서 생성 이미지가 처음으로 "숫자처럼 보이기" 시작하는지 관찰하고 그 이유를 노트에 설명하라.


프로젝트 3. ControlNet 기반 포즈-이미지 생성 파이프라인 (약 10분 설계)

배경: 이 프로젝트는 직접 훈련 없이 Hugging Face의 diffusers 라이브러리를 활용한다. ControlNet의 이론적 구조를 이해하고, 파이프라인을 분해하여 각 컴포넌트의 역할을 이해하는 것이 목표다.

문제:

diffusers 라이브러리의 StableDiffusionControlNetPipeline을 사용하여 포즈-to-이미지 생성기를 만들어라. 구체적인 과제는 다음과 같다. 먼저, 임의의 사람 이미지에서 controlnet_aux 라이브러리의 OpenposeDetector로 포즈 스켈레톤을 추출하고 시각화하라. 이 포즈 스켈레톤과 텍스트 프롬프트를 조건으로 새로운 이미지를 생성하라. 동일한 포즈 스켈레톤을 유지한 채, 텍스트 프롬프트만 바꾸어 최소 5개의 다른 스타일/장면의 이미지를 생성하라(예: 우주비행사, 닌자, 발레리나). 가이던스 스케일 w를 1, 3, 7, 10, 15로 변경하며 이미지를 생성하고, w가 커질수록 어떤 trade-off가 발생하는지 기술하라. 마지막으로, ControlNetModelStableDiffusionPipeline에 추가하는 부분의 코드를 분석하여, Zhang et al. 논문에서 설명한 Zero Convolution이 어디에 해당하는지 diffusers 코드에서 찾아 노트에 기록하라. Zero Convolution이 필요한 이유를 수식 없이 한 문단으로 설명하라.


마무리 — 이 단계가 열어주는 다음 질문

5단계를 마치면서 한 가지를 반드시 느껴야 한다. 확산 모델은 "잡음을 예측한다"는 단순한 아이디어에서 출발했지만, 텍스트, 이미지, 포즈, 깊이 맵 등 무엇이든 조건으로 받아들여 놀라운 품질의 이미지를 생성하는 범용 엔진이 되었다. 이것이 가능한 이유는 모든 조건을 "동일한 어텐션 메커니즘"으로 주입할 수 있기 때문이다. 2단계에서 배운 Transformer의 어텐션이 언어, 이미지, 오디오, 3D 모두를 같은 언어로 이야기할 수 있게 해주는 기반임을 다시 한번 확인하게 된다. 다음 6단계에서는 이렇게 만들어진 모델들을 실제 프로덕션 환경에 배포하고, 안전하고 윤리적으로 운영하는 방법을 다룬다. 지금까지 배운 모든 것들이 실제 세상과 맞닥뜨릴 때 어떤 새로운 도전이 생기는지를 다루는 단계다.


평가 기준 (참고용)

항목 배점 핵심 질문
생성 품질 (FID/CLIP Score) 40점 미니 DDPM FID, ControlNet CLIP Score를 수치로 보고하는가
제어 정밀도 40점 포즈 조건 준수율, 가이던스 스케일 trade-off 분석의 깊이
포트폴리오 20점 세 프로젝트의 결과물을 일관된 서사로 엮어 설명하는가
← 단계 4