Chapter 36

GANs

GANs
🎬 দুই খেলোয়াড়ের খেলা
Generative Adversarial Network (Goodfellow, 2014) — Generator নকল ডেটা বানায়, Discriminator আসল-নকল চেনে। দুজনে প্রতিযোগিতা করতে করতে Generator এমন বাস্তব ডেটা বানায় যা প্রায় আসল।

মিনিম্যাক্স অবজেক্টিভ

min_G max_D  E[log D(x)] + E[log(1 - D(G(z)))]

x ~ আসল ডেটা
z ~ noise (latent)

Generator vs Discriminator

Generator (G)
Discriminator (D)
z (noise) → image
image → real/fake probability
Upsampling, ConvTranspose
Conv + pooling
Goal: D-কে ফাঁকি দেওয়া
Goal: G-কে ধরা

সরল DCGAN — PyTorch

import torch, torch.nn as nn

class G(nn.Module):
    def __init__(self, z=100):
        super().__init__()
        self.net = nn.Sequential(
            nn.ConvTranspose2d(z, 256, 4, 1, 0), nn.BatchNorm2d(256), nn.ReLU(),
            nn.ConvTranspose2d(256, 128, 4, 2, 1), nn.BatchNorm2d(128), nn.ReLU(),
            nn.ConvTranspose2d(128, 64, 4, 2, 1),  nn.BatchNorm2d(64),  nn.ReLU(),
            nn.ConvTranspose2d(64, 1, 4, 2, 1), nn.Tanh(),
        )
    def forward(self, z): return self.net(z)

class D(nn.Module):
    def __init__(self):
        super().__init__()
        self.net = nn.Sequential(
            nn.Conv2d(1, 64, 4, 2, 1), nn.LeakyReLU(0.2),
            nn.Conv2d(64, 128, 4, 2, 1), nn.BatchNorm2d(128), nn.LeakyReLU(0.2),
            nn.Conv2d(128, 256, 4, 2, 1), nn.BatchNorm2d(256), nn.LeakyReLU(0.2),
            nn.Conv2d(256, 1, 4, 1, 0), nn.Sigmoid(),
        )
    def forward(self, x): return self.net(x).view(-1)

Training Loop

for x, _ in loader:
    # ----- D -----
    z = torch.randn(B, 100, 1, 1, device=dev)
    fake = G(z).detach()
    loss_d = bce(D(x), ones) + bce(D(fake), zeros)
    opt_d.zero_grad(); loss_d.backward(); opt_d.step()

    # ----- G -----
    z = torch.randn(B, 100, 1, 1, device=dev)
    loss_g = bce(D(G(z)), ones)        # G চায় D তাকে real ভাবুক
    opt_g.zero_grad(); loss_g.backward(); opt_g.step()

সাধারণ সমস্যা ও সমাধান

  • Mode collapse: G একইরকম sample বানায় → mini-batch discrimination, WGAN।
  • Training instability: learning rate ছোট, Adam β1=0.5।
  • Vanishing D gradient: WGAN-GP, spectral norm।
  • Evaluation কঠিন: FID, IS metric ব্যবহার করুন।

GAN পরিবার

  • DCGAN: CNN-based, baseline।
  • cGAN: class label-conditioned generation।
  • Pix2Pix, CycleGAN: image-to-image translation।
  • WGAN-GP: Wasserstein distance — stable training।
  • StyleGAN 2/3: photorealistic face generation।
  • BigGAN: large-scale class-conditional।
🔑 FID Score
Fréchet Inception Distance — generated আর real distribution-এর Inception feature space-এ দূরত্ব। কম FID = ভালো quality।

অনুশীলন

১. MNIST-এ DCGAN train করে digit generate করুন।

২. CelebA-তে DCGAN দিয়ে face — FID measure করুন।

৩. Conditional GAN দিয়ে label-নির্দিষ্ট sample তৈরি করুন।

সারসংক্ষেপ

✨ এই অধ্যায়ে যা শিখলাম
  • GAN = G vs D adversarial training।
  • DCGAN baseline; StyleGAN photorealistic।
  • Mode collapse ও instability — মূল চ্যালেঞ্জ।