چگونه روی کیفیت و سرعت انتخاب توصیه ها کار می کنیم

نام من Pavel Parkhomenko است، من یک توسعه دهنده ML هستم. در این مقاله، من می خواهم در مورد ساختار سرویس Yandex.Zen صحبت کنم و پیشرفت های فنی را به اشتراک بگذارم، که اجرای آنها باعث افزایش کیفیت توصیه ها شده است. از این پست یاد خواهید گرفت که چگونه در چند میلی ثانیه از بین میلیون ها سند، مرتبط ترین مورد را برای کاربر پیدا کنید. چگونه می توان تجزیه پیوسته یک ماتریس بزرگ (شامل میلیون ها ستون و ده ها میلیون ردیف) انجام داد تا اسناد جدید بردار خود را در ده ها دقیقه دریافت کنند. نحوه استفاده مجدد از تجزیه ماتریس کاربر-مقاله برای به دست آوردن یک نمایش برداری خوب برای ویدیو.

چگونه روی کیفیت و سرعت انتخاب توصیه ها کار می کنیم

پایگاه داده توصیه ما حاوی میلیون‌ها سند با فرمت‌های مختلف است: مقاله‌های متنی که در پلتفرم ما ایجاد شده و از سایت‌های خارجی، ویدیوها، روایت‌ها و پست‌های کوتاه گرفته شده‌اند. توسعه چنین سرویسی با تعداد زیادی چالش فنی همراه است. در اینجا به برخی از آنها اشاره می کنیم:

  • وظایف محاسباتی را تقسیم کنید: تمام عملیات سنگین را به صورت آفلاین انجام دهید و در زمان واقعی فقط از مدل ها استفاده سریع انجام دهید تا مسئولیت 100-200 میلی ثانیه را داشته باشید.
  • به سرعت اقدامات کاربر را در نظر بگیرید. برای انجام این کار، لازم است که همه رویدادها فوراً به توصیه‌کننده تحویل داده شوند و بر نتایج مدل‌ها تأثیر بگذارند.
  • فید را طوری تنظیم کنید که برای کاربران جدید به سرعت با رفتار آنها سازگار شود. افرادی که به تازگی به سیستم پیوسته اند باید احساس کنند که بازخورد آنها بر توصیه ها تأثیر می گذارد.
  • به سرعت درک کنید که مقاله جدید را به چه کسی توصیه کنید.
  • به ظهور مداوم محتوای جدید به سرعت پاسخ دهید. روزانه ده ها هزار مقاله منتشر می شود و بسیاری از آنها عمر محدودی دارند (مثلاً اخبار). این همان چیزی است که آنها را از فیلم، موسیقی و سایر محتوای طولانی مدت و گران برای خلق متمایز می کند.
  • انتقال دانش از یک حوزه به حوزه دیگر. اگر سیستم توصیه‌ای مدل‌های آموزشی برای مقالات متنی داشته باشد و ویدیو را به آن اضافه کنیم، می‌توانیم از مدل‌های موجود مجددا استفاده کنیم تا نوع جدید محتوا رتبه بهتری پیدا کند.

من به شما خواهم گفت که چگونه این مشکلات را حل کردیم.

انتخاب نامزدها

چگونه می توان تعداد اسناد مورد بررسی را هزاران بار در چند میلی ثانیه کاهش داد و عملاً کیفیت رتبه بندی کاهش پیدا نکرد؟

فرض کنید ما بسیاری از مدل‌های ML را آموزش دادیم، ویژگی‌هایی را بر اساس آنها ایجاد کردیم و مدل دیگری را آموزش دادیم که اسناد را برای کاربر رتبه‌بندی می‌کند. همه چیز خوب خواهد بود، اما اگر میلیون‌ها سند وجود داشته باشد، نمی‌توانید تمام علائم را برای همه اسناد در زمان واقعی بگیرید و محاسبه کنید، و توصیه‌ها باید در 100-200 میلی‌ثانیه ساخته شوند. وظیفه انتخاب زیرمجموعه خاصی از میلیون ها است که برای کاربر رتبه بندی می شود. این مرحله معمولاً انتخاب نامزد نامیده می شود. چندین الزام برای آن وجود دارد. اولاً، انتخاب باید خیلی سریع اتفاق بیفتد، به طوری که تا حد امکان زمان برای خود رتبه بندی باقی بماند. ثانیا، با کاهش شدید تعداد اسناد برای رتبه بندی، باید اسناد مربوط به کاربر را تا حد امکان به طور کامل حفظ کنیم.

اصل انتخاب نامزد ما تکامل یافته است و در حال حاضر به یک طرح چند مرحله ای رسیده ایم:

