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

الوحدة 9 — التغذية الراجعة الضمنيّة وتحيّز الموضع

الوحدة الأولى فرّقت بين التغذية الصريحة والضمنيّة. الآن نرى أنّ الضمنيّة، رغم غزارتها، تحمل انحيازات بنيويّة تحرف كلّ نموذج لا يتعامل معها. فهم هذه الانحيازات وتصحيحها هو ما يفصل نظام إنتاج حقيقيّ عن تجربة أكاديميّة.

النقرة إشارة، لا حقيقة

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

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

توزين الثقة

على منصّة الدورات مثلًا، سلّم التفاعلات:

  • عرض الغلاف بلا نقر: ثقة قريبة من الصفر (0.05).
  • نقر ثمّ إغلاق سريع (أقلّ من 15 ثانية): 0.10 (فضول).
  • نقر ثمّ قراءة الوصف كاملًا: 0.30 (اهتمام).
  • إضافة إلى قائمة الأمنيات: 0.50.
  • بدء الدورة: 0.70.
  • إتمام أوّل درس: 0.90.
  • إتمام الدورة كاملة: 1.00.

هذه القيم لا تُشتقّ من الرياضيّات بل من ملاحظة الارتباط الفعليّ لكلّ إشارة مع النتيجة النهائيّة (شراء، تجديد، تقييم إيجابيّ). القيم بالضبط قد تختلف من منصّة إلى أخرى، لكنّ المبدأ عامّ.

iALS: تفكيك المصفوفة للتغذية الضمنيّة

طريقة FunkSVD من الوحدة الثالثة تفترض أنّنا نعرف تقييمات صريحة. للتفاعلات الضمنيّة، Yifan Hu وآخرون اقترحوا في 2008 خوارزميّة iALS (implicit ALS) التي تُدخل الثقة صراحةً في الخسارة:

L=u,icu,i(pu,ixuyi)2+λ(xu2+yi2)L = \sum_{u,i} c_{u,i}\,(p_{u,i} - x_u^\top y_i)^2 + \lambda\,(\lVert x_u \rVert^2 + \lVert y_i \rVert^2)

pu,ip_{u,i} ثنائيّة (1 إذا كان تفاعل، 0 إن لا)، وcu,ic_{u,i} الثقة (كبيرة للتفاعلات القويّة، صغيرة أو 1 لغيابها). الاختراع الأساس: يُجمَع على كلّ خانات المصفوفة، لا على الخانات المعروفة فقط. الغياب يُعامَل بوصفه إشارة سلبيّة ذات ثقة منخفضة.

هذا التصميم يُبطل الغلطة الكلاسيكيّة في تفكيك المصفوفة الصريحة: لا نتظاهر بأنّ الغياب معلومة مفقودة، بل نعتبره إشارة ضعيفة. القيمة الشائعة: cu,i=1+αru,ic_{u,i} = 1 + \alpha \cdot r_{u,i} حيث α\alpha حوالي 40.

مكتبة implicit بلغة Python تُنفّذ هذا مع تحسين موازٍ:

import implicit
import scipy.sparse as sp

# item_users : csr_matrix (nb_items, nb_users) avec valeurs = confiance
model = implicit.als.AlternatingLeastSquares(
factors=64,
regularization=0.01,
iterations=15,
alpha=40.0,
use_gpu=False,
)
model.fit(item_users)

# recommandations pour un utilisateur
recos, scores = model.recommend(user_id=42, user_items=item_users.T[42], N=10)

alpha تحكّم في كيفية تحويل عدد التفاعلات إلى ثقة؛ 40 قيمة افتراضيّة مستقاة من الورقة الأصليّة.

تحيّز الموضع

الآن الانحياز الأخطر. تجربة قامت بها Yahoo عام 2010: عرض نتائج البحث في ترتيبَين مختلفَين لعيّنات مستخدمين متكافئة. الترتيب الأوّل يعرض النتيجة الأفضل في الموضع 1. الترتيب الثاني يعرض النتيجة نفسها في الموضع 3. النقر عليها في الحالة الأولى ثلاثة أضعاف النقر في الثانية، رغم أنّ المحتوى نفسه.

هذه ظاهرة تحيّز الموضع. النقر لا يعكس جودة العنصر، بل حاصل ضرب جودته باحتمال أن يراه المستخدم أصلًا:

P(clic)=P(vu)P(clicvu)P(\text{clic}) = P(\text{vu}) \cdot P(\text{clic} \mid \text{vu})

