🚀 جرب Zilliz Cloud، الـ Milvus المدارة بالكامل، مجاناً — تجربة أداء أسرع بـ 10 أضعاف! جرب الآن>>

milvus-logo
LFAI
  • Home
  • Blog
  • تسريع عملية توليد المرشحين في أنظمة التوصية باستخدام Milvus المقترن بـ PaddlePaddle

تسريع عملية توليد المرشحين في أنظمة التوصية باستخدام Milvus المقترن بـ PaddlePaddle

  • Scenarios
November 26, 2021
Yunmei

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

  • النظام بطيء للغاية عند إرجاع النتائج بسبب الكم الهائل من مجموعات البيانات.
  • لا يمكن معالجة البيانات المدرجة حديثًا في الوقت الفعلي للبحث أو الاستعلام.
  • نشر نظام التوصية أمر شاق.

تهدف هذه المقالة إلى معالجة المشكلات المذكورة أعلاه وتقديم بعض الأفكار من خلال تقديم مشروع نظام التوصية بالمنتجات الذي يستخدم قاعدة بيانات Milvus، وهي قاعدة بيانات متجهة مفتوحة المصدر، مقترنة بمنصة PaddlePaddle، وهي منصة للتعلم العميق.

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

سير العمل الأساسي لنظام التوصية

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

2.png 2.png

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

في حالة نظام التوصية بالمنتجات، يقوم النظام أولاً بمقارنة الملف الشخصي للمستخدم بخصائص المنتجات الموجودة في المخزون لتصفية قائمة المنتجات التي تلبي احتياجات المستخدم. ثم يقوم النظام بتصنيف المنتجات بناءً على مدى تشابهها مع الملف الشخصي للمستخدم، ثم يقوم بترتيبها، وأخيرًا يُعيد أفضل 10 منتجات للمستخدم.

3.png 3.png

بنية النظام

يستخدم نظام التوصية بالمنتجات في هذا المشروع ثلاثة مكونات: MIND و PaddleRec و Milvus.

MIND

MIND، وهي اختصار لعبارة "شبكة متعددة الاهتمامات مع التوجيه الديناميكي للتوصية في Tmall"، هي خوارزمية طورتها مجموعة علي بابا. قبل اقتراح MIND، استخدمت معظم نماذج الذكاء الاصطناعي السائدة للتوصية متجهًا واحدًا لتمثيل اهتمامات المستخدم المتنوعة. ومع ذلك، لا يكفي متجه واحد لتمثيل الاهتمامات الدقيقة للمستخدم. لذلك، تم اقتراح خوارزمية MIND لتحويل اهتمامات المستخدم المتعددة إلى عدة متجهات.

على وجه التحديد، تتبنى MIND شبكة متعددة الاهتمامات مع توجيه ديناميكي لمعالجة الاهتمامات المتعددة لمستخدم واحد خلال مرحلة توليد المرشحين. شبكة الاهتمامات المتعددة هي طبقة من مستخرج الاهتمامات المتعددة مبني على آلية توجيه الكبسولة. يمكن استخدامها لدمج السلوكيات السابقة للمستخدم مع اهتماماته المتعددة، لتوفير ملف تعريف دقيق للمستخدم.

يوضح الرسم البياني التالي بنية شبكة MIND.

4.png 4.png

لتمثيل سمة المستخدمين، تأخذ MIND سلوكيات المستخدم واهتمامات المستخدم كمدخلات، ثم تغذيها في طبقة التضمين لتوليد متجهات المستخدم، بما في ذلك متجهات اهتمامات المستخدم ومتجهات سلوك المستخدم. ثم يتم تغذية متجهات سلوك المستخدم في طبقة مستخرج الاهتمامات المتعددة لتوليد كبسولات اهتمامات المستخدمين. بعد تجميع كبسولات اهتمامات المستخدم مع تضمينات سلوك المستخدم واستخدام عدة طبقات ReLU لتحويلها، يُنتج MIND عدة متجهات تمثيلية للمستخدم. وقد حدد هذا المشروع أن MIND سيُخرج في النهاية أربعة متجهات تمثيل للمستخدمين.

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

