পাঠ ৬ · ২৮-এর মধ্যে · মডিউল ২

Autoencoder পরিচিতি — নিজেকেই পুনর্গঠন

Autoencoders — encoder, bottleneck, decoder
৬ মিনিট পড়া মধ্যম · Intermediate PyTorch কোডসহ

এই পাঠে যা শিখবেন

  • Encoder, bottleneck, decoder — তিনটি অংশের কাজ ও জ্যামিতিক অর্থ
  • Reconstruction loss কেন কাজ করে — self-supervised শেখার যাদু
  • Denoising autoencoder — শব্দের মধ্যে থেকে আসল ছবি বের করা
  • PyTorch দিয়ে MNIST-এ একটি ছোট autoencoder train করা

১ · Autoencoder — কী এবং কেন

একটি autoencoderAutoencoderএকটি neural network যা input $x$-কে নিজেই reconstruct করতে শেখে। মধ্যবর্তী bottleneck $z$ একটি compressed representation। ১৯৮০-র দশকে Hinton ও অন্যরা পরিচয় করান; ২০০৬-এ deep belief network পেপারে গুরুত্বপূর্ণ হয়ে ওঠে। এমন একটি neural network যা নিজের input কেই output হিসেবে ফিরিয়ে আনার চেষ্টা করে। শুনতে অদ্ভুত — "যা পাচ্ছি তাই ফেরত দেব?" — কিন্তু একটি বাধ্যবাধকতা আছে: মাঝখানে একটি সংকীর্ণ bottleneck দিয়ে যেতে হয়। এই বাধ্যবাধকতাই network-কে বাধ্য করে গুরুত্বপূর্ণ feature শেখাতে।

তিন অংশ

১) Encoder $E$: $x \mapsto z$ — উচ্চ-মাত্রিক input-কে কম-মাত্রিক code-এ চাপে।
২) Bottleneck $z$: compressed representation — শেখা feature।
৩) Decoder $D$: $z \mapsto \hat{x}$ — code থেকে input পুনর্গঠন।

গাণিতিকভাবে: $\hat{x} = D(E(x))$, এবং loss হলো $\mathcal{L} = \|x - \hat{x}\|^2$ (MSE)।

ভাবুন আপনি একজন বন্ধুকে ফোনে একটি ছবি বর্ণনা করছেন — মাত্র ১০ শব্দে। বন্ধু সেই বর্ণনা শুনে ছবিটি আঁকার চেষ্টা করছে। আপনি = encoder, বন্ধু = decoder, ১০ শব্দ = bottleneck $z$। ভালো বর্ণনা দিতে শেখা মানেই — ছবির সবচেয়ে গুরুত্বপূর্ণ feature বাছাই করতে শেখা।

২ · কেন bottleneck দরকার?

যদি $z$-এর dimension input-এর সমান হতো, network সহজেই identity function ($\hat{x} = x$) শিখে নিত — কিছুই না শিখে। Bottleneck এমন একটি constraint তৈরি করে যেখানে network বাছাই করতে বাধ্য হয় — কোন তথ্য রাখবে, কোনটি ফেলে দেবে।

MNIST-এ একটি $28 \times 28 = 784$-মাত্রিক ছবি যদি $z \in \mathbb{R}^{32}$-এ চাপা যায়, তবু decoder প্রায় হুবহু পুনর্গঠন করতে পারে — কারণ MNIST ছবিগুলো একটি অনেক ছোট manifoldManifoldউচ্চ-মাত্রিক space-এর মধ্যে একটি কম-মাত্রিক curved surface। "মুখ" ছবিগুলো ১৫০,৫২৮-D pixel space-এর সব পয়েন্ট নয় — অনেক ছোট manifold-এ বাস করে। DL-এর মূল assumption।-এ বাস করে।

৩ · Reconstruction loss

সবচেয়ে সাধারণ — pixel-wise MSE:

$$\mathcal{L}_{\text{recon}} = \frac{1}{N} \sum_{i=1}^{N} \| x_i - D(E(x_i)) \|^2$$

