أنظمة التوصية2009متوسط11 دقيقة قراءة

BPR: ترتيب مخصَّص بأسلوب بايزي انطلاقاً من التغذية الراجعة الضمنية

BPR: Bayesian Personalized Ranking from Implicit Feedback

Rendle, S. · Freudenthaler, C. · Gantner, Z. · Schmidt-Thieme, L. — UAI

المشكلة

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

الإسهام

يطرح BPR إطاراً رياضياً متيناً للترتيب المخصَّص يقوم على المقارنة الزوجية. الفكرة أنه بدلاً من توقّع درجة مطلقة لكل عنصر، نسأل سؤالاً أبسط: «هل يفضّل المستخدم u العنصر i على العنصر j؟». معيار التحسين BPR-OPT مشتقّ من تحليل بايزي يعظّم الاحتمال اللاحق. أما خوارزمية التعلّم LearnBPR فتعتمد مع سحب عشوائي للثلاثيات (u, i, j). ويُثبت البحث أن BPR-OPT يكافئ تحسين AUC مباشرةً. الإطار لا يرتبط بنموذج بعينه — طبّقه المؤلفون على تحليل المصفوفات وعلى أقرب k جار التكيّفي، وتفوّقوا على طرق المعتادة في كليهما.

الأثر

تحوّل BPR إلى دالة الخسارة الزوجية المرجعية في أنظمة التوصية القائمة على ، وصار من أكثر الأوراق البحثية استشهاداً في هذا المجال. أثّر أسلوبه في التدريب مباشرةً على الترشيح التعاوني العصبي (NCF) وشبكة الاهتمام العميق (DIN) وعلى أغلب أنظمة التوصية الحديثة التي تعتمد تعلّم الترتيب. رسالته الجوهرية واضحة: حسِّن ما يهمك فعلاً — الترتيب — بدلاً من الانحدار. هذه الفكرة أعادت تشكيل طريقة تفكير مجتمع البحث في التوصيات.

تخيّل أنك نادل في مطعم لا يجمع تقييمات. لا تستطيع أن تسأل الزبائن «كيف كان الطبق؟» — كل ما تملكه هو ملاحظة ماذا طلبوا. زبون طلب المعكرونة وتجاوز السلطة؟ غالباً يفضّل المعكرونة، لكن تجاوزه للسلطة لا يعني أنه يكرهها — ربما لم تلفت نظره في القائمة أصلاً.

التقليدية تتعامل مع كل طبق لم يُطلب على أنه «مكروه». BPR أذكى: يكتفي بالقول «هذا الزبون اختار المعكرونة بدلاً من السلطة»، ثم يتدرّب على ملايين المقارنات الزوجية من هذا النوع. مع الوقت، يتعلّم النظام ترتيب القائمة بأكملها لكل زبون على حدة — دون أن يحتاج لسؤال أحد عن تقييم بالنجوم.

المشكلة: نعرف ماذا فعل المستخدم، لكن لا نعرف لماذا

حين يمنحك المستخدم تقييماً صريحاً بالنجوم — كما في Netflix — فالأمر مباشر: صُغ المسألة على أنها ، توقَّع التقييم، ثم رتّب العناصر حسب الدرجة المتوقعة.

لكن في الواقع، أغلب الأنظمة لا تملك رفاهية التقييمات الصريحة. ما تملكه هو تغذية راجعة ضمنية: نقرات، مشتريات، مشاهدات صفحات، عدد مرات التشغيل. وهنا يظهر عدم تناظر جوهري:

  • تفاعل ملاحَظ (المستخدم نقر على العنصر) ← غالباً إيجابي، لكن كم هو إيجابي؟ لا نعرف.
  • غياب تفاعل (المستخدم لم ينقر) ← مجهول تماماً. ربما لم يعجبه، أو ربما لم يره أصلاً.

طرق مثل تحليل المصفوفات المنتظم الموزون (WR-MF) تتعامل مع هذا الغموض بمعاملة كل عنصر لم يُلاحَظ على أنه سلبي بثقة منخفضة. لكن هذا الأسلوب النقطي يظل يحسّن دقة التنبؤ بالدرجات — وهو الهدف الخاطئ حين يكون ما نريده فعلاً هو الترتيب.