P(vu)P(\text{vu}) يعتمد شبه كلّيًّا على الموضع. المستخدم يمرّر بصره من فوق إلى تحت، وأحيانًا يتوقّف مبكرًا. النتيجة: العناصر في المواضع العليا تنال نقرات كثيرة بغضّ النظر عن جودتها، والعكس بالعكس.

لو تركنا هذا الانحياز بلا تصحيح، سيتعلّم النموذج أنّ العناصر التي عرضها في المواضع العليا هي «الجيّدة»، وسيُوصي بها أكثر، فتحصل على نقرات أكثر، فيتأكّد ظنّه. حلقة تغذية راجعة مسمومة.

تصحيح الميل: IPS

الحلّ الرياضيّ اقترحه Schnabel وآخرون عام 2016 تحت اسم Inverse Propensity Scoring. الفكرة مستعارة من علم الإحصاء: نُقسّم مساهمة كلّ ملاحظة على احتمال أنّها لوحظت أصلًا.

LIPS=(u,i)O(yu,i,y^u,i)P(vuu,i)L_{\text{IPS}} = \sum_{(u,i) \in \mathcal{O}} \frac{\ell(y_{u,i}, \hat{y}_{u,i})}{P(\text{vu} \mid u, i)}

P(vuu,i)P(\text{vu} \mid u,i) هو الميل: احتمال أن يرى المستخدم العنصر في الموضع الذي عُرض فيه. عنصر في الموضع 1 له ميل 1.0، وعنصر في الموضع 10 له ميل قد لا يتجاوز 0.1. القسمة على الميل تُصحّح الانحياز: النقرة في الموضع 10 تزن عشرة أضعاف النقرة في الموضع 1.

تقدير الميل بحدّ ذاته مسألة صعبة. أبسط تقريب: نعمل تجربة قصيرة نتحكّم فيها بموضع كلّ عنصر (مثلًا 2% من الاستفسارات يُرتَّب فيها العرض عشوائيًّا)، ونقيس نسب النقر لكلّ موضع.

تحيّز الشعبيّة

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

الحلول العمليّة:

  • عيّنات سالبة موزونة: بدل أخذ عيّنة سالبة عشوائيّة، نأخذها من العناصر الشعبيّة بشكل مُبالغ فيه. هذا يعاقب الشعبيّ عند عدم التفاعل، ويعادل تصحيح الميل جزئيًّا.
  • إعادة تعيير الدرجات: نقسّم الدرجة النهائيّة على log(1+شعبيّة العنصر)γ\log(1 + \text{شعبيّة العنصر})^\gamma مع γ\gamma بين 0.3 و0.7. يُخفّف هيمنة الشعبيّ من دون إلغائها.

تجارب مضادة الوقائع

الشكل الأكثر حداثة لتقييم النماذج بلا تحيّز يستعمل مقاييس مضادّة للوقائع (counterfactual). نُدرِّب النموذج على بيانات ملوّثة بتحيّز الموضع، ثمّ نقيّمه بمقياس يُوَزَّن بمقلوب الميل. مقياس IPS-Recall وIPS-NDCG أصبحا معياريَّين في الأبحاث الحديثة.

حين تكون الحلقة قد أُغلقت

إذا كان النظام قد عمل لسنوات بلا تصحيح، فبياناتك التاريخيّة كلّها ملوّثة بتحيّز موضعه. لا يمكن ببساطة إعادة تدريب النموذج على نفس البيانات مع IPS: الميل نفسه صعب التقدير من ملاحظات ملوّثة. الحلّ العمليّ الوحيد: تخصيص جزء صغير من الحركة لعرض عشوائيّ لجمع بيانات نظيفة، ثمّ إعادة بناء التقدير.

الخلاصة

  • التغذية الضمنيّة مبهمة: نقرة لا تعني إعجابًا مؤكّدًا، وغياب النقرة لا يعني رفضًا. النموذج السليم يُوَزّع ثقة على كلّ تفاعل.
  • iALS يُعمّم تفكيك المصفوفة إلى الحالة الضمنيّة بجمع الخسارة على كلّ الخانات مع ثقة موزونة، وهي الطريقة القياسيّة للبيانات الثنائيّة.
  • تحيّز الموضع يجعل النقر يعكس المكان لا الجودة؛ يُصحَّح بـIPS (تعديل بمقلوب ميل الرؤية).
  • تحيّز الشعبيّة يخنق الكاتالوغ الطويل؛ يُخفَّف بعيّنات سالبة موزونة أو إعادة تعيير للدرجة.

الوحدة التالية: المشروع الختاميّ، محرّك توصية كامل مع تقسيم زمنيّ ولوحة مقاييس وخطّة اختبار حيّ.