Binary input (যেমন MNIST grayscale 0-1) হলে binary cross-entropy বেশি ভাল কাজ করে:

$$\mathcal{L}_{\text{BCE}} = -\sum_j \big[ x_j \log \hat{x}_j + (1-x_j) \log (1-\hat{x}_j) \big]$$

Loss নিজেই input থেকে আসে — তাই এটি self-supervised। Daraz-এর কোটি কোটি unlabeled product image autoencoder দিয়ে feature শেখাতে ব্যবহার করা যায় — কোনো manual annotation ছাড়াই।

৪ · Denoising autoencoder

Vincent et al. (২০০৮) একটি দারুণ idea দিলেন — input-এ noise যোগ করে দাও, কিন্তু target থাকুক original। Network বাধ্য হবে শুধু feature না, robust feature শিখতে।

$$\tilde{x} = x + \epsilon, \quad \epsilon \sim \mathcal{N}(0, \sigma^2 I)$$ $$\mathcal{L} = \| x - D(E(\tilde{x})) \|^2$$

বাংলা handwriting দাগ-যুক্ত পুরনো কাগজে স্ক্যান করা হলে — denoising AE সেই দাগ সরিয়ে clean digit বের করতে পারে।

Autoencoder — input → code → reconstruction x → E → z → D → x̂ Input x 28×28 784-D Encoder E 784→256→64→32 z (32-D) bottleneck · compressed গুরুত্বপূর্ণ feature Decoder D 32→64→256→784 Output x̂ 28×28 reconstructed L = ‖x − x̂‖²
Autoencoder pipeline — encoder চাপে, bottleneck $z$ ধরে রাখে, decoder পুনর্গঠন করে। Loss পুরো network-কে train করে।

৫ · PyTorch দিয়ে MNIST autoencoder

Python · PyTorch
import torch
import torch.nn as nn

class AE(nn.Module):
    def __init__(self, latent_dim=32):
        super().__init__()
        self.encoder = nn.Sequential(
            nn.Linear(784, 256), nn.ReLU(),
            nn.Linear(256, 64), nn.ReLU(),
            nn.Linear(64, latent_dim),
        )
        self.decoder = nn.Sequential(
            nn.Linear(latent_dim, 64), nn.ReLU(),
            nn.Linear(64, 256), nn.ReLU(),
            nn.Linear(256, 784), nn.Sigmoid(),
        )

    def forward(self, x):
        z = self.encoder(x)
        return self.decoder(z), z

model = AE()
opt = torch.optim.Adam(model.parameters(), lr=1e-3)
loss_fn = nn.MSELoss()

    
Encoder ৭৮৪-D pixel-কে ৩২-D-এ চাপে; decoder সেখান থেকে ফিরিয়ে আনে। শেষে Sigmoid — pixel value 0-1 range-এ আসে।

৬ · Training loop

Python · PyTorch
# মনে করুন train_loader MNIST batch দিচ্ছে
for epoch in range(10):
    for x, _ in train_loader:        # label ব্যবহৃত না — self-supervised
        x = x.view(-1, 784)
        x_hat, z = model(x)
        loss = loss_fn(x_hat, x)
        opt.zero_grad()
        loss.backward()
        opt.step()
    print(f"epoch {epoch+1}: loss={loss.item():.4f}")

    

৭ · কেন plain AE generate করতে পারে না?

Autoencoder train হওয়ার পর — যদি আমরা random $z \sim \mathcal{N}(0, I)$ নিয়ে decoder চালাই, output সাধারণত বাজে হয়। কারণ training-এ যে $z$-গুলো ব্যবহার হয়েছে, তারা latent space-এর কিছু অজানা region-এ ছড়িয়ে — কোনো fixed distribution মানে না।

Plain AE compression ও denoising-এ ভাল, কিন্তু generation-এর জন্য নয়। সমাধান — $z$-এর উপর একটি prior চাপিয়ে দাও। সেটাই পরের পাঠের VAE।