عندما يتم تحويل جميع البيانات إلى متجهات، يتم إدخال طبقة انتباه إضافية مدركة للتسميات لتوجيه عملية التدريب.

PaddleRec

PaddleRec هي مكتبة نموذج بحث واسع النطاق للتوصية. وهي جزء من نظام Baidu PaddlePaddle البيئي. يهدف PaddleRec إلى تزويد المطورين بحل متكامل لبناء نظام توصية بطريقة سهلة وسريعة.

5.png 5.png

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

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

  • دعم النشر: يوفر PaddleRec حلول نشر عبر الإنترنت لنماذجه. تكون النماذج جاهزة للاستخدام على الفور بعد التدريب، وتتميز بالمرونة والتوافر العالي.

ميلفوس

Milvus هي قاعدة بيانات متجهة تتميز ببنية سحابية أصلية. وهي مفتوحة المصدر على GitHub ويمكن استخدامها لتخزين وفهرسة وإدارة متجهات التضمين الضخمة التي تم إنشاؤها بواسطة الشبكات العصبية العميقة ونماذج التعلم الآلي الأخرى. يغلف Milvus العديد من مكتبات البحث عن الجار الأقرب التقريبي (ANN) من الدرجة الأولى بما في ذلك Faiss و NMSLIB و Annoy. يمكنك أيضًا توسيع نطاق Milvus وفقًا لحاجتك. خدمة Milvus متوفرة بشكل كبير وتدعم المعالجة المجمعة والموحدة للدفعات والتدفق. تلتزم Milvus بتبسيط عملية إدارة البيانات غير المنظمة وتوفير تجربة مستخدم متسقة في بيئات النشر المختلفة. يحتوي على الميزات التالية:

  • أداء عالٍ عند إجراء بحث متجه على مجموعات بيانات ضخمة.

  • مجتمع مطور أولاً يقدم دعمًا متعدد اللغات وسلسلة أدوات متعددة اللغات.

  • قابلية توسع سحابي وموثوقية عالية حتى في حالة حدوث عطل.

  • بحث هجين يتحقق من خلال إقران التصفية القياسية مع البحث عن التشابه المتجه.

يُستخدم برنامج Milvus للبحث عن التشابه المتجه وإدارة المتجهات في هذا المشروع لأنه قادر على حل مشكلة التحديثات المتكررة للبيانات مع الحفاظ على استقرار النظام.

تنفيذ النظام

لبناء نظام التوصية بالمنتج في هذا المشروع، عليك اتباع الخطوات التالية:

  1. معالجة البيانات
  2. تدريب النموذج
  3. اختبار النموذج
  4. توليد العناصر المرشحة للمنتجات
    1. تخزين البيانات: يتم الحصول على متجهات العناصر من خلال النموذج المدرّب ويتم تخزينها في ميلفوس.
    2. البحث عن البيانات: يتم تغذية متجهات المستخدم الأربعة التي تم إنشاؤها بواسطة MIND في Milvus للبحث عن تشابه المتجهات.
    3. ترتيب البيانات: كل متجه من المتجهات الأربعة له متجهات العناصر المتشابهة top_k الخاصة به، ويتم ترتيب أربع مجموعات من المتجهات top_k لإرجاع قائمة نهائية من top_k المتجهات الأكثر تشابهًا.

تتم استضافة الكود المصدري لهذا المشروع على منصة Baidu AI Studio. القسم التالي هو شرح مفصل للشفرة المصدرية لهذا المشروع.

الخطوة 1. معالجة البيانات

تأتي مجموعة البيانات الأصلية من مجموعة بيانات كتب أمازون المقدمة من ComiRec. ومع ذلك، يستخدم هذا المشروع البيانات التي يتم تنزيلها من PaddleRec ومعالجتها بواسطة PaddleRec. راجع مجموعة بيانات AmazonBook في مشروع PaddleRec لمزيد من المعلومات.

من المتوقع أن تظهر مجموعة البيانات الخاصة بالتدريب بالصيغة التالية، حيث يمثل كل عمود

  • Uid: معرّف المستخدم.
  • item_id: معرّف عنصر المنتج الذي تم النقر عليه من قبل المستخدم.
  • Time: الطابع الزمني أو ترتيب النقر.

