TROISINH
FrontierVision & Multimodal

Diffusion Models — Noise → Image, nguyên lý đằng sau Stable Diffusion

Hiểu bản chất Diffusion Models: từ noise ngẫu nhiên đến ảnh nét căng qua quá trình 'đi ngược' Markov chain, lý do Stable Diffusion chạy nhanh gấp 64 lần nhờ latent space.

Khi DALL-E tạo ra những bức ảnh siêu thực từ một câu mô tả, hay Stable Diffusion biến văn bản thành ảnh nét căng ngay trên laptop cá nhân, đằng sau đó không phải là ma thuật, mà là một quá trình "đi ngược" kỳ diệu: từ một bức ảnh toàn nhiễu (noise) hoàn toàn ngẫu nhiên, mô hình học cách loại bỏ dần từng chút nhiễu trong 50-1000 bước để lộ ra hình ảnh hoàn chỉnh. Đây là Diffusion Models — kiến trúc đã thay thế GANs để trở thành xương sống của tạo sinh ảnh hiện đại, được sử dụng bởi Stability AI, OpenAI, Midjourney và Adobe Firefly.

Vấn đề

Trước khi Diffusion xuất hiện, thế giới tạo sinh ảnh bị chia phe bởi những hạn chế gay gắt:

  • GANs (Generative Adversarial Networks): Dùng hai mạng đối đầu (generator vs discriminator). Training cực kỳ bất ổn định — dễ rơi vào mode collapse (chỉ sinh ra vài kiểu ảnh giống nhau), và tối ưu hàm minimax là một bài toán khốc liệt thường dẫn đến hiện tượng "training collapse" không thể phục hồi.

  • VAEs (Variational Autoencoders): Ổn định hơn nhưng sinh ảnh mờ nhòe (blurry) vì optimize surrogate loss (ELBO), không trực tiếp tối đa hóa likelihood của dữ liệu. Chất lượng bị giới hạn bởi capacity của bottleneck.

  • Autoregressive (PixelCNN, GPT): Sinh ảnh pixel-by-pixel hoặc patch-by-patch. Tốn O(N) bước cho N pixels, tuần tự chậm chạp, không thể song song hóa trong quá trình sinh. Với ảnh 512×512, đây là 262,144 bước tuần tự — hoàn toàn không khả thi cho real-time.

Cần một phương pháp: training ổn định như VAE, chất lượng cao như GANs khi train tốt, và có thể song song hóa trong training (dù inference vẫn tuần tự). Đặc biệt, cần khả năng điều khiển (conditioning) để tạo ảnh từ text — thứ mà GANs làm rất khó khăn.

Ý tưởng cốt lõi

Ý chính đơn giản đến mức ngỡ ngàng: thay vì học cách vẽ ảnh từ con số không, mô hình học cách 'tẩy' nhiễu.

Hãy tưởng tượng một bức tượng đá. Thay vì đẽo từ khối đá lớn (bất khả thi để làm đúng một lần), bạn bắt đầu từ khối đá bị phủ đầy bụi (noise), và mỗi bước bạn chỉ cần lau một chút bụi đi, làm cho bề mặt rõ nét hơn một chút. Sau 1000 lần lau, bức tượng lộ ra hoàn chỉnh. Đó chính xác là cách Diffusion hoạt động — biến một bài toán "impossible" thành 1000 bài toán "trivial".

Quá trình thuận: Phá hủy có kiểm soát

Bắt đầu từ ảnh gốc x₀, ta thêm nhiễu Gaussian từng chút một qua T bước (thường T=1000) theo một lịch trình variance β_t. Sau cùng, ảnh trở thành noise thuần túy N(0,I) — hoàn toàn ngẫu nhiên.

Điểm kỳ diệu nằm ở tính chất "closed form": vì nhiễu Gaussian ổn định dưới phép cộng, ta có thể nhảy thẳng từ ảnh gốc x₀ đến bất kỳ bước t nào mà không cần tính từng bước trung gian (reparameterization trick):
x_t = √ᾱ_t x₀ + √(1-ᾱ_t) ε, với ε ~ N(0,I).

Điều này cho phép training song song hoàn toàn: mỗi batch có thể sample ngẫu nhiên timestep t khác nhau và tính loss độc lập — không giống như autoregressive bắt buộc tính tuần tự.

Quá trình ngược: Học cách "đi lùi"

Mạng neural (thường là U-Net với attention) học để đoán nhiễu ε đã được thêm vào ở mỗi bước t. Khi sinh ảnh, ta bắt đầu từ noise ngẫu nhiên x_T ~ N(0,I), và lặp lại quá trình: đoán nhiễu → trừ đi → thêm một chút nhiễu ngẫu nhiên nhỏ (stochastic sampling) để đến bước t-1. Mỗi bước là một phép làm mịn (denoise) cục bộ, đẩy phân phối về phía dữ liệu thực.

Stable Diffusion Twist: Latent Space

Thay vì diffuse trên không gian pixel 512×512×3 (kích thước khổng lồ), ta dùng VAE (Variational Autoencoder) nén ảnh xuống latent space 64×64×4 (nhỏ hơn 64 lần về số lượng pixels, 48× về memory). Diffusion chỉ chạy trên latent space này (U-Net nhỏ hơn, nhanh hơn), rồi VAE decoder giải nén về pixel. Đây là lý do bạn có thể chạy Stable Diffusion trên laptop 8GB VRAM — bạn không bao giờ diffuse trên không gian pixel đầy đủ.