چگونه روی کیفیت و سرعت انتخاب توصیه ها کار می کنیم

ابتدا تمام اسناد به گروه ها تقسیم می شوند و محبوب ترین اسناد از هر گروه گرفته می شود. گروه ها می توانند سایت ها، موضوعات، خوشه ها باشند. برای هر کاربر، بر اساس سابقه او، نزدیک ترین گروه ها به او انتخاب شده و بهترین اسناد از آنها گرفته می شود. ما همچنین از شاخص kNN برای انتخاب اسنادی که در زمان واقعی به کاربر نزدیک هستند استفاده می کنیم. چندین روش برای ساخت یک شاخص kNN وجود دارد؛ روش ما بهترین کار را داشت HNSW (گراف های جهان کوچک قابل پیمایش سلسله مراتبی). این یک مدل سلسله مراتبی است که به شما امکان می دهد N نزدیکترین بردارها را برای یک کاربر از پایگاه داده میلیون ها در چند میلی ثانیه پیدا کنید. ابتدا کل پایگاه داده اسناد خود را بصورت آفلاین نمایه می کنیم. از آنجایی که جستجو در فهرست به سرعت کار می کند، اگر چندین جاسازی قوی وجود داشته باشد، می توانید چندین شاخص ایجاد کنید (یک شاخص برای هر جاسازی) و به هر یک از آنها در زمان واقعی دسترسی داشته باشید.

ما هنوز ده ها هزار سند برای هر کاربر داریم. این هنوز برای شمارش همه ویژگی ها زیاد است، بنابراین در این مرحله از رتبه بندی سبک استفاده می کنیم - یک مدل رتبه بندی سنگین سبک وزن با ویژگی های کمتر. وظیفه پیش بینی این است که یک مدل سنگین دارای کدام اسناد در بالای صفحه است. اسناد با بالاترین پیش بینی در مدل سنگین یعنی در آخرین مرحله رتبه بندی استفاده می شود. این رویکرد به شما امکان می دهد پایگاه داده اسناد در نظر گرفته شده برای کاربر را از میلیون ها به هزاران در ده ها میلی ثانیه کاهش دهید.

مرحله ALS در زمان اجرا

چگونه بلافاصله پس از کلیک، بازخورد کاربر را در نظر بگیریم؟

یک عامل مهم در توصیه ها زمان پاسخگویی به بازخورد کاربران است. این امر به ویژه برای کاربران جدید مهم است: هنگامی که شخصی تازه شروع به استفاده از سیستم توصیه می کند، فید غیر شخصی از اسناد موضوعات مختلف دریافت می کند. به محض اینکه او اولین کلیک را انجام داد، باید فوراً این را در نظر بگیرید و با علایق او سازگار شوید. اگر تمام عوامل را به صورت آفلاین محاسبه کنید، پاسخ سریع سیستم به دلیل تاخیر غیرممکن خواهد شد. بنابراین لازم است اقدامات کاربر را در زمان واقعی پردازش کنید. برای این منظور، ما از مرحله ALS در زمان اجرا برای ساختن نمایش برداری از کاربر استفاده می کنیم.

بیایید فرض کنیم برای همه اسناد یک نمایش برداری داریم. به عنوان مثال، می‌توانیم بر اساس متن مقاله با استفاده از ELMo، BERT یا سایر مدل‌های یادگیری ماشین، جاسازی‌ها را به‌صورت آفلاین بسازیم. چگونه می توانیم نمایش برداری از کاربران را در همان فضا بر اساس تعامل آنها در سیستم بدست آوریم؟

اصل کلی تشکیل و تجزیه ماتریس کاربر-سنداجازه دهید m کاربر و n سند داشته باشیم. برای برخی از کاربران، رابطه آنها با اسناد خاص مشخص است. سپس این اطلاعات را می توان به عنوان یک ماتریس mxn نشان داد: ردیف ها مربوط به کاربران، و ستون ها مربوط به اسناد هستند. از آنجایی که شخص بیشتر اسناد را ندیده است، بیشتر سلول های ماتریس خالی می مانند، در حالی که بقیه پر می شوند. برای هر رویداد (مثل، دوست نداشتن، کلیک کردن) مقداری در ماتریس ارائه شده است - اما بیایید یک مدل ساده شده را در نظر بگیریم که در آن یک like با 1 و یک دوست نداشتن با -1 مطابقت دارد.

بیایید ماتریس را به دو قسمت تجزیه کنیم: P (mxd) و Q (dxn)، که در آن d بعد نمایش برداری است (معمولاً یک عدد کوچک). سپس هر شی با یک بردار d بعدی مطابقت دارد (برای یک کاربر - یک ردیف در ماتریس P، برای یک سند - یک ستون در ماتریس Q). این بردارها جاسازی اشیاء مربوطه خواهند بود. برای پیش بینی اینکه آیا یک کاربر از یک سند خوشش می آید یا نه، می توانید به سادگی جاسازی های او را ضرب کنید.