من المتوقع أن تظهر مجموعة البيانات الخاصة بالاختبار بالصيغة التالية، حيث يمثل كل عمود

  • Uid: معرّف المستخدم.

  • hist_item: معرف عنصر المنتج في سلوك نقر المستخدم التاريخي. عندما يكون هناك عدة hist_item ، يتم فرزها وفقًا للطابع الزمني.

  • eval_item: التسلسل الفعلي الذي ينقر فيه المستخدم على المنتجات.

الخطوة 2. تدريب النموذج

يستخدم تدريب النموذج البيانات المعالجة في الخطوة السابقة ويعتمد نموذج التوليد المرشح، MIND، المبني على PaddleRec.

1. مدخلات النموذج

في dygraph_model.py ، قم بتشغيل التعليمات البرمجية التالية لمعالجة البيانات وتحويلها إلى مدخلات النموذج. تفرز هذه العملية العناصر التي نقر عليها المستخدم نفسه في البيانات الأصلية وفقًا للطابع الزمني، وتجمعها لتكوين تسلسل. بعد ذلك، اختر عشوائيًا item``_``id من التسلسل كـ target_item ، واستخرج العناصر العشرة قبل target_item كـ hist_item لمدخلات النموذج. إذا لم يكن التسلسل طويلًا بما فيه الكفاية، يمكن تعيينه على أنه 0. seq_len يجب أن يكون الطول الفعلي للتسلسل hist_item.

def create_feeds_train(self, batch_data):
    hist_item = paddle.to_tensor(batch_data[0], dtype="int64")
    target_item = paddle.to_tensor(batch_data[1], dtype="int64")
    seq_len = paddle.to_tensor(batch_data[2], dtype="int64")
    return [hist_item, target_item, seq_len]

ارجع إلى البرنامج النصي /home/aistudio/recommend/model/mind/mind_reader.py للحصول على رمز قراءة مجموعة البيانات الأصلية.

2. نموذج الربط الشبكي

الكود التالي هو مقتطف من net.py. class Mind_Capsual_Layer يحدد طبقة مستخرج الاهتمامات المتعددة المبنية على آلية توجيه كبسولة الاهتمامات. تقوم الدالة label_aware_attention() بتنفيذ تقنية الانتباه المدرك للتسمية في خوارزمية MIND. تقوم الدالة forward() في class MindLayer بنمذجة خصائص المستخدم وتوليد متجهات الوزن المقابلة.

class Mind_Capsual_Layer(nn.Layer):
    def __init__(self):
        super(Mind_Capsual_Layer, self).__init__()
        self.iters = iters
        self.input_units = input_units
        self.output_units = output_units
        self.maxlen = maxlen
        self.init_std = init_std
        self.k_max = k_max
        self.batch_size = batch_size
        # B2I routing
        self.routing_logits = self.create_parameter(
            shape=[1, self.k_max, self.maxlen],
            attr=paddle.ParamAttr(
                name="routing_logits", trainable=False),
            default_initializer=nn.initializer.Normal(
                mean=0.0, std=self.init_std))
        # bilinear mapping
        self.bilinear_mapping_matrix = self.create_parameter(
            shape=[self.input_units, self.output_units],
            attr=paddle.ParamAttr(
                name="bilinear_mapping_matrix", trainable=True),
            default_initializer=nn.initializer.Normal(
                mean=0.0, std=self.init_std))
                
class MindLayer(nn.Layer):

    def label_aware_attention(self, keys, query):
        weight = paddle.sum(keys * query, axis=-1, keepdim=True)
        weight = paddle.pow(weight, self.pow_p)  # [x,k_max,1]
        weight = F.softmax(weight, axis=1)
        output = paddle.sum(keys * weight, axis=1)
        return output, weight

    def forward(self, hist_item, seqlen, labels=None):
        hit_item_emb = self.item_emb(hist_item)  # [B, seqlen, embed_dim]
        user_cap, cap_weights, cap_mask = self.capsual_layer(hit_item_emb, seqlen)
        if not self.training:
            return user_cap, cap_weights
        target_emb = self.item_emb(labels)
        user_emb, W = self.label_aware_attention(user_cap, target_emb)

        return self.sampled_softmax(
            user_emb, labels, self.item_emb.weight,
            self.embedding_bias), W, user_cap, cap_weights, cap_mask