افتح في المختبر
انقر على الخلايا لتبديل التفاعلات. لاحظ أن الخلايا التي تحمل علامة (؟) غامضة: لا نعرف إن كان المستخدم يكرهها أم لم يرَها أصلاً. BPR يقارن فقط بين ما تفاعل معه المستخدم وما لم يتفاعل معه.
تستيقظ التجربة عند وصولك…

الفكرة المحورية: قارِن بدلاً من أن تتنبأ

جوهر BPR هو تغيير السؤال الذي نطرحه. بدلاً من أن نسأل «كم سيعطي المستخدم uu العنصرَ ii؟»، نسأل سؤالاً أبسط وأصدق: «هل يفضّل uu العنصرَ ii على jj؟»

من التغذية الراجعة الضمنية يمكننا استخلاص تفضيلات زوجية. لكل مستخدم uu:

  • إذا تفاعل uu مع العنصر ii ولم يتفاعل مع jj، نفترض أنه يفضّل ii، أي i>uji >_u j.
  • إذا تفاعل مع كليهما أو لم يتفاعل مع أيٍّ منهما، لا نفترض شيئاً — ليس لدينا ما يكفي لتحديد أيّهما أفضل.

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

افتح في المختبر
بدّل بين العرض النقطي والزوجي. في النقطي، كل ما لم يُلاحَظ يأخذ القيمة 0 وهو افتراض مضلِّل. في الزوجي، لا نقول «أ > ب» إلا حين يوجد دليل فعلي.
تستيقظ التجربة عند وصولك…

BPR-OPT: معيار بايزي للترتيب

يصوغ BPR مسألة الترتيب من منظور بايزي. الهدف هو إيجاد النموذج Θ\Theta التي تعظّم بعد مشاهدة التفضيلات الزوجية:

p(Θ>u)p(>uΘ)  p(Θ)p(\Theta \mid >_u) \propto p(>_u \mid \Theta) \; p(\Theta)

الطرف الأول — p(>uΘ)p(>_u \mid \Theta) — يعبّر عن مدى توافق النموذج مع تفضيلات المستخدم الملاحَظة. أما الطرف الثاني — p(Θ)p(\Theta) — فيلعب دور الذي يحمي من . بافتراض استقلالية المستخدمين واستقلالية أزواج العناصر لكل مستخدم، تتفكك المعقولية إلى حاصل ضرب على جميع ثلاثيات التدريب (u,i,j)(u, i, j).

لكل ثلاثية، نحتاج لنمذجة احتمال أن uu يفضّل ii على jj. هنا يأتي دور دالة اللوجستية:

p(i>ujΘ)=σ(x^uij(Θ))p(i >_u j \mid \Theta) = \sigma(\hat{x}_{uij}(\Theta))

حيث x^uij=x^uix^uj\hat{x}_{uij} = \hat{x}_{ui} - \hat{x}_{uj} هو الفرق بين الدرجتين المتوقعتين. بأخذ سالب اللوغاريتم للاحتمال اللاحق وتطبيق توزيع مسبق غاوسي على Θ\Theta، نصل إلى معيار BPR-OPT.

BPR-OPT=(u,i,j)DSlnσ(x^uij)λΘΘ2\text{BPR-OPT} = \sum_{(u,i,j) \in D_S} \ln \sigma(\hat{x}_{uij}) - \lambda_\Theta \|\Theta\|^2
BPR-OPT — معيار الترتيب الزوجيلكل ثلاثية (u, i, j)، مرّر فرق الدرجات المتوقعة x̂_uij عبر دالة السيغمويد ليصبح احتمالاً، خذ اللوغاريتم، اجمع على كل الثلاثيات، ثم اطرح عقوبة L2 للتنظيم. هذا مكافئ لتعظيم مساحة تحت المنحنى (AUC).