৮ · Autoencoder-এর ব্যবহার আজকের দিনে

  • Pretraining: বড় unlabeled dataset-এ feature শেখা, তারপর downstream task-এ fine-tune।
  • Anomaly detection: reconstruction error বেশি = অস্বাভাবিক sample। bKash fraud detection-এ ব্যবহারযোগ্য।
  • Compression: JPEG-এর neural alternative — Stable Diffusion-এর VAE encoder ছবি ৮× downscale করে।
  • Denoising: পুরনো কাগজে handwritten Bangla scanning।
  • Embedding: $z$-কে similarity search-এ ব্যবহার।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ Autoencoder ও PCA — দু'টোই dimensionality reduction। কীভাবে আলাদা? কখন কোনটি বেছে নেবেন?

PCA (Pearson, ১৯০১) ও autoencoder (Hinton-এর দল, ১৯৮০-৯০ এর দশক) — দু'টোই উচ্চ-মাত্রা থেকে কম-মাত্রায় projection। কিন্তু গাণিতিক ও ব্যবহারিক দিক থেকে আলাদা।

PCA:

  • Linear — শুধু variance সর্বোচ্চ এমন direction বাছে।
  • Closed-form solution — covariance matrix-এর eigendecomposition। কোনো training লুপ নেই।
  • Deterministic — একই data মানে একই output।
  • Interpretable — প্রতিটি principal component একটি linear combination।
  • Curve বা manifold ধরতে পারে না — যেমন Swiss roll dataset।

Autoencoder:

  • Non-linear (যদি hidden layer-এ ReLU/sigmoid থাকে)।
  • Iterative training — gradient descent।
  • Stochastic — initialization ভিন্ন হলে ভিন্ন solution।
  • Manifold শিখতে পারে — যা PCA পারে না।
  • মজার তথ্য: hidden layer-এ activation না থাকলে (linear AE) — solution mathematically PCA-র subspace-এর সমান।

কখন কী বাছবেন:

  • Data ছোট (১,০০০ sample) ও approximately linear → PCA সহজ ও দ্রুত।
  • Data বড় ও non-linear (ছবি, audio) → autoencoder।
  • Quick exploratory analysis → PCA।
  • Production-এ embedding দরকার → autoencoder, পরে contrastive learning বা SimCLR।

আধুনিক context: ২০২৪-এ pretraining-এর জন্য বেশিরভাগ মানুষ autoencoder-এর বদলে contrastive (SimCLR, CLIP) বা masked (MAE — He et al., ২০২২) approach ব্যবহার করেন। তবু Stable Diffusion-এর latent VAE প্রমাণ — autoencoder ধারণা এখনো কেন্দ্রীয়।

প্র ০২ Bottleneck dimension কত হওয়া উচিত? খুব ছোট বা খুব বড় হলে কী সমস্যা?

Bottleneck dimension $d$ — autoencoder ডিজাইনের সবচেয়ে গুরুত্বপূর্ণ hyperparameter। এর সঠিক মান data-র অন্তর্নিহিত manifold-এর dimension-এর কাছাকাছি হওয়া উচিত।

খুব ছোট $d$:

  • Information bottleneck — গুরুত্বপূর্ণ feature-ও হারিয়ে যাবে।
  • Reconstruction blurry, ছবিতে detail কম।
  • MNIST-এ $d=2$ চেষ্টা করলে — ১০ digit আলাদা cluster তৈরি হয়, কিন্তু intra-class variation হারিয়ে যায়।

খুব বড় $d$:

  • Identity function-এর কাছাকাছি — কিছুই compress হলো না।
  • Generalization দুর্বল — noise-ও mেমরাইজ করতে পারে।
  • Downstream task-এ feature কম discriminative।

Sweet spot বের করার পদ্ধতি:

  • Reconstruction curve: বিভিন্ন $d$-তে validation MSE plot করুন। Elbow point-এ থামুন।
  • Intrinsic dimensionality estimation: Levina-Bickel (২০০৪) বা TwoNN (Facco et al., ২০১৭) — data-র manifold dimension প্রাক্কলন।
  • Downstream task: $z$-কে classifier-এ feed করে accuracy দেখুন।
  • Empirical heuristic: MNIST-এ ১৬-৩২ ভাল; CIFAR-১০-এ ৬৪-১২৮; ImageNet-এ ৫১২-২০৪৮।

