هناك نكتة في دوائر تكنولوجيا المعلومات مفادها أن التعلم الآلي (ML) يشبه الجنس بين المراهقين: الجميع يتحدث عن ذلك ، والجميع يتظاهر بالقيام به ، ولكن في الواقع ، قليل من الناس ينجحون. نجحت FunCorp في إدخال ML في الآليات الرئيسية لمنتجها وتحقيق تحسن جذري (حوالي 40٪!) في المقاييس الرئيسية. مثير للإعجاب؟ مرحبا بكم في القط.
قليلا من الخلفية
بالنسبة لأولئك الذين يقرؤون مدونة FunCorp بشكل غير منتظم ، اسمحوا لي أن أذكركم بأن منتجنا الأكثر نجاحًا هو تطبيق iFunny UGC الذي يحتوي على عناصر من شبكة اجتماعية لعشاق الميمات. يقوم المستخدمون (وهذا هو كل رابع ممثل لجيل الشباب في الولايات المتحدة) بتحميل أو إنشاء صور أو مقاطع فيديو جديدة مباشرة في التطبيق ، وتقوم خوارزمية ذكية باختيار (أو ، كما نقول ، "ميزات" ، من كلمة "مميز") أفضلها وتشكيل كل منها يوم 7 أعداد من 30-60 وحدة محتوى في موجز منفصل ، يتفاعل معها 99٪ من الجمهور. نتيجة لذلك ، عند دخول التطبيق ، يرى كل مستخدم أفضل الميمات ومقاطع الفيديو والصور المضحكة. إذا كنت تزور كثيرًا ، فسيتم تمرير الخلاصة بسرعة وينتظر المستخدم المشكلة التالية في غضون ساعات قليلة. ومع ذلك ، إذا قمت بزيارة أقل ، يتراكم المحتوى المميز ، ويمكن أن تنمو الخلاصة إلى 1000 عنصر في غضون أيام قليلة.
وفقًا لذلك ، نشأت المهمة: إظهار المحتوى الأكثر صلة لكل مستخدم بالنسبة له ، وتجميع الميمات التي تهمه شخصيًا في بداية الخلاصة.
لأكثر من 9 سنوات من وجود iFunny ، كانت هناك عدة طرق لهذه المهمة.
أولاً ، جربنا الطريقة الواضحة لفرز التغذية بعدد الابتسامات (التناظرية لدينا من "الإعجابات") - معدل الابتسامة . لقد كان أفضل من الترتيب الزمني ، ولكنه أدى في نفس الوقت إلى تأثير "متوسط درجة الحرارة في المستشفى": هناك القليل من الدعابة التي يحبها الجميع ، وسيظل هناك دائمًا أشخاص غير مهتمين (وحتى مزعجين بصراحة) بالمواضيع الشائعة اليوم ... لكنك تريد أيضًا مشاهدة جميع النكات المضحكة الجديدة من الرسوم المتحركة المفضلة لديك.
في التجربة التالية ، حاولنا مراعاة اهتمامات المجتمعات الصغيرة الفردية: عشاق الرسوم المتحركة ، والرياضة ، والميمات مع القطط والكلاب ، إلخ. للقيام بذلك ، بدأوا في تكوين العديد من الخلاصات المميزة المواضيعية وعرضوا على المستخدمين اختيار الموضوعات التي تهمهم ، باستخدام العلامات والنصوص التي تم التعرف عليها في الصور. لقد تحسن شيء ما ، ولكن تم فقد تأثير الشبكة الاجتماعية: هناك عدد أقل من التعليقات على المحتوى المميز ، والذي لعب دورًا كبيرًا في تفاعل المستخدم. علاوة على ذلك ، في طريقنا إلى الخلاصات المجزأة ، فقدنا الكثير من الميمات المشهورة حقًا. شاهدوا "الكارتون المفضل" لكنهم لم يروا النكات حول "The Last Avengers"
منذ أن بدأنا بالفعل في تنفيذ خوارزميات التعلم الآلي في منتجنا ، والذي قدمناه في لقاءنا الخاص، فقد أرادوا اتباع نهج آخر باستخدام هذه التقنية.
تقرر محاولة بناء نظام توصية على أساس مبدأ التصفية التعاونية. هذا المبدأ جيد في الحالات التي يكون فيها التطبيق يحتوي على القليل جدًا من البيانات حول المستخدمين: القليل منهم يشير إلى سنهم أو جنسهم عند التسجيل ، وفقط من خلال عنوان IP يمكن للمرء أن يفترض موقعه الجغرافي (على الرغم من أنه من المعروف بدون العرافين أن الغالبية العظمى من مستخدمي iFunny هم من السكان. الولايات المتحدة) ، وعبر نموذج الهاتف - مستوى الدخل. على هذا ، بشكل عام ، كل شيء. يعمل التصفية التعاونية على النحو التالي: يتم أخذ سجل التقييمات الإيجابية لمحتوى المستخدم ، ويتم العثور على مستخدمين آخرين لديهم تقييمات مماثلة ، ثم يوصى بما أعجبه نفس المستخدمين بالفعل (مع تقييمات مماثلة).
ميزات المهمة
الميمات هي محتوى محدد جدًا. أولاً ، إنه شديد التأثر بالاتجاهات المتغيرة بسرعة. المحتوى والشكل اللذان صعدا إلى القمة وجعلا 80٪ من الجمهور يبتسمان قبل أسبوع ، يمكن أن يسبب اليوم الانزعاج من طبيعتهما الثانوية وعدم ملاءمتهما
ثانيًا ، تفسير غير خطي ووضعي للغاية لمعنى الميم. في اختيار الأخبار ، يمكنك التعرف على الأسماء المعروفة والموضوعات التي يستخدمها مستخدم معين باستمرار. في مجموعة مختارة من الأفلام ، يمكنك مشاهدة الممثلين والنوع وغير ذلك الكثير. نعم ، يمكنك التعرف على كل هذا في مجموعة مختارة من الميمات الشخصية. لكن كم سيكون مخيبًا للآمال أن تفوتك تحفة حقيقية من الفكاهة ، تستخدم صورًا أو مفردات لا تتناسب مع المحتوى الدلالي على الإطلاق!