تخيّل دالة السيغمويد هنا كـحَكَم يحوّل الفارق بين الدرجتين إلى مستوى ثقة. إذا كان x^uij\hat{x}_{uij} كبيراً وموجباً — أي أن النموذج واثق أن ii يتقدّم على jj — فالسيغمويد تعطي قيمة قريبة من 1، واللوغاريتم يكاد يكون صفراً: ضئيلة. أما إذا كان الفارق صغيراً أو سالباً — أي أن النموذج مرتبك أو أخطأ في الترتيب — فالسيغمويد تنخفض وتتصاعد العقوبة بحدّة. بعبارة أخرى، النموذج يُعاقَب أشدّ العقاب على الانتهاكات: الحالات التي يضع فيها العنصر الذي لم يتفاعل معه المستخدم في مرتبة أعلى من العنصر الذي تفاعل معه.

افتح في المختبر
اسحب فارق الدرجات x̂_uij وراقب كيف يتغيّر خرج السيغمويد والخسارة. لاحظ أن الفوارق السالبة (حيث الترتيب خاطئ) تُقابَل بعقوبات حادّة.
تستيقظ التجربة عند وصولك…

لماذا BPR-OPT مكافئ لمساحة تحت المنحنى (AUC)

تُثبت الورقة علاقة أنيقة: معيار BPR-OPT يكافئ تقريباً قابلاً للاشتقاق من (AUC) لكل مستخدم. ما تقيسه AUC ببساطة هو: إذا اخترنا عشوائياً عنصراً تفاعل معه المستخدم وآخر لم يتفاعل معه، ما احتمال أن النموذج يرتّب الأول أعلى؟ وهذا بالضبط ما تقوم عليه المقارنة الزوجية في BPR.

الفرق التقني أن AUC الخام تستخدم دالة دليلية (1 إذا كان الترتيب صحيحاً، و0 خلاف ذلك)، وهذه الدالة غير قابلة للاشتقاق فلا يمكن حساب لها. BPR يحلّ المشكلة باستبدالها بدالة السيغمويد الناعمة σ\sigma، مما يتيح استخدام التحسين القائم على التدرّج مع استهداف مقياس الترتيب مباشرةً.

AUC(u)=1Iu+IIu+iIu+jIIu+δ(x^ui>x^uj)\text{AUC}(u) = \frac{1}{|I_u^+| \cdot |I \setminus I_u^+|} \sum_{i \in I_u^+} \sum_{j \in I \setminus I_u^+} \delta(\hat{x}_{ui} > \hat{x}_{uj})
مساحة تحت المنحنى لكل مستخدم — ما يحسّنه BPR فعلاًمتوسط على كل أزواج (إيجابي، سلبي): هل رتّب النموذج الإيجابي أعلى؟ δ تساوي 1 إن نعم و0 إن لا. BPR يستبدل δ بالسيغمويد σ لجعل هذا قابلاً للاشتقاق.

LearnBPR: السحب العشوائي هو الحل

السؤال الآن: كيف نحسّن BPR-OPT عملياً؟ الطريقة البديهية هي المرور على الثلاثيات بالترتيب، لكن هذا يسبّب مشكلة حقيقية: حين تمرّ على ثلاثيات المستخدم نفسه بالتتابع، تحصل على تدرّجات مترابطة بشدة، وهذا يبطئ بشكل ملحوظ.

حل LearnBPR هو : في كل خطوة، اسحب ثلاثية (u,i,j)(u, i, j) عشوائياً — اختر مستخدماً عشوائياً، ثم عنصراً تفاعل معه، ثم عنصراً لم يتفاعل معه. احسب التدرّج لتلك الثلاثية، حدِّث المعاملات، ثم كرِّر.

تدرّج BPR-OPT لثلاثية واحدة هو:

BPR-OPTΘ=σ(x^uij)x^uijΘλΘΘ\frac{\partial \text{BPR-OPT}}{\partial \Theta} = \sigma(-\hat{x}_{uij}) \cdot \frac{\partial \hat{x}_{uij}}{\partial \Theta} - \lambda_\Theta \Theta