আধুনিক উদাহরণ: Stable Diffusion-এর VAE encoder $512 \times 512 \times 3 = 786,432$ pixel-কে $64 \times 64 \times 4 = 16,384$ latent-এ চাপে — প্রায় ৪৮× compression। এই dimension সাবধানে tuned — অনেক experimentation-এর ফল।

Trade-off summary: $d$ বড় = reconstruction ভাল কিন্তু feature কম useful; $d$ ছোট = strong feature কিন্তু information loss। আপনার task-এর উপর নির্ভর — generation বনাম classification বনাম anomaly detection-এ ভিন্ন।

প্র ০৩ Autoencoder কেন anomaly detection-এ ভাল কাজ করে? bKash transaction monitor-এ কীভাবে ব্যবহার করবেন?

Anomaly detection-এ autoencoder-এর জাদু — সে শুধু "স্বাভাবিক" data-এ train হয়। ফলে normal sample সে ভাল reconstruct করে, কিন্তু abnormal sample reconstruct করতে পারে না — কারণ সেই pattern সে দেখেনি।

মূল আইডিয়া:

  • Train: শুধু verified-normal transaction-এ AE train।
  • Inference: নতুন transaction $x$-এ error = ‖x − D(E(x))‖ হিসাব।
  • Threshold $\tau$ ছাড়িয়ে গেলে — anomaly flag।

bKash-এর জন্য feature design:

  • Amount (log-transform), recipient type, time-of-day (cyclic encoding), day-of-week, sender's average amount, recipient's age in network, geographic distance, device fingerprint, recent transaction velocity।
  • Normalize সব feature — AE distance-sensitive।
  • Categorical → embedding (small AE for embedding learning)।

Threshold বাছাই:

  • Validation set-এ false positive rate অনুসারে ROC curve।
  • Bangladesh Bank guideline + business loss function — false negative (fraud miss) সাধারণত false positive (good user freeze) থেকে অনেক বেশি costly।
  • Dynamic threshold — time-of-day, festival period (ঈদ-এ legitimate transaction spike) অনুসারে adjust।

Limitation:

  • Concept drift — fraud pattern বদলায়। AE-কে periodically retrain দরকার।
  • "Adversarial fraud" — যদি attacker AE structure জানে, low-error fraud design করতে পারে।
  • Class imbalance — true anomaly rate ০.১% হলে threshold tuning কঠিন।

আধুনিক alternative:

  • Isolation Forest (Liu et al., ২০০৮) — দ্রুত, interpretable।
  • Deep SVDD (Ruff et al., ২০১৮) — AE + one-class SVM principle।
  • Diffusion-based anomaly detection (২০২৩+) — denoising score difference।

Production tip: AE-কে ensemble-এ রাখুন — rule-based + AE + gradient-boosted classifier। প্রতিটি ভিন্ন pattern ধরে।

প্র ০৪ Stable Diffusion-এ VAE-encoder কেন ব্যবহার হয়? Pixel space-এ সরাসরি diffusion চালালে কী সমস্যা?

Latent Diffusion Model (Rombach et al., ২০২২ — Stable Diffusion-এর মূল পেপার) একটি ক্রান্তিকারী idea — diffusion process pixel space-এ না চালিয়ে, একটি pretrained autoencoder-এর latent space-এ চালাও। এতে compute অর্ধেকের কম হয়, quality প্রায় একই থাকে।

Pixel-space diffusion-এর সমস্যা:

  • Compute বিশাল: $512 \times 512 \times 3 = 786{,}432$ dimension-এ U-Net চালানো — প্রতিটি timestep-এ। ১০০০ step × ব্যাচ = বিশাল GPU।
  • Memory: attention $O(n^2)$ — pixel space-এ unmanageable।
  • Perceptually irrelevant detail: high-frequency texture (yes/no important) reconstruction-এ অপ্রয়োজনীয় effort।
  • OpenAI GLIDE (২০২২) ও DALL-E 2-এর pixel diffusion training-এ লক্ষ লক্ষ ডলার GPU।

