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