Diffusion
디퓨전 모델
노이즈를 제거하며 이미지 생성하는 모델. Stable Diffusion, DALL-E 3의 기반.
디퓨전 모델
노이즈를 제거하며 이미지 생성하는 모델. Stable Diffusion, DALL-E 3의 기반.
디퓨전(Diffusion)은 데이터에 점진적으로 노이즈를 추가한 뒤, 그 역과정을 학습하여 노이즈로부터 원본 데이터를 복원하는 생성 모델 기법입니다. 물리학의 확산(diffusion) 현상에서 영감을 받았으며, 2020년 DDPM(Denoising Diffusion Probabilistic Models) 논문을 통해 이미지 생성에서 GAN을 능가하는 성능을 보여주며 주목받기 시작했습니다.
디퓨전의 역사적 기원은 2015년 Sohl-Dickstein의 "Deep Unsupervised Learning using Nonequilibrium Thermodynamics"까지 거슬러 올라가지만, 실용적인 이미지 생성은 2020년 Ho et al.의 DDPM에서 시작되었습니다. 이후 2021년 DALL-E 2, 2022년 Stable Diffusion, 2023년 DALL-E 3, Midjourney V5 등이 연달아 출시되며 AI 이미지 생성 시대를 열었습니다.
핵심 원리는 두 단계로 구성됩니다. Forward process(확산 과정)에서는 원본 이미지 x0에 T 스텝에 걸쳐 가우시안 노이즈를 점진적으로 추가하여 순수 노이즈 xT로 변환합니다. Reverse process(역확산 과정)에서는 신경망이 각 스텝에서 추가된 노이즈를 예측하고 제거하여 xT에서 x0를 복원합니다. 학습 목표는 예측 노이즈와 실제 노이즈 간의 MSE를 최소화하는 것입니다.
실무에서 디퓨전은 Stable Diffusion, DALL-E 3, Midjourney의 핵심 기술로 활용됩니다. GAN 대비 학습 안정성이 높고 모드 붕괴(mode collapse) 문제가 없어 다양한 이미지를 생성할 수 있습니다. 다만 샘플링에 수십~수백 스텝이 필요해 추론 속도가 느리다는 단점이 있어, DDIM, DPM-Solver 등 빠른 샘플러 연구가 활발합니다.
# 디퓨전 핵심 개념 구현 (간소화 버전)
import torch
import torch.nn as nn
import numpy as np
class SimpleDiffusion:
"""간단한 디퓨전 프로세스 구현"""
def __init__(self, timesteps=1000, beta_start=1e-4, beta_end=0.02):
self.timesteps = timesteps
# 선형 노이즈 스케줄
self.betas = torch.linspace(beta_start, beta_end, timesteps)
self.alphas = 1.0 - self.betas
self.alphas_cumprod = torch.cumprod(self.alphas, dim=0)
def forward_process(self, x0, t):
"""Forward diffusion: x0에 노이즈 추가하여 xt 생성"""
sqrt_alpha_cumprod = torch.sqrt(self.alphas_cumprod[t])
sqrt_one_minus = torch.sqrt(1.0 - self.alphas_cumprod[t])
noise = torch.randn_like(x0)
xt = sqrt_alpha_cumprod * x0 + sqrt_one_minus * noise
return xt, noise
def reverse_step(self, xt, predicted_noise, t):
"""Reverse diffusion: 예측 노이즈로 xt-1 복원"""
alpha = self.alphas[t]
alpha_cumprod = self.alphas_cumprod[t]
beta = self.betas[t]
# 평균 계산
mean = (1 / torch.sqrt(alpha)) * (
xt - (beta / torch.sqrt(1 - alpha_cumprod)) * predicted_noise
)
# 노이즈 추가 (t > 0일 때)
if t > 0:
noise = torch.randn_like(xt)
return mean + torch.sqrt(beta) * noise
return mean
# 학습 루프 예시
diffusion = SimpleDiffusion()
model = nn.Sequential(nn.Linear(784, 512), nn.ReLU(), nn.Linear(512, 784))
for epoch in range(100):
x0 = torch.randn(32, 784) # 배치 데이터
t = torch.randint(0, 1000, (32,)) # 랜덤 타임스텝
xt, noise = diffusion.forward_process(x0, t[0])
predicted_noise = model(xt)
loss = nn.MSELoss()(predicted_noise, noise)
# loss.backward() 및 optimizer.step()...
2025년 1월 기준 주요 Diffusion 기반 이미지 생성 서비스 가격 비교입니다.
| 서비스 | 월정액 | 이미지당 비용 | 무료 옵션 |
|---|---|---|---|
| DALL-E 3 | $20/월 (ChatGPT Plus) | $0.016 ~ $0.04 (API) | 일 3장 무료 |
| Midjourney | $10 ~ $30/월 | ~$0.05 (Basic) | 없음 |
| Stable Diffusion | 무료 (로컬) | $0.002+ (클라우드) | 셀프 호스팅 무료 |
| Stability AI API | - | $0.01/크레딧 | $1M 이하 무료 |
선택 가이드: 예술적 품질은 Midjourney, API 연동/다양성은 DALL-E 3, 비용 효율/커스터마이징은 Stable Diffusion 로컬 권장. SDXL 로컬 실행 시 RTX 4090급 GPU($1,600+) 필요.
"디퓨전이 GAN을 대체한 핵심 이유는 학습 안정성입니다. GAN의 discriminator-generator 균형 문제나 모드 붕괴 없이, 단순한 노이즈 예측 MSE 손실로 안정적으로 학습됩니다. 대신 샘플링이 느려서 DDIM 같은 가속 기법이 필수적이에요."
"디퓨전에서 노이즈 스케줄 설계가 중요합니다. 선형(linear)보다 코사인(cosine) 스케줄이 초반 스텝에서 정보 손실을 줄여 고품질 이미지 생성에 유리합니다. Stable Diffusion도 코사인 스케줄 변형을 사용합니다."
"실시간 이미지 생성이 필요하면 LCM(Latent Consistency Model)이나 SDXL Turbo처럼 1-4스텝 생성이 가능한 distilled 모델을 검토해야 합니다. 기본 디퓨전 20-50스텝으로는 사용자 경험상 대기 시간이 너무 깁니다."
기본 DDPM은 1000스텝 샘플링이 필요하여 이미지 한 장 생성에 수십 초가 소요됩니다. 프로덕션에서는 DDIM(50스텝), DPM-Solver(20스텝), 또는 distillation 모델 사용이 필수입니다.
512x512 이상 고해상도 생성 시 메모리 요구량이 급증합니다. Latent Diffusion처럼 압축된 잠재 공간에서 연산하거나, 타일링/업스케일링 파이프라인을 구축해야 합니다.
Classifier-Free Guidance 강도(CFG scale)가 너무 높으면 과포화된 부자연스러운 이미지가, 너무 낮으면 프롬프트 무시가 발생합니다. 보통 7-12 범위에서 시작하여 조정하세요.