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

জিআরইউ

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 দিয়েই কাজ চলে যায়।

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

  • Mobile NLP — কম resource এ ভালো performance।
  • Real-time speech processing।
  • Time series forecasting।
  • Music/audio generation।
  • Resource-constrained chatbot।

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

1
Step 1 — Update gate
z_t = σ(W_z · [h_{t-1}, x_t]) — কতটুকু update হবে।
2
Step 2 — Reset gate
r_t = σ(W_r · [h_{t-1}, x_t]) — past কতটুকু reset।
3
Step 3 — Candidate hidden
h̃_t = tanh(W · [r_t * h_{t-1}, x_t])।
4
Step 4 — Final hidden
h_t = (1 - z_t) * h_{t-1} + z_t * h̃_t।

Python কোড

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)।

সাধারণ ভুল

  • GRU সব ক্ষেত্রে LSTM থেকে ভালো ভাবা — task ভেদে আলাদা।
  • Bidirectional ব্যবহার না করা যখন full context দরকার।
  • Hidden dim ছোট রেখে underfit।
  • Sequence labeling এ শুধু last hidden ব্যবহার — প্রতিটা step এর output লাগবে।

অনুশীলন

  1. GRU দিয়ে POS tagger বানান CoNLL data এ।
  2. GRU vs LSTM same task এ training time + accuracy compare।
  3. Bidirectional GRU দিয়ে NER।
  4. Stacked GRU (num_layers=3) এর effect দেখুন।

ছোট প্রজেক্ট

Bi-GRU POS Tagger

একটা small POS-tagged corpus এ Bidirectional GRU train করুন। প্রতিটা token এর জন্য POS tag predict করুক। Padding ও mask সঠিকভাবে handle করুন। Token-level accuracy report করুন।

সারাংশ

  • GRU = simplified LSTM, ২টা gate।
  • কম parameter, faster training।
  • Performance LSTM এর close — task ভেদে winner বদলায়।
  • Sequence labeling, real-time NLP তে popular।
  • RNN family র সবচেয়ে practical choice ছিল pre-Transformer।