أخيرًا ، هناك قدر كبير جدًا من المحتوى الذي يتم إنشاؤه ديناميكيًا. في iFunny ، ينشئ المستخدمون عشرات الآلاف من المنشورات كل يوم. يجب "تنظيف" كل هذا المحتوى بأسرع ما يمكن ، وفي حالة نظام التوصية الشخصي ، ليس فقط للعثور على "الماس" ، ولكن أيضًا للتمكن من التنبؤ بتقييم المحتوى من قبل مختلف ممثلي المجتمع.
ماذا تعني هذه الميزات لتطوير نموذج التعلم الآلي؟ بادئ ذي بدء ، يجب تدريب النموذج باستمرار على أحدث البيانات. في بداية الانغماس في تطوير نظام التوصيات ، لا يزال من غير الواضح تمامًا ما إذا كنا نتحدث عن عشرات الدقائق أو بضع ساعات. لكن كلاهما يعني الحاجة إلى إعادة التدريب المستمر للنموذج ، أو حتى أفضل - التدريب عبر الإنترنت على دفق مستمر من البيانات. كل هذه ليست المهام الأسهل من وجهة نظر إيجاد بنية نموذجية مناسبة واختيار معلماتها الفائقة: وهذا من شأنه أن يضمن أنه في غضون أسبوعين لن تبدأ المقاييس في التدهور بثقة.
هناك صعوبة منفصلة تتمثل في الحاجة إلى اتباع بروتوكول اختبار أ / ب المعتمد من قبلنا. لا ننفذ أي شيء أبدًا دون التحقق أولاً من جزء من المستخدمين ، ومقارنة النتائج بمجموعة تحكم.
بعد حسابات طويلة ، تقرر بدء MVP بالخصائص التالية: نحن نستخدم فقط معلومات حول تفاعل المستخدمين مع المحتوى ، ونقوم بتدريب النموذج في الوقت الفعلي ، مباشرة على خادم مزود بكمية كبيرة من الذاكرة ، مما يسمح بتخزين السجل الكامل لتفاعل مجموعة الاختبار من المستخدمين لفترة طويلة إلى حد ما. قررنا قصر وقت التدريب على 15-20 دقيقة من أجل الحفاظ على تأثير الحداثة ، بالإضافة إلى توفير الوقت لاستخدام أحدث البيانات من المستخدمين الذين يأتون بكثافة إلى التطبيق أثناء الإصدارات.
نموذج
أولاً ، بدأنا في تحريف الترشيح التعاوني الأكثر كلاسيكية مع تحلل المصفوفة والتدريب في ALS (بالتناوب على المربع الصغرى) أو SGD (نزول التدرج العشوائي). لكنهم اكتشفوا بسرعة: لماذا لا نبدأ على الفور بأبسط شبكة عصبية؟ باستخدام شبكة بسيطة أحادية الطبقة ، حيث توجد طبقة دمج خطية واحدة فقط ، ولا يوجد التفاف للطبقات المخفية ، حتى لا تدفن نفسك في أسابيع من اختيار المعلمات الفائقة. ما هو أبعد من MVP؟ يمكن. لكن تدريب مثل هذه الشبكة ليس أكثر صعوبة من الهندسة المعمارية الكلاسيكية ، إذا كان لديك جهاز مجهز بوحدة معالجة رسومات جيدة (كان عليك أن تفرغ من أجلها).
في البداية ، كان من الواضح أن هناك خيارين فقط لتطوير الأحداث: إما أن يعطي التطوير نتيجة مهمة في مقاييس المنتج ، ثم سيكون من الضروري التعمق أكثر في معلمات المستخدمين والمحتوى ، في تدريب إضافي على المحتوى الجديد والمستخدمين الجدد ، في الشبكات العصبية العميقة ، أو لن يجلب ترتيب المحتوى المخصص يمكن تغطية الزيادة الملموسة و "المتجر". إذا حدث الخيار الأول ، فسيتعين ربط كل ما سبق حتى طبقة التضمين الأولية.
قررنا اختيار آلة التخصيب العصبي . مبدأ تشغيلها على النحو التالي: يتم ترميز كل مستخدم وكل محتوى بواسطة ناقلات ذات طول ثابت متساوي - حفلات الزفاف ، والتي يتم تدريبها بشكل أكبر على مجموعة من التفاعلات المعروفة بين المستخدم والمحتوى.
تتضمن مجموعة التدريب جميع حقائق المستخدمين الذين يشاهدون المحتوى. بالإضافة إلى الابتسامات ، فقد تقرر اعتبارها ردود فعل إيجابية حول المحتوى من خلال النقر على زر "مشاركة" أو "حفظ" ، وكذلك كتابة تعليق. في حالة وجوده ، يتم تمييز التفاعل بـ 1 (واحد). إذا لم يترك المستخدم تعليقات إيجابية بعد المشاهدة ، فسيتم تمييز التفاعل بـ 0 (صفر). وبالتالي ، حتى في حالة عدم وجود مقياس تصنيف واضح ، يتم استخدام نموذج صريح (نموذج بتصنيف صريح من المستخدم) ، وليس نموذجًا ضمنيًا ، والذي يأخذ في الاعتبار الإجراءات الإيجابية فقط.
لقد جربنا أيضًا النموذج الضمني ، لكنه لم يعمل على الفور ، لذلك ركزنا على النموذج الصريح. ربما ، بالنسبة للنموذج الضمني ، تحتاج إلى استخدام دهاء أكثر من وظائف فقدان ترتيب الانتروبيا الثنائية البسيطة.
يكمن الاختلاف بين عامل المصفوفة العصبية والترشيح التعاوني العصبي القياسي في وجود ما يسمى بطبقة تجمع التفاعل الثنائي بدلاً من الطبقة المعتادة المتصلة بالكامل ، والتي من شأنها ببساطة توصيل متجهات تضمين المستخدم والمحتوى. تقوم طبقة التفاعل الثنائي بتحويل مجموعة من متجهات التضمين (لا يوجد سوى متجهين في iFunny: المستخدم والمحتوى) إلى متجه واحد بضربهما في عنصر بعنصر.
في حالة عدم وجود طبقات مخفية إضافية أعلى التفاعل الثنائي ، نحصل على المنتج النقطي لهذه النواقل ، وإضافة تحيز المستخدم وتحيز المحتوى ، نلفه في السيني. هذا تقدير لاحتمال تلقي تعليقات إيجابية من المستخدم بعد مشاهدة هذا المحتوى. وفقًا لهذا التقييم ، نقوم بترتيب المحتوى المتاح قبل عرضه على جهاز معين.
وبالتالي ، فإن مهمة التدريب هي التأكد من أن حفلات الزفاف الخاصة بالمستخدم والمحتوى التي يوجد لها تفاعل إيجابي قريبة من بعضها البعض (لها الحد الأقصى لمنتج النقاط) ، وأن حفلات الزفاف الخاصة بالمستخدم والمحتوى التي يوجد بها تفاعل سلبي بعيدة كل البعد عن بعضها البعض. (منتج نقطي أدنى).
نتيجة لهذا التدريب ، تصبح حفلات الزفاف للمستخدمين الذين يبتسمون نفس الشيء قريبًا من بعضهم البعض بأنفسهم. وهذا وصف رياضي مناسب للمستخدمين يمكن استخدامه في العديد من المهام الأخرى. لكن هذه قصة أخرى.
لذلك ، يدخل المستخدم الخلاصة ويبدأ في مشاهدة المحتوى. في كل مرة تشاهد ، تبتسم ، تشارك ، إلخ. يرسل العميل إحصاءات إلى التخزين التحليلي الخاص بنا (والذي كتبنا عنه سابقًا في مقال الانتقال من Redshift إلى Clickhouse ، إذا كان مهتمًا ). في الطريق ، نختار الأحداث التي تهمنا ونرسلها إلى خادم ML ، حيث يتم تخزينها في الذاكرة.
كل 15 دقيقة ، يتم إعادة تدريب النموذج على الخادم ، وبعد ذلك يتم أخذ إحصاءات المستخدم الجديدة في الاعتبار في التوصيات.
يطلب العميل الصفحة التالية من الخلاصة ، يتم تشكيلها بطريقة قياسية ، ولكن في طريقة إرسال قائمة المحتوى إلى خدمة ML ، والتي تقوم بفرزها وفقًا للأوزان التي يقدمها النموذج المدرب لهذا المستخدم المعين.
نتيجة لذلك ، يرى المستخدم أولاً تلك الصور ومقاطع الفيديو التي ، وفقًا للطراز ، ستكون الأكثر تفضيلًا له.
بنية الخدمة الداخلية
تعمل الخدمة عبر HTTP. يستخدم Flask كخادم HTTP بالاشتراك مع Gunicorn. يتعامل مع طلبين: add_event و get_rates.
يضيف طلب add_event تفاعلًا جديدًا بين المستخدم والمحتوى. تتم إضافته إلى قائمة انتظار داخلية ثم معالجتها في عملية منفصلة (تصل ذروتها إلى 1600 دورة في الثانية).
طلب get_rates يحسب أوزان user_id وقائمة content_id وفقًا للنموذج (عند ذروة حوالي مائة دورة في الثانية).
العملية الداخلية الرئيسية هي المرسل. إنه مكتوب بلغة Asyncio وينفذ المنطق الأساسي:
- معالجة قائمة انتظار طلبات add_event وتخزينها في الهاشمب (200 مليون حدث في الأسبوع) ؛
- يعيد حساب النموذج في دائرة ؛
- يحفظ الأحداث الجديدة على القرص كل نصف ساعة ، مع حذف الأحداث الأقدم من أسبوع من التجزئة.
يتم وضع النموذج المدرب في الذاكرة المشتركة ، حيث يقرأه عمال HTTP.
النتائج
الرسوم البيانية تتحدث عن نفسها. إن النمو بنسبة 25٪ في العدد النسبي للابتسامات وما يقرب من 40٪ في عمق المشاهدات التي نراها عليها هو نتيجة طرح الخوارزمية الجديدة للجمهور بأكمله في نهاية اختبار A / B 50/50 ، أي زيادة حقيقية بالنسبة للقيم الأساسية كان ما يقرب من الضعف. نظرًا لأن iFunny تجني الأموال من الإعلانات ، فإن الزيادة في العمق تعني زيادة متناسبة في الإيرادات ، والتي بدورها سمحت لنا بتجاوز أشهر الأزمة في عام 2020 بهدوء تام. تؤدي الزيادة في عدد الابتسامات إلى ولاء أكبر ، مما يعني انخفاض احتمالية التخلي عن التطبيق في المستقبل ؛ يبدأ المستخدمون المخلصون في الانتقال إلى أقسام أخرى من التطبيق ، وترك التعليقات ، والتواصل مع بعضهم البعض. والأهم من ذلك ، أننا لم نخلق فقط أساسًا موثوقًا به لتحسين جودة التوصيات ،ولكن أيضًا وضع الأساس لإنشاء ميزات جديدة استنادًا إلى الكم الهائل من البيانات السلوكية المجهولة التي تراكمت لدينا على مدار سنوات التطبيق.
خاتمة
تعد خدمة معدل محتوى ML نتيجة لعدد كبير من التحسينات والتحسينات الطفيفة.
أولاً ، تم أخذ المستخدمين غير المسجلين بعين الاعتبار في التدريب. في البداية ، كانت هناك أسئلة حولهم ، نظرًا لأنهم لم يتمكنوا من ترك الرموز - وهي التعليقات الأكثر شيوعًا بعد عرض المحتوى. ولكن سرعان ما أصبح واضحًا أن هذه المخاوف ذهبت سدى وأغلقت نقطة نمو كبيرة جدًا. يتم إجراء الكثير من التجارب على تكوين عينة التدريب: لوضع نسبة أكبر من الجمهور فيها أو لتوسيع الفاصل الزمني للتفاعلات التي يتم أخذها في الاعتبار. في سياق هذه التجارب ، اتضح أن كمية البيانات لا تلعب فقط دورًا مهمًا في مقاييس المنتج ، ولكن أيضًا وقت تحديث النموذج. غالبًا ما تكون الزيادة في جودة الترتيب غارقة في 10-20 دقيقة إضافية لإعادة حساب النموذج ، مما جعل من الضروري التخلي عن الابتكارات.
لقد أسفرت العديد من التحسينات ، حتى الأصغر منها ، عن نتائج: إما أنها حسنت جودة التعلم ، أو سرعت عملية التعلم ، أو حفظت الذاكرة. على سبيل المثال ، كانت هناك مشكلة في حقيقة أن التفاعلات لا تتناسب مع الذاكرة - كان لابد من تحسينها. بالإضافة إلى ذلك ، تم تعديل الكود وأصبح من الممكن إدخاله ، على سبيل المثال ، المزيد من التفاعلات لإعادة الحساب. كما أدى إلى تحسين استقرار الخدمة.
يجري العمل الآن على الاستخدام الفعال لمعلمات المستخدم والمحتوى المعروفة ، لإنشاء نموذج تدريجي سريع إعادة التدريب ، وتظهر فرضيات جديدة للتحسينات المستقبلية.
إذا كنت مهتمًا بمعرفة كيفية تطويرنا لهذه الخدمة وما هي التحسينات الأخرى التي تمكنا من تنفيذها - اكتب في التعليقات ، بعد فترة سنكون مستعدين لكتابة الجزء الثاني.
عن المؤلفين
لسوء الحظ ، لا يسمح هبر بالإشارة إلى العديد من المؤلفين للمقال. على الرغم من نشر المقال من حسابي ، إلا أن معظمه كتبه المطور الرئيسي لخدمات FunCorp ML - Grisha Kuzovnikov (برنامج PhoenixMSTU) وكذلك محلل وعالم بيانات - ديما زمتسوف. خادمك المتمرّد مسؤول بشكل أساسي عن النكات الجنسية للمراهقين والمقدمة وقسم النتائج بالإضافة إلى العمل التحريري. وبالطبع ، لم تكن كل هذه الإنجازات ممكنة بدون مساعدة فرق تطوير الواجهة الخلفية ، وضمان الجودة ، والمحللين وفريق المنتج ، الذين اخترعوا كل هذا وأمضوا عدة أشهر في إجراء وتعديل تجارب A / B.