أنظمة التوصية2018متوسط10 دقيقة قراءة
شبكة الاهتمام العميق للتنبؤ بمعدّل النقر
Deep Interest Network for Click-Through Rate Prediction
Zhou, G. · Song, C. · Zhu, X. · Fan, Y. · Zhu, H. · Ma, X. · Yan, Y. · Jin, J. · Li, H. · Gai, K. — KDD
المشكلة
النماذج التقليدية للتنبؤ تختصر كل سلوكيات المستخدم في متّجه واحد ثابت الطول، بصرف النظر عن الإعلان المعروض. المشكلة أن هذا المتّجه الواحد لا يستطيع تمثيل اهتمامات متنوّعة: أمّ شابة تتصفّح المعاطف والأقراط وألعاب الأطفال تظهر للنظام بشكل متطابق سواء كان الإعلان عن حقيبة يد أو هاتف. وزيادة حجم المتّجه ليست حلاً عملياً لأنها تؤدي إلى في بيانات صناعية متفرّقة بمئات الملايين من السمات.
الإسهام
تقدّم الورقة آلية انتباه محلية تفحص سجلّ بالنسبة لكل إعلان مرشّح، فيصبح تمثيل المستخدم متغيّراً حسب الإعلان بدلاً من أن يكون ثابتاً. إلى جانب ذلك، تطرح الورقة تقنيتَي : تسوية واعية بحجم الدفعة تجعل انتظام L2 قابلاً للتطبيق على نطاق مليارات المعاملات، ودالة تفعيل تكيّفية (Dice) تعمّم PReLU بإزاحة نقطة التبديل إلى متوسّط توزيع المدخلات. حقّقت الشبكة تحسّناً بنسبة 10% في معدّل النقر ضمن اختبارات A/B على نظام الإعلانات في علي بابا.
الأثر
أرست هذه الورقة مبدأً جوهرياً: تمثيل المستخدم ينبغي أن يتغيّر بحسب الإعلان، لا أن يبقى جامداً. هذا التوجّه أنتج عائلة كاملة من النماذج مثل DIEN لتطوّر الاهتمام، وDSIN لاهتمام الجلسة، وBERT4Rec للتوصية التسلسلية. وامتدّ تأثيره إلى أنظمة التوصية الصناعية في علي بابا وجوجل وميتا، حتى أصبحت نمذجة المستخدم التكيّفية هي المعيار في التنبؤ بمعدّل النقر على النطاق الواسع.
تخيّل أنك تدخل مكتبة ضخمة وبيدك ورقة تصف حقيبة يد تريد شراءها. النظام القديم يعطيك صندوقاً جاهزاً فيه «كل ما قرأته سابقاً» — روايات وكتب طبخ وأدلّة سفر — الصندوق نفسه مهما كان طلبك.
شبكة العميق تعمل كـأمينة مكتبة ذكية: تقرأ ورقتك، تتفحّص الرفوف، وتسحب فقط مجلات الأزياء وكتالوجات الإكسسوارات. لو كتبت في ورقتك «حذاء رياضي»، لذهبت مباشرة إلى قسم الرياضة. الصندوق يتغيّر كل مرة، لأن ما يهمّ يعتمد على ما تبحث عنه الآن.
المشكلة: صندوق واحد لجميع الاهتمامات
في عالم إعلانات التجارة الإلكترونية، كلّما زار مستخدم صفحةً ما، يحتاج النظام أن يقرّر أيّ إعلان يعرض له. جوهر هذا القرار هو التنبؤ بمعدّل النقر: ما احتمال أن ينقر هذا المستخدم بالذات على هذا الإعلان بالذات؟
حتى عام 2017، كان النهج السائد يعمل كالتالي: تؤخذ سلوكيات المستخدم — السلع التي تصفّحها والتصنيفات التي نقر عليها — وتُرمَّز كمتّجهات كثيفة، ثم تُجمَّع كلها في واحد ثابت الطول عبر بالجمع أو بالمتوسّط. بعد ذلك يُدمج هذا المتّجه مع الإعلان ويُمرَّر إلى .
الخلل الجوهري هنا أن متّجه المستخدم يبقى هو نفسه بصرف النظر عن الإعلان. تصوّر أمّاً شابة تصفّحت المعاطف والأقراط وحقائب اليد وألعاب الأطفال — كل هذه الاهتمامات المختلفة مضغوطة في نقطة واحدة في فضاء التضمين. حين يظهر إعلان حقيبة يد، لا يملك النظام طريقة لتكبير الجزء المتعلّق بالحقائب من سجلّها واستبعاد الباقي، بل يستخدم الكتلة المضغوطة كلها. الحل البديهي هو توسيع بُعد المتّجه، لكن حين تصل أبعاد معرّفات السلع إلى 600 مليون، يقود ذلك إلى فرط تخصيص كارثي.
تمثيل السمات: من المتفرّق إلى الكثيف
بيانات التنبؤ بمعدّل النقر تصنيفية بطبيعتها ومقسّمة إلى مجموعات. كل عيّنة تبدو مثل: [يوم_الأسبوع=الجمعة، الجنس=أنثى، تصنيفات_متصفَّحة={حقائب، كتب}، تصنيف_الإعلان=كتب]. كل مجموعة تُرمَّز بترميز أحادي (one-hot) أو متعدد (multi-hot). مثلاً، حقل التصنيفات المتصفَّحة بتصنيفين نشطين يتحوّل إلى متّجه بقيمتَي 1 فقط.
هذه المتّجهات ضخمة بشكل هائل — معرّف السلعة وحده يصل إلى نحو 600 مليون بُعد في نظام علي بابا. طبقة التضمين تأخذ كل معرّف نَشِط وتُسقطه على متّجه كثيف مُتعلَّم ببُعد (يساوي 12 عادةً في الإنتاج). السمات أحادية القيمة تُنتج متّجه تضمين واحداً، أمّا السمات متعددة القيم فتُنتج قائمة من متّجهات التضمين يختلف طولها من مستخدم لآخر.
المشكلة الآن: كيف نغذّي قائمة متغيّرة الطول في شبكة متعددة الطبقات ذات مدخل ثابت؟ الحل التقليدي هو طبقة تجميع — بالجمع أو بالمتوسّط — تضغط القائمة في متّجه واحد. وهذا بالضبط هو عنق الزجاجة الذي تسعى شبكة الاهتمام العميق لكسره.
فكرة DIN: دَع الإعلان يختار أيّ الذكريات تهمّ
الفكرة بسيطة وأنيقة: ليست كل السلوكيات الماضية بنفس الأهمية لكل إعلان. حين يظهر لك إعلان حقيبة يد، تصفّحك السابق لحقائب اليد والحقائب الجلدية أهمّ بكثير من الحذاء الرياضي الذي شاهدته الأسبوع الماضي. لذلك تُدخل الشبكة وحدة تفعيل محلية — وهي صغيرة تُعطي كل سلوك تاريخي درجة صلة بالإعلان المرشّح.
تخيّلها كـكشّاف ضوء على خشبة مسرح: الإعلان المرشّح يلعب دور المخرج الذي يقرّر مَن يُضاء. إعلان حقيبة يد؟ تُنار الحقائب. إعلان حذاء رياضي؟ يُنار قسم الأحذية. السلوكيات ذات الأوزان العالية تهيمن على تمثيل المستخدم، بينما السلوكيات البعيدة عن الإعلان تتراجع إلى الخلفية.
النقطة المهمة هنا: على عكس الانتباه المعتاد في الترجمة الآلية، الشبكة لا تُطبّق على الأوزان لتجعل مجموعها يساوي 1. لماذا؟ لأنها تريد الحفاظ على شدّة الاهتمام. مستخدم بنسبة 90% سلوكيات ملابس سيُنتج تفعيلاً إجمالياً عالياً لإعلان قميص، ومنخفضاً لإعلان هاتف. لو سوّينا الأوزان بـsoftmax لأصبح المجموع واحداً في الحالتين وضاع هذا الفرق الدالّ.
دالة التفعيل تستقبل ثلاثة مدخلات: تضمين السلوك ، وتضمين الإعلان ، والجداء الخارجي بينهما . فائدة الجداء الخارجي أنه يوفّر للشبكة الصغيرة معلومات صريحة عن العلاقة بين السلوك والإعلان، فتتعلّم أنماط الصلة بسرعة أكبر. المخرج عددي واحد يعبّر عن مدى أهمية هذا السلوك لهذا الإعلان.
بنية شبكة الاهتمام العميق — من البداية إلى النهاية
الهيكل العام للشبكة يشبه النموذج الأساسي — تضمين ثم شبكة متعددة الطبقات — لكن الفرق الجوهري أنها تستبدل طبقة التجميع البسيطة بوحدة التفعيل المحلية. مسار البيانات يمرّ بخمس مراحل:
1. طبقة التضمين — كل معرّف سمة (معرّف السلعة، المتجر، التصنيف) يُسقَط على متّجه كثيف ببُعد .
2. وحدة التفعيل المحلية — لكل سلوك في سجلّ المستخدم، تحسب شبكة التفعيل درجة صلته بالإعلان المرشّح. ثم تُستخدم هذه الأوزان في مجموع موزون (وليس متوسّطاً) لتضمينات السلوكيات، فنحصل على .
3. الدمج — يُدمَج مع تضمين الإعلان وسمات الملف الشخصي وسمات السياق.
4. الشبكة متعددة الطبقات — (192 ← 200 ← 80 ← 2 في الإنتاج) تتعلّم التفاعلات اللاخطية بين السمات.
5. دالة — الثنائية لتصنيف نقر/عدم نقر.
التدريب على النطاق الصناعي: تقنيتان جوهريتان
حين نتحدّث عن تدريب شبكات عميقة على بيانات بحجم بيانات علي بابا — ملياري عيّنة و600 مليون سمة لمعرّفات السلع — يبرز تحدّيان عمليان تحلّهما الورقة بتقنيتين مبتكرتين.
الفكرة نفسها بالشيفرة
مبسَّط لإظهار الفكرة — ليس التنفيذ الحقيقي.
import numpy as np
def activation_unit(behavior_emb, ad_emb):
"""تقييم سلوك واحد مقابل الإعلان المرشّح.
behavior_emb: (D,) ad_emb: (D,) -> وزن عددي"""
outer = behavior_emb * ad_emb # جداء عنصري (هداماري)
concat = np.concatenate([behavior_emb, ad_emb, outer]) # (3D,)
# شبكة صغيرة: 3D -> 36 -> 1
h = np.maximum(0, concat @ W1 + b1) # طبقة مخفية
return (h @ W2 + b2).item() # وزن التفعيل العددي
def din_user_vector(behavior_list, ad_emb):
"""تجميع بالمجموع الموزون: كل سلوك موزون بدرجة صلته بالإعلان."""
weights = [activation_unit(b, ad_emb) for b in behavior_list]
# بدون softmax — لحفظ شدّة الاهتمام
weighted = sum(w * b for w, b in zip(weights, behavior_list))
return weighted # الشكل: (D,) — يتغيّر حسب الإعلانالنتائج التجريبية
اختُبرت الشبكة على ثلاث مجموعات بيانات متدرّجة الحجم: أمازون إلكترونيات (1.7 مليون عيّنة)، وMovieLens (20 مليون عيّنة)، وبيانات الإنتاج من علي بابا (2.14 مليار عيّنة). في الثلاث جميعها تفوّقت على النموذج الأساسي وWide&Deep وPNN وDeepFM.
أبرز النتائج ظهرت على بيانات أمازون حيث سلوكيات المستخدمين أغنى وأكثر تنوّعاً: التحسّن النسبي بلغ 5.35% فوق النموذج الأساسي، وقفز إلى 6.82% بعد إضافة Dice. أمّا على بيانات علي بابا الضخمة، فحقّقت الشبكة مع تسوية MBA ودالة Dice تحسّناً نسبياً بنسبة 11.65% — أي زيادة مطلقة في AUC مقدارها 0.0113، وهو رقم له أثر تجاري حقيقي على هذا النطاق.
في الاختبارات الحيّة (A/B) على مدى شهر تقريباً، حقّقت الشبكة تحسّناً بنسبة 10% في معدّل النقر وزيادة بنسبة 3.8% في العائد لكل ألف ظهور مقارنةً بالنموذج السابق. ومنذ ذلك الحين اعتُمدت كنموذج الإعلانات الرئيسي في علي بابا.
قرار تصميمي: لماذا لا تستخدم DIN دالة softmax
في الانتباه المعتاد (كما في )، تُسوَّى الأوزان عبر softmax لتجمع إلى 1. الشبكة هنا تتخلّى عن هذا القيد عمداً. والسبب واضح حين نفكّر بمثال:
خُذ مستخدماً 90% من سجلّه ملابس و10% إلكترونيات. حين يظهر إعلان قميص، معظم سلوكياته ذات صلة — مجموع أوزان التفعيل يكون رقماً كبيراً يعكس شدّة اهتمام عالية. أمّا حين يظهر إعلان هاتف، فعُشر السلوكيات فقط ينشط — والمجموع صغير يعكس شدّة اهتمام منخفضة. لو طبّقنا softmax لأجبرنا المجموعَين على أن يساويا 1، وضاعت هذه الإشارة المهمّة تماماً. الشبكة متعددة الطبقات اللاحقة ستضطر حينها لإعادة اكتشاف معلومة الشدّة من الصفر.
هذه مقايضة واعية: الشبكة تتنازل عن التفسير الاحتمالي للأوزان مقابل معلومات أغنى عن مدى ارتباط سجلّ المستخدم بالإعلان. وهو اختيار عملي أثبتت النتائج صوابه.
لماذا كان هذا العمل مفصلياً
2016
Wide&Deep (جوجل)
جمع بين تقاطعات السمات المصنوعة يدوياً (الشقّ العريض) والتضمينات المُتعلَّمة (الشقّ العميق). أصبح المعيار الصناعي لكن متّجهات المستخدم بقيت ثابتة.
2017
التصفية التعاونية العصبية (NCF)
استبدلت الجداء النقطي في تحليل المصفوفات بشبكة عصبية لنمذجة تفاعلات المستخدم مع العناصر. لكن متّجه المستخدم ظلّ ثابتاً لا يتغيّر بتغيّر العنصر.
2018
شبكة الاهتمام العميق (DIN)
أول من جعل متّجه المستخدم يعتمد على الإعلان عبر التفعيل المحلي. طُبّقت على نطاق علي بابا مع تسوية MBA ودالة Dice.
2019
شبكة تطوّر الاهتمام العميق (DIEN)
بنت على DIN بإضافة نمذجة تطوّر الاهتمام عبر وحدات GRU — لا تكتفي بمعرفة أيّ الاهتمامات ذات صلة، بل تتتبّع كيف تتغيّر مع الزمن.
2019
BERT4Rec
طبّق فكرة التنبؤ المُقنَّع من BERT على التوصية التسلسلية. السياق ثنائي الاتجاه أتاح للنموذج التنبؤ باهتمامات المستخدم بالاعتماد على سلوكياته السابقة واللاحقة معاً.
الفكرة الجوهرية — أن تمثيل المستخدم ينبغي أن يتشكّل حسب ما نسأل عنه — هي في حقيقتها حالة خاصة من مبدأ أعمّ: التمثيل المعتمد على السياق. انتباه المُحوِّل يجعل تمثيل الكلمة يعتمد على الجملة، وBERT يجعله يعتمد على السياق من الاتجاهين. ما فعلته شبكة الاهتمام العميق هو إثبات أن المبدأ نفسه يعمل بالفعالية ذاتها في أنظمة التوصية.
المرجعZhou, Song, Zhu, Fan, Zhu, Ma, Yan, Jin, Li, Gai. Deep Interest Network for Click-Through Rate Prediction. KDD, 2018.
مصطلحات هذه الورقة
- آلية الانتباهAttention
- معدّل النقرClick-Through Rate
- التضمينEmbedding
- سلوك المستخدمUser Behavior
- دالة التنشيطActivation Function
- الضبط الهيكليRegularization
- نظام التوصيةRecommender System
- سوفت ماكسSoftmax
- التجميع المكانيPooling
- البيرسبترون متعدد الطبقاتMulti-Layer Perceptron (MLP)
- التصفية التعاونيةCollaborative Filtering
- ميزة / سمةFeature
- فرط التخصيصOverfitting