Sequence to Sequence Models
Translation এবং summarization এর foundation।
এখন পর্যন্ত আমরা একটা sequence input → একটা label predict করছিলাম। কিন্তু machine translation এ input এক ভাষার sentence, output আরেক ভাষার sentence — দুটোই sequence, length আলাদা! এই problem এর architecture: Sequence-to-Sequence (Seq2Seq) — modern translation, summarization, chatbot এর foundation।
Seq2Seq architecture দুটো অংশ — Encoder এবং Decoder। Encoder (RNN/LSTM/GRU) input sequence কে একটা context vector এ compress করে। Decoder সেই context vector থেকে শুরু করে এক element করে output sequence generate করে। Translation, summarization, question answering, chatbot — সব এই pattern এ।
ভাবুন একজন translator — সে প্রথমে পুরো English sentence পড়ে মাথায় meaning দাঁড় করায় (encoding), তারপর সেই meaning থেকে এক word করে Bangla sentence লেখে (decoding)। Encoder থেকে decoder এ যায় শুধু একটা context vector — সেটাই সব meaning ধরে রাখে। (Attention আসার আগে এটাই bottleneck ছিল!)
import torch
import torch.nn as nn
class Encoder(nn.Module):
def __init__(self, vocab_size, embed_dim, hidden_dim):
super().__init__()
self.embedding = nn.Embedding(vocab_size, embed_dim)
self.gru = nn.GRU(embed_dim, hidden_dim, batch_first=True)
def forward(self, src):
emb = self.embedding(src)
_, hidden = self.gru(emb)
return hidden
class Decoder(nn.Module):
def __init__(self, vocab_size, embed_dim, hidden_dim):
super().__init__()
self.embedding = nn.Embedding(vocab_size, embed_dim)
self.gru = nn.GRU(embed_dim, hidden_dim, batch_first=True)
self.fc = nn.Linear(hidden_dim, vocab_size)
def forward(self, tgt_token, hidden):
emb = self.embedding(tgt_token)
out, hidden = self.gru(emb, hidden)
logits = self.fc(out)
return logits, hidden
class Seq2Seq(nn.Module):
def __init__(self, src_vocab, tgt_vocab, embed_dim=64, hidden_dim=128):
super().__init__()
self.encoder = Encoder(src_vocab, embed_dim, hidden_dim)
self.decoder = Decoder(tgt_vocab, embed_dim, hidden_dim)
def forward(self, src, tgt):
hidden = self.encoder(src)
logits, _ = self.decoder(tgt, hidden)
return logits
model = Seq2Seq(src_vocab=2000, tgt_vocab=2500)
src = torch.randint(0, 2000, (4, 10))
tgt = torch.randint(0, 2500, (4, 12))
out = model(src, tgt)
print("Output shape:", out.shape)Encoder source sequence read করে শুধু final hidden state return করে — এটাই context vector। Decoder সেই hidden দিয়ে শুরু করে, target token গুলো feed করে output predict করে। Training এ teacher forcing — actual previous target দেওয়া হয়। Inference এ decoder এর own prediction পরের step এ feed হয়।
৫০-১০০ টা English-Bangla phrase pair নিয়ে একটা Seq2Seq (encoder-decoder GRU) train করুন। Teacher forcing দিয়ে train, greedy decoding দিয়ে inference। Vocabulary, padding, <SOS>/<EOS> token সব properly handle করুন।