রোডম্যাপ
PHASE 4 · অধ্যায় 19

এলএসটিএম

LSTM

Long-term memory ধরে রাখার power।

ভূমিকা

RNN বানালেন, কিন্তু লক্ষ্য করলেন — ৫০ শব্দের বেশি sentence এ model শুরুর কথা ভুলে যায়। সমাধান এলো ১৯৯৭ সালে — LSTM (Long Short-Term Memory) — যা decades ধরে NLP এর backbone ছিল, Transformer আসার আগ পর্যন্ত।

ধারণা

LSTM একটি বিশেষ ধরনের RNN cell যাতে তিনটা gate আছে — Forget gate (কী ভুলবো), Input gate (কী নতুন information রাখবো), Output gate (কী output করবো) — এবং একটা cell state যা long-term memory ধরে রাখে। এই gating mechanism vanishing gradient সমস্যা solve করে।

সহজ ব্যাখ্যা

ভাবুন আপনার মাথায় দুই ধরনের memory — short-term (এখন কী হচ্ছে) আর long-term (গল্পের শুরুর key fact)। Forget gate বলে দেয় কোন পুরনো information আর দরকার নেই, Input gate নতুন কী important সেটা decide করে, Output gate বলে এখন কতটুকু memory ব্যবহার করতে হবে। এই smart filtering এর জন্যই LSTM long sequence এ ভালো।

বাস্তব ব্যবহার

  • Google Translate এর pre-Transformer era।
  • Speech recognition (Siri, Alexa early version)।
  • Handwriting recognition।
  • Music generation।
  • Video activity recognition।

ধাপে ধাপে বিশ্লেষণ

1
Step 1 — Cell state initialize
Long-term memory C_0।
2
Step 2 — Forget gate
f_t = σ(W_f · [h_{t-1}, x_t]) — কোন memory drop।
3
Step 3 — Input gate
নতুন information cell state এ যোগ।
4
Step 4 — Cell state update
C_t = f_t * C_{t-1} + i_t * C̃_t।
5
Step 5 — Output gate
h_t = o_t * tanh(C_t)।

Python কোড

import torch
import torch.nn as nn

class LSTMClassifier(nn.Module):
    def __init__(self, vocab_size, embed_dim, hidden_dim, num_classes):
        super().__init__()
        self.embedding = nn.Embedding(vocab_size, embed_dim)
        self.lstm = nn.LSTM(embed_dim, hidden_dim, batch_first=True, num_layers=2, dropout=0.3)
        self.fc = nn.Linear(hidden_dim, num_classes)

    def forward(self, x):
        emb = self.embedding(x)
        out, (h_n, c_n) = self.lstm(emb)
        last_hidden = h_n[-1]
        return self.fc(last_hidden)

model = LSTMClassifier(vocab_size=5000, embed_dim=64, hidden_dim=128, num_classes=3)
dummy = torch.randint(0, 5000, (8, 20))
logits = model(dummy)
print("Logits shape:", logits.shape)
print("Params:", sum(p.numel() for p in model.parameters()))
ব্যাখ্যা

nn.LSTM RNN এর drop-in replacement, কিন্তু internally 3টা gate আছে। num_layers=2 দিয়ে stacked LSTM, dropout regularization এর জন্য। forward এ (h_n, c_n) tuple — h_n hidden state, c_n cell state। h_n[-1] শেষ layer এর hidden।

সাধারণ ভুল

  • Bidirectional না করা যখন full context দরকার — nn.LSTM(..., bidirectional=True)।
  • শুধু hidden_dim বাড়ানো — দুটো 64 দিম layer একটা 256 এর চেয়ে ভালো হতে পারে।
  • Long sequence এ training slow — GRU বা Transformer consider করুন।
  • Dropout শুধু output এ — recurrent dropout আলাদা।

অনুশীলন

  1. Bidirectional LSTM দিয়ে IMDB sentiment classify করুন।
  2. LSTM vs vanilla RNN — same data এ accuracy compare।
  3. Character-level LSTM দিয়ে Shakespeare-style text generate।
  4. LSTM cell manually implement করে gate গুলো understand করুন।

ছোট প্রজেক্ট

LSTM Sentiment Analyzer

IMDB বা কোনো review dataset এ একটা Bidirectional LSTM train করুন যা positive/negative classify করে। Glove embedding দিয়ে initialize করলে আরো ভালো হবে। Accuracy আর confusion matrix report করুন।

সারাংশ

  • LSTM = gated RNN যা long-term dependency শেখে।
  • তিনটা gate: forget, input, output।
  • Cell state = long-term memory highway।
  • Vanishing gradient সমস্যা মূলত solve।
  • Transformer আসার আগ পর্যন্ত NLP এর king।