لاحظ الحد σ(x^uij)\sigma(-\hat{x}_{uij}): هو بمثابة إشارة تعلّم ذكية تتكيّف تلقائياً. حين يخطئ النموذج في الترتيب (الفارق سالب)، تكون σ\sigma قريبة من 1 فيكون التحديث كبيراً. وحين يكون الترتيب صحيحاً بالفعل (فارق موجب كبير)، تقترب σ\sigma من 0 ويكاد التحديث يتلاشى. النتيجة أن النموذج ينفق جهده التعلّمي على الأخطاء التي تستحق التصحيح.

افتح في المختبر
اضغط «عيّنة وتحديث» لمشاهدة LearnBPR وهو يسحب ثلاثيات عشوائية ويحدّث النموذج. قارن مع المرور التسلسلي ولاحظ الفرق في سرعة التقارب.
تستيقظ التجربة عند وصولك…

تطبيق BPR على تحليل المصفوفات

إطار BPR مستقل عن النموذج المستخدم — يصلح لأي نموذج يُخرج درجة x^ui\hat{x}_{ui} لكل مستخدم وعنصر. الورقة توضّح ذلك بتطبيقه على تحليل المصفوفات، وهو النموذج الأكثر شيوعاً في أنظمة التوصية في تلك الفترة.

الفكرة في تحليل المصفوفات أن كل مستخدم uu يُمثَّل بـ WuRkW_u \in \mathbb{R}^k، وكذلك كل عنصر ii يُمثَّل بمتجه HiRkH_i \in \mathbb{R}^k. الدرجة المتوقعة هي ببساطة بينهما:

x^ui=Wu,Hi=f=1kwufhif\hat{x}_{ui} = \langle W_u, H_i \rangle = \sum_{f=1}^{k} w_{uf} \cdot h_{if}

وبالتالي يصبح فارق الدرجات:

x^uij=Wu,HiHj\hat{x}_{uij} = \langle W_u, H_i - H_j \rangle

بالتعويض في تدرّج BPR-OPT، نحصل على تحديثات بديهية:

  • WuW_u: يُدفع باتجاه HiHjH_i - H_j — أي تقريب المستخدم من العنصر المفضَّل وإبعاده عن غير المفضَّل.
  • HiH_i: يُدفع نحو WuW_u — أي تقريب العنصر المفضَّل من المستخدم.
  • HjH_j: يُدفع بعيداً عن WuW_u — أي إبعاد العنصر غير المفضَّل.

الصورة الهندسية هنا جميلة وبديهية: كل خطوة تدريب تشدّ المستخدم وعناصره المفضَّلة نحو بعضهم في ، بينما تدفع العناصر غير المفضَّلة بعيداً عنه.

افتح في المختبر
شاهد كيف يتحرك المستخدمون (الدوائر) والعناصر (المربعات) في فضاء ثنائي الأبعاد: تحديثات BPR تسحب العناصر المفضَّلة نحو المستخدم وتدفع غير المفضَّلة بعيداً عنه.
تستيقظ التجربة عند وصولك…

الفكرة ذاتها في شيفرة برمجية

BPR مع تحليل المصفوفات، كاملاًpython

مبسَّط لإظهار الفكرة — ليس التنفيذ الحقيقي.

import numpy as np

def sigmoid(x):
    return 1 / (1 + np.exp(-np.clip(x, -500, 500)))

def bpr_update(W, H, u, i, j, lr=0.01, reg=0.01):
    """خطوة تدرّج واحدة لـ BPR-MF للثلاثية (u, i, j)."""
    x_uij = W[u] @ H[i] - W[u] @ H[j]   # فارق الدرجات
    s = sigmoid(-x_uij)                    # معامل التدرّج

    # حدّث المتجهات الكامنة: قرّب المستخدم من i وأبعده عن j
    W[u] += lr * (s * (H[i] - H[j]) - reg * W[u])
    H[i] += lr * (s * W[u]          - reg * H[i])
    H[j] += lr * (s * (-W[u])       - reg * H[j])

