| 목표 | 내용 |
|---|---|
| 생성 모델의 기본 개념 | 데이터 분포 (P(x)), 잠재 분포 (p(z)) 등을 이해 |
| GAN(Generative Adversarial Network) | 생성자·판별자의 대립 구조와 손실 함수 |
| VAE(Variational Autoencoder) | 인코더·디코더, ELBO, 재구성·KL 손실 |
| Diffusion | 노이즈 추가·제거 과정을 통해 이미지 생성 |
| 실무 예시 | 이미지 생성, 잡음 제거, 텍스트‑투‑이미지 등 |
| 모델 | 분류 | 주요 특징 |
|---|---|---|
| GAN | Implicit | 생성자(Generator)와 판별자(Discriminator)의 대립 훈련 |
| VAE | Explicit | 인코더‑디코더 구조, ELBO 최적화 |
| Diffusion | Implicit | 다단계 노이즈 추가와 제거 과정 |
for _ in range(num_steps):
# Real batch
x_real = real_batch
# Fake batch
z = torch.randn(batch_size, z_dim)
x_fake = G(z)
# Discriminator loss
d_real = D(x_real).view(-1)
d_fake = D(x_fake.detach()).view(-1)
d_loss = -torch.mean(torch.log(d_real) + torch.log(1 - d_fake))
D.zero_grad()
d_loss.backward()
d_opt.step()
# Generator loss
g_loss = -torch.mean(torch.log(D(x_fake).view(-1)))
G.zero_grad()
g_loss.backward()
g_opt.step()
| 문제 | 해결 방법 |
|---|---|
| Mode Collapse | Spectral Normalization, Gradient Penalty |
| 불안정한 수렴 | Wasserstein GAN, Batch Normalization |
| 학습 단계 조절 | 학습률 스케줄링, 클립 등 |
최대화 목표
[
\log p_\theta(x) \;\ge\;
\underbrace{D{\text{KL}}!\bigl(q\phi(z|x)\,|\,p(z)\bigr)}_{\text{KL loss}}
]
역전파용 손실
[
-\mathbb{E}{q\phi(z|x)}[\log p_\theta(x|z)]
[
z = \mu + \sigma \odot \epsilon,
\qquad \epsilon \sim \mathcal{N}(0,I)
]
이로 인해 (z) 에 대한 미분이 가능해짐.
class VAE(nn.Module):
def __init__(self, latent_dim):
super().__init__()
# Encoder
self.enc = nn.Sequential(
nn.Flatten(),
nn.Linear(784, 400),
nn.ReLU(True),
nn.Linear(400, 2*latent_dim) # μ, logσ²
)
# Decoder
self.dec = nn.Sequential(
nn.Linear(latent_dim, 400),
nn.ReLU(True),
nn.Linear(400, 784),
nn.Sigmoid()
)
def encode(self, x):
h = self.enc(x)
mu, logvar = h.chunk(2, dim=1)
return mu, logvar
def reparameterize(self, mu, logvar):
std = torch.exp(0.5*logvar)
eps = torch.randn_like(std)
return mu + eps*std
def decode(self, z):
return self.dec(z)
def forward(self, x):
mu, logvar = self.encode(x)
z = self.reparameterize(mu, logvar)
recon = self.decode(z)
return recon, mu, logvar
def loss_function(recon_x, x, mu, logvar):
BCE = F.binary_cross_entropy(recon_x, x, reduction='sum')
KLD = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())
return BCE + KLD
[
\mathbb{E}{t,\,x_0,\,\epsilon}
\bigl[
\lambda_t \,|\epsilon - \epsilon\theta(x_t, t)|^2
\bigr]
]
def p_sample(model, x, t):
beta_t = betas[t]
sqrt_one_minus_alpha = sqrt_one_minus_alphas[t]
eps_theta = model(x, t) # denoiser output
mean = (x - eps_theta*beta_t / sqrt_one_minus_alpha) / torch.sqrt(1 - beta_t)
if t>0:
var = beta_t
noise = torch.randn_like(mean)
return mean + torch.sqrt(var + 1e-6)*noise
else:
return mean
| 분야 | 모델 | 활용 내용 |
|---|---|---|
| 이미지 생성 | GAN | 실사 사진, 스타일 변환, 예술 작품 생성 |
| 잡음 제거 / 보상 | VAE, Diffusion | 의료 영상(CT, MRI) 노이즈 감소, 디지털 아트 리프레시 |
| 강화학습 | VAE latent space | 정책 최적화에 사용할 잠재 공간 으로 state‑encoding |
| 텍스트→이미지 | Diffusion (예: Stable Diffusion) | 자연어 기술을 기반으로 고해상도 이미지 생성 |
| 용어 | 설명 |
|---|---|
| Generator (G) | 노이즈 → 가짜 이미지 생성 |
| Discriminator (D) | 실제 vs 가짜 판별 |
| ELBO | 확률적 대체, VAE의 최적화 목표 |
| KL Divergence | 두 분포 차이량 |
| Diffusion Step | 노이즈 추가/제거 단계 |
| Mode Collapse | GAN이 한 종류의 이미지만 생성 |
| Latent Space | 잠재 변수 (\mathbf{z}) 의 공간 |
| Spectral Normalization | 가중치 정규화로 훈련 안정화 |
| Reparameterization Trick | 미분 가능한 noise sampling |
| Implicit Density | 분포를 명시하지 않으면서 샘플만 생성 |
| Explicit Density | 분포를 수식으로 정의 |
본 노트는 초보자도 이해할 수 있는 수준으로 프로세스를 요약하고, 수학 공식은 단계별로 해설했습니다.
필요한 경우 원문 PDF와 타이핑 자료를 참고해 보충할 수 있도록 구성했습니다.