چگونه روی کیفیت و سرعت انتخاب توصیه ها کار می کنیم
یکی از راه های ممکن برای تجزیه ماتریس ALS (Alternating Last Squares) است. ما تابع ضرر زیر را بهینه خواهیم کرد:

چگونه روی کیفیت و سرعت انتخاب توصیه ها کار می کنیم

در اینجا rui تعامل کاربر u با سند i است، qi بردار سند i، pu بردار کاربر u است.

سپس بردار کاربر بهینه از نقطه نظر میانگین مربعات خطا (برای بردارهای سند ثابت) به صورت تحلیلی با حل رگرسیون خطی مربوطه پیدا می شود.

این مرحله ALS نامیده می شود. و خود الگوریتم ALS این است که ما به طور متناوب یکی از ماتریس ها (کاربران و مقالات) را اصلاح می کنیم و دیگری را به روز می کنیم و راه حل بهینه را پیدا می کنیم.

خوشبختانه، یافتن نمایش برداری کاربر یک عملیات نسبتاً سریع است که می تواند در زمان اجرا با استفاده از دستورالعمل های برداری انجام شود. این ترفند به شما این امکان را می دهد که بلافاصله بازخورد کاربران را در رتبه بندی در نظر بگیرید. همین تعبیه را می توان در شاخص kNN برای بهبود انتخاب نامزد استفاده کرد.

فیلتر مشارکتی توزیع شده

چگونه می توان فاکتورسازی ماتریس توزیع شده افزایشی را انجام داد و به سرعت بازنمایی های برداری مقالات جدید را یافت؟

محتوا تنها منبع سیگنال های توصیه نیست. منبع مهم دیگر اطلاعات مشارکتی است. ویژگی های رتبه بندی خوب را می توان به طور سنتی از تجزیه ماتریس سند کاربر به دست آورد. اما هنگام تلاش برای انجام چنین تجزیه ای، با مشکلاتی مواجه شدیم:

1. ما میلیون ها سند و ده ها میلیون کاربر داریم. ماتریس به طور کامل بر روی یک دستگاه قرار نمی گیرد و تجزیه آن زمان بسیار طولانی خواهد داشت.
2. بیشتر محتوای سیستم دارای طول عمر کوتاهی است: اسناد فقط برای چند ساعت مرتبط باقی می مانند. بنابراین، لازم است که نمایش برداری آنها در سریع ترین زمان ممکن ساخته شود.
3. اگر بلافاصله پس از انتشار سند یک تجزیه بسازید، تعداد کافی از کاربران زمان لازم برای ارزیابی آن را نخواهند داشت. بنابراین، نمایش برداری آن به احتمال زیاد خیلی خوب نخواهد بود.
4. اگر کاربری دوست داشته باشد یا دوست نداشته باشد، ما نمی توانیم بلافاصله این را در تجزیه در نظر بگیریم.

برای حل این مشکلات، ما یک تجزیه توزیع شده از ماتریس سند کاربر را با به‌روزرسانی‌های افزایشی مکرر پیاده‌سازی کردیم. دقیقا چگونه کار می کند؟

فرض کنید ما یک خوشه از N ماشین داریم (N به صدها می رسد) و می خواهیم یک تجزیه توزیع شده از یک ماتریس را روی آنها انجام دهیم که در یک ماشین جا نمی شود. سوال این است که چگونه می توان این تجزیه را انجام داد تا از یک طرف داده های کافی روی هر ماشین وجود داشته باشد و از طرف دیگر محاسبات مستقل باشند؟

چگونه روی کیفیت و سرعت انتخاب توصیه ها کار می کنیم

ما از الگوریتم تجزیه ALS که در بالا توضیح داده شد استفاده خواهیم کرد. بیایید نحوه اجرای یک مرحله ALS را به صورت توزیع شده بررسی کنیم - بقیه مراحل مشابه خواهند بود. فرض کنید یک ماتریس ثابت از اسناد داریم و می خواهیم ماتریسی از کاربران بسازیم. برای انجام این کار، آن را با خط به N قسمت تقسیم می کنیم، هر قسمت تقریباً به همان تعداد خط خواهد داشت. سلول‌های غیر خالی ردیف‌های مربوطه و همچنین ماتریس جاسازی‌های سند (به طور کامل) را به هر دستگاه ارسال می‌کنیم. از آنجایی که اندازه آن خیلی بزرگ نیست و ماتریس سند کاربر معمولاً بسیار پراکنده است، این داده ها در یک ماشین معمولی قرار می گیرند.

