Fine-tuning — مدل رو به سبک خودت در بیار

قسمت ۶ ۲۰ دقیقه

مرور قبلی: RAG چی بود؟

اپیزود قبلی یاد گرفتیم چطور با RAG به مدل اطلاعات بدیم — اسناد رو Chunk و Embed کنیم، تو Vector Database بذاریم، و موقع جواب‌دادن تکه‌های مرتبط رو پیدا کنیم. RAG حافظه اضافه می‌کنه.

ولی یه سوال: اگه بخوایم خود مدل رو عوض کنیم چی؟ مثلاً بخوایم فارسی خوب‌تری حرف بزنه، یا سبک خاصی داشته باشه، یا تو یه حوزه تخصصی (مثل حقوق یا پزشکی) بهتر عمل کنه؟ اینجاست که Fine-tuning وارد می‌شه.

سه مرحله زندگی یه مدل زبانی

برای فهمیدن Fine-tuning، اول باید بدونی یه مدل زبانی چطور به دنیا میاد و بزرگ می‌شه. سه مرحله اصلی داره:

مرحله ۱: Pre-training (پیش‌آموزش)

مرحله اول و سنگین‌ترین مرحله. شرکتی مثل Meta یا Alibaba تریلیون‌ها کلمه از اینترنت جمع می‌کنه و مدل رو ماه‌ها روی هزاران GPU آموزش می‌ده. هدف: مدل زبان رو یاد بگیره — گرامر، دانش عمومی، استدلال پایه.

فکر کن مثل ۱۲ سال مدرسه رفتنه. همه‌چیز رو یاد می‌گیری ولی تخصصی نیستی.

💡 هزینه Pre-training: آموزش یه مدل بزرگ مثل Llama 3 405B حدود ۳۰ میلیون دلار هزینه داره! این مرحله رو تو انجام نمی‌دی — از مدل‌های آماده استفاده می‌کنی.

مرحله ۲: SFT — Supervised Fine-Tuning (تنظیم دقیق نظارت‌شده)

بعد از Pre-training، مدل فقط بلده کلمه بعدی رو حدس بزنه. هنوز بلد نیست مکالمه کنه. SFT بهش یاد می‌ده چطور به سوالات جواب بده — با نشون دادن هزاران مثال از مکالمات خوب.

فکر کن مثل دوره کارآموزیه. بعد از مدرسه و دانشگاه، میری سر کار و یاد می‌گیری چطور دانشت رو عملی استفاده کنی.

مرحله ۳: RLHF — Reinforcement Learning from Human Feedback

آخرین مرحله. انسان‌ها جواب‌های مدل رو بررسی می‌کنن و بهش می‌گن «این جواب خوب بود» یا «این بد بود». مدل با این بازخوردها یاد می‌گیره جواب‌های بهتری بده.

فکر کن مثل بازخورد از مشتری‌هاته. بعد از چند ماه کار، بر اساس نظر مشتری‌ها عملکردت رو بهبود می‌دی.

Fine-tuning تو عمل یعنی چی؟

وقتی ما می‌گیم Fine-tuning، معمولاً منظورمون مرحله ۲ (SFT) هست. یعنی یه مدل از پیش آموزش‌دیده رو می‌گیری و با داده‌های خودت بهش آموزش اضافی می‌دی.

مثلاً:

  • یه مدل عمومی رو Fine-tune می‌کنی با هزاران مکالمه پزشکی تا دستیار پزشکی بشه
  • یه مدل انگلیسی رو Fine-tune می‌کنی با داده‌های فارسی تا فارسی بهتر حرف بزنه
  • یه مدل عمومی رو Fine-tune می‌کنی که به سبک خاصی جواب بده

کی Fine-tune کنیم، کی نکنیم؟

این یکی از مهم‌ترین تصمیم‌هاست. خیلی‌ها وقتی می‌فهمن Fine-tuning چیه، می‌خوان همه‌چیز رو Fine-tune کنن. ولی اکثر وقت‌ها لازم نیست!

Fine-tune کن وقتی:

  • سبک و لحن خاصی می‌خوای: مثلاً مدل باید مثل یه وکیل حرف بزنه
  • زبان خاصی لازمه: مثلاً فارسی عامیانه یا اصطلاحات یه صنعت خاص
  • فرمت خروجی ثابت می‌خوای: مثلاً همیشه JSON تولید کنه
  • هزینه API زیاده: یه مدل کوچیک Fine-tune شده می‌تونه جایگزین یه مدل بزرگ بشه

