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

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

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

تتم قراءة الحل من عنوان الشريحة. دعونا نوصي المستخدم ببعض الأماكن التي نرى أنها مريحة للهبوط. الفكر يبدو واضحا ، ولكن هناك الكثير من الفروق الدقيقة هنا.
بالنسبة للمبتدئين ، "الملاءمة" مفهوم شخصي. يبدو أنه قبل حل المشكلة ، من الضروري صياغة بعض المعايير لحقيقة أن المشكلة سيتم حلها بشكل صحيح. لقد قمنا بصياغة ثلاثة أهم منها لأنفسنا. المعيار الأول هو كما هو الحال في أي مهمة من التوصيات: ربما ، التوصيات جيدة إذا تم استخدامها. إذا أظهرنا مثل هذه النقاط التي سيغادر منها المستخدم حقًا - فربما تكون هذه نقاط جيدة. لكن هذا بالطبع ليس كل شيء ، لأنه يمكنك تعلم التوصية بشيء ما ، وإظهاره ، وتشجيع المستخدم على استخدامه ، لكن لا يمكنك الحصول على أي ربح ملموس (لن نحصل على نظام ، ولا مستخدم ، ولا سائق). لذلك ، من المهم جدًا إلقاء نظرة على المقاييس الأخرى. لقد اخترنا اثنين.
إذا أخبرناك عن مكان الهبوط الذي يمكن للسائق القيادة إليه بسهولة ، فيجب تقليل وقت تسليم السيارة. من ناحية أخرى ، إذا كان من السهل على المستخدم العثور على سيارة في هذا المكان ، فمن الأسهل الهبوط ، ثم يجب تقليل وقت انتظار السائق من قبل السائق. هذه هي بعض فرضياتنا ، التي نعتبرها أمراً مفروغاً منه ، وهذه بعض المقاييس التي ننظر إليها عند تقديم هذه التوصيات. لكن بالطبع ، هذه ليست المقاييس الوحيدة التي يجب النظر إليها. يمكنك الخروج مع أكثر من عشرة. أعتقد أن كل واحد منكم يمكنه الخروج بمائة من هذه المقاييس.
فيما يلي بعض الأمثلة. قد تكون هذه نسبة الإلغاء قبل الرحلة. من الناحية النظرية ، ينبغي أن تنخفض إذا كان من السهل على المستخدم الهبوط. تقليديًا ، تكون هذه مكالمات عندما يتصل المستخدم بالسائق الذي يحاول العثور عليه ، أو على العكس من ذلك ، يتصل السائق بالمستخدم قبل بدء الرحلة. هذا النداء هو في الدعم ، ومع عشرات آخرين.
لقد صاغنا المشكلة. لقد فهمنا تقريبًا المعيار الذي يمكننا من خلاله حل هذه المشكلة. دعونا الآن نفكر في كيفية حل هذه المشكلة. أول ما يتبادر إلى الذهن: دعونا نوصي بأي نقاط هبوط مثبتة ومفهومة. هنا على الشريحة مثال على مركز التسوق الأوروبي. ونحن نعرف بالتأكيد أنه يمكنك الوصول إلى المخارج من مركز التسوق هذا ، وهذا نوع من الإرشادات ، حيث يمكن للمستخدم العثور على سائق. قد يكون أي منظمة. يوجد مثال مع ABC of Taste في بعض مراكز التسوق. في رأيي ، هذا هو يريفان بلازا. هذا أيضًا نوع من الإرشادات للمستخدم والسائق ، والذي نعلم أنه يمكنك القيادة هناك.

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

يتم تلقي هذه النقاط تلقائيًا بالفعل في مركز أعمال Aurora ، حيث يجلس فريق Yandex.Taxi لدينا حاليًا.
تحدثت على مستوى عال عن مهمتنا. الآن دعنا نتحدث بمزيد من التفصيل عن المراحل التي يتكون منها حل هذه المشكلة. من الواضح أن هناك مرحلة من مراحل إعداد البيانات.

