Pretraining vs Fine-tuning
Massive model কে নিজের কাজে কিভাবে adapt করা যায়।
একটা 175B parameter model কে scratch থেকে train করতে $5M+ লাগে। কিন্তু আপনি নিজের ছোট data এ adapt করতে পারেন সেই model কে কয়েক ঘণ্টায়, কয়েক ডলারে। এই magic এর নাম Pretraining vs Fine-tuning — modern NLP এর core paradigm।
Pretraining = massive unlabeled corpus এ general purpose task (MLM, next token prediction) এ scratch থেকে train। এতে model ভাষার general knowledge শেখে। Fine-tuning = pretrained weights দিয়ে শুরু করে নিজের task-specific small labeled data এ further train। PEFT (LoRA, prefix-tuning) দিয়ে কম parameter update করেও কাজ চলে।
ভাবুন একজন graduate student — সে ১৬ বছর general education পেয়েছে (pretraining), এখন PhD তে একটা specific topic এ ২-৩ বছর গভীরভাবে কাজ করছে (fine-tuning)। Scratch থেকে শেখানোর চেয়ে এটা অনেক efficient। LoRA এর idea: graduate এর পুরো মাথা পরিবর্তন না করে, কিছু small 'adapter' যোগ — original knowledge অক্ষত, task-specific skill যোগ।
from transformers import (
AutoTokenizer, AutoModelForSequenceClassification,
TrainingArguments, Trainer,
)
from datasets import Dataset
import numpy as np
texts = [
"I love this product, amazing quality!",
"Worst experience ever, total waste.",
"Pretty good, would buy again.",
"Not great, broke in two days.",
"Absolutely fantastic, five stars!",
"Terrible, do not recommend at all.",
]
labels = [1, 0, 1, 0, 1, 0]
tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased")
model = AutoModelForSequenceClassification.from_pretrained(
"distilbert-base-uncased", num_labels=2
)
def tokenize(batch):
return tokenizer(batch["text"], padding="max_length", truncation=True, max_length=64)
dataset = Dataset.from_dict({"text": texts, "label": labels}).map(tokenize, batched=True)
args = TrainingArguments(
output_dir="./out",
num_train_epochs=3,
per_device_train_batch_size=2,
learning_rate=2e-5,
logging_steps=2,
report_to="none",
)
def compute_metrics(pred):
preds = np.argmax(pred.predictions, axis=1)
acc = (preds == pred.label_ids).mean()
return {"accuracy": acc}
trainer = Trainer(
model=model, args=args, train_dataset=dataset,
eval_dataset=dataset, compute_metrics=compute_metrics,
)
trainer.train()
print(trainer.evaluate())AutoModelForSequenceClassification distilbert এর উপর classification head যোগ করে। Dataset.from_dict + map দিয়ে tokenize। TrainingArguments এ hyperparameters। Trainer training loop, evaluation, logging সব handle করে। compute_metrics এ accuracy custom calc। trainer.train() এ fine-tuning শুরু।
নিজের domain (e.g. tech news vs sports news) এর 200-500 sample collect করুন, distilbert-base-uncased এ LoRA দিয়ে fine-tune করুন (peft library)। Full fine-tune এর সাথে accuracy + training time + memory compare করুন।