ارجع إلى البرنامج النصي /home/aistudio/recommend/model/mind/net.py للاطلاع على بنية الشبكة المحددة لـ MIND.

3. تحسين النموذج

يستخدم هذا المشروع خوارزمية آدم كمحسِّن للنموذج.

def create_optimizer(self, dy_model, config):
    lr = config.get("hyper_parameters.optimizer.learning_rate", 0.001)
    optimizer = paddle.optimizer.Adam(
        learning_rate=lr, parameters=dy_model.parameters())
    return optimizer

بالإضافة إلى ذلك، يكتب PaddleRec المعلمات الفائقة في config.yaml ، لذلك تحتاج فقط إلى تعديل هذا الملف لرؤية مقارنة واضحة بين فعالية النموذجين لتحسين كفاءة النموذج. عند تدريب النموذج، يمكن أن ينتج التأثير الضعيف للنموذج عن عدم ملاءمة النموذج أو الإفراط في ملاءمته. لذلك يمكنك تحسينه عن طريق تعديل عدد جولات التدريب. في هذا المشروع، ما عليك سوى تغيير عدد جولات التدريب في config.yaml للعثور على العدد المثالي لجولات التدريب. بالإضافة إلى ذلك، يمكنك أيضًا تغيير مُحسِّن النموذج، optimizer.class ، أو learning_rate لتصحيح الأخطاء. يوضح ما يلي جزءًا من المعلمات في config.yaml.

runner:
  use_gpu: True
  use_auc: False
  train_batch_size: 128
  epochs: 20
  print_interval: 10
  model_save_path: "output_model_mind"

# hyper parameters of user-defined network
hyper_parameters:
  # optimizer config
  optimizer:
    class: Adam
    learning_rate: 0.005

ارجع إلى البرنامج النصي /home/aistudio/recommend/model/mind/dygraph_model.py للحصول على التنفيذ المفصل.

4. تدريب النموذج

قم بتشغيل الأمر التالي لبدء تدريب النموذج.

python -u trainer.py -m mind/config.yaml

ارجع إلى /home/aistudio/recommend/model/trainer.py لمشروع تدريب النموذج.

الخطوة 3. اختبار النموذج

تستخدم هذه الخطوة مجموعة بيانات الاختبار للتحقق من الأداء، مثل معدل استرجاع النموذج المدرّب.

أثناء اختبار النموذج، يتم تحميل جميع متجهات العناصر من النموذج، ثم يتم استيرادها إلى قاعدة بيانات المتجهات مفتوحة المصدر Milvus. اقرأ مجموعة بيانات الاختبار من خلال البرنامج النصي /home/aistudio/recommend/model/mind/mind_infer_reader.py. تحميل النموذج في الخطوة السابقة، وتغذية مجموعة بيانات الاختبار في النموذج للحصول على أربعة متجهات اهتمام للمستخدم. ابحث عن متجهات العناصر الخمسين الأكثر تشابهًا مع متجهات الاهتمامات الأربعة في ميلفوس. يمكنك التوصية بالنتائج التي تم إرجاعها للمستخدمين.

قم بتشغيل الأمر التالي لاختبار النموذج.

python -u infer.py -m mind/config.yaml -top_n 50

أثناء اختبار النموذج، يوفر النظام عدة مؤشرات لتقييم فعالية النموذج، مثل Recall@50، وNDCG@50، وHetRate@50. تقدم هذه المقالة تعديل معلمة واحدة فقط. ومع ذلك، في سيناريو التطبيق الخاص بك، تحتاج إلى تدريب المزيد من الحقب الزمنية للحصول على تأثير أفضل للنموذج. يمكنك أيضًا تحسين فعالية النموذج باستخدام محسنات مختلفة، وتعيين معدلات تعلم مختلفة، وزيادة عدد جولات الاختبار. يوصى بحفظ عدة نماذج بتأثيرات مختلفة، ثم اختيار النموذج الذي يتمتع بأفضل أداء ويناسب تطبيقك بشكل أفضل.