ما هي البيانات التي لدينا؟ أولاً ، لدينا بيانات GPS الخاصة بمستخدمينا وبيانات GPS الخاصة ببرامج التشغيل الخاصة بنا. عندما يستخدمون تطبيقنا ، فإننا نعرف الموقع التقريبي للمستخدمين. من الواضح أن نظام تحديد المواقع العالمي (GPS) لديه خطأ كبير ، في المنطقة التي يتراوح طولها بين 13 و 15 متراً ، ومع ذلك ، هناك شيء ما. ثانياً ، لدينا معلومات مضمّنة في سجلات التطبيق عندما يكون السائق قد تحول من الحالة "أنا في انتظار المستخدم" إلى الحالة "أنا آخذ المستخدم". يمكن افتراض أنه في هذا الوقت تقريبًا ، انتظر السائق المستخدم ، وصعد المستخدم إلى السيارة ، وانطلقوا. حول هذا المكان ، تم إجراء الهبوط. ولدينا رسم بياني للطريق. لا يمثل الرسم البياني للطريق مجموعة من الحواف والشوارع فحسب ، بل هو أيضًا معلومات تعريفية إضافية: الحواجز والمعلومات حول مواقف السيارات ، إلخ. بناءً على هذه البيانات ، يمكنك بالفعل الحصول على نوع من النقاط التلقائية.
كان هذا هو مصدر البيانات. وعند الخروج ، نريد شيئين. هذه هي بعض ما يسمى المرشحين نقطة الهبوط. كيف يأتون؟ من المؤسف أنه لم يكن من الممكن عرض الفيديو. ما يلي يحدث تقريبا. لدينا العديد من نقاط GPS التي نعرف أن السائق قد تحول من حالة "في انتظار الركاب" إلى حالة "دعنا نذهب". يمكننا ، رسمياً ، رسمها على الرسم البياني ، أي إسقاطها على الرسم البياني للطريق ، لأن السيارة ، كقاعدة عامة ، تبدأ في التحرك من بعض الطرق. على هذا الرسم البياني ، قم بعمل نوع من تجميع هذه النقاط. وللحصول على عدد كبير من المرشحين - هذه أماكن يدخل فيها بعض المستخدمين إلى السيارة ، وكان ذلك طبيعيًا وملائمًا لهم. ليس حيث اتصلوا ، ولكن حيث انتهى بهم المطاف جالسين.
بعد ذلك ، عندما يكون لدينا الكثير من المرشحين ولدينا مستخدم على الإنترنت ، فإننا نعرف موقعه ، لذلك فتح التطبيق ويريد استدعاء سيارة أجرة ، ثم يمكننا اختيار أفضل خمسة من عدد كبير من المرشحين وإظهارهم. يتم تحديد أفضل خمسة من خلال نموذج التعلم الآلي الذي يتعلم ترتيب جميع المرشحين وفقا لاحتمال أن المستخدم في الوقت الحالي في هذا الوقت ، مع الأخذ في الاعتبار موقعه ومع الأخذ في الاعتبار تاريخ سفره ، هو الأكثر ملاءمة للمغادرة. وبهذه الطريقة تقريبًا يمكننا إنشاء هذه النقاط تلقائيًا. علاوة على ذلك ، إذا قاموا في وقت ما بالتنقيب المشروط في مكان ما ، أي ، يصبح من غير المريح استدعاء سيارة أجرة ، أو في مكان ما وضعوا علامة تحظر التوقف ، وتوقف السائقون والمستخدمون عن الهبوط في هذا المكان ، ثم في بعض الأماكن في اللحظة التي ستفهم فيها الخوارزمية هذا ، وسيتم تحديث البيانات.

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

ما هي الأدوات التي نستخدمها في إعداد البيانات؟ بشكل أساسي ، كل تحضير البيانات الذي كتبناه في Python ، على حزمة Python: هذه هي NumPy القياسية ، و Pandas ، و Scikit-learn ، إلخ. لدينا الكثير من البيانات. لدينا ملايين الرحلات شهريا. هناك الكثير من البيانات حول GPS ، وعن مسارات برامج التشغيل ، وسجلات التطبيقات ، لذلك نحن بحاجة إلى معالجتها جميعًا على نظام المجموعة. للقيام بذلك ، نستخدم MapReduce من إصدار intra-Yandex الخاص بنا ، والذي يسمى YT ، وهناك مكتبة مكتوبة في Python لها ، والتي تسمح بإطلاق بعض المخططين والمخفضات ، وإجراء بعض العمليات الحسابية على مجموعة كبيرة.
أخيرًا ، عندما يكون خط الأنابيب جاهزًا ، نحتاج إلى تشغيله تلقائيًا حتى يتم تحديث البيانات ، ولهذا نستخدم شيءًا مثل Nirvana و Hitman. هذا هو أيضا التنمية داخل ياندكس. السكينة هي إطار لإدارة الحوسبة العنقودية. في الواقع ، إنها تعرف كيفية تشغيل أي برنامج تقريبًا ، وكن متسامحًا مع الخطأ ، وكن متصالبًا (00:14:53). وفي حالة حدوث شيء ما ، فهي تعرف كيفية إعادة تشغيله ، لإنشاء عمليات إطلاق عند حدوث أي أحداث. ور. د.