Fine-tune نکن وقتی:

  • فقط اطلاعات اضافه می‌خوای: از RAG استفاده کن (اپیزود ۵)
  • Prompt خوب کافیه: اول prompt engineering امتحان کن (اپیزود ۳)
  • داده کافی نداری: Fine-tuning بدون داده خوب، نتیجه بد می‌ده
  • اطلاعات مرتب عوض می‌شن: هر بار Fine-tune کردن هزینه‌بره — RAG بهتره

قاعده طلایی: اول Prompt Engineering امتحان کن. بعد RAG. اگه هنوز نتیجه نگرفتی، اون وقت Fine-tune کن. این ترتیب از نظر هزینه و زمان بهینه‌ترینه.

مشکل Fine-tuning سنتی

یه مشکل بزرگ هست: Fine-tuning سنتی یعنی همه پارامترهای مدل رو آپدیت کنی. یه مدل ۷B یعنی ۷ میلیارد پارامتر. برای آپدیت همشون به GPU‌های خیلی قوی نیاز داری — شاید چند تا A100 80GB که هر کدوم چند هزار دلاره.

این برای شرکت‌های بزرگ مشکلی نیست. ولی برای من و تو؟ عملاً غیرممکنه.

اینجاست که LoRA وارد می‌شه و همه‌چیز رو عوض می‌کنه.

LoRA — انقلاب Fine-tuning

LoRA مخفف Low-Rank Adaptation هست. ایده‌ش ساده ولی نبوغ‌آمیزه:

به‌جای اینکه همه ۷ میلیارد پارامتر رو آپدیت کنی، یه سری پارامتر کوچیک اضافی به مدل اضافه می‌کنی و فقط اون‌ها رو آموزش می‌دی. پارامترهای اصلی مدل دست‌نخورده می‌مونن.

تشبیه ساده

فرض کن یه ساختمون داری (مدل اصلی). Fine-tuning سنتی یعنی کل ساختمون رو خراب کنی و از نو بسازی. LoRA یعنی یه اتاق جدید بهش اضافه کنی — ساختمون اصلی دست‌نخورده می‌مونه.

مزایای LoRA

  • حافظه کم: به‌جای ۸۰GB، با ۱۶GB هم می‌شه کار کرد
  • سرعت: چون پارامترهای کمتری آپدیت می‌شن، آموزش سریع‌تره
  • ذخیره‌سازی: وزن‌های LoRA معمولاً چند ده مگابایت بیشتر نیستن (در مقابل چند گیگابایت مدل اصلی)
  • ترکیب‌پذیری: می‌تونی چند LoRA مختلف داشته باشی و بین‌شون سوئیچ کنی
# مفهوم LoRA به زبان ساده (شبه‌کد)

# Fine-tuning سنتی:
# همه W (وزن‌ها) رو آپدیت کن
W_new = W_old + delta_W  # delta_W خیلی بزرگه

# LoRA:
# delta_W رو به دو ماتریس کوچیک تجزیه کن
# rank خیلی کوچیکه (مثلاً ۸ یا ۱۶)
A = random_matrix(rank, input_dim)   # کوچیک
B = random_matrix(output_dim, rank)  # کوچیک
delta_W = B × A                       # حاصل‌ضرب = تقریب خوبی از تغییرات

W_new = W_old + delta_W  # ولی delta_W اینجا خیلی کم‌حجمه!

QLoRA — LoRA به توان ۲

QLoRA ترکیب Quantization (فشرده‌سازی) + LoRA هست. یعنی اول مدل اصلی رو ۴-بیت فشرده می‌کنی، بعد LoRA رو روش اعمال می‌کنی.

نتیجه: یه مدل ۷B رو می‌تونی روی یه GPU با ۸-۱۰ گیگ VRAM هم Fine-tune کنی! این یعنی حتی با یه RTX 3060 یا ۴060 هم می‌تونی Fine-tuning انجام بدی.

🎯 خلاصه مقایسه:

  • Full Fine-tuning: بهترین کیفیت، بیشترین هزینه
  • LoRA: کیفیت عالی، هزینه متوسط
  • QLoRA: کیفیت خوب، کمترین هزینه — بهترین نقطه شروع

آماده‌سازی Dataset

هر Fine-tuning خوب با داده خوب شروع می‌شه. کیفیت داده مهم‌تر از کمیته. ۱۰۰۰ نمونه باکیفیت بهتر از ۱۰۰,۰۰۰ نمونه بی‌کیفیته.

فرمت داده

رایج‌ترین فرمت برای SFT، فرمت مکالمه‌ایه:

