서론: 세대의 새로운 개척지
I 확산 모델 그들은 최신 세대로서 GAN을 능가했습니다. DALL-E, Stable Diffusion 및 Midjourney와 같은 이미지, 전원 시스템. 그 뒤에 숨은 아이디어 놀랍도록 간단합니다. 프로세스 앞으로 점차적으로 소음이 추가됩니다. 이미지가 완전히 파괴될 때까지 이미지를 가우스로 변환한 다음 신경망이 학습합니다. 프로세스 뒤집다, 단계별로 노이즈를 제거하여 재구축 원본 이미지(또는 새 이미지 생성)
GAN과 달리 확산 모델은 안정적인 훈련과 더 큰 다양성을 제공합니다. 결과와 엄격한 확률론적 프레임워크를 제공합니다. 가격과 생성과정 플러스 느리고(수백 개의 노이즈 제거 단계) DDIM 및 잠재 확산과 같은 기술로 완화됩니다.
무엇을 배울 것인가
- 순방향 프로세스: 노이즈가 이미지를 점진적으로 파괴하는 방법
- 반대 과정: 신경망이 잡음을 제거하는 방법을 학습하는 방법
- DDPM: 잡음 제거 확산 확률 모델
- DDIM: 더 적은 단계로 더 빠른 생성
- 텍스트 조건화: CLIP을 사용하여 텍스트 설명에서 이미지 생성
- 안정 확산: 잠재 공간에서의 확산
- 허깅 페이스 디퓨저를 이용한 실제 구현
순방향 프로세스: 노이즈 추가
Il 앞으로의 과정 점진적으로 노이즈를 추가하는 마르코프 체인 T 단계의 이미지에 가우스를 적용합니다. 각 단계 t에서 소량의 노이즈가 추가됩니다. 한 사람에 따르면 일정 기본값(선형 또는 코사인). 충분한 조치를 취한 후 (일반적으로 T=1000) 원본 이미지는 완전히 파괴되어 순수한 노이즈가 됩니다. 가우스.
기본적인 속성은 계산 없이 임의의 단계 t로 직접 이동할 수 있다는 것입니다. 닫힌 공식 덕분에 모든 중간 단계:
import torch
import torch.nn as nn
import numpy as np
class DiffusionSchedule:
"""Schedule per il processo di diffusione"""
def __init__(self, num_timesteps=1000, beta_start=1e-4, beta_end=0.02):
self.num_timesteps = num_timesteps
# Schedule lineare dei beta
self.betas = torch.linspace(beta_start, beta_end, num_timesteps)
self.alphas = 1.0 - self.betas
# Alpha cumulativo: prodotto di tutti gli alpha fino a t
self.alpha_cumprod = torch.cumprod(self.alphas, dim=0)
self.sqrt_alpha_cumprod = torch.sqrt(self.alpha_cumprod)
self.sqrt_one_minus_alpha_cumprod = torch.sqrt(1.0 - self.alpha_cumprod)
def add_noise(self, x_0, t, noise=None):
"""Forward process: q(x_t | x_0) - aggiunge rumore a x_0"""
if noise is None:
noise = torch.randn_like(x_0)
sqrt_alpha = self.sqrt_alpha_cumprod[t].view(-1, 1, 1, 1)
sqrt_one_minus = self.sqrt_one_minus_alpha_cumprod[t].view(-1, 1, 1, 1)
# x_t = sqrt(alpha_cumprod_t) * x_0 + sqrt(1 - alpha_cumprod_t) * noise
return sqrt_alpha * x_0 + sqrt_one_minus * noise
# Demo: rumore progressivo
schedule = DiffusionSchedule()
image = torch.randn(1, 3, 64, 64) # Immagine originale
for t in [0, 250, 500, 750, 999]:
t_tensor = torch.tensor([t])
noisy = schedule.add_noise(image, t_tensor)
print(f"Step {t}: noise level = {schedule.sqrt_one_minus_alpha_cumprod[t]:.4f}")
역과정: 노이즈 제거
Il 역과정 그리고 마법이 일어나는 곳. 신경망(일반적으로 유넷)는 각 단계에서 추가되는 노이즈를 예측하는 방법을 학습합니다. 순수한 소음에서 시작하기 Gaussian 모델은 T 단계로 점차적으로 노이즈를 제거하여 일관된 이미지를 생성합니다.
훈련의 목표는 간단합니다. 추가된 실제 잡음 간의 차이를 최소화하는 것입니다. 그리고 네트워크가 예측한 잡음. 이 MSE 잡음 손실은 매우 효과적인 것으로 입증되었습니다.
class SimpleUNet(nn.Module):
"""U-Net semplificata per noise prediction"""
def __init__(self, channels=3, time_emb_dim=256):
super().__init__()
# Time embedding: trasforma timestep in vettore
self.time_mlp = nn.Sequential(
nn.Linear(1, time_emb_dim),
nn.SiLU(),
nn.Linear(time_emb_dim, time_emb_dim)
)
# Encoder
self.enc1 = self._block(channels, 64)
self.enc2 = self._block(64, 128)
self.enc3 = self._block(128, 256)
# Bottleneck
self.bottleneck = self._block(256, 512)
# Decoder con skip connections
self.dec3 = self._block(512 + 256, 256)
self.dec2 = self._block(256 + 128, 128)
self.dec1 = self._block(128 + 64, 64)
self.final = nn.Conv2d(64, channels, 1)
self.pool = nn.MaxPool2d(2)
self.up = nn.Upsample(scale_factor=2, mode='bilinear')
def _block(self, in_ch, out_ch):
return nn.Sequential(
nn.Conv2d(in_ch, out_ch, 3, padding=1),
nn.GroupNorm(8, out_ch),
nn.SiLU(),
nn.Conv2d(out_ch, out_ch, 3, padding=1),
nn.GroupNorm(8, out_ch),
nn.SiLU()
)
def forward(self, x, t):
# t_emb = self.time_mlp(t.float().unsqueeze(-1))
e1 = self.enc1(x)
e2 = self.enc2(self.pool(e1))
e3 = self.enc3(self.pool(e2))
b = self.bottleneck(self.pool(e3))
d3 = self.dec3(torch.cat([self.up(b), e3], dim=1))
d2 = self.dec2(torch.cat([self.up(d3), e2], dim=1))
d1 = self.dec1(torch.cat([self.up(d2), e1], dim=1))
return self.final(d1)
# Training: predici il rumore
model = SimpleUNet()
schedule = DiffusionSchedule()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)
def training_step(x_0):
t = torch.randint(0, 1000, (x_0.size(0),))
noise = torch.randn_like(x_0)
x_t = schedule.add_noise(x_0, t, noise)
noise_pred = model(x_t, t)
loss = nn.functional.mse_loss(noise_pred, noise)
return loss
DDPM 및 DDIM: 속도 대 품질
PMDD
Il PMDD (노이즈 제거 확산 확률 모델)은 다음의 모든 T 단계를 사용합니다. 높은 품질을 보장하지만 수백 또는 수천 번의 평가가 필요한 샘플링 프로세스 네트워크의.
DDIM
Il DDIM (Denoising Diffusion Implicit Models)은 다음을 사용하여 샘플링을 가속화합니다. 단계 건너뛰기를 허용하는 비마코비안 프로세스입니다. 50~100단계만 거치면 품질을 얻을 수 있습니다. 1000단계의 DDPM과 비슷하며 생성 시간을 10~20배 단축합니다.
안정 확산: 잠재 공간에서의 확산
안정적인 확산 픽셀 공간이 아닌 확산 프로세스를 적용합니다. 하지만 한 번에 압축된 잠재 공간 (일반적으로 512x512 대신 64x64). 오토인코더(VAE)는 이미지를 잠재 공간으로 압축하고, 여기서 확산이 작동합니다. 공간이 줄어들고 디코더는 최종 이미지를 재구성합니다. 이렇게 하면 요구 사항이 줄어듭니다. 계산 비용을 약 50배 줄여 소비자 GPU에서 생성이 가능해졌습니다.
텍스트-이미지: CLIP을 사용한 조절
텍스트-이미지 생성 사용 클립 (대조적 언어-이미지 사전 훈련) 잡음 제거 프로세스를 구동하는 임베딩으로 텍스트 프롬프트를 인코딩합니다. 거기 분류자 없는 안내 프롬프트 준수와 다양성 사이의 균형: 가치 높을수록 텍스트에 더 밀접하게 부착되지만 덜 다양한 이미지를 생성합니다.
from diffusers import StableDiffusionPipeline
import torch
# Caricare Stable Diffusion
pipe = StableDiffusionPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
torch_dtype=torch.float16
)
pipe = pipe.to("cuda")
# Generare un'immagine da testo
prompt = "A serene Japanese garden with cherry blossoms, digital art"
image = pipe(
prompt,
num_inference_steps=50,
guidance_scale=7.5 # Classifier-free guidance
).images[0]
image.save("japanese_garden.png")
print(f"Immagine generata: {image.size}")
ControlNet과 미래
컨트롤넷 생성에 정확한 공간 제어 추가: 핸드 스케치, 깊이 맵, 인간 포즈 및 Canny Edge는 생성을 안내하여 모델이 디테일과 스타일을 추가하는 동안 원하는 구성을 선택하세요.
생성 모델 분야는 빠르게 발전하고 있습니다. 일관성 모델 그들은 약속한다 한 단계의 세대, 영상확산 일관된 비디오 및 템플릿 생성 멀티모달은 텍스트, 이미지, 오디오를 단일 프레임워크로 결합합니다.
시리즈의 다음 단계
- 다음 기사에서는 강화 학습
- 에이전트가 보상(Q-Learning, DQN 및 PPO)을 통해 어떻게 학습하는지 살펴보겠습니다.
- OpenAI Gymnasium으로 플레이하는 방법을 학습하는 에이전트를 구현하겠습니다.