def learn_bpr(interactions, n_users, n_items, k=20, epochs=100, lr=0.01):
    """خوارزمية LearnBPR كاملة مع أخذ عيّنات تمهيدية."""
    W = np.random.randn(n_users, k) * 0.01
    H = np.random.randn(n_items, k) * 0.01

    # بناء مجموعات العناصر الإيجابية لكل مستخدم للبحث السريع
    user_items = {}
    for u, i in interactions:
        user_items.setdefault(u, set()).add(i)

    all_items = set(range(n_items))
    for epoch in range(epochs):
        for _ in range(len(interactions)):
            # عيّنات تمهيدية: اسحب (u, i, j) عشوائياً بانتظام
            u, i = interactions[np.random.randint(len(interactions))]
            j = np.random.randint(n_items)
            while j in user_items[u]:      # أعد السحب حتى يكون j غير ملاحَظ
                j = np.random.randint(n_items)
            bpr_update(W, H, u, i, j, lr)

    return W, H   # مصفوفتا المستخدمين والعناصر الكامنة

# التنبؤ بترتيب المستخدم u: رتّب العناصر حسب W[u] @ H[i]
# scores = W[u] @ H.T ← الترتيب التنازلي يعطي الترتيب الشخصي

لماذا غيّر المسار

أثبت هذا الإطار متانة لافتة عبر السنين. خسارة BPR الزوجية صارت إشارة التدريب المرجعية لنماذج التغذية الراجعة الضمنية. وحين دخل مجال التوصيات، تبنّت بنية الترشيح التعاوني العصبي والبنى التي تلتها BPR-OPT كدالة خسارة. بل إن فكرة سحب ثلاثيات (مستخدم، عنصر إيجابي، عنصر سلبي) — ما بات يُعرف بـ — يعود في جذوره إلى أسلوب العيّنات التمهيدية في LearnBPR.

المسار بعد BPR

  1. 2008

    WR-MF (هو، كورين، فولينسكي)

    تحليل المصفوفات المنتظم الموزون للتغذية الراجعة الضمنية. اعتبر كل عنصر لم يُلاحَظ سلبياً بثقة منخفضة — وهو الخط المرجعي النقطي الذي جاء BPR ليتفوّق عليه.

  2. 2009

    BPR (هذه الورقة)

    طرح إطار التحسين الزوجي لترتيب التغذية الراجعة الضمنية. أثبت أن BPR-OPT يكافئ AUC تقريباً، وأن السحب العشوائي للعيّنات يتفوق على المرور التسلسلي.

  3. 2016

    VBPR (هي وماكولي)

    وسّع BPR بإضافة سمات بصرية مستخرجة من الشبكات الالتفافية، فصارت صور العناصر جزءاً من التمثيل الكامن، مما حسّن أداء الترتيب خصوصاً مع العناصر الجديدة.

  4. 2017

    NCF (هي وآخرون)

    استبدل الضرب النقطي بشبكة عصبية لكنه احتفظ بخسارة BPR الزوجية. أكّد أن النماذج العميقة تستفيد من أسلوب التدريب الزوجي.

  5. 2018

    DIN (جو وآخرون)

    أضافت آلية انتباه على تسلسل سلوك المستخدم. رغم اعتمادها على خسارة نقطية، إلا أن طريقة سحب العيّنات فيها تحاكي فلسفة BPR في أخذ العيّنات السلبية.

  6. 2020

    مراجعة BPR (ريندل وآخرون)

    أظهر ريندل أن BPR-MF حين يُضبط بعناية يضاهي NCF أو يتفوق عليه في عدّة معايير مرجعية، مما أعاد النقاش حول ما إذا كانت النماذج العميقة متفوقة دائماً في التوصيات.

خسارة BPR الزوجية لا تزال لبنة أساسية في أنظمة التوصية. في كل مرة يسحب فيها نظام توصية حديث ثلاثية (مستخدم، عنصر إيجابي، عنصر سلبي) ويدفع الدرجة الإيجابية لتتقدم على السلبية، فهو يسير على الدرب الذي رسمه BPR. ورسالة الورقة الجوهرية — حسِّن المقياس الذي يهمك فعلاً، لا بديلاً أسهل — تبقى من أهم الدروس في التعلّم الآلي التطبيقي.

المرجعRendle, Freudenthaler, Gantner, Schmidt-Thieme. BPR: Bayesian Personalized Ranking from Implicit Feedback. UAI, 2009.

مصطلحات هذه الورقة