این ترفند را می توان در چندین دوره تکرار کرد تا زمانی که مدل همگرا شود و ماتریس ثابت را یک به یک تغییر دهید. اما حتی در این صورت، تجزیه ماتریس می تواند چندین ساعت طول بکشد. و این مشکل را حل نمی کند که شما باید به سرعت جاسازی اسناد جدید را دریافت کنید و جاسازی های اسنادی را که اطلاعات کمی در مورد آنها در هنگام ساخت مدل وجود دارد به روز رسانی کنید.

معرفی به روز رسانی سریع مدل افزایشی به ما کمک کرد. فرض کنید یک مدل آموزش دیده در حال حاضر داریم. از زمان آموزش او، مقالات جدیدی وجود داشته است که کاربران ما با آنها تعامل داشته اند، و همچنین مقالاتی که در طول آموزش تعامل کمی داشتند. برای به دست آوردن سریع جاسازی‌های چنین مقالاتی، از جاسازی‌های کاربر به‌دست‌آمده در اولین آموزش بزرگ مدل استفاده می‌کنیم و یک مرحله ALS برای محاسبه ماتریس سند با یک ماتریس کاربر ثابت انجام می‌دهیم. این به شما امکان می دهد جاسازی ها را به سرعت - در عرض چند دقیقه پس از انتشار سند - دریافت کنید و اغلب جاسازی های اسناد اخیر را به روز کنید.

برای اینکه توصیه‌هایی فوراً اعمال انسان را در نظر بگیریم، در زمان اجرا از جاسازی‌های کاربر که به‌صورت آفلاین به دست آمده‌اند استفاده نمی‌کنیم. در عوض، یک مرحله ALS انجام می دهیم و بردار کاربر واقعی را دریافت می کنیم.

انتقال به یک منطقه دامنه دیگر

چگونه از بازخورد کاربران در مقالات متنی برای ساختن نمایش برداری از یک ویدیو استفاده کنیم؟

در ابتدا، ما فقط مقالات متنی را توصیه می‌کردیم، بنابراین بسیاری از الگوریتم‌های ما برای این نوع محتوا طراحی شده‌اند. اما هنگام افزودن انواع دیگر محتوا، با نیاز به تطبیق مدل ها مواجه شدیم. چگونه با استفاده از یک مثال ویدیویی این مشکل را حل کردیم؟ یکی از گزینه ها آموزش مجدد همه مدل ها از ابتدا است. اما این کار زمان زیادی می برد و برخی از الگوریتم ها به اندازه نمونه آموزشی نیاز دارند که هنوز به مقدار لازم برای نوع جدیدی از محتوا در اولین لحظات زندگی خود در سرویس موجود نیست.

ما به سمت دیگری رفتیم و از مدل های متنی برای ویدیو استفاده مجدد کردیم. همان ترفند ALS به ما کمک کرد تا نمایش های برداری از ویدیوها را ایجاد کنیم. ما یک نمایش برداری از کاربران بر اساس مقالات متنی گرفتیم و یک مرحله ALS را با استفاده از اطلاعات مشاهده ویدیو انجام دادیم. بنابراین ما به راحتی یک نمایش برداری از ویدئو دریافت کردیم. و در زمان اجرا به سادگی نزدیکی بین بردار کاربر به دست آمده از مقالات متنی و بردار ویدیو را محاسبه می کنیم.

نتیجه

توسعه هسته یک سیستم توصیه بلادرنگ شامل چالش های زیادی است. شما باید به سرعت داده ها را پردازش کنید و روش های ML را برای استفاده موثر از این داده ها اعمال کنید. ایجاد سیستم‌های توزیع‌شده پیچیده با قابلیت پردازش سیگنال‌های کاربر و واحدهای جدید محتوا در حداقل زمان؛ و بسیاری از وظایف دیگر.

در سیستم فعلی که طراحی آن را توضیح دادم، کیفیت توصیه‌ها برای کاربر همراه با فعالیت و مدت اقامت او در سرویس افزایش می‌یابد. اما البته، مشکل اصلی در اینجا نهفته است: برای سیستم دشوار است که فوراً منافع شخصی را که تعامل کمی با محتوا دارد، درک کند. هدف اصلی ما بهبود توصیه‌ها برای کاربران جدید است. ما به بهینه سازی الگوریتم ها ادامه خواهیم داد تا محتوای مرتبط با یک شخص سریعتر وارد فید او شود و محتوای نامربوط نشان داده نشود.

منبع: www.habr.com

اضافه کردن نظر