أنظمة التوصية2019متوسط11 دقيقة قراءة
BERT4Rec: التوصية التسلسلية بتمثيلات المرمِّز ثنائي الاتجاه من المحوِّل
BERT4Rec: Sequential Recommendation with Bidirectional Encoder Representations from Transformer
Sun, F. · Liu, J. · Wu, J. · Pei, C. · Lin, X. · Ou, W. · Jiang, P. — CIKM
المشكلة
قبل عام 2019، كانت كل نماذج تقرأ سجلّ المستخدم باتجاه واحد: من الأقدم إلى الأحدث. طرق سلاسل ماركوف مثل FPMC كانت تكتفي بالنظر إلى آخر عنصر أو عنصرين فقط. النماذج المعتمدة على الشبكات التكرارية مثل GRU4Rec كانت تمرّ على التسلسل خطوة بخطوة، لكنها في كل خطوة لا ترى إلا ما سبقها. وحتى SASRec الذي أدخل إلى هذا المجال، ظلّ يستخدم قناعًا سببيًا يحجب كل موضع عن رؤية العناصر اللاحقة. المشكلة المشتركة واضحة: كل هذه النماذج تبني تمثيل كل عنصر من السياق الأيسر فقط، وتتجاهل معلومات قد تكون بالغة الأهمية في التفاعلات اللاحقة.
الإسهام
ينقل BERT4Rec فكرة نمذجة اللغة المُقنَّعة من BERT إلى مجال التوصية التسلسلية. بدلًا من التنبؤ بالعنصر التالي من السياق الأيسر فقط، يُقنِّع عناصر عشوائية في تسلسل تفاعلات المستخدم ويُدرِّب محوِّلًا عميقًا ثنائي الاتجاه ليتنبّأ بها مستخدمًا السياق من الجهتين. عند ، يُضاف رمز [mask] في نهاية التسلسل للتنبؤ بالعنصر القادم. على أربع مجموعات بيانات مرجعية (Beauty وSteam وMovieLens-1m وMovieLens-10m)، حقّق BERT4Rec تحسينات تتراوح بين 7 و12% في معدل الإصابة ومقياس NDCG مقارنةً بـ SASRec وGRU4Rec وCaser.
الأثر
أثبت BERT4Rec أن منهجية بالتقنيع التي نجحت في معالجة اللغة الطبيعية تنتقل بفعالية إلى التوصية. أصبحت الورقة من أكثر أوراق التوصية التسلسلية استشهادًا، وأطلقت موجة كاملة من أنظمة التوصية المبنية على . الرؤية المحورية هنا أن سلوك المستخدم لا يسير باتجاه واحد بالضرورة: عملية شراء اليوم قد تكشف بأثر رجعي لماذا تصفّح المستخدم منتجًا بالأمس. هذه الفكرة فتحت الباب أمام النمذجة ثنائية الاتجاه في مجتمع التوصية بأكمله، وبُنيت عليها أعمال لاحقة مثل S3-Rec وALBERT4Rec وامتدادات متعددة تستخدم التعلّم التبايُني.
تخيّل أنك محقّق أمامه سجلّ مشتريات ناقص: حذاء ← سترة ← ??? ← نظارة شمسية ← ساعة. أنظمة التوصية القديمة تعمل كمحقّق يقرأ السجلّ من أوله فقط — حين يصل إلى الفراغ، كل ما يعرفه هو أن المشتري اختار حذاءً ثم سترة، ولا شيء غير ذلك.
BERT4Rec محقّق يرى السجلّ بالكامل دفعة واحدة: الحذاء والسترة قبل الفراغ، والنظارة والساعة بعده. لذلك قد يُرشِّح وشاحًا — لأنه يُكمل السترة ويتناسب مع النظارة الشمسية — وهذا استنتاج يستحيل على المحقّق أحادي الاتجاه أن يصل إليه لأنه ببساطة لم يرَ ما بعد الفراغ.
المشكلة: القراءة باتجاه واحد تُضيّع السياق
الهدف من التوصية التسلسلية هو التنبؤ بما سيتفاعل معه المستخدم لاحقًا، بناءً على سجلّه الزمني من نقرات ومشتريات وتقييمات. والفكرة الأساسية هنا أن الترتيب مهم: مشاهدة Inception ثم Interstellar تحمل دلالة تختلف تمامًا عن مشاهدتهما بالترتيب المعاكس.
قبل BERT4Rec، تطوّرت الحلول عبر ثلاث موجات. الموجة الأولى هي طرق سلاسل ماركوف (مثل FPMC) التي افترضت أن العنصر التالي يعتمد فقط على آخر عنصر أو عنصرين — وكأنك تتنبّأ بطقس الغد بالنظر إلى اليوم وحده. الموجة الثانية هي النماذج القائمة على الشبكات التكرارية (GRU4Rec) التي عالجت التسلسل خطوة بخطوة وتحمل حالة خفية للأمام، لكنها عانت من مشكلة في التسلسلات الطويلة. أما الموجة الثالثة فهي نماذج الانتباه الذاتي (مثل SASRec) التي سمحت لكل عنصر بالنظر إلى جميع العناصر السابقة دفعة واحدة — وهذا حلّ مشكلة التبعيّات بعيدة المدى — لكنها ظلّت تستخدم يمنع كل موضع من رؤية ما يأتي بعده.
هذا القناع السببي مستعار أصلًا من نمذجة اللغة، حيث المطلوب التنبؤ بالكلمة التالية. في ذلك السياق يكون الحجب منطقيًا: لا يمكنك الاطّلاع على كلمات لم تُولَّد بعد أثناء التوليد. لكن في التوصية الوضع مختلف — سجلّ المستخدم بأكمله موجود أمامك وقت الاستدلال. حجب السياق الأيمن هنا قيد مصطنع لا مبرّر له، ويُهدر معلومات كان يمكن الاستفادة منها.
الفكرة: أخفِ عناصر وتنبّأ بها من كل الاتجاهات
الفكرة الجوهرية في BERT4Rec مأخوذة من BERT في معالجة اللغة الطبيعية، وتحديدًا مهمة . في اللغة، يأخذ BERT جملة ويُخفي بعض كلماتها ثم يتعلّم التنبؤ بها من السياق المحيط — من اليمين واليسار معًا. BERT4Rec يُطبّق الفكرة نفسها لكن على العناصر بدلًا من الكلمات: يأخذ تسلسل تفاعلات المستخدم، ويُقنِّع بعض العناصر عشوائيًا، ويُدرِّب النموذج على استرجاعها مستعينًا بالسياق الكامل من الاتجاهين.
لنأخذ مثالًا عمليًا: إذا كان تسلسل المستخدم هو ، قد يُقنِّع النموذج الموضعين 2 و4 فيصبح التسلسل . المطلوب الآن استعادة و بالاعتماد على جميع العناصر المتبقية — بما في ذلك العناصر التي تأتي بعد الموضع المُقنَّع. هذا الأمر مستحيل تمامًا لو كنّا نستخدم قناعًا سببيًا.
لكن لماذا هذا مهم عمليًا في التوصية؟ لأن سلوك المستخدم لا يسير في خط مستقيم دائمًا. تخيّل مستخدمًا تصفّح كاميرا، ثم حاملًا ثلاثيًا، ثم بطاقة ذاكرة، ثم حقيبة كاميرا — شراء حقيبة الكاميرا في النهاية يكشف بأثر رجعي لماذا نظر إلى الحامل الثلاثي. السياق ثنائي الاتجاه يلتقط هذا النوع من العلاقات الاستعادية التي لا تستطيع النماذج أحادية الاتجاه رؤيتها.
البنية: طبقات محوِّل مُكدَّسة للعناصر
بنية BERT4Rec هي في جوهرها تكديس لعدد من طبقات مرمِّز المُحوِّل — نفس اللبنة المستخدمة في BERT لكن بدون قناع سببي. كل طبقة تتكوّن من جزأين: تليه تعمل على كل موضع مستقلًا. الجزءان يستخدمان و.
تمثيل المدخلات يتكوّن من جمع معًا. الأول هو تضمين العنصر الذي يحوِّل معرِّف كل عنصر إلى متجه بأبعاد . الثاني هو الذي يُرمِّز ترتيب العنصر داخل التسلسل (الموضع 1، 2، …، ). على خلاف المُحوِّل الأصلي الذي استخدم دوال جيبية ثابتة، يستخدم BERT4Rec تضمينات موضعية قابلة للتعلّم — وهو الخيار نفسه الذي اعتمده BERT.
النموذج يعالج تسلسلًا بطول ثابت يضم أحدث عنصر. إذا كان سجلّ المستخدم أقصر من ، يُحشى من البداية برمز حشو خاص. وإذا كان أطول، تُقتطع أقدم العناصر ويُحتفظ بآخر فقط. هذا قيد عملي بحت الهدف منه إبقاء تكلفة الحساب في حدود معقولة.
التدريب: هدف التنبؤ بالعناصر المُقنَّعة
تدريب BERT4Rec يتّبع إجراء الإكمال المُقنَّع. في كل تسلسل تدريبي، تُختار نسبة من العناصر عشوائيًا وتُستبدل برمز [mask]. بعدها يحاول النموذج التنبؤ بالعنصر الأصلي في كل موضع مُقنَّع.
دالة الخسارة هي السالبة — أي اللوغاريتم السالب لاحتمال العنصر الصحيح — وتُحسب فقط عند المواضع المُقنَّعة. أما العناصر الظاهرة فدورها توفير السياق دون أن تُسهم في الخسارة أو تتلقى إشارة تدرُّج. هذا هو بالضبط أسلوب نمذجة اللغة المُقنَّعة في BERT، منقولًا إلى عالم العناصر والتوصيات.
من أهم القرارات التصميمية هنا نسبة التقنيع . إذا كانت منخفضة جدًا أصبح التدريب بطيئًا لأن كل تسلسل يُنتج عددًا قليلًا من إشارات التعلّم. وإذا ارتفعت كثيرًا لم يبقَ سياق كافٍ للتنبؤ بدقة. النتائج في الورقة تُظهر أن (تقنيع 20%) يناسب التسلسلات القصيرة، بينما أفضل للتسلسلات الطويلة — ببساطة لأن السياق المتبقي يظل كافيًا حتى مع تقنيع أكثر.
الاستدلال: التنبؤ بالعنصر التالي
عند الاستدلال، يتحوّل الهدف من ملء فراغات داخلية إلى التنبؤ بالعنصر التالي فعلًا. الحل الذي يعتمده BERT4Rec أنيق: يُلحق رمز [mask] في نهاية تسلسل المستخدم ويسأل النموذج: ما العنصر الذي ينبغي أن يحلّ محل هذا القناع؟
النموذج يُخرج متجهًا خفيًا عند موضع القناع. هذا المتجه يُسقَط على مصفوفة تضمينات العناصر لإنتاج درجة لكل عنصر في الكتالوج، ثم تُرتَّب العناصر وتُقدَّم أعلى منها كتوصيات.
هناك نقطة تستحق الانتباه: هدف التدريب (التنبؤ بعناصر مُقنَّعة في أي موضع) يختلف قليلًا عن هدف الاستدلال (التنبؤ بالعنصر التالي في النهاية). لكن التمثيلات الغنية التي تعلّمها النموذج من السياق ثنائي الاتجاه أثناء التدريب تُعوّض هذا الاختلاف بفارق كبير — وهذا بالضبط ما أثبتته التجارب العملية.
الفكرة بالكود
مبسَّط لإظهار الفكرة — ليس التنفيذ الحقيقي.
import numpy as np
def mask_sequence(items, num_items, mask_id, mask_prob=0.2):
"""طبِّق تقنيع الإكمال على تسلسل تفاعلات المستخدم."""
masked = items.copy()
labels = np.full_like(items, -1) # -1 = لا تتنبأ هنا
for i in range(len(items)):
if items[i] == 0: # تخطَّ الحشو
continue
if np.random.random() < mask_prob:
labels[i] = items[i] # احفظ العنصر الحقيقي
masked[i] = mask_id # استبدله بـ [mask]
return masked, labels
def bert4rec_loss(model, items, mask_id, num_items):
"""خطوة تدريب واحدة: تنبّأ بالعناصر المُقنَّعة من السياق ثنائي الاتجاه."""
masked_input, labels = mask_sequence(items, num_items, mask_id)
# تمرير أمامي: انتباه كامل — بلا قناع سببي!
# كل عنصر يرى كل عنصر آخر (السابق واللاحق).
hidden = model.encode(masked_input) # (طول_التسلسل, d_model)
loss = 0
count = 0
for i in range(len(items)):
if labels[i] != -1:
# أسقِط الحالة الخفية على تضمينات العناصر ← درجة لكل عنصر
logits = hidden[i] @ model.item_embeddings.T
loss += cross_entropy(logits, labels[i])
count += 1
return loss / count
def predict_next(model, user_history, mask_id, top_k=10):
"""الاستدلال: ألحِق [mask] وتنبّأ بالعنصر التالي."""
sequence = user_history + [mask_id] # ألحِق [mask] في النهاية
hidden = model.encode(sequence)
mask_hidden = hidden[-1] # التمثيل عند [mask]
scores = mask_hidden @ model.item_embeddings.T
return top_k_items(scores, top_k)النتائج: ثنائي الاتجاه يتفوّق على أحادي الاتجاه في جميع الحالات
قُيِّم BERT4Rec على أربع مجموعات بيانات تمثّل مجالات وأحجامًا متنوعة: Amazon Beauty (صغيرة ومتفرّقة)، وSteam (متوسطة الحجم، مجال الألعاب)، وMovieLens-1m وMovieLens-10m (كبيرة وكثيفة). بروتوكول التقييم يعتمد مبدأ حذف العنصر الأخير: آخر عنصر في سجلّ كل مستخدم يُحجَز للاختبار، والذي قبله للتحقق.
أبرز النتائج عبر جميع المجموعات:
-
BERT4Rec يتفوّق على SASRec — وهو أقوى نموذج أحادي الاتجاه — بمتوسط 7.2% في معدل الإصابة@10 و11.7% في NDCG@10. المقارنة هنا عادلة تمامًا: البنية واحدة من المُحوِّل ذاته، والاختلاف الوحيد هو اتجاه التقنيع.
-
BERT4Rec يتغلّب على GRU4Rec ونسخته المُحسَّنة GRU4Rec+ بهوامش أكبر، وهذا يؤكّد أن الانتباه الذاتي يتفوّق على الآليات التكرارية في التوصية التسلسلية.
-
على أكبر مجموعة (MovieLens-10m)، BERT4Rec بطبقتين فقط يتغلّب على SASRec مع أفضل عمق ممكن. الرسالة واضحة: السياق ثنائي الاتجاه أقيم من مجرد إضافة طبقات.
-
تعميق النموذج (طبقات محوِّل أكثر) يُساعد، لكن المكسب الأكبر يأتي من التحوّل من اتجاه واحد إلى اتجاهين — الاتجاه أهم من العمق.
قرارات التصميم الرئيسية
الورقة تُحلِّل بعناية تأثير عدة خيارات تصميمية:
نسبة التقنيع : مع التسلسلات القصيرة (مثل مجموعة Beauty)، القيمة المثلى هي . أما مع التسلسلات الطويلة (مثل MovieLens-1m)، فإن تُعطي نتائج أفضل لأن عدد العناصر المتبقية يظل كافيًا حتى مع تقنيع نسبة أكبر. هذا يُشبه ما وجده BERT في اللغة حيث كانت نسبة 15% مناسبة — والنسبة المثلى تعتمد على طول التسلسل وكثافته.
عدد الطبقات : الأداء يتحسّن بوضوح عند الانتقال من طبقة واحدة إلى اثنتين في جميع المجموعات، ومن اثنتين إلى ثلاث في المجموعات الأكبر. بعد ذلك تبدأ المكاسب بالتوقف أو حتى التراجع بسبب . الاختيار الأفضل في أغلب الحالات هو طبقتان.
أقصى طول للتسلسل : السجلّات الأطول تُفيد حتى نقطة معيّنة ( للمجموعات الصغيرة، لـ MovieLens-10m). بعد هذا الحد يُسيطر الحشو على التسلسل ويبدأ الأداء بالتراجع.
عدد رؤوس : القيمة الافتراضية تعمل جيدًا. زيادة عدد الرؤوس لا تُحسِّن الأداء بشكل ثابت لأن كل رأس يحصل على أبعاد أقل، والعلاقات بين العناصر أبسط بطبيعتها من العلاقات اللغوية.
ما الذي فتحه BERT4Rec
2016
GRU4Rec — الشبكات التكرارية للتوصية بناءً على الجلسة
أول تطبيق ناجح للشبكات العصبية التكرارية في التوصية التسلسلية. كان يمرّ على تسلسلات العناصر خطوة بخطوة باستخدام وحدة GRU، لكنه عانى من تلاشي التدرُّج مع السجلّات الطويلة.
2018
SASRec — الانتباه الذاتي للتوصية التسلسلية
استبدل الشبكات التكرارية بآلية انتباه ذاتي مستوحاة من المحوِّل. كل عنصر يستطيع النظر إلى جميع العناصر السابقة دفعة واحدة، وهذا حلّ مشكلة التبعيّات بعيدة المدى. لكنه ظلّ مقيّدًا بقناع سببي — أي اتجاه واحد فقط.
2019
BERT4Rec — التقنيع ثنائي الاتجاه للتوصية
تخلّص من القناع السببي واعتمد مهمة الإكمال المُقنَّع من BERT. كل عنصر يرى جميع العناصر الأخرى، فيحصل على تمثيلات أغنى بكثير. تحسّن بنسبة 7–12% مقارنة بـ SASRec عبر أربع مجموعات بيانات.
2020
S3-Rec — التدريب المسبق ذاتي الإشراف للتوصية
وسّع فكرة BERT4Rec بإضافة مهام إشراف ذاتي جديدة مثل التنبؤ بسمات العنصر والتنبؤ بمقاطع من التسلسل، بهدف إثراء إشارات التدريب المسبق خاصةً في حالات البداية الباردة.
2021
التعلّم التبايُني يلتقي بالتوصية التسلسلية
دمج CL4SRec وCoSeRec التنبؤ بالتقنيع من BERT4Rec مع أهداف التعلّم التبايُني، لتعلّم تمثيلات أكثر متانة عبر مقارنة نسخ مُعزَّزة مختلفة من التسلسل نفسه.
الإسهام الأبرز لـ BERT4Rec هو نقل فكرة بسيطة لكنها مؤثرة: ماذا لو تعاملنا مع تسلسلات تفاعلات المستخدم بنفس الطريقة التي يتعامل بها BERT مع الجمل؟ نُقنِّع بعض العناصر ونتنبّأ بها من السياق الكامل، ونترك النموذج يكتشف بنفسه أيّ العناصر تُفسِّر أيّ عناصر أخرى — بصرف النظر عن ترتيبها الزمني. المحصلة هي نموذج توصية يفهم نوايا المستخدم بعمق أكبر، لأنه يقرأ القصة من طرفيها لا من بدايتها فقط.
المرجعSun, Liu, Wu, Pei, Lin, Ou, Jiang. BERT4Rec: Sequential Recommendation with Bidirectional Encoder Representations from Transformer. CIKM, 2019.
مصطلحات هذه الورقة
- التوصية التسلسليةSequential Recommendation
- نمذجة اللغة المُقنَّعة (MLM)Masked Language Modeling (MLM)
- الانتباه الذاتيSelf-Attention
- ملء الفراغCloze
- التصفية التعاونيةCollaborative Filtering
- التغذية الراجعة الضمنيةImplicit Feedback
- الانتباه المتعدد المساراتMulti-Head Attention
- التضمين الموضعيPositional Embedding
- النموذج التوليدي التراجعيAutoregressive Model
- قناع سببيCausal Mask
- الإسقاط العشوائي للعصبوناتDropout
- التضمينEmbedding
- سوفت ماكسSoftmax
- فقد الإنتروبيا التقاطعيةCross-Entropy Loss
- البداية الباردةCold Start