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

রিকারেন্ট নিউরাল নেটওয়ার্ক

RNN for NLP

Memory ওয়ালা first neural network।

ভূমিকা

আগের সব model এ একটা সমস্যা ছিল — তারা word order ভুলে যেত। 'Dog bites man' আর 'Man bites dog' — BoW এর কাছে same। কিন্তু ভাষায় sequence matters! এই সমস্যার প্রথম সমাধান এলো — Recurrent Neural Network (RNN) — যেটার memory আছে।

ধারণা

RNN একটি neural network যা sequence data process করে এক element করে, প্রতিটা step এ একটা hidden state ধরে রাখে যেটা আগের সব input এর information carry করে। সূত্র: h_t = tanh(W_x · x_t + W_h · h_{t-1} + b)। অর্থাৎ current input + previous memory → new memory।

সহজ ব্যাখ্যা

ভাবুন আপনি একটা গল্প পড়ছেন — প্রতিটা শব্দ পড়ার সময় আপনি আগের শব্দগুলো মনে রাখছেন, না হলে গল্প বুঝতেন না। RNN ও তাই — প্রতিটা time step এ নতুন word নেয়, কিন্তু আগের context (hidden state) সাথে নিয়ে যায়। একই network বারবার চলে (recurrent), শুধু input আর hidden state পরিবর্তন হয়।

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

  • Language modeling — next word prediction।
  • Text generation — character বা word level।
  • Speech recognition — audio sequence থেকে text।
  • Time series prediction — stock, weather।
  • Machine translation এর প্রথম generation।

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

1
Step 1 — Tokenize ও index
Text কে integer sequence এ রূপান্তর।
2
Step 2 — Embedding layer
Each token কে dense vector এ map।
3
Step 3 — RNN cell
Sequence এর প্রতিটা step এ hidden state update।
4
Step 4 — Output layer
Hidden state থেকে prediction (classification বা next word)।
5
Step 5 — BPTT
Backpropagation Through Time দিয়ে train।

Python কোড

import torch
import torch.nn as nn

class SimpleRNN(nn.Module):
    def __init__(self, vocab_size, embed_dim, hidden_dim, num_classes):
        super().__init__()
        self.embedding = nn.Embedding(vocab_size, embed_dim)
        self.rnn = nn.RNN(embed_dim, hidden_dim, batch_first=True)
        self.fc = nn.Linear(hidden_dim, num_classes)

    def forward(self, x):
        emb = self.embedding(x)
        out, hidden = self.rnn(emb)
        last = out[:, -1, :]
        return self.fc(last)

vocab_size = 1000
model = SimpleRNN(vocab_size, embed_dim=32, hidden_dim=64, num_classes=2)

dummy_input = torch.randint(0, vocab_size, (4, 10))
logits = model(dummy_input)
print("Input shape:", dummy_input.shape)
print("Output logits shape:", logits.shape)
ব্যাখ্যা

nn.Embedding token id কে dense vector এ রূপান্তর করে। nn.RNN sequence process করে — out হলো প্রতিটা time step এর hidden state, hidden হলো final state। out[:, -1, :] দিয়ে শেষ time step এর representation নিয়ে fc layer এ classification।

সাধারণ ভুল

  • Vanishing gradient — long sequence এ RNN আগের context ভুলে যায়।
  • Exploding gradient — gradient clipping দরকার।
  • Sequence length খুব বড় হলে training slow।
  • Padding handle না করলে variable length batch এ সমস্যা।

অনুশীলন

  1. IMDB review তে RNN দিয়ে sentiment classify করুন।
  2. Character-level RNN দিয়ে name generator বানান।
  3. nn.RNN vs manual forward loop implement করে compare।
  4. Gradient clipping (torch.nn.utils.clip_grad_norm_) try করুন।

ছোট প্রজেক্ট

Next Word Predictor

একটা small RNN train করুন কিছু sentence এ যা শেষ word predict করে। PyTorch দিয়ে embedding + RNN + linear layer — input 4 word, output 5th word।

সারাংশ

  • RNN = sequence এর জন্য neural network with memory।
  • Hidden state আগের সব context carry করে।
  • একই weight বারবার apply হয় — তাই 'recurrent'।
  • Vanishing gradient = long-term dependency শিখতে পারে না।
  • এই দুর্বলতা থেকেই জন্ম LSTM এর।