AI Dictionary of Terms

GAN (Generative Adversarial Network)

A generative AI architecture consisting of two neural networks — a Generator that creates fake data and a Discriminator that tries to distinguish real from fake — trained simultaneously in an adversarial game, where the Generator learns to produce increasingly realistic outputs to fool the Discriminator.

The Simple Version

Imagine a counterfeiter trying to create fake paintings, and an art expert trying to detect forgeries. The counterfeiter gets better and better at making fakes, and the expert gets better and better at spotting them. Eventually, the counterfeiter becomes so skilled that the expert can’t tell the difference.

GANs work the same way. The Generator (counterfeiter) creates fake images, and the Discriminator (expert) tries to tell real images from fake ones. They train together, each pushing the other to improve. Eventually, the Generator produces images so realistic that the Discriminator can’t distinguish them from real images.

Detailed Explanation

Introduced by Ian Goodfellow in 2014, GANs pioneered adversarial training for generative models.

The Adversarial Game:

1. Generator (G):

2. Discriminator (D):

3. Training Process:

Mathematical Formulation:

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

GAN Variants:

1. DCGAN (Deep Convolutional GAN):

2. StyleGAN / StyleGAN2:

3. CycleGAN:

4. Pix2Pix:

5. Progressive GAN:

Challenges:

Applications:

Key Characteristics

Business Context

While diffusion models have largely superseded GANs for image generation, GANs remain relevant for specific applications:

Where GANs Excel:

Enterprise Applications:

GANs vs. Diffusion Models:

Aspect GANs Diffusion Models
Generation Speed Fast (single pass) Slow (iterative)
Quality Good State-of-the-art
Diversity Limited (mode collapse) High
Training Stability Unstable Stable
Controllability Moderate High (text conditioning)

Real-World Analogy

A forger and a detective in an endless game of cat and mouse. The forger creates increasingly sophisticated forgeries, and the detective develops better detection methods. Both improve through this adversarial relationship. Eventually, the forger becomes so skilled that even the best detective can’t spot the fakes — but the forger has learned to create convincing forgeries, not original art.

Code Example

# Simple GAN using PyTorch
import torch
import torch.nn as nn
import torch.optim as optim

# Generator: Creates fake images from noise
class Generator(nn.Module):
    def __init__(self, latent_dim=100, img_shape=(1, 28, 28)):
        super().__init__()
        self.img_shape = img_shape
        
        self.model = nn.Sequential(
            nn.Linear(latent_dim, 128),
            nn.LeakyReLU(0.2),
            nn.BatchNorm1d(128),
            nn.Linear(128, 256),
            nn.LeakyReLU(0.2),
            nn.BatchNorm1d(256),
            nn.Linear(256, 512),
            nn.LeakyReLU(0.2),
            nn.BatchNorm1d(512),
            nn.Linear(512, int(torch.prod(torch.tensor(img_shape)))),
            nn.Tanh()
        )
    
    def forward(self, z):
        img = self.model(z)
        img = img.view(img.size(0), *self.img_shape)
        return img

# Discriminator: Classifies real vs. fake
class Discriminator(nn.Module):
    def __init__(self, img_shape=(1, 28, 28)):
        super().__init__()
        
        self.model = nn.Sequential(
            nn.Linear(int(torch.prod(torch.tensor(img_shape))), 512),
            nn.LeakyReLU(0.2),
            nn.Linear(512, 256),
            nn.LeakyReLU(0.2),
            nn.Linear(256, 1),
            nn.Sigmoid()
        )
    
    def forward(self, img):
        img_flat = img.view(img.size(0), -1)
        validity = self.model(img_flat)
        return validity

# Initialize models
generator = Generator()
discriminator = Discriminator()

# Loss and optimizers
adversarial_loss = nn.BCELoss()
optimizer_G = optim.Adam(generator.parameters(), lr=0.0002, betas=(0.5, 0.999))
optimizer_D = optim.Adam(discriminator.parameters(), lr=0.0002, betas=(0.5, 0.999))

# Training loop (simplified)
for epoch in range(100):
    for imgs, _ in dataloader:
        batch_size = imgs.size(0)
        
        # Labels for real and fake images
        real_labels = torch.ones(batch_size, 1)
        fake_labels = torch.zeros(batch_size, 1)
        
        # Train Discriminator
        optimizer_D.zero_grad()
        
        # Real images
        real_loss = adversarial_loss(discriminator(imgs), real_labels)
        
        # Fake images
        z = torch.randn(batch_size, 100)
        fake_imgs = generator(z)
        fake_loss = adversarial_loss(discriminator(fake_imgs.detach()), fake_labels)
        
        d_loss = (real_loss + fake_loss) / 2
        d_loss.backward()
        optimizer_D.step()
        
        # Train Generator
        optimizer_G.zero_grad()
        
        # Generate fake images and try to fool discriminator
        z = torch.randn(batch_size, 100)
        fake_imgs = generator(z)
        g_loss = adversarial_loss(discriminator(fake_imgs), real_labels)
        
        g_loss.backward()
        optimizer_G.step()

Common Misconceptions

Sources & Further Reading