أنظمة التوصية2009مبتدئ9 دقيقة قراءة

تقنيات تحليل المصفوفات لأنظمة التوصية

Matrix Factorization Techniques for Recommender Systems

Koren, Y. · Bell, R. · Volinsky, C. — IEEE Computer

المشكلة

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

الإسهام

الفكرة الأساسية هي تفكيك مصفوفة التقييمات المتناثرة إلى مصفوفتين صغيرتين — واحدة تمثّل المستخدمين وأخرى تمثّل العناصر — بحيث يكون كل صف فيهما متجهاً مدمجاً يصف الأذواق أو السمات الكامنة. التقييم المتوقَّع هو ببساطة الجداء النقطي َي المستخدم والعنصر مع إضافة انحيازات مُتعلَّمة. يُدرَّب بكفاءة عبر أو . توسّعات لاحقة أضافت والتغيّرات الزمنية، فأنتجت النماذج التي فازت بجائزة Netflix.

الأثر

أسّس القاعدة التي بُنيت عليها أنظمة التوصية الحديثة، والأهم أنه زرع بذرة فكرة التي انتشرت لاحقاً في كل فروع التعلّم العميق. متجهات المستخدمين والعناصر التي قدّمها هذا العمل هي الأصل المباشر لـ word2vec وGloVe وجداول التضمين الموجودة في كل شبكة عصبية حديثة. خوارزميات مثل BPR وNCF وWide & Deep ومحرك توصيات YouTube كلها تعود جذورها إلى هذه الفكرة.

تخيّل أنك دخلت مكتبة فيها مليون كتاب لكن بلا فهرس. الطريقة التقليدية أن يسأل أمين المكتبة كل زائر سابق عن الكتب التي أحبّها ثم يبحث عن شخص ذوقه يشبه ذوقك — لكن هذا بطيء وغير عملي مع ملايين الزوّار.

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

تحليل المصفوفات هو ذلك الأمين الذكي: يكتشف هذه السمات المخفية تلقائياً من أنماط التقييمات وحدها، دون أن يخبره أحد ما تعنيه كل سمة.

كيف تعمل أنظمة التوصية؟

هناك استراتيجيتان أساسيتان في عالم :

الأولى هي ، وفكرتها أنها تنظر إلى خصائص العناصر نفسها — كالنوع والمخرج والكلمات المفتاحية — ثم توصي بعناصر تشبه ما أعجبك سابقاً. ميزتها أنها لا تحتاج بيانات مستخدمين آخرين، لكن مشكلتها أنها لا تفاجئك: ستستمر في ترشيح المزيد مما تعرف مسبقاً أنه يعجبك.

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

افتح في المختبر
التصفية بالمحتوى تنظر لخصائص العنصر، بينما التصفية التعاونية تنظر لأنماط سلوك المستخدمين. بدِّل بينهما للمقارنة.
تستيقظ التجربة عند وصولك…

التصفية التعاونية نفسها فيها مدرستان:

أساليب الجوار تبحث عن مستخدمين يشبهونك في الذوق (أو عناصر تشبه ما أحببته) ثم تحسب متوسط تقييماتهم. هذه الأساليب بسيطة ومفهومة، لكنها تعاني حين تكون مصفوفة التقييمات شبه فارغة — وهذا هو الوضع الطبيعي دائماً تقريباً.

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

المشكلة الجوهرية: جدول ضخم معظمه فارغ

تصوّر جدولاً كل صف فيه يمثّل مستخدماً وكل عمود يمثّل فيلماً. كل خانة إما تحتوي تقييماً (من 1 إلى 5 نجوم)، أو — وهذا الغالب الأعم — تكون فارغة. في بيانات Netflix مثلاً كان هناك نحو 480 ألف مستخدم و17,770 فيلماً، لكن لم يُسجَّل إلا 100 مليون تقييم فقط. أي أن نحو 1.2% فقط من الخانات ممتلئة — و98.8% المتبقية فراغات نريد التنبّؤ بها.

