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 পরিবর্তন হয়।
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।
একটা small RNN train করুন কিছু sentence এ যা শেষ word predict করে। PyTorch দিয়ে embedding + RNN + linear layer — input 4 word, output 5th word।