هذا هو ما تبدو عليه واجهة الويب الخاصة بمجموعة MapReduce. يمكن أن نرى هنا أن لدينا الكثير من الآلات ، مثل العقد التي يتم إجراء العمليات الحسابية عليها.

وهكذا في واجهة الويب ، تبدو عملية نموذجية لنوع من المعالجة المسبقة للبيانات والتدريب النموذجي. هذا هو الرسم البياني التبعية. التبعيات تشبه البيانات ، عندما يكون جزء (مكعب واحد) ينتظر البيانات من مكعب آخر ؛ والاعتماد المنطقي (أولاً قمنا بإعداد جميع البيانات ، ثم بدأ التدريب). هذا هو نوع من النظام الآلي. لهذا كله ، نستخدم عادة بيثون.
قمنا بصياغة المشكلة ، وصياغة معايير النجاح ، وتعلمنا حلها بطريقة ما دون الاتصال بالإنترنت ، بل وصنعنا نوعًا من النموذج ، ويبدو أنه يعمل وفقًا لبعض المقاييس غير المتصلة بالإنترنت - إنه يتنبأ حقًا بالنقاط التي يترك منها المستخدم ويجد تلك النقاط التي ، على ما يبدو ، ينبغي أن تقلل من وقت الانتظار وتسليم السيارة.

لنجرب هذه النماذج ، استخدم هذه البيانات. للقيام بذلك ، تخيل ما هي خدمة Yandex.Taxi.
مخطط سطحي للغاية يشبه هذا. هناك مستخدمون ، لديهم تطبيق ، وهناك برامج تشغيل ، لديهم أيضًا تطبيق يسمى "عداد التاكسي". تتواصل هذه التطبيقات بطريقة ما مع الواجهة الخلفية ، والواجهة الخلفية هي مجموعة من الخدمات المصغرة التي تتواصل مع بعضها البعض -
تحدث إليا عن هذا. أحد خدمات microservices هي خدمتنا ، وفريقنا يقوم بذلك ، ويسمى ML كخدمة ، MLaaS.

كل ما تحتاج إلى معرفته عنه هو MLaaS المكتوب بلغة C ++ ، استنادًا إلى ما يسمى Fastcgi Daemon. هذه مكتبة مفتوحة المصدر ، والتي هي عبارة عن إطار عمل لكتابة خادم ويب يمكنه الحصول على الطلبات ونشرها ، كل شيء قياسي. كانت مكتوبة مرة واحدة في ياندكس ، وضعت في المصدر المفتوح. نستخدم النسخة المنقوصة. ماذا يمكن أن تفعل هذه الخدمة؟ إنه يعرف كيفية التعامل مع الطرز: قم بتطبيقها ، واحتفظ بها في المنزل ، وأحيانًا يتم تحديثها ، وانتقل إلى هذه السحابة الرائعة ، حيث يتم تحديثها وحفظها وتنزيلها بانتظام.
كل وظيفة ، على سبيل المثال ، نقاط الهبوط هذه - داخل نسميها نقاط الالتقاط - أو ، على سبيل المثال ، نصائح النقاط B التي تحدثت عنها Ilya باستمرار في التقرير السابق ، كل وظيفة من هذا القبيل ، حيث يوجد نوع من التعلم الآلي ، تتوافق مع معالج ، الذي يخزن منطق تلقي الطلب ، وتوليد عوامل التعلم الآلي ، وتطبيق النماذج ، وتوليد استجابة. بالطبع ، هذه الخدمة ليست معزولة ، وتكون قادرة على الانتقال إلى بعض مصادر البيانات الإضافية وقواعد البيانات وبعض الخدمات الصغيرة الأخرى.

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