# فرمت مکالمه‌ای (Chat Format)
{
    "conversations": [
        {"role": "system", "content": "تو یه دستیار حقوقی هستی."},
        {"role": "user", "content": "مهریه چطور محاسبه می‌شه؟"},
        {"role": "assistant", "content": "طبق قانون مدنی ایران..."}
    ]
}

# یا فرمت ساده‌تر Instruction-Response
{
    "instruction": "این متن رو خلاصه کن",
    "input": "متن طولانی...",
    "output": "خلاصه متن..."
}

نکات مهم درباره داده

  • تنوع: نمونه‌ها باید متنوع باشن. اگه همه سوالات شبیه هم باشن، مدل فقط همون رو یاد می‌گیره.
  • کیفیت: جواب‌ها باید دقیق و کامل باشن. مدل از جواب‌های بد هم یاد می‌گیره!
  • تعداد: برای شروع، ۵۰۰ تا ۲۰۰۰ نمونه باکیفیت کافیه.
  • توازن: دقت کن موضوعات مختلف نسبت مناسبی داشته باشن.

Unsloth — Fine-tuning سریع و آسان

Unsloth یه ابزار اوپن‌سورسه که Fine-tuning رو خیلی ساده و سریع کرده. ادعاش اینه که ۲ برابر سریع‌تر و ۶۰ درصد حافظه کمتر مصرف می‌کنه.

# نصب Unsloth
pip install unsloth

# یه مثال ساده Fine-tuning با Unsloth
from unsloth import FastLanguageModel

# بارگذاری مدل
model, tokenizer = FastLanguageModel.from_pretrained(
    model_name="unsloth/Qwen2.5-7B",
    max_seq_length=2048,
    load_in_4bit=True,  # QLoRA
)

# اضافه کردن LoRA
model = FastLanguageModel.get_peft_model(
    model,
    r=16,             # rank — هر چی بیشتر، قوی‌تر ولی سنگین‌تر
    lora_alpha=16,
    lora_dropout=0,
    target_modules=["q_proj", "k_proj", "v_proj", 
                    "o_proj", "gate_proj", "up_proj", 
                    "down_proj"],
)

# آموزش
from trl import SFTTrainer
trainer = SFTTrainer(
    model=model,
    tokenizer=tokenizer,
    train_dataset=dataset,
    max_seq_length=2048,
    # تنظیمات آموزش...
)
trainer.train()

# ذخیره
model.save_pretrained("my-fine-tuned-model")
⚡ نکته: Unsloth از Qwen, Llama, Mistral, Gemma و خیلی مدل‌های دیگه پشتیبانی می‌کنه. بهترین انتخاب برای شروع Fine-tuning بدون سخت‌افزار گرونه.

اشتباهات رایج Fine-tuning

چند تا اشتباه رایج که مبتدی‌ها مرتکب می‌شن:

  1. Overfitting (بیش‌برازش): مدل داده آموزشی رو حفظ می‌کنه ولی عمومیت نداره. راه‌حل: داده متنوع‌تر و epoch کمتر.
  2. Catastrophic Forgetting (فراموشی فاجعه‌بار): مدل چیزایی که قبلاً بلد بود رو فراموش می‌کنه. راه‌حل: LoRA استفاده کن و learning rate پایین بذار.
  3. داده کم‌کیفیت: جمله معروف: Garbage In, Garbage Out. داده بد = مدل بد.
  4. عدم ارزیابی: حتماً مدل رو بعد از Fine-tuning تست کن. بنچمارک داشته باش.

جمع‌بندی

تو این اپیزود یاد گرفتی:

  1. سه مرحله زندگی یه مدل: Pre-training، SFT، RLHF
  2. کی Fine-tune کنی و کی نکنی
  3. LoRA و QLoRA چطور Fine-tuning رو ارزان و عملی کردن
  4. چطور داده آماده کنی
  5. Unsloth به‌عنوان ابزار عملی Fine-tuning
  6. اشتباهات رایج و راه‌حل‌هاشون

اپیزود بعدی: AI Agent — وقتی LLM زنده می‌شه

تا الان مدل رو شناختی، بهش حافظه دادی (RAG)، و یاد گرفتی شخصی‌سازیش کنی (Fine-tuning). ولی هنوز یه چیزی کمه: مدل فقط حرف می‌زنه. نمی‌تونه کاری انجام بده — نه ایمیل بفرسته، نه API بزنه، نه فایل بخونه. اپیزود بعدی می‌ریم سراغ AI Agent‌ها — جایی که LLM واقعاً زنده می‌شه و شروع به انجام دادن می‌کنه!

نظرات

هنوز نظری ثبت نشده. اولین نفر باشید!

نظر خود را بنویسید