GRU
LSTM-এর হালকা এবং fast variant।
LSTM দারুণ, কিন্তু তিনটা gate, cell state — parameters অনেক, training slow। ২০১৪ সালে এলো GRU (Gated Recurrent Unit) — LSTM এর simpler cousin, প্রায় সমান accuracy কিন্তু কম parameter আর faster।
GRU দুটো gate ব্যবহার করে — Reset gate (কতটুকু past ভুলবো) আর Update gate (কতটুকু past রাখবো vs নতুন input নেবো)। আলাদা cell state নেই — শুধু hidden state। কম parameter, faster training, কিন্তু অনেক task এ LSTM এর close performance।
LSTM এর তিনটা gate আর cell state কে যদি smart ভাবে merge করেন — পাবেন GRU। Update gate একসাথে forget আর input এর কাজ করে: 'কত পুরনো রাখব, কত নতুন নেবো' — total = 1। Reset gate ঠিক করে past hidden state কতটুকু current candidate এ মিশবে। দুটো gate দিয়েই কাজ চলে যায়।
import torch
import torch.nn as nn
class GRUTagger(nn.Module):
def __init__(self, vocab_size, embed_dim, hidden_dim, num_tags):
super().__init__()
self.embedding = nn.Embedding(vocab_size, embed_dim)
self.gru = nn.GRU(embed_dim, hidden_dim, batch_first=True, bidirectional=True)
self.fc = nn.Linear(hidden_dim * 2, num_tags)
def forward(self, x):
emb = self.embedding(x)
out, h_n = self.gru(emb)
return self.fc(out)
model = GRUTagger(vocab_size=3000, embed_dim=64, hidden_dim=128, num_tags=10)
dummy = torch.randint(0, 3000, (4, 15))
tag_logits = model(dummy)
print("Output shape:", tag_logits.shape)
print("Params:", sum(p.numel() for p in model.parameters()))nn.GRU LSTM এর alternative — same API কিন্তু কম parameter। bidirectional=True forward + backward দুই দিকেই process করে, তাই hidden_dim * 2। Output shape (batch, seq_len, hidden*2) — প্রতিটা token এর জন্য একটা tag predict করতে চাইলে useful (POS, NER)।
একটা small POS-tagged corpus এ Bidirectional GRU train করুন। প্রতিটা token এর জন্য POS tag predict করুক। Padding ও mask সঠিকভাবে handle করুন। Token-level accuracy report করুন।