Chapter 29

RNN

RNN
🎬 স্মৃতিময় নেটওয়ার্ক
Recurrent Neural Network (RNN) sequence-এর জন্য তৈরি — text, time series, speech। প্রতিটি timestep-এ আগের hidden state ও বর্তমান ইনপুট নিয়ে নতুন state তৈরি করে।

মূল সমীকরণ

h_t = tanh(W_xh · x_t + W_hh · h_{t-1} + b_h)
y_t = W_hy · h_t + b_y

একই weight প্রতিটি timestep-এ — parameter sharing। ফলে variable-length input handle করা যায়।

Unrolled View

x1 → [RNN] → h1 → [RNN] → h2 → [RNN] → h3 → ...
      ↑           ↑           ↑
     same W      same W      same W

সমস্যা — Vanishing & Exploding Gradient

দীর্ঘ sequence-এ BPTT-তে gradient হয় বহুগুণ ছোট হয়ে যায় (vanishing) — দূরের context ভুলে যায়; বা বিস্ফোরিত হয় (exploding) — training অস্থির। সমাধান: LSTM/GRU, gradient clipping, proper initialization (Xavier/He)।

PyTorch দিয়ে সরল RNN

import torch, torch.nn as nn

class RNNClassifier(nn.Module):
    def __init__(self, vocab, emb=64, hid=128, n_class=2):
        super().__init__()
        self.emb = nn.Embedding(vocab, emb, padding_idx=0)
        self.rnn = nn.RNN(emb, hid, batch_first=True)
        self.fc  = nn.Linear(hid, n_class)
    def forward(self, x):
        x = self.emb(x)
        out, h = self.rnn(x)
        return self.fc(h.squeeze(0))

Keras উদাহরণ

from tensorflow.keras import layers, models
m = models.Sequential([
    layers.Embedding(10000, 64, mask_zero=True),
    layers.SimpleRNN(128),
    layers.Dense(1, activation="sigmoid"),
])

Bi-directional RNN

সামনে ও পিছনে দুদিক থেকে পড়ে — context উভয়দিক থেকে। POS tagging, NER-এ দারুণ।

layers.Bidirectional(layers.SimpleRNN(128))

Sequence Task-এর ধরন

Pattern
উদাহরণ
আউটপুট
One → Many
Image captioning
Sequence
Many → One
Sentiment
Single
Many → Many (sync)
POS tagging
Same length
Many → Many (async)
Translation
Diff length
🔑 কখন RNN?
আজকাল Transformer প্রভাবশালী, তবু ছোট ডেটা, on-device, বা streaming task-এ RNN/LSTM এখনও কার্যকর।

অনুশীলন

১. IMDB sentiment-এ SimpleRNN train করে accuracy দেখুন।

২. Bi-RNN বনাম uni-RNN তুলনা করুন।

৩. Gradient clipping চালু/বন্ধ করে training stability দেখুন।

সারসংক্ষেপ

✨ এই অধ্যায়ে যা শিখলাম
  • RNN sequence-এর জন্য — hidden state বহন করে।
  • Vanishing gradient → LSTM/GRU দরকার।
  • Bi-RNN context উভয়দিক থেকে পায়।