هدف تحليل المصفوفات هو ملء هذه الفراغات بطريقة ذكية، وذلك بالكشف عن البنية المخفية المدفونة داخل نمط التقييمات المعروفة رغم تناثرها.

افتح في المختبر
مصفوفة مُحاكاة لتقييمات المستخدمين والعناصر. الخانات الملونة تقييمات معروفة، والرمادية فراغات يحاول تحليل المصفوفات التنبّؤ بها. مرِّر المؤشر لرؤية القيم.
تستيقظ التجربة عند وصولك…

الفكرة المحورية: فكّك المصفوفة إلى مصفوفتين صغيرتين

الفكرة الجوهرية بسيطة: إذا كانت مصفوفة التقييمات RR بحجم mm مستخدم × nn عنصر، نقرّبها بجداء مصفوفتين أصغر بكثير:

  • مصفوفة المستخدمين PP بحجم m×km × k، حيث كل صف pup_u هو متجه العوامل الكامنة للمستخدم uu — أي تضمين يلخّص ذوقه.
  • مصفوفة العناصر QQ بحجم n×kn × k، حيث كل صف qiq_i هو متجه العوامل الكامنة للعنصر ii — أي تضمين يلخّص سماته.

العدد kk (عادةً بين 20 و200) هو عدد أبعاد — وهو أصغر بكثير من mm أو nn. كل بُعد قد يمثّل ضمنياً مفهوماً مثل «كم فيه من الكوميديا» أو «هل النبرة قاتمة» — لكن النموذج يكتشف هذه الأبعاد بنفسه من البيانات دون أن يخبره أحد بذلك.

تخيّل أنك تمنح كل مستخدم وكل فيلم بطاقة تعريف فيها kk من الدرجات. للتنبّؤ بمقدار إعجاب المستخدم uu بالفيلم ii، ضع البطاقتين جنباً إلى جنب واحسب : اضرب كل درجة بنظيرتها ثم اجمع النتائج.

r^ui=qipu=f=1kqifpuf\hat{r}_{ui} = q_i^\top p_u = \sum_{f=1}^{k} q_{if} \cdot p_{uf}
التنبؤ الأساسي في تحليل المصفوفات — الجداء النقطي لمتجهَين كامنَينالتقييم المتوقَّع هو حاصل جمع حاصل ضرب كل عنصر في متجه المستخدم بنظيره في متجه العنصر. الأبعاد المتوافقة (كلاهما كبير أو كلاهما صغير) ترفع التقييم، والمتعارضة تخفضه.
افتح في المختبر
اسحب المستخدمين والأفلام في الفضاء الكامن. الجداء النقطي بينهما هو التقييم المتوقَّع — كلما تقاربت المتجهات ارتفع التقييم.
تستيقظ التجربة عند وصولك…

تعديل عملي: الانحيازات تلتقط الأنماط البديهية

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

الحل: قبل أن ننظر في الذوق الشخصي، نطرح الأنماط البديهية أولاً. نأخذ المتوسط العام للتقييمات μ\mu، ثم نضيف انحيازاً خاصاً بالمستخدم bub_u يعبّر عن ميله للتقييم المرتفع أو المنخفض مقارنة بالمتوسط، وانحيازاً خاصاً بالعنصر bib_i يعبّر عن شعبيته العامة. ما يتبقّى بعد طرح هذه الانحيازات هو الجزء الذي يعكس التفاعل الحقيقي بين المستخدم والعنصر — وهذا تحديداً ما تنمذجه العوامل الكامنة.

r^ui=μ+bu+bi+qipu\hat{r}_{ui} = \mu + b_u + b_i + q_i^\top p_u
تحليل المصفوفات مع الانحيازات — معادلة التنبؤ الكاملةμ = المتوسط العام · b_u = انحياز المستخدم · b_i = انحياز العنصر · q_i^T p_u = تفاعل الذوق الشخصي. الانحيازات تمتص الأنماط الواضحة، والجداء النقطي يلتقط الأنماط الدقيقة المتعلقة بالذوق.
افتح في المختبر
شاهد كيف يُبنى التقييم المتوقَّع طبقة بطبقة: المتوسط العام ← انحياز المستخدم ← انحياز العنصر ← التفاعل الكامن.
تستيقظ التجربة عند وصولك…

