LSTM (Long Short-Term Memory) এবং GRU (Gated Recurrent Unit) হল দুটি জনপ্রিয় রিকরেন্ট নিউরাল নেটওয়ার্ক (RNN) আর্কিটেকচার, যা প্রাকৃতিক ভাষা প্রক্রিয়াকরণ (NLP) এর বিভিন্ন কাজে অত্যন্ত কার্যকর। Text Classification-এ, LSTM এবং GRU টেক্সটের সিকোয়েন্স (যেমন শব্দের সিকোয়েন্স) প্রক্রিয়া করতে সহায়ক, এবং এই সিকোয়েন্সের ভিত্তিতে শ্রেণীকরণ (classification) করতে পারে।
এখানে আমরা LSTM এবং GRU ব্যবহার করে Text Classification মডেল তৈরি করার পদ্ধতি ব্যাখ্যা করব। আমরা CNTK বা অন্যান্য লাইব্রেরি (যেমন TensorFlow বা PyTorch) ব্যবহার করতে পারি, তবে এই উদাহরণে আমরা মূলত PyTorch ব্যবহার করব কারণ এটি খুব জনপ্রিয় এবং ব্যবহারকারী-বান্ধব।
LSTM/GRU ব্যবহার করে Text Classification করার পদক্ষেপ
১. ডেটা প্রস্তুতি
প্রথমত, আমাদের টেক্সট ডেটার প্রক্রিয়াকরণ করতে হবে। টেক্সট ডেটা সরাসরি নিউরাল নেটওয়ার্কে প্রবাহিত হতে পারে না, তাই এটি tokenization, padding এবং vectorization করতে হবে।
Tokenization:
টেক্সটকে ছোট ছোট tokens (যেমন, শব্দ বা অক্ষর) এ বিভক্ত করা হয়।
Padding:
ভিন্ন দৈর্ঘ্যের সিকোয়েন্সকে সমান দৈর্ঘ্যে আনার জন্য padding ব্যবহার করা হয়।
Vectorization:
টেক্সটের প্রতিটি টোকেন একটি সংখ্যা বা ভেক্টরে রূপান্তরিত হয়। সাধারণত word embeddings (যেমন GloVe বা Word2Vec) ব্যবহার করা হয়।
from torchtext.data.utils import get_tokenizer
from torchtext.vocab import GloVe
import torch
# Example text data
texts = ["This is a positive example.", "This is a negative example."]
labels = [1, 0] # 1 for positive, 0 for negative
# Tokenizer and embedding initialization
tokenizer = get_tokenizer('basic_english')
glove = GloVe(name='6B', dim=100)
# Tokenization and vectorization
def text_to_tensor(text):
tokens = tokenizer(text)
return torch.tensor([glove.stoi[token] for token in tokens], dtype=torch.long)
# Example conversion
text_tensor = text_to_tensor(texts[0])
২. LSTM/GRU মডেল তৈরি করা
এবার, আমরা LSTM বা GRU মডেল তৈরি করতে পারি, যা ইনপুট হিসেবে টেক্সট সিকোয়েন্স নেবে এবং আউটপুট শ্রেণী প্রদান করবে।
LSTM মডেল:
import torch
import torch.nn as nn
class LSTMTextClassifier(nn.Module):
def __init__(self, vocab_size, embed_dim, hidden_dim, output_dim):
super(LSTMTextClassifier, self).__init__()
self.embedding = nn.Embedding(vocab_size, embed_dim)
self.lstm = nn.LSTM(embed_dim, hidden_dim, batch_first=True)
self.fc = nn.Linear(hidden_dim, output_dim)
self.softmax = nn.Softmax(dim=1)
def forward(self, x):
x = self.embedding(x) # Embedding layer
lstm_out, (h, c) = self.lstm(x) # LSTM layer
lstm_out = h[-1] # Last hidden state
output = self.fc(lstm_out) # Fully connected layer
output = self.softmax(output) # Softmax to get probabilities
return output
GRU মডেল:
class GRUTextClassifier(nn.Module):
def __init__(self, vocab_size, embed_dim, hidden_dim, output_dim):
super(GRUTextClassifier, self).__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, output_dim)
self.softmax = nn.Softmax(dim=1)
def forward(self, x):
x = self.embedding(x) # Embedding layer
gru_out, h = self.gru(x) # GRU layer
gru_out = h[-1] # Last hidden state
output = self.fc(gru_out) # Fully connected layer
output = self.softmax(output) # Softmax to get probabilities
return output
৩. মডেল ট্রেনিং
এবার, মডেলটি প্রশিক্ষণ দেওয়ার জন্য, আপনাকে Loss Function এবং Optimizer নির্ধারণ করতে হবে।
# Hyperparameters
vocab_size = len(glove.stoi) # Size of vocabulary
embed_dim = 100 # Dimension of word embeddings (GloVe)
hidden_dim = 128 # Hidden dimension of LSTM/GRU
output_dim = 2 # Output dimension (positive/negative)
learning_rate = 0.001
# Model, loss function, and optimizer
model = LSTMTextClassifier(vocab_size, embed_dim, hidden_dim, output_dim)
criterion = nn.CrossEntropyLoss() # For classification tasks
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
# Example training loop
for epoch in range(10):
model.train()
total_loss = 0
for text, label in zip(texts, labels):
text_tensor = text_to_tensor(text)
label_tensor = torch.tensor([label], dtype=torch.long)
# Forward pass
output = model(text_tensor.unsqueeze(0)) # Add batch dimension
loss = criterion(output, label_tensor)
# Backward pass
optimizer.zero_grad()
loss.backward()
optimizer.step()
total_loss += loss.item()
print(f'Epoch {epoch+1}, Loss: {total_loss/len(texts)}')
৪. মডেল মূল্যায়ন
এখন, মডেলটি প্রশিক্ষণ দেওয়ার পর, এটি মূল্যায়ন করার সময়, accuracy বা অন্যান্য evaluation metrics ব্যবহার করে মডেলের কার্যকারিতা পরিমাপ করা যেতে পারে।
# Evaluate the model on a test set
model.eval()
test_texts = ["This is an amazing example.", "I hate this product."]
test_labels = [1, 0]
correct = 0
total = 0
for text, label in zip(test_texts, test_labels):
text_tensor = text_to_tensor(text)
label_tensor = torch.tensor([label], dtype=torch.long)
output = model(text_tensor.unsqueeze(0))
_, predicted = torch.max(output, 1)
total += 1
correct += (predicted == label_tensor).sum().item()
accuracy = correct / total
print(f'Accuracy: {accuracy * 100}%')
LSTM/GRU ব্যবহার করে Text Classification এর সুবিধা:
- Long-Term Dependencies:
- LSTM এবং GRU দীর্ঘ সময়কালের মধ্যে সম্পর্ক ধরে রাখতে সক্ষম, যা টেক্সট ডেটায় গুরুত্বপূর্ণ। বিশেষ করে, যখন ডেটাতে দীর্ঘ পরিসরের নির্ভরতা থাকে।
- Efficient Learning:
- GRU কম প্যারামিটার ব্যবহার করে দ্রুত শিখতে সক্ষম, যা LSTM এর তুলনায় প্রশিক্ষণ সময় কমিয়ে আনে, তবে উভয়ই কার্যকরী।
- Text Preprocessing:
- Text Vectorization এবং Tokenization পদ্ধতির মাধ্যমে ইনপুট ডেটা প্রস্তুত করা সহজ। Word embeddings (যেমন Word2Vec, GloVe) শব্দের সিমেন্টিক অর্থ ধারণ করতে সাহায্য করে।
- Transfer Learning:
- Pre-trained LSTM বা GRU মডেল ব্যবহার করে Transfer Learning প্রয়োগ করা যেতে পারে, যা ডেটার অভাব থাকলে দ্রুত ভালো ফলাফল পেতে সহায়ক।
সারাংশ
LSTM এবং GRU টেক্সট শ্রেণীকরণ (text classification) এর জন্য অত্যন্ত কার্যকরী এবং শক্তিশালী মডেল। LSTM দীর্ঘ সময়ের সিকোয়েন্সের মধ্যে সম্পর্ক শিখতে সক্ষম, এবং GRU তুলনামূলকভাবে কম প্যারামিটার ব্যবহার করে দ্রুত শিখতে পারে। PyTorch বা CNTK এর মতো লাইব্রেরি ব্যবহার করে LSTM বা GRU মডেল তৈরি এবং প্রশিক্ষণ করা যায়। টেক্সট ডেটা প্রক্রিয়াকরণ, word embeddings ব্যবহার, এবং training ও evaluation প্রক্রিয়া তৈরি করা হয় এই মডেলগুলির মাধ্যমে টেক্সট শ্রেণীকরণের কার্যকারিতা বাড়াতে।
Read more