الخطوة 4. توليد عناصر المنتج المرشحة

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

قم بتشغيل الأمر التالي لتوليد مرشحين أوليين.

uvicorn main:app

توفر الخدمة أربعة أنواع من الواجهات:

  • إدراج: قم بتشغيل الأمر التالي لقراءة ناقلات العناصر من النموذج الخاص بك وإدراجها في مجموعة في ميلفوس.
curl -X 'POST' \
  'http://127.0.0.1:8000/rec/insert_data' \
  -H 'accept: application/json' \
  -d ''
  • توليد مرشحين أوليين: أدخل التسلسل الذي ينقر فيه المستخدم على المنتجات، واكتشف المنتج التالي الذي قد ينقر عليه المستخدم. يمكنك أيضًا توليد العناصر المرشحة للمنتجات على دفعات لعدة مستخدمين دفعة واحدة. hist_item في الأمر التالي هو متجه ثنائي الأبعاد، ويمثل كل صف تسلسل المنتجات التي نقر عليها المستخدم في الماضي. يمكنك تحديد طول التسلسل. النتائج التي تم إرجاعها هي أيضًا مجموعات من المتجهات ثنائية الأبعاد، ويمثل كل صف منها item ids التي تم إرجاعها للمستخدمين.
curl -X 'POST' \
  'http://127.0.0.1:8000/rec/recall' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "top_k": 50,
  "hist_item": [[43,23,65,675,3456,8654,123454,54367,234561],[675,3456,8654,123454,76543,1234,9769,5670,65443,123098,34219,234098]]
}'
  • الاستعلام عن العدد الإجمالي لعناصر المنتج: قم بتشغيل الأمر التالي لإرجاع العدد الإجمالي لمتجهات العناصر المخزنة في قاعدة بيانات ميلفوس.
curl -X 'POST' \
  'http://127.0.0.1:8000/rec/count' \
  -H 'accept: application/json' \
  -d ''
  • حذف: قم بتشغيل الأمر التالي لحذف جميع البيانات المخزنة في قاعدة بيانات ملفوس .
curl -X 'POST' \
  'http://127.0.0.1:8000/qa/drop' \
  -H 'accept: application/json' \
  -d ''

إذا قمت بتشغيل خدمة إنشاء المرشح على خادمك المحلي، يمكنك أيضًا الوصول إلى الواجهات المذكورة أعلاه على 127.0.0.1:8000/docs. يمكنك التلاعب بالنقر على الواجهات الأربع وإدخال قيمة المعلمات. ثم انقر فوق "جربها" للحصول على نتيجة التوصية.

6.png 6.png

7.png 7.png

الخلاصة

تركز هذه المقالة بشكل أساسي على المرحلة الأولى من توليد المرشحين في بناء نظام التوصية. كما أنها توفر حلاً لتسريع هذه العملية من خلال الجمع بين Milvus وخوارزمية MIND و PaddleRec، وبالتالي فقد عالجت المشكلة المقترحة في الفقرة الافتتاحية.

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

ماذا لو تعذّرت معالجة البيانات المدرجة حديثًا في الوقت الفعلي للبحث أو الاستعلام؟ يمكنك استخدام برنامج Milvus لأنه يدعم المعالجة المجمّعة والدفق الموحّد ويمكّنك من البحث والاستعلام عن البيانات المدرجة حديثًا في الوقت الفعلي. كما أن نموذج MIND قادر على تحويل سلوك المستخدم الجديد في الوقت الفعلي وإدراج ناقلات المستخدم في Milvus بشكل فوري.

ماذا لو كان النشر المعقد مخيفًا للغاية؟ يمكن لمكتبة PaddleRec، وهي مكتبة قوية تنتمي إلى نظام PaddlePaddle، أن توفر لك حلاً متكاملاً لنشر نظام التوصيات الخاص بك أو التطبيقات الأخرى بطريقة سهلة وسريعة.

نبذة عن المؤلف

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

هل تبحث عن المزيد من الموارد؟

Like the article? Spread the word

استمر في القراءة