انتقل إلى المحتوى الرئيسي

الوحدة 7 — المعاملات الفائقة للضبط الدقيق

بمجرّد أن يبدأ التدريب، تصبح خمسة أرقام تُقرّر بين النجاح والفشل: معدّل التعلّم، عدد الحقب، حجم الدفعة الفعلي، طول التسلسل، وطول التسخين. هذه الوحدة تُعطيك قيم انطلاق آمنة لحالة الفلم الأحمر، ثمّ يُوضّح متى ينبغي تعديل كلّ واحد منها.

معدّل التعلّم: الملك المُطلَق

معدّل التعلّم (learning rate) هو المعامل الفائق الأخطر، والذي يُدمِّر أكثر تدريبات من كلّ الآخرين مجتمعين. في الضبط الدقيق، القيم النموذجية أصغر بكثير من التدريب من الصفر:

  • الضبط الكامل: بين 10510^{-5} و5×1055 \times 10^{-5}.
  • LoRA / QLoRA: بين 10410^{-4} و5×1045 \times 10^{-4}، أي عشرة أضعاف أعلى تقريبًا.

لماذا LoRA يقبل معدّلًا أعلى؟ لأنّ المعاملات المُدرَّبة قليلة، وكلّ واحدة تحتاج «حركة» أكبر لتتعلّم شيئًا مفيدًا. الأوزان الأصلية مُجمَّدة فلا خطر عليها.

قيمة الانطلاق الآمنة لحالتنا: 2×1042 \times 10^{-4} مع LoRA. ابتعد فقط بعد رؤية علامة واضحة تستوجب ذلك.

علامات معدّل التعلّم الخاطئ

يعلَّم قراءة المنحنيات في الوحدة 8، لكنّ العلامات الأساسية:

  • معدّل مرتفع جدًّا: خسارة تقفز أو تصبح NaN في الحقبات الأولى، توليد فوضوي بعد بضع خطوات.
  • معدّل منخفض جدًّا: خسارة تنزل ببطء شديد أو لا تتحرّك، النموذج لا يتعلّم شيئًا ملموسًا بعد حقبة كاملة.

القاعدة: قسِّم أو ضاعِف على 3 (لا على 10) حين تعدّل. القفزات الكبيرة تُخفي المشكلات الحقيقية.

عدد الحقب

عدد الحقب (epochs) هو عدد المرّات التي يمرّ فيها النموذج على كامل مجموعة التدريب. الضبط الدقيق لا يحتاج كثيرًا:

  • 1-3 حقب: النطاق الأشيع، كافٍ لمعظم مهامّ التخصّص.
  • 5+ حقب: تقريبًا دائمًا فرط تخصيص. علامة على أنّ البيانات قليلة أو أنّ المهمّة تتطلّب في الحقيقة RAG لا ضبطًا.

لحالتنا (2000 زوج): ثلاث حقب نقطة انطلاق جيّدة، مع مراقبة خسارة التحقّق بعناية لتحديد أفضل نقطة توقّف.

القاعدة الذهبية: لا تُقيَّم آخر نقطة تفتيش (checkpoint). قيِّم النقطة التي كانت خسارة التحقّق فيها أدنى، حتّى لو كانت في منتصف الحقبة الثانية.

حجم الدفعة الفعلي

حجم الدفعة يُقاس بعدد الأمثلة التي يُحدَّث بها الوزن مرّة واحدة. تمييز حاسم بين:

  • حجم دفعة الجهاز (per_device_batch_size): كم مثالًا تُعالَج معًا في تمريرة واحدة. محكوم بذاكرة GPU.
  • تراكم التدرّج (gradient_accumulation_steps): كم تمريرة تُجمَع تدرّجاتها قبل خطوة تحديث واحدة.

حجم الدفعة الفعلي = حجم دفعة الجهاز × تراكم التدرّج × عدد GPUs.

لحالتنا على بطاقة 24 غيغا: per_device_batch_size = 4، gradient_accumulation_steps = 4، فيصبح الحجم الفعلي 16. هذا نطاق مثالي للضبط الدقيق.

