Temperature و Top-p: التحكم في عشوائية مخرجات النموذج
لو بعتّ نفس الجملة بالظبط لـ Claude 3 مرّات ورجعتلك 3 ردود مختلفة في الصياغة، انت مش ضحية bug ومش لازم تكرّر المحاولة. ده سلوك مقصود اسمه stochastic decoding، وبيتحكم فيه parameter واحد اسمه temperature، وparameter تاني اسمه top_p. لو ضبطتهم صح، نفس الـ prompt هيرجّع نفس الإجابة كل مرة، أو هيرجّع 5 صياغات إبداعية مختلفة — انت اللي تختار.
المشكلة باختصار
المطور المبتدئ بيكتشف الـ LLM، بيبعت سؤال يستخرج منه JSON لاسم وعمر مستخدم، يلاقي مرة بترجع {"name": "Ahmed", "age": 28} ومرة {"user_name": "Ahmed", "age": 28} ومرة {"name": "Ahmed", "age": "28"}. كل تغيير صغير بيكسر الكود اللي بيستهلك الـ response. الحل مش regex احتياطي ومش retry loop — الحل تفهم ليه ده بيحصل أصلاً.
تخيّل الطبّاخ اللي عنده 50 ألف كلمة
تخيّل معايا طبّاخ بيكتب وصفة، وقدّامه قاموس فيه 50 ألف كلمة. كل ما يكتب كلمة، بيبص في الـ 50 ألف كلمة ويدّيهم درجات: "اللي بعد كلمة قلّب الأرجح يكون المكوّنات بنسبة 62%، أو الخليط بنسبة 18%، أو الماء بنسبة 7%، والباقي بنسب أقل".
دلوقتي عندك خياران:
- الطبّاخ الجاد: بياخد دايماً الكلمة الأعلى نسبة (المكوّنات). نفس المدخل بيدّي نفس المخرج كل مرة. ممل بس مضمون.
- الطبّاخ المبدع: بيرمي دادو متحيّز للنسب دي، فممكن يطلع الخليط بدل المكوّنات، أو يفاجئك بـ الماء. الناتج مختلف كل مرة، أحياناً ألطف، أحياناً غريب.
temperature هو المسطرة بين الطبّاخين دول. temperature = 0 يعني الطبّاخ الجاد. temperature = 1 يعني الطبّاخ المبدع. temperature = 2 يعني طبّاخ مخدّر، بيختار أي حاجة تقريباً.
التعريف العلمي بعد ما اتفقنا على المثال
النموذج اللغوي بيخرج لكل خطوة logits: مصفوفة فيها رقم لكل token في الـ vocabulary. الـ vocabulary لـ Claude فيه حوالي 200 ألف token (راجع توثيق Anthropic الرسمي). الـ logits بتتحوّل لاحتمالات عبر دالة softmax:
P(token_i) = exp(logit_i / T) / Σ exp(logit_j / T)
الـ هنا هي الـ temperature. = softmax العادية. = التوزيع بيتركّز على أعلى احتمالات (greedy). = التوزيع بيتبسّط ويبقى أقرب لـ uniform distribution.
]]>