Aha moment: Không có gì ma thuật cả

Nhiều người nghĩ AI "vẽ" ảnh từ con số không — thực ra không đúng. Bạn không cần học cách vẽ mèo từ không khí; bạn chỉ cần học cách nhận biết "đây là nhiễu" và "đây là mèo", rồi từ từ loại bỏ nhiễu. Đó là lý do training ổn định: bạn chỉ optimize MSE loss giữa noise thực và noise dự đoán — không có adversarial game phức tạp như GANs.

Tại sao nó hoạt động

Score Function: Mũi tên chỉ về "vùng hợp lý"

Về mặt toán học, Diffusion thực chất học score function ∇_x log p(x) — gradient của log-likelihood dữ liệu. Nếu phân phối dữ liệu là một dãy núi (những bức ảnh đẹp nằm trên đỉnh), score function chỉ hướng lên đỉnh từ bất kỳ điểm nào trong không gian.

Mỗi bước denoise, mô hình nhìn ảnh nhiễu và hỏi: "Hướng nào dẫn đến vùng có xác suất cao hơn?" rồi bước một bước nhỏ theo hướng đó. Tích lũy qua nhiều bước, đường đi từ noise đến dữ liệu trở thành một đường cong mượt mà.

Training đơn giản đến ngỡ ngàng

# Pseudo-code training loop
for x_0, c in dataloader:  # x_0: real image, c: condition (text)
    t = randint(0, T)
    epsilon = randn_like(x_0)
    x_t = sqrt(alpha_bar[t]) * x_0 + sqrt(1 - alpha_bar[t]) * epsilon
    predicted_noise = unet(x_t, t, c)
    loss = mse_loss(predicted_noise, epsilon)
    loss.backward()

Không có GAN discriminator, không có VAE KL divergence — chỉ là MSE giữa hai tensor nhiễu. Sự đơn giản này làm cho training scalable và ổn định trên quy mô lớn.

Classifier-Free Guidance (CFG): Cách "bám" vào prompt

Để điều khiển bằng text, ta train mô hình với điều kiện c (prompt) nhưng randomly drop 10% thành unconditional (c = ∅). Lúc inference, ta tính:

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

Scale w (thường 7-15) điều chỉnh độ "bám" vào prompt. Khi w cao, ảnh trung thực với mô tả nhưng có thể bị oversaturated; khi w thấp, ảnh đa dạng hơn nhưng ít tuân thủ prompt.

Latent Space Efficiency

Việc chạy U-Net trên 64×64×4 thay vì 512×512×3 giảm FLOPs và memory ~64 lần. Điều này biến điều không thể (diffusion trên ảnh HD) thành có thể trên hardware consumer. Cross-attention trong U-Net cho phép text embeddings (từ CLIP hoặc T5) điều khiển quá trình denoise tại mọi layer.

Ý nghĩa thực tế

Tiêu chíGANsDiffusion Models (Pixel)Latent Diffusion (Stable Diffusion)
Training stabilityKém (mode collapse)Tốt (MSE loss)Tốt
Chất lượng ảnhCao nhưng khó trainRất cao, diverseRất cao
Inference speed1 step (nhanh)1000 steps (chậm)50 steps (chấp nhận được)
Memory (512×512)~10GB~40GB+~6-8GB
Text conditioningKhó khănDễ dàng (cross-attention)Dễ dàng

Benchmarks thực tế:

  • DDPM đạt 2.94 FID trên CIFAR-10 (vượt trội GANs thời bấy giờ).
  • Stable Diffusion 512×512 trên RTX 4090: ~2-4 giây cho 50 steps, hoặc <1 giây với Distilled variants (SDXL Turbo, LCM).
  • Memory: Latent diffusion cho phép chạy model 1B+ parameters trên GPU 8GB VRAM — điều impossible với pixel-space diffusion.

Ai đang dùng:

  • Stability AI: Stable Diffusion 1.5, SDXL, SD3.
  • OpenAI: DALL-E 2 (CLIP + diffusion), DALL-E 3.
  • Midjourney: Kiến trúc diffusion proprietary.
  • Google: Imagen (diffusion + T5).
  • Adobe: Firefly (latent diffusion cho commercial use).
  • Black Forest Labs: FLUX.1 (flow matching — biến thể mới của diffusion).

Hạn chế:

  • Tốc độ: Vẫn chậm hơn GANs nhiều lần (dù đã có distillation xuống 1-4 steps).
  • Text rendering: Khó render text chính xác (do tokenization và độ phân giải hạn chế trong latent space 64×64).
  • Quan hệ không gian: Khó nắm bắt quan hệ phức tạp giữa nhiều objects (ví dụ: "cái cốc ở bên trái cái đĩa").
  • Memory: Pixel-space diffusion (không qua VAE) vẫn cần VRAM khổng lồ, giới hạn resolution.

Đào sâu hơn

Paper gốc:

Cùng cụm (Vision & Multimodal):

Đọc tiếp:

Mở rộng:

On this page