لماذا لا نستعمل حجم دفعة جهاز كبير مباشرة؟ لأنّ الذاكرة لا تسمح. تراكم التدرّج يعطي نفس أثر الدفعة الكبيرة رياضيًّا، بتكلفة زمن أطول.

طول التسلسل

طول التسلسل (max_seq_length) يُقرّر أطول مدخل يقبله النموذج أثناء التدريب. له أثر تربيعي على الذاكرة عبر آلية الانتباه.

  • 1024: للمهامّ القصيرة (تعليقات، تصنيف).
  • 2048: الافتراضي الشائع، مناسب لمعظم مهامّ التلخيص.
  • 4096 أو 8192: للتفريغات الطويلة، يستلزم FlashAttention-2.

قاعدة عملية: قِس توزيع أطوال بياناتك أوّلًا. إذا كان 95% من الأمثلة أقصر من 2000 رمز، فاختر max_seq_length = 2048 وقصّ الاستثناءات. اختيار 8192 «للأمان» يضاعف زمن التدريب بلا فائدة.

التسخين (Warmup)

في بداية التدريب، الانطلاق مباشرة بمعدّل التعلّم الكامل قد يُدمّر التهيئة الحسّاسة (خاصّة B=0B = 0 في LoRA). الحلّ: تسخين تدريجي ينمو معدّل التعلّم فيه من صفر إلى القيمة الكاملة خلال أوّل 3-10% من الخطوات.

في مكتبة transformers:

training_args = TrainingArguments(
learning_rate=2e-4,
warmup_ratio=0.05,
lr_scheduler_type="cosine",
...
)

warmup_ratio=0.05 يعني 5% من إجمالي الخطوات مخصّصة للتسخين، ثمّ تناقص تدريجي بمنحنى جيبي حتّى نهاية التدريب.

القيم الافتتاحية الكاملة لحالتنا

from transformers import TrainingArguments

args = TrainingArguments(
output_dir="./meeting-adapter",
num_train_epochs=3,
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
learning_rate=2e-4,
warmup_ratio=0.05,
lr_scheduler_type="cosine",
max_grad_norm=1.0,
weight_decay=0.01,
logging_steps=10,
eval_steps=100,
save_steps=100,
save_total_limit=3,
load_best_model_at_end=True,
metric_for_best_model="eval_loss",
bf16=True,
optim="paged_adamw_8bit",
)

هذه المجموعة نجحت في مئات المشاريع المعلنة. تجنّب تعديل أكثر من معاملَين في المرّة الواحدة، وإلّا لن تعرف ما الذي حسّن أو أساء.

قصّ التدرّج ووزنه

  • max_grad_norm = 1.0: قصّ التدرّج إن تجاوز معياره الواحد. حماية بسيطة من قممه المفاجئة.
  • weight_decay = 0.01: تنظيم L2 خفيف. في LoRA لا يطبَّق على المحوّلات نفسها في بعض الإصدارات، تحقّق من الوثائق.
الاختبار المسبق

قبل تدريب كامل من 3 حقب، شغّل max_steps=50 مع logging_steps=1. تحقّق أنّ الخسارة تنخفض، وأنّ الذاكرة لا تفيض، وأنّ التوليد على مثال واحد منطقي. عشرون دقيقة تستحقّها.

ثبات البذرة

اضبط seed=42 أو أيّ عدد ثابت. بدون بذرة، دورتان متتاليتان بالإعدادات نفسها قد تعطيان نتيجتين مختلفتين، ولن تعرف هل التحسّن من التغيير أم من الحظّ.

الخلاصة

  • معدّل التعلّم بين 10410^{-4} و5×1045 \times 10^{-4} لـLoRA، والقفزات بمعامل 3 لا 10.
  • 3 حقب نموذجيّة، مع اختيار نقطة التفتيش ذات أدنى خسارة تحقّق لا الأخيرة.
  • حجم دفعة فعلي بين 16 و32 عبر تراكم التدرّج، طول تسلسل مقاس على توزيع البيانات.
  • تسخين 5% مع منحنى تناقص جيبي، وقصّ تدرّج عند 1.0 للحماية.

في الوحدة التالية: قراءة منحنيات التدريب واستنتاج التوقّف في الوقت المناسب.