ولكن ماذا لدينا في الوقت الحالي؟ لقد أخبرتك بالفعل أن لدينا إعداد البيانات ، والتدريب ، والدراسات المختلفة ، والتجارب ، وكل ذلك مكتوب في Python Stack ، وهناك بعض الإنتاج المكتوب في C ++ ، ببساطة لأن لدينا مطالب كبيرة على الكفاءة والإنتاجية. عندما تعيش في مثل هذا النظام البيئي ، تنشأ مشكلتان.
بادئ ذي بدء ، هذه مشكلة التجارب. على سبيل المثال ، حصل عالِم بيانات يعمل في فريقنا على فكرة. إذا قمت بتشغيل نوع من خوارزمية التجميع أو التصنيف بمعلمات مختلفة قليلاً ، يمكنك تحقيق جودة أفضل. لقد حاول اختبار فرضيته في وضع عدم الاتصال ، ودمجها في عملية بيثون الخاصة بنا ، وحسابها ، واتضح بالفعل. ويريد الآن تجربة AB ، أي جزء من المستخدمين لإظهار الخوارزمية الجديدة وقياس بعض المقاييس عبر الإنترنت بالفعل: هل الوقت قد انخفض بالفعل ، انتظر ، يزداد الاستخدام. للقيام بذلك ، لديه خمسة إصدارات من خوارزمية مشروطة ، والتي يعتقد ، والتي توفر دون اتصال بالإنترنت جودة جيدة: نفذ في C ++ وإجراء تجربة AB. وبعد هذه التجربة AB ، ربما ستذهب الخمسة إلى الخردة ، أي أن جودةها على الإنترنت ستصبح أسوأ مما كانت عليه في وضع عدم الاتصال ، أي أنها أسوأ من الإنتاج. وهذا يعني أن عملية التجريب تستغرق وقتًا طويلاً نظرًا لحقيقة أن لغتين مختلفتين وشرطتين مختلفتين مشروطتين.
هذا هو للميزات الحالية. وهناك جديدة. مرة واحدة كانت نقاط الالتقاط هذه أيضًا أفكارًا أردت التحقق منها بسرعة. لا تنفق عليها شهرين من التطوير - فمن المستحسن أن تحصل على شيء خلال ثلاثة أسابيع. لإنشاء مثل هذا النموذج الأولي هو شاقة للغاية. أولاً ، اكتب في Python استخراج الميزات ، ببساطة لأنها مريحة - تحرك سريعًا كما يقولون. يمكنك بناء أي نموذج أولي في Python ، وهناك العديد من المكتبات لتحليل البيانات. لقد جربت على الكمبيوتر المحمول الخاص بك ، وتريد الآن التحقق من المستخدمين. ولجعل نموذج أولي صعب للغاية. لقد توصلنا إلى استنتاج مفاده أننا بحاجة إلى بعض الخدمات الإضافية من أجل تجميع مثل هذه النماذج الأولية بسرعة - مشروطة ، في أسبوع أو حتى في يوم واحد - وكذلك لإجراء تجارب AB.

أنشأنا هذه الخدمة ، التي يطلق عليها PyMLaaS. ما هو مثل؟ في الواقع ، هذا هو التماثل التام لـ MLaaS ، الذي تحدثت عنه من قبل ، ولكنه كتب في بيثون على أساس Flask ، nginx و Gunicorn. الهيكل بسيط للغاية ، كما هو الحال في MLaaS ، ولكن هناك فرصة للحفر بسرعة في بعض النماذج الأولية من التجارب الخاصة بك حاليا. بالإضافة إلى ذلك ، قمنا بترتيب مثل هذه الوكلاء على مستوى nginx ، بحيث أتيحت لنا ، بشكل مشروط ، الفرصة لإعادة توجيه جزء من التحميل من MLaaS إلى PyMLaaS ومن ثم التجربة.

أي أننا نقلنا بعض المعلمات ونريد التحقق من تأثير ذلك على المستخدمين. بدأنا بزيادة 5 ٪ من الحمل على PyMLaaS ، وسنرى ما يحدث في التجربة. أخيرًا ، من المناسب إنشاء نماذج أولية. لقد قمت بإنشاء نموذج أولي لبعض الميزات الجديدة ، ورأيته في PyMLaaS ويمكنك اختباره على الفور في الإنتاج.
لقد أحببنا ذلك كثيرًا حتى ظهرت الفكرة - لماذا لا تستخدمها طوال الوقت؟ لأنه ، بشرط ، هناك ميزات تتطلب حمولة كبيرة ، 1000 RPS ، متطلبات ذاكرة كبيرة. أريد أن يكون هناك تواز مرن إلى حد ما. ولكن بالنسبة لبعض الميزات ، بالنسبة إلى بعض المنتجات أو الخدمات التي لا يوجد لديها مثل هذه الطلبات الكبيرة على التحميل والأداء و RPS وما إلى ذلك ، فإننا نستخدم هذه الخدمة بنجاح كبير.

لتلخيص. , . . . , - , , , -, - . - PyMLaaS, AB-, . , MLaaS, , .
pickup points — . . , . 30% , . .