Latent diffusion-এর সমাধান:

  • VAE encoder $512 \times 512 \times 3$ → $64 \times 64 \times 4$ — ৪৮× কম dimension।
  • Diffusion U-Net এই $64 \times 64 \times 4$ latent-এ কাজ করে — ৪৮× কম compute।
  • Final step-এ VAE decoder latent → pixel।
  • Stable Diffusion 1.5 একটি consumer GPU-তে inference সম্ভব করেছে — কারণ এই trick।

VAE-এর বাছাই কেন গুরুত্বপূর্ণ:

  • Encoder-এর reconstruction "perceptually" ভাল হতে হবে — এজন্য pure MSE-এর বদলে LPIPS perceptual loss + GAN-style adversarial loss সাথে train।
  • Latent space-এর distribution "smooth" হতে হবে — যাতে diffusion সহজে navigate করতে পারে।
  • SD VAE-এর scaling factor ০.১৮২১৫ — যাতে latent-এর variance ১-এর কাছাকাছি থাকে। গুরুত্বপূর্ণ engineering detail।

Trade-off:

  • Pixel-level fine detail (যেমন face বা text) VAE encode-decode-এ একটু blur — তাই SD অনেক সময় hand বা text বাজে generate করে।
  • SD 3 (২০২৪) এই VAE-এর বদলে ১৬-channel improved version ব্যবহার করে — fidelity উন্নত।

মূল উপলব্ধি: autoencoder যেন "perceptually meaningful compression"-এর engine হিসেবে আজও কেন্দ্রীয়। Diffusion মডেল বিশাল হলেও, একটা ভাল AE তাকে ১০০× সস্তা করে দেয়। Generative AI-র অর্থনীতিতে এই compression-পদ্ধতি critical।

অনুশীলন

  1. হাতে-কলমে: $784 \to 256 \to 64 \to 32$ encoder-এর মোট parameter সংখ্যা হিসাব করুন (bias সহ)।
    • Layer 1: $784 \times 256 + 256 = 200{,}960$
    • Layer 2: $256 \times 64 + 64 = 16{,}448$
    • Layer 3: $64 \times 32 + 32 = 2{,}080$
    • মোট encoder = $219{,}488$ parameter। Decoder mirror — প্রায় একই, মোট AE ≈ ৪৪০K।
  2. কোডে চেষ্টা: উপরের AE-এর encoder-এ ReLU বাদ দিয়ে দেখুন কী হয়। কেন reconstruction PCA-র সমান হয়ে যায়?

    সব layer linear হলে — কয়েকটি linear transformation-এর composition নিজেই linear। ফলে সম্পূর্ণ network একটি $W_{\text{full}} = W_3 W_2 W_1$ ম্যাট্রিক্স। MSE loss-এ এর optimal solution গাণিতিকভাবে PCA-র top-$d$ eigenvector subspace-এর সমান (Bourlard ও Kamp, ১৯৮৮)। তাই non-linear activation-ই autoencoder-কে PCA থেকে শক্তিশালী করে।

  3. চিন্তা করুন: Daraz-এর ১ কোটি product image আছে কিন্তু label নেই। Autoencoder কীভাবে কাজে লাগাবেন? কী feature বের করে কী business-value তৈরি হবে?
    • সব ছবি ResNet-style encoder + decoder-এ self-supervised train (বা MAE)।
    • $z$-vector → product embedding। Similar product search ("এর মতো আরো দেখাও") সম্ভব।
    • Anomaly: ভুল category-তে যাওয়া ছবি ধরা।
    • Cold-start recommendation: নতুন product-এর শুধু ছবি থাকলেও — embedding similarity দিয়ে initial recommendation।
    • Fashion-এ "এই pattern আমার পছন্দ" → similar pattern খোঁজা।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

কোড রানার কাজ না করলে? ব্রাউজারে কাজ না করলে Google Colab ব্যবহার করুন — Google-এর ফ্রি অনলাইন Python পরিবেশ, শুধু Gmail অ্যাকাউন্ট লাগে।
পূর্ববর্তী পাঠ
পাঠ ৫ · Sampling