التعلّم: كيف نحسب هذه المتجهات؟

نريد إيجاد متجهات المستخدمين والعناصر والانحيازات التي تجعل تنبّؤاتنا أقرب ما يمكن إلى التقييمات المعروفة. تُصاغ هذه المسألة على شكل تقليل — وهي مجموع مربعات الفروق بين التقييمات المتوقَّعة والفعلية — مع إضافة حدّ يمنع للبيانات بدلاً من التعميم.

minp,q,b(u,i)K(ruiμbubiqipu)2+λ(pu2+qi2+bu2+bi2)\min_{p, q, b} \sum_{(u,i) \in \mathcal{K}} \left( r_{ui} - \mu - b_u - b_i - q_i^\top p_u \right)^2 + \lambda \left( \|p_u\|^2 + \|q_i\|^2 + b_u^2 + b_i^2 \right)
دالة الهدف المنتظمة لتحليل المصفوفات — ما نحسّنه فعلياًالحد الأول يعاقب على أخطاء التنبؤ في التقييمات المعروفة. الحد الثاني الموزون بـ λ يكبح فرط التخصيص بإبقاء جميع المعاملات المُتعلَّمة قريبة من الصفر.

هناك خوارزميتان رئيسيتان لتدريب هذا النموذج:

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

المربعات الصغرى بالتناوب (ALS) — الفكرة مختلفة: ثبّت متجهات المستخدمين وأوجد متجهات العناصر المُثلى (وهي مسألة مربعات صغرى كلاسيكية)، ثم ثبّت متجهات العناصر وأوجد متجهات المستخدمين المُثلى، وهكذا بالتناوب. كل دورة أبطأ من SGD، لكن الميزة الكبرى أن كل مسألة فرعية محدّبة ويمكن توزيعها على عدة أجهزة بالتوازي — وهذا يجعلها مثالية للعناقيد الحوسبية الكبيرة.

افتح في المختبر
شاهد كيف يتقارب كلٌّ من SGD وALS. الأول يأخذ خطوات صغيرة كثيرة، والثاني خطوات أقل لكن أكبر. كلاهما يصل إلى نفس النتيجة.
تستيقظ التجربة عند وصولك…

الفكرة نفسها في الكود

تحليل المصفوفات بالانحدار التدريجي العشوائي — تنفيذ كاملpython

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

import numpy as np

def train_mf(ratings, k=20, lr=0.005, reg=0.02, epochs=20):
    """
    ratings: قائمة من (مستخدم، عنصر، تقييم)
    k: عدد العوامل الكامنة
    يُرجع: P (مصفوفة المستخدمين)، Q (مصفوفة العناصر)، bu، bi، mu
    """
    users = set(u for u, _, _ in ratings)
    items = set(i for _, i, _ in ratings)
    n_users, n_items = max(users) + 1, max(items) + 1

    # تهيئة المتجهات الكامنة بقيم عشوائية صغيرة
    P = np.random.normal(0, 0.1, (n_users, k))   # تضمينات المستخدمين
    Q = np.random.normal(0, 0.1, (n_items, k))   # تضمينات العناصر
    bu = np.zeros(n_users)                         # انحيازات المستخدمين
    bi = np.zeros(n_items)                         # انحيازات العناصر
    mu = np.mean([r for _, _, r in ratings])       # المتوسط العام

    for epoch in range(epochs):
        np.random.shuffle(ratings)
        for u, i, r in ratings:
            # التنبؤ: mu + bu + bi + dot(Pu, Qi)
            pred = mu + bu[u] + bi[i] + P[u] @ Q[i]
            err = r - pred                         # خطأ التنبؤ

            # تحديثات SGD — عدِّل نحو القيمة الصحيحة ونظِّم نحو الصفر
            bu[u] += lr * (err - reg * bu[u])
            bi[i] += lr * (err - reg * bi[i])
            P[u]  += lr * (err * Q[i] - reg * P[u])
            Q[i]  += lr * (err * P[u] - reg * Q[i])

    return P, Q, bu, bi, mu

# تنبؤ: كم سيحب المستخدم 42 العنصر 7؟
# pred = mu + bu[42] + bi[7] + P[42] @ Q[7]

ما وراء التقييمات: الإشارات الضمنية والتغيّرات الزمنية

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

نموذج SVD++ يوسّع تحليل المصفوفات الأساسي بأن يأخذ بالحسبان العناصر التي تفاعل معها المستخدم — حتى لو لم يمنحها تقييماً رقمياً. كل عنصر يحصل على متجه عوامل إضافي yiy_i، ومتجه تفضيلات المستخدم الفعلي يصبح عوامله الصريحة مضافاً إليها مجموع متجهات yiy_i لكل العناصر التي تفاعل معها.

r^ui=μ+bu+bi+qi(pu+N(u)12jN(u)yj)\hat{r}_{ui} = \mu + b_u + b_i + q_i^\top \left( p_u + |N(u)|^{-\frac{1}{2}} \sum_{j \in N(u)} y_j \right)
SVD++ — دمج التغذية الراجعة الضمنيةN(u) هي مجموعة العناصر التي تفاعل معها المستخدم u. متجهات y_j تتيح للنموذج أن يتعلّم من نمط تفاعلات المستخدم حتى بدون تقييمات صريحة.

من التوسّعات المهمة أيضاً مراعاة التغيّرات الزمنية في الأذواق. ذوقك في سن العشرين يختلف عن ذوقك في الأربعين — ربما كنت تحب أفلام الإثارة ثم انتقلت للدراما. نموذج timeSVD++ يعالج هذا بجعل الانحيازات والعوامل الكامنة كلتيهما متغيرتين مع الزمن، فيلتقط تطوّر التفضيلات بمرور الوقت.

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

لماذا كان مهماً — ولا يزال

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

  1. 2006

    إطلاق جائزة Netflix

    مسابقة بمليون دولار على 100 مليون تقييم فيلم. أساليب تحليل المصفوفات تصدّرت لوحة النتائج بسرعة.

  2. 2009

    الفوز بجائزة Netflix

    فاز فريق BellKor's Pragmatic Chaos بالجائزة. حلّهم كان مجموعة نماذج مبنية بشكل أساسي على تحليل المصفوفات مع انحيازات وديناميكيات زمنية.

  3. 2009

    BPR — الترتيب الشخصي البايزي

    أعاد صياغة مسألة التوصية كمسألة ترتيب وليس تنبّؤاً بالتقييمات، مستخدماً تحليل المصفوفات كدالة تسجيل أساسية.

  4. 2013

    Word2Vec كتحليل مصفوفات ضمني

    أثبت Levy وGoldberg أن skip-gram في word2vec يحلّل ضمنياً مصفوفة التواجد المشترك بين الكلمات وسياقاتها.

  5. 2014

    GloVe — تحليل مصفوفات صريح لتضمينات الكلمات

    حلّل Pennington وآخرون مباشرةً مصفوفة لوغاريتم التواجد المشترك، ووحّدوا بين التضمينات القائمة على العدّ والقائمة على التنبؤ.

  6. 2016

    نظام التوصية العميق في YouTube

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

  7. 2017

    NCF — التصفية التعاونية العصبية

    استبدل الجداء النقطي بشبكة عصبية قادرة على تعلّم تفاعلات غير خطية بين المستخدم والعنصر، مع الإبقاء على تضمينات مُتعلَّمة كنقطة انطلاق.

المرجعKoren, Bell, Volinsky. Matrix Factorization Techniques for Recommender Systems. IEEE Computer, 2009.

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