<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های امیر واهب</title><link>https://virgool.ir/feed/@amir.vaheb</link><description>Data Scientist &amp; Machine Learning Engineer @SabaIdea</description><language>fa</language><pubDate>2026-11-11 15:43:37</pubDate><image><url>https://files.virgool.ir/upload/users/9481/avatar/avatar.png</url><title>امیر واهب</title><link>https://virgool.ir/@amir.vaheb</link></image><item><title>سیستم پیشنهاددهنده اولیه فیلیمو (Jump Start Recommendation System)</title><link>https://aparat.design/jump-start-recommendation-system-urjpemzfu7g8</link><description>مقدمهیکی از اهداف ما در فیلیمو بهبود تجربه کاربران تازه‌وارد است. پیش از این در صفحه اصلی (Homepage)  فیلیمو، برای پیشنهاد دادن فیلم به کاربران جدید یک صفحه عمومی داشتیم که نتیجه برآیند انتخاب‌های کلی کاربران بود. بعدتر برای بهبود تجربه کاربران جدید یک سیستم پیشنهاددهنده اولیه ساختیم که کاربران با انتخاب حداقل سه فیلم یا سریال، سلیقه اولیه خود را معرفی می‌کنند و طبق این سلیقه اولیه، فیلم‌ها در صفحه اصلی نمایش داده می‌شوند. به مرور که کاربر فیلم‌های بیشتری تماشا می‌کند سلیقه اولیه او به سلیقه شخصی‌سازی شده تبدیل و صفحه اصلی بر اساس امتیازات جدید کاربر، ساخته می‌شود.این مساله که در مورد همه کاربران جدید در سیستم‌های پیشنهاددهنده وجود دارد را «شروع سرد» می‌گوییم. اصطلاح شروع سرد (cold start) از مدل کار کردن موتور ماشین گرفته شده. وقتی هوا سرد است، با روشن شدن ماشین، اجزا آن به درستی کار نمی‌کند و بعد از رسیدن به دمای مطلوب و اصطلاحا گرم شدن موتور، می‌توان ماشین را به راحتی به حرکت در آورد. در موتورهای پیشنهاددهنده هم «شروع سرد» به این معنی است که شرایط هنوز برای موتور بهینه نیست تا بهترین نتیجه ممکن را پیشنهاد دهد. شروع سرد موقعی اتفاق می‌افتد که یک کاربر جدید یا یک فیلم جدید وارد سیستم شود و سیستم در مورد آن‌ اطلاعات خاصی ندارد. پس برای پیشنهاد دادن دچار مشکل می‌شود. در شروع سرد، دو دسته اصلی وجود دارد:شروع سرد آیتم‌هاشروع سرد کاربراندر این مقاله قصد داریم مساله شروع سرد کاربران را که یکی از چالش‌های ما در فیلیمو بود، بررسی کنیم. سیستم پیشنهاددهنده اولیهاین سیستم دو بخش اصلی دارد. بخش اول انتخاب فیلم‌های منتخب برای نمایش به کاربران و بخش دوم پیدا کردن کاربران (فعال) مشابه (بر اساس فیلم‌های انتخاب شده) و محاسبه امتیاز اولیه.فیلم‌های منتخببرای انتخاب فیلم‌ از بین هزاران فیلم نیاز به روشی داریم که تا جای ممکن طیف وسیعی از سلایق را پوشش دهد و محبوبیت بالایی داشته باشد. یکی از بهترین روش‌ها روش یادگیری فعال (Active Learning) است که حالت‌های مختلفی دارد. در این مقاله (لینک) طبقه‌بندی آن توضیح داده شده است.در این روش، سیستم یک امتیاز بر اساس استراتژی‌های مختلف به تمام فیلم‌ها می‌دهد. استراتژی‌هایی مانند محبوبیت یا آنتروپی (انتخاب آیتم‌هایی که بیشترین اختلاف آرا را دارند) یا ترکیب آن‌ها و بعد از بین آنها فیلم‌هایی با بیشترین امتیاز را به کاربران نمایش می‌دهد. پیشنهاد می‌کنم برای درک بهتر جزئیات این روش، ارائه دکتر الهی (لینک) را مشاهده کنید.در نسخه اول از روش غیر شخصی‌سازی شده استفاده می‌کنیم و به تمامی کاربران، فیلم‌های مشابهی نشان می‌دهیم. برای بیشتر کردن طیف سلیقه کاربران، ابتدا همه فیلم‌ها خوشه‌بندی می‌شوند سپس بر اساس امتیاز سلیقه کلی (استراتژی محبوبیت) هر خوشه را مرتب کرده و فیلمی که بیشترین امتیاز را دارد انتخاب می‌شود.خوشه‌بندی فیلم‌هابرای خوشه‌بندی فیلم‌ها از الگوریتم Hierarchical clustering استفاده شده و به هر فیلم یک برچسب شماره خوشه اختصاص می‌یابد.امتیازدهی به فیلمها در هر خوشه برای محاسبه سلیقه کلی کاربران از امتیازات به دست آمده از الگوریتم شخصی سازی شده (variational autoencoder) استفاده می‌کنیم و آن را در فرمول زیر قرار می‌دهیم (از این فرمول برای انتخاب بهترین فیلم‌ها در سایت imdb استفاده شده است) :GS = (n ÷ (n + i)) × M + (i ÷ (n + i)) × ?M = میانگین امتیاز فیلم برای همه کاربرانn =  تعداد حضور فیلم در لیست تماشای کاربرانi =  حداقل تعداد حضور فیلم در لیست تماشای کاربران برای محاسبه سلیقه کلی (در حال حاضر ۲۰)C =  میانگین تعداد حضور فیلم در لیست تماشای کاربرانبا محاسبه امتیاز کلی برای هر فیلم در هر خوشه، هر فیلمی که امتیاز بیشتری داشته داشته باشد به عنوان نماینده  آن خوشه انتخاب می‌شود. در نهایت با استفاده از امتیاز سلیقه همه کاربران، فیلم‌های منتخب مرتب می‌شوند.در دیاگرام زیر فرآیند این مرحله نمایش داده شده اند.پیدا کردن کاربران مشابهاضافه کردن فیلم‌های مشابه به لیست انتخابی کاربربرای تقویت لیست انتخابی کاربران و بهبود نتایج، از سیستم پیشنهاددهنده فیلم به فیلم استفاده کردیم. در بعضی از موارد، یافتن کاربران مشابه با داشتن ۳ فیلم، مخصوصا اگر فیلم‌ها بسیار محبوب باشد، نتیجه خوبی ندارد. بنابراین با استفاده از این سیستم، تعدادی فیلم مشابه به ازای هر فیلم انتخابی (بر اساس تعداد انتخاب‌های کاربران) در نظر گرفته و لیست انتخابی کاربران را تقویت کرده و در نهایت نتایج دقیق‌تری تولید می‌شود.محاسبه امتیاز اولیه کاربر جدید بر اساس امتیازات کاربران مشابهاین لیست تقویت شده را به عنوان یک لیست تماشا شده توسط کاربر جدید در نظر گرفته و به عنوان ورودی به همراه لیست تماشای همه کاربران به الگوریتم شخصی سازی شده (VAE) می‌دهیم. با استفاده از لایه میانی این الگوریتم، یک فضای برداری برای همه لیست تماشای کاربران تشکیل می‌شود. سپس از کتابخانه FAISS استفاده کرده و شبیه‌ترین بردارها یا در واقع لیست تماشای کاربران را پیدا می‌کنیم. در نهایت ۵ کاربر (فعال) مشابه بر اساس این لیست تماشا انتخاب شده و میانگین امتیازات آنها را به کاربر جدید اختصاص می‌دهیم.بر اساس این امتیازات و توضیحاتی که در پست قبلی داده شده است، یک صفحه اولیه برای کاربر ساخته می‌شود.در دیاگرام زیر فرآیند یافتن امتیاز کاربران جدید شرح داده شده.آنالیز رفتار کاربران در انتخاب فیلمهای کاندیدبرای آنالیز رفتار کاربران در انتخاب فیلم‌، ابتدا ترتیب نمایش فیلم‌ها را بررسی کردیم. برای این کار ترتیب نمایش که به صورت پیش‌فرض بر اساس امتیاز سلیقه کلی بود را یک بار با ترتیب تصادفی و یک بار با برعکس امتیازات کلی مورد آزمایش قرار دادیم.تعداد فیلم‌های نمایش داده شده حدود ۸۰ فیلم است و بازه‌های زمانی تست، در هر حالت، یک ماه در نظر گرفته شده.رفتار کاربران در انتخاب فیلمها با امتیازات کلیجدول زیر، تعداد انتخاب کابران در هر جایگاه را نشان می‌دهد. بر اساس این اعداد بیشتر کاربران ۱۰ فیلم اول را انتخاب کرده‌اند.هیت مپ متناظر با جایگاه فیلمها در صفحهنمودار زیر تعداد انتخاب‌های کاربران در جاهای مختلف را نشان می‌دهد. همانطور که مشاهده می‌شود جایگاه ۱ تا ۱۰ بیشترین انتخاب را دارند.هیستوگرام جایگاه فیلمهای انتخاب شده توسط کاربرانرفتار کاربران در انتخاب فیلم‌ها با ترتیب برعکس امتیازات کلیبا برعکس کردن امتیازات، کاربران زیادی جایگاه‌های آخر را انتخاب کردند اما تعداد قابل توجهی از کاربران فقط ۳ فیلم اول را انتخاب کرده و به نظر می‌رسد توجهی به انتخاب فیلم‌ها ندارند.رفتار کاربران در انتخاب فیلم‌ها با ترتیب تصادفیهمانطور که می‌بینید در این حالت، باز هم فیلم‌های جایگاه ۱ تا ۱۰ بیشتر مورد توجه کاربران است.نتیجه‌گیرینتیجه این که تعداد قابل توجهی از کاربران، به جای در نظر گرفتن‌ فیلم‌های مورد علاقه خود، توجه بیشتری به فیلم‌های ابتدایی لیست که آن‌ها دسترسی آن‌ها راحت‌تر است، دارند. در واقع کاربران تازه‌وارد اهمیتی به انتخاب دقیق‌تر برای داشتن پیشنهاد بهتر نمی‌‌دهند. حالا باید دنبال راه‌حل‌هایی برای افزایش دقت کاربران برای انتخاب محتوا باشیم.قدم بعدیهدف از بررسی این سیستم، بهبود تجربه کاربران تازه‌وارد است اما در هر دو بخش اصلی بر اساس داده‌هایی که از رفتار کاربران جمع‌آوری می‌کنیم اصلاحاتی قابل انجام است. در بخش اول در حال بررسی و تست استراتژی‌های دیگری هستیم که فیلم‌های منتخب مناسب‌تری به کاربران ارائه شود و در بخش دوم الگوریتم و فرمول‌های جدید را مورد ارزیابی قرار می‌دهیم.منابعhttps://www.sciencedirect.com/.../S1574013715300150?via%3Dihubhttps://www.aparat.com/v/3NSYthttps://medium.com/@markmilankovich/the-cold-start-problem-for-recommender-systems-89a76505a7https://analyticsindiamag.com/cold-start-problem-in-recommender-systems-and-its-mitigation-techniques/</description><category>امیر واهب</category><author>امیر واهب</author><pubDate>Tue, 26 Apr 2022 16:27:26 +0430</pubDate></item><item><title>سیستم‌های پیشنهاد دهنده فیلیمو - قسمت دوم و پایانی</title><link>https://aparat.design/recommendation-systems-in-filimo-hgvuqhjhbdjy</link><description>در مقاله قبل توضیح دادیم که برای ساختن سیستم پیشنهاد دهنده «فیلم به فیلم» چه چالش‌هایی وجود داشت و تیم هوشمندسازی آپارات و فیلیمو چطور نسخه اول آن سیستم را ساخت و در ادامه، در این مقاله سعی داریم چالش‌ها و نحوه ساختن صفحه اول شخصی‌سازی‌ شده  فیلیمو را توضیح دهیم.سیستم پیشنهاد‌دهنده شخصی‌سازی شده چیست؟هر صفحه در فیلیمو از مجموعه‌ای از ردیف‌ها ساخته شده‌است که دارای دسته‌بندی‌های متفاوتی هستند. سیستم پیشنهاد‌دهنده شخصی‌سازی شده برای هر کاربر فعال، فیلم‌های صفحه اول و صفحات دیگر را مطابق با تاریخچه تماشای فیلم می‌سازد و برای کاربران غیر فعال و تازه واردها صفحاتی را بر اساس محبوبیت کلی و مدل‌ها و فرمول‌های دیگری می‌سازد.شکل 1. نمونه‌ای از چند ردیف‌ در صفحه شخصی‌سازی شده یک کاربر چالش‌هایی که در این مسیر داشتیمعلاوه بر چالش‌های مطرح شده در مقاله قبل، برای ساختن صفحه اول شخصی‌سازی شده، چالش‌های دیگری نیز وجود داشت که در ادامه به برخی از آن‌ها اشاره می‌کنیم.پیچیدگی ساخت ماتریس امتیازدهی کاربران به فیلم‌ها: ساخت ماتریس امتیازدهی به همه کاربران فعال، نیاز به منابع کافی برای ساخت، ذخیره و به‌روزرسانی داشت. به علاوه پیاده‌سازی الگوریتم مناسب برای ساخت این ماتریس، بسیار دشوار و پیچیده بود.پیچیدگی ساخت ردیف‌ها و صفحات شخصی‌سازی شده: برای این کار به الگوریتم‌هایی برای چیدمان افقی در هر ردیف و چیدمان عمودی برای کل ردیف‌ها برای ساخت صفحه نیاز داشتیم.استفاده چند کاربر از یک حساب کاربری: استفاده چندین کاربر یا اعضای خانواده از یک حساب کاربری در فیلیمو باعث کاهش دقت سیستم پیشنهاددهنده می‌شد و تا زمانی که کاربرانی با سلیقه‌های متفاوت از یک حساب کاربری استفاده می‌کنند، سیستم سلیقه غالب را اعمال کرده، در نتیجه دیگر کاربران پیشنهاد مطلوبی نمی‌گیرند.کمبود دادِگان: هر نوع تعامل کاربران با محصول از اهمیت خاصی برخوردار است و می‌تواند کیفیت سیستم پیشنهاددهنده را ارتقا دهد. ما داده‌هایی مانند کلیک کاربران را نداشتیم زیرا به یک زیرساخت قوی نیاز داشت، بنابراین فقط با تاریخچه تماشای کاربران مدل‌ها را آموزش دادیم.مدل‌های  پیشنهاد‌دهنده شخصیهدف از این سیستم طراحی مدلی بود که به کمک آن بتوانیم با توجه به تاریخچه فیلم‌های مشاهده‌شده توسط هر کاربر، فیلم‌های مناسب با سلیقه آن کاربر را به او پیشنهاد دهیم. برای انجام این کار نیاز به ساخت ماتریسی داشتیم که همه کاربران به همه فیلم‌ها امتیاز دهند. این کار به دو روش انجام شد، روش اول را که روش ترکیبی مبتنی بر فاکتورسازی ماتریس (hybrid matrix factorization) است، به طور مختصر در بخش قبل شرح دادیم و در این مقاله در ارتباط با روش دوم که استفاده از روش‌های مبتنی برای شبکه‌های خود رمزگذار (Autoencoder) است، توضیح می‌دهیم.شبکه‌های خود رمزگذار چیست؟به دلیل این که در این مدل‌ها  برای هر کاربر، علاوه بر آیتم‌ها، یک بردار ویژگی نیز محاسبه می‌شود، پس می توان با محاسبه ضرب داخلی بردار محاسبه شده برای هر کاربر در تمامی آیتم‌ها، میزان مشابهت(علاقه) آن کاربر با تمامی آیتم‌ها را بدست آورد. یکی از بزرگترین محدودیت‌های این مدل عدم توانایی آن در محاسبه بردار ویژگی برای کاربران خارج از داده‌های آموزشی است. بنابراین برای کاربران جدید که در داده‌های آموزشی قبلی حضور نداشته‌اند نمی توان از این مدل استفاده نمود. برای رفع این محدودیت می‌توان از روش‌های مختلفی مانند روش‌های مبتنی برای شبکه‌های خود رمزگذار(autoencoder) استفاده نمود.هدف این نوع از شبکه‌ها انتقال داده‌ها به یک فضای برداری با ابعاد کمتر است به گونه‌ای که بتوان با استفاده از این فضای برداری، داده‌های اصلی را بازسازی نمود. این شبکه ها از دو بخش اصلی تشکیل شده‌اند:بخش اول: رمزگذار(encoder) که وظیفه کاهش ابعاد داده‌های ورودی را بر عهده داردبخش دوم: رمزگشا(decoder) که داده‌های رمزگذاری‌شده را به حالت اولیه بر می‌گردانند.به دلیل این که در این مدل از شبکه‌های عصبی، کاهش ابعاد داریم، شبکه باید توانایی نشان دادن داده‌ها در فضایی با ابعاد کمتر را فراگیرد. از این شبکه‌ها می‌توان در سیستم‌های پیشنهاد‌دهنده شخصی استفاده کرد. برای این منظور می‌توان مجموعه داده‌ای متشکل از لیست فیلم‌های مشاهده‌شده توسط کاربران را جمع آوری کرد. بنابراین ورودی و خروجی این نوع شبکه می‌تواند لیست فیلم‌های مشاهده شده توسط کاربر باشد.نکته مهم در استفاده از این شبکه‌ها برای سیستم پیشنهاد دهنده، استفاده از نوعی لایه مانند dropout پس از لایه ورودی است.این لایه تعدادی از داده‌های ورودی به شبکه را به صورت تصادفی حذف می‌کند. چون هدف شبکه بازسازی داده‌های ورودی در لایه خروجی است باید در طول فرایند آموزش توانایی تخمین داده‌های حذف شده را فرابگیرد. بنابراین پس از آموزش شبکه می‌توان لیستی از فیلم‌های مشاهده‌شده توسط یک کاربر را به عنوان ورودی و لیست تخمین زده شده توسط شبکه را به عنوان خروجی‌( لیست پیشنهادی برای کاربر) در نظر گرفت. می‌توان گفت، از مزیت‌های اصلی این روش، امکان استفاده از آن برای کاربران جدید و قابلیت مقیاس‌پذیری بیشتر نسبت به مدل قبلی است.ما در این سیستم از (Variational Autoencoder(VAE که نوع خاصی از شبکه خود رمزگذار است، استفاده می‌کنیم. دلایل استفاده از این مدل و اطلاعات تکمیلی را می‌توانید در مقاله‌ای که در منابع آورده شده مطالعه کنید.شکل 2. معماری یک شبکه خودرمزگذارنحوه ساخت ردیف‌ها و صفحاتبرای ساخت ردیف‌ها و صفحات، دو موضوع پیش رو داشتیم:ساختن صفحات شخصی سازی شدهساختن  صفحه کلی یا generalساخت صفحات شخصی سازی شدهصفحات شخصی‌سازی شده برای کاربران فعال ساخته می‌شوند. برای ساخت ردیف‌ها، مدل ما امتیازی به هر کاربر برای همه فیلم تولید می کند. این امتیازها  برای شخصی‌سازی ردیف‌ها و صفحات الزامی است. ما با استفاده از ویژگی‌ها و اطلاعات فیلم‌ها ردیف‌هایی را به طور کلی می‌سازیم. این ردیف‌ها با استفاده از این امتیازها رتبه بندی و اولویت‌بندی می‌شوند و ردیف‌هایی که امتیاز بالاتری کسب کنند در جایگاه بالاتری در صفحه قرار می‌گیرند. همچنین در خود هر ردیف فیلم‌هایی که امتیاز بالاتری داشته باشند از سمت راست به ترتیب قرار می‌گیرند و از سویی دیگر برای ساخت و چیدمان بعضی ردیف‌هایی مانند «بر اساس فیلمی که شما دیده اید» یا «ادامه تماشا»، از پروفایل ساخته‌شده برای کاربران استفاده می‌کنیم.شکل 3. شمایی از نحوه ساخت صفحه شخصی‌سازی‌شدهساختن  صفحه کلی یا generalصفحه کلی برای کاربرانی مورد استفاده قرار می‌گیرد که یا کاربر فعال نیستند یا کاربران جدید هستند. برای ساخت صفحه کلی ما از روش‌های مختلفی استفاده کردیم:یکی از روش‌ها استفاده از لایک‌ها و امتیاز کاربران به فیلم‌ها است. بدین صورت که فیلم‌های محبوب، با استفاده از فرمولی که IMDB برای فیلم‌های برتر استفاده می‌کند، در اولویت قرار می‌گیرند و امتیاز بالاتری کسب می‌کنند و در نتیجه ردیف‌ها بر اساس علایق عمومی ساخته می‌شوند.روش دیگر استفاده از امتیازهای ساخته شده برای همه کاربران، در مدل‌های Autoencoder یا LightFM بود، با استفاده از فرمول مطرح شده سلیقه کلی را محاسبه کردیم و ردیف‌ها را بر اساس آن تشکیل دادیم. با توجه به نتایج ارزیابی‌ها، صفحه کلی که با استفاده از امتیازهای مدل Autoencoder ساخته شد، بهترین بازخورد را داشت و مورد استفاده قرار گرفت.چطور ارزیابی می‌کنیم؟برای ارزیابی سیستم پیشنهاد‌دهنده شخصی‌سازی شده فیلیمو، ما ابتدا مدل برتر که بر اساس nDCG، که در مقاله قبل توضیح دادیم استفاده می‌کنیم، سپس صفحات ساخته‌شده برای کاربران را به صورت A/B تست ارزیابی می‌کنیم. در این ارزیابی ما از کاربران دو گروه تقریبا یکسان از نظر میزان تماشای فیلیمو انتخاب کردیم، و پس از چند روز تفاوت میزان تماشای کاربران را ارزیابی کردیم. ما برای این ارزیابی از ابزار google analytics استفاده کردیم.شکل 4. روش ارزیابی سیستم‌های پیشنهاددهندهنکته بسیار مهم!!!ما برای ساخت این سیستم از تاریخچه تماشای کاربران استفاده می‌کنیم تا سلیقه کاربران را به دست آوریم. اما از اطلاعات شخصی کاربران استفاده نمی‌کنیم، در واقع همه اطلاعات به صورت کد شده در سیستم قرار دارند و این اطمینان را به کاربران می‌دهیم که از این اطلاعات صرفا برای افزایش کیفیت پیشنهادات استفاده می‌شود.معماری کلی سیستم‌های پیشنهاد دهندهشکل 5. معماری کلی سیستم‌های پیشنهاددهندهاجزای سیستم شامل این موارد هستند:سرویس پیشنهاد‌دهنده «فیلم به فیلم»سرویس Wall-Eسرویس پروفایلسرویس جمع آوری کننده دادهسرویس توصیه کننده  (Variational Autoencoder(VAEسرویس سازنده ردیف‌های فیلیموسرویس رهامسرویس Blenderسرویس پیشنهاد دهنده فیلم به فیلم:این سرویس در مقاله قبلی توضیح داده شد و از خروجی آن در بعضی ردیف‌ها مانند «بر اساس فیلمی که دیده‌اید» استفاده می‌شود.سرویس Wall-E: این سرویس مسئول جمع آوری اطلاعات تماشای فیلم توسط کاربران و تجمیع (aggregation) و نگهداری آن است.سرویس پروفایل: سرویس پروفایل وظیفه تولید شخصیت (persona) برای کاربران را دارد،  روزانه برای کاربرانی که فیلم دیده‌اند، لیست فیلم‌های دیده‌شده (watched)، پسندیده‌شده(liked)، پسندیده‌نشده‌(disliked) و نشان‌شده (bookmarked) را تشکیل می‌دهد، سپس از روی آن اطلاعات زیر را برای هر کاربر تولید می‌کند:توزیع رده سنیتوزیع دسته‌بندی اول و دوم فیلمتوزیع عوامل فیلمتوزیع زمان (ساعت، روز) تماشای فیلمتوزیع زمان‌(دهه) تولید و انتشار فیلمتوزیع کشور(های) سازنده فیلمتوزیع فیلم ها و سریال‌هاتوزیع تگ‌هامیانگین، حداقل و حداکثر امتیاز کاربران به فیلم‌هامیانگین، حداقل و حداکثر طول فیلم‌هامیانگین، حداقل و حداکثر تعداد دیدگاه‌های فیلممیانگین، حداقل و حداکثر تعداد بازیگران فیلمهمچنین این سرویس وظیفه دارد که لیستی از فیلم‌های نیمه کاره دیده‌شده و فیلم‌هایی که پتانسیل نشان داده شدن در ردیف پیشنهاد «بر اساس فیلم‌های پسندیده شده» را دارند، تولید کند.سرویس توصیه کننده  (Variational Autoencoder(VAE: این سرویس در واقع همان مدل خود رمزگذاری‌شده است که در بالا به طور کلی و مختصر توضیح دادیم. خروجی این مدل، ماتریسی است که به ازای هر کاربر به همه فیلم‌ها امتیازی داده می‌شود.سرویس سازنده ردیف‌های فیلیمو: این سرویس با استفاده از داده‌های موجود در Redis، که توسط سرویس VAE تهیه شده‌است، ردیف‌های فیلیمو را به صورت آفلاین، به‌روز‌رسانی و برای نمایش به عنوان فیلیمو عمومی مورد استفاده قرار می‌دهد. فیلیمو نسخه عمومی از این ردیف‌ها و امتیاز‌ها استفاده می‌کند.سرویس رهام (row هام): این سرویس وظیفه سرو کردن نهایی ردیف فیلم‌های صفحه اصلی و صفحات داخلی فیلیمو به صورت شخصی‌سازی شده را بر عهده دارد. این سرویس همچنین شامل زیرساخت A/B Test مجموعه نیز هست که هر کاربر را بر اساس شرط‌های مشخص شده دسته‌بندی می‌کند و امکان A/B تست کردن مدل‌های تولید شده را می‌دهد. به طور مثال، بر این اساس که آیا می‌توان برای کاربر صفحه شخصی‌سازی شده تولید کرد یا نه (کاربر در مدت مشخص، تعداد کافی فیلم دیده باشد)، کاربرها به دو دسته بزرگ Personal و General تقسیم‌بندی می‌شوند و با  ساخت دو گروه متشکل از نسبت مساوی از هر دو گروه A/B تست می شوند. سرویس رهام به صورتی بهینه پیاده‌سازی شده که بتواند در تعداد درخواست بالا نیز همچنان در محدوده چند میلی ثانیه به کاربران بدون سلیقه، ردیف‌ها را به صورت General و برای کاربران دارای سلیقه، ردیف‌ها را به صورت شخصی سازی شده سرو کند.در حالت کلی ردیف‌ها شامل چند دسته می‌شوند که فیلم‌ها در هر ردیف بر اساس امتیازی که علاقه کاربر (در صورت داشتن سلیقه وگرنه میانگینی از علاقه همه کاربران دارای سلیقه) به فیلم نشان می‌دهد، مرتب می‌شوند. سپس بر‌اساس مجموع امتیاز چند فیلم اول هر ردیف، امتیاز ردیف بدست می‌آید، ردیف‌ها با آن امتیاز در محدوده‌ای که از قبل مشخص‌شده مرتب می‌شوند.به طور مثال، ردیف «دوباره ببینید» می‌تواند در بازه ردیف‌های ۱۰ تا ۳۰ قرار بگیرد و تا چند دقیقه cache ‌شود، تا در درخواست‌های بعد کاربر بتوان بلافاصله آن‌ها را سرو کرد، این ردیف‌ها به دسته‌های زیر تقسیم می‌شوند:ردیف‌های عادی از پیش تشکیل شده‌اند.ردیف‌های ثابت که یا اطلاعات ثابتی دارند یا توسط بخش‌های دیگر فیلیمو پر می‌شوند.ردیف‌های پویا (dynamic) که در لحظه درخواست تولید می‌شوند. به طور مثال، ردیف «به تماشا ادامه دهید» که در لحظه بر اساس profile کاربر تشکیل می‌شوند.ردیف‌های پویا که توسط سرویس‌های دیگر مقداردهی می‌شوند. به طور مثال، ردیف «بر اساس فیلم X که دیده‌اید» که فیلم منتخب از profile کاربر استخراج می‌شود ولی برای تشکیل ردیف نیاز به درخواست اطلاعات از سرویس recommendation server است.سرویس Blender: این سرویس وظیفه غنی‌سازی (enrichment) اطلاعات فیلم‌های فیلیمو با هدف در دست داشتن داده‌های متای(meta data) بیشتر برای مدل‌های پیشنهاد فیلم را بر عهده دارد و به صورت مداوم اطلاعات سایت‌های مرجع فیلم مانند IMDB و TMDB را به صورت به‌روز دریافت می‌کند و در کنار اطلاعات فیلم‌های فیلیمو قرار می‌دهد.مسیر تیم هوشمندسازی در آیندهمهمترین بخشی که در نظر داریم در آینده به آن بپردازیم ساختن زیر ساخت مناسب‌تر برای دریافت دیتا و داشتن دیتای بیشتر از کاربران است. در ادامه مدل‌های بسیاری از جمله مدل‌های مبتنی بر گراف وجود دارند که قصد ارزیابی آن‌ها را پیش رو داریم و در مدل‌های موجود به مواردی چون تست‌های متفاوت، بهتر شدن از لحاظ دقت، کارایی و سرعت پاسخ‌دهی بپردازیم، در نهایت امیدواریم بتوانیم با ساختن یک سیستم پیشنهاد‌دهنده مناسب، محصول با کیفیت‌تری به کاربران ارائه دهیم.نکاتی در مورد پست اولبا توجه به نظرات و بازخوردهای مطرح شده در پست اول، دو نکته را لازم است بیان کنیم.در سیستم پیشنهاد دهنده «فیلم به فیلم»، مدل‌هایی مانند word2vec و GloVe اگرچه از اطلاعات تاریخچه تماشای کاربران، فقط برای به دست آوردن شباهت بین فیلم‌ها استفاده می‌کنند، اما می‌توانند در زیرمجموعه مدل‌های پالایش گروهی (collaborative filtering) قرار گیرند. زیرا با توجه به تعریف جامع‌تر پالایش گروهی، هر مدلی که از دیتا کاربران استفاده کرده و از اطلاعات آن به طور ضمنی در مدلی به کار برد، آن مدل نیز می‌تواند در زیرمجموعه پالایش گروهی قرار گیرد.در مدل‌های word2vec و GloVe ترتیب تماشای فیلم در طول زمان اهمیت دارد و نتایج آن‌ها موقتی هستند. به عبارت دیگر، مدل‌های ما این توانایی را دارند که در صورت تغییر سلیقه کاربران، فیلم‌های پیشنهاد شده، با توجه به تاریخچه تماشای فیلم‌ها در طول زمان، تغییر کنند.کلام آخرما در این دو مقاله به صورت مختصر دو سیستم پیشنهاد‌دهنده در فیلیمو را شرح دادیم. چالش‌ها، روش‌ها، نحوه کارکرد و ارزیابی هر دو سیستم پیشنهاد دهنده «فیلم به فیلم» و سیستم «صفحه شخصی سازی شده» را بیان کردیم. به طورکلی نتیجه‌ای قابل مشاهده، این است که، این سیستم‌ها در قسمت‌هایی برای بهبود همدیگر با هم در ارتباط هستند و در کل باعث افزایش استفاده کاربران از  محصول شده‌اند و کیفیت آن را افزایش داده‌اند.در آخر از همه اعضای تیم و کسانی که در نوشتن این دو پست به ما کمک کردند تشکر می‌کنم. در ضمن از دوستانی که نظر و بازخوردشان را اعلام کردند، مخصوصا آقای بهنام ثابتی، که ابهامات ذکر شده را مطرح کردند، ممنونیم. امیدواریم که این مطالب برای دوستان مفید واقع شده باشد.منابعhttps://netflixtechblog.com/learning-a-personalized-homepage-aa8ec670359ahttps://towardsdatascience.com/recommendation-system-part-1-use-of-collaborative-filtering-and-hybrid-collaborative-content-in-6137ba64ad58https://medium.com/recombee-blog/evaluating-recommender-systems-choosing-the-best-one-for-your-business-c688ab781a35https://netflixtechblog.com/page-simulator-fa02069fb269https://towardsdatascience.com/intuitively-understanding-variational-autoencoders-1bfe67eb5dafhttps://github.com/mkfilipiuk/VAE-CF</description><category>امیر واهب</category><author>امیر واهب</author><pubDate>Wed, 29 Apr 2020 19:29:46 +0430</pubDate></item><item><title>سیستم‌های پیشنهاد دهنده فیلیمو - قسمت اول</title><link>https://aparat.design/recommendation-systems-in-filimo-cqzge4gfsevi</link><description>در این دو بلاگ پست قصد داریم سیستم‌های پیشنهاد‌دهنده فیلیمو را تشریح کنیم. در قسمت اول، سیستم پیشنهاد دهنده فیلم به فیلم فیلیمو و الگوریتم‌ها و مدل‌های استفاده شده در آن را توضیح خواهیم داد و در قسمت دوم که به زودی منتشر می‌شود، سیستم پیشنهاد‌دهنده شخصی سازی شده فیلیمو و روش‌ها و نحوه ساخته شدن  صفحه شخصی‌سازی‌شده را شرح خواهیم داد.این دو بلاگ پست حاصل یک سال تلاش و تجربه تیم هوشمند‌سازی است، که به هدف افزایش تعامل و رضایت کاربران از فیلیمو و آپارات، تشکیل شد. این تیم در قدم اول با تمرکز بر فیلیمو، به دنبال تسهیل انتخاب کاربران از هزاران عنوان فیلم در فیلیمو بوده است. پیدا کردن فیلم مورد پسند برای کاربران ممکن است زمان زیادی از آنها بگیرد، و این هنر ماست که سلیقه کاربران را تشخیص دهیم و فیلم‌هایی را به آنها پیشنهاد دهیم، که انتظار می‌رود مورد پسندشان قرار بگیرند و در نتیجه  زمان دسترسی کاربران به محتوای مورد نظرشان را کاهش دهیم.سیستم پیشنهاد دهنده چیست؟چطور YouTube ویدیو بعدی که ممکن است تماشا کنید را تشخیص می دهد؟ چطور Netflix فیلم‌هایی را فقط برای شما انتخاب میکند؟ سحر و جادو؟  خیر! در هر دو حالت، از سیستمهای پیشنهاد‌دهنده مبتنی بر یادگیری ماشین استفاده می‌کنند که تشابه بین ویدیوها و فیلم‌ها را تشخیص داده و پیشنهادهایی بر اساس سلیقه شما می‌دهند.معمولا دو نوع سیستم پیشنهاد‌دهنده وجود دارند:سیستم پیشنهاد دهنده صفحه اصلیدر این سیستم هر شخص، صفحه اصلی متفاوتی بر اساس سلیقه خود می‌بیند. برای مثال کاربران فعال در فیلیمو هر کدام صفحات اصلی متفاوتی را می‌بینند.سیستم پیشنهاد دهنده آیتمهای مرتبطدر این سیستم برای هر آیتم، آیتم‌های مرتبط با آن برای کاربران نمایش داده می‌شود. برای مثال هر صفحه فیلم در فیلیمو  فیلم‌های پیشنهادی مربوط به خود را دارد.چرا از سیستم‌های پیشنهاد دهنده استفاده می‌شود؟روانشناسان تحقیقات زیادی بر روی رفتار انسان‌ها برای انتخاب و خرید اقلام مختلف انجام داده‌اند. یکی از معروفترین این تحقیقات آزمایش مربا بوده است که در آن، رفتار انسان برای انتخاب مربا بین گزینه‌های با تعداد کم و زیاد مورد بررسی قرار گرفت. نتایج آزمایش نشان داد که درست است که گزینه‌های کم، جالب نیست اما گزینه‌های زیاد برای انتخاب هم ما را سردرگم می‌کند. بنابراین داشتن تعداد زیادی گزینه برای انتخاب، به نظر جذاب می‌آید ولی در واقع کاربران را گیج می‌کند و قدرت تصمیم‌گیری را از آنها می‌گیرد و در نتیجه داشتن تعداد زیادی آیتم در یک فروشگاه آنلاین یا تعداد بسیاری فیلم در فیلیمو، بدون داشتن یک سیستم پیشنهاد دهنده خوب بیشتر از این که مفید باشد می‌تواند مضر باشد.شکل 1. پارادوکس انتخاب (آزمایش مربا)به علاوه در بیشتر زمان‌ها کاربران خودشان نمی‌دانند چه فیلمی ببینند و هر فیلمی که در دسترس باشد و به آنها نشان داده شود را برای تماشا انتخاب می‌کنند. بنابراین در صورتی که فیلم‌های در دسترس، مورد علاقه کاربران باشد میزان رضایت و زمان تماشای فیلم بالاتر رفته و بیشتر از محصول استفاده می‌کنند. درنتیجه نیاز به یک  سیستم پیشنهاد‌دهنده‌ای داریم که بر اساس علاقه‌مندی کاربران فیلم‌های مناسبی را در دسترس کاربران قرار‌دهد.سیستم پیشنهاد دهنده فیلم به فیلمما در هر صفحه  فیلم در فیلیمو یک ردیف از فیلمهای پیشنهادی بر اساس فیلم اصلی داریم که مورد توجه کاربران است. کاربران معمولا اگر از تماشای یک فیلم لذت ببرند علاقه مندند فیلمهای مشابه و مورد علاقه کاربران دیگر که این فیلم را تماشا کرده‌اند را ببینند. در هر صفحه ما فیلم‌هایی را پیشنهاد می‌دهیم که سیستم پیشنهاد‌دهنده فیلم به فیلم بر اساس مدل‌های مختلف ارائه می‌دهد. هدف این سیستم ارائه پیشنهاداتی هست که چهار ویژگی مرتبط‌بودن، جدید‌بودن، متنوع‌بودن و غیر‌قابل‌انتظار‌بودن را همزمان داشته باشد و در نتیجه کاربران بیشتر از محصول استفاده کرده و رضایت بیشتری داشته باشند.شکل 2. نمونه ای از فیلمهای پیشنهادی در صفحات فیلم در فیلیموچالش‌هاسیستم‌های پیشنهاد‌دهنده با وجود کاربردها و مزایای زیاد، از تعداد زیادی چالش‌ اساسی رنج می‌برند که هدف الگوریتم‌های ارائه‌شده تاکنون، رفع یک یا چند مورد از این چالش‌هاست؛ که در زیر به چند مورد از مهم‌ترین آن‌ها اشاره خواهیم کرد.کمبود دادگانبرای هر سیستم پیشنهاد‌دهنده ای وجود دادگان کافی ضروری است. در ابتدای کار، مشخصات ثبت شده در پایگاه داده برای هر فیلم دارای نواقص و اشتباهاتی بود که در طول زمان، هم اطلاعات را تصحیح کردیم و هم از منابع دیگر اطلاعات تکمیلی مانند جوایز فیلم‌ها را به آن اضافه کردیم.ابهام در اطلاعاتدر سیستم‌­های پیشنهاد‌دهنده هدف پیدا نمودن شباهت بین آیتم‌های مختلف و کاربران بر اساس ویژگی های آن‌هاست که در برخی از کاربردها و حوزه‌ها این کار بسیار پیچیده است. برای مثال، دادگان ما در ابتدای کار در قسمت دسته بندی در بعضی فیلم‌ها یا نحوه دسته بندی که از ابتدا ساخته شده بود محدودیت‌هایی را ایجاد می‌کرد یا در وارد کردن اطلاعات دقت کافی وجود نداشت.شروع سرد (cold start)مشکل شروع سرد تقریباً در همه سیستم‌های پیشنهاددهنده وجود دارد که کارایی سیستم را به شدت  کاهش می‌دهد. به زبانی ساده می‌توان گفت مشکل شروع سرد هنگامی رخ می‌دهد که یک کاربر یا فیلم جدید وارد سیستم شود و سیستم در مورد آن‌ها اطلاعات یا دانش خاصی نداشته باشد، لذا در هنگام پیشنهاد دچار مشکل می‌شود.علاوه بر این چالش ها، زیرساخت های لازم برای ارزیابی آنلاین این سیستم هم با مشکلاتی رو به رو بود که در نتیجه، تعداد و کیفیت ارزیابی را تحت تاثیر قرار داد.جمع‌آوری و آماده‌سازی دادگانبرای جمع‌آوری دادگان، از دیتابیس فیلم‌های فیلیمو، اطلاعات مورد نیاز فیلم‌ها و تاریخچه مشاهده کاربران را از داده‌های تعامل کاربران  جمع آوری کردیم. همچنین ، برای تقویت داده های فیلم‌ها از دو منبع معتبر یعنی IMDB و TMDB نیز استفاده شد. برای تمیز کردن دادگان، کمبودها و ایرادات زیادی را پیدا کرده و سپس آنها را کامل و تمیز کردیم. به طور مثال، ژانر قسمت‌های مختلف سریال به دلیل خطای انسانی یکسان نبود، در برخی از فیلم‌ها تعدادی از فیلدها مقدار نداشت و یا در داده‌های تعامل  کاربران، فیلد مشخص کننده دستگاه مورد استفاده مقدار نداشت. به علاوه یکی از نویزهایی که در فیلیمو متداول است، کاربرانی هستند که به علت استفاده چند کاربره از یک اکانت، تعداد تماشای غیر متعارف دارند که باعث خطای مدل‌های ما می شوند و در نتیجه نیاز به نرمال‌کردن آن‌ها بود.روش‌ها و مدل‌هابه طور کلی ساختار سیستم‌های پیشنهاد دهنده شامل سه بخش است:تولید کاندیدا ( candidate generation)امتیازدهی (scoring)رتبه بندی دوباره (re-ranking)شکل 3 .شمایی از بخشهای کلی سیستمهای پیشنهاد دهندهتولید کاندیدادر مرحله اول ، سیستم شروع به تولید زیر مجموعه‌های کوچکی از کاندیداها می‌کند. برای مثال، کاندیداهای تولید شده در فیلیمو از هزاران فیلم به صدها فیلم کاهش پیدا می‌کند. مدل‌ها نیاز به ارزیابی کاندیداهای تولید شده دارند. هر مدل ممکن است چندین کاندیداهای مختلف تولید کند که با ارزیابی آنها بهترین کاندیدا‌ها انتخاب می‌شوند.امتیاز‌دهیدر مرحله بعد، مدل دیگری امتیازدهی و رتبه بندی کاندیداها را برای انتخاب مجموعه‌ای از آیتم‌ها (فیلم‌‍‌ها) برای نمایش به کاربر بر عهده می‌گیرد. این مدل با ارزیابی آیتم‌های مرتبط، مجموعه‌ای کوچکتر را تشکیل می‌دهد که سیستم با استفاده از آن جواب دقیق‌تری را می‌تواند ارائه دهد.رتبه بندی دوبارهدر آخر، سیستم برای رتبه‌بندی نهایی باید محدودیت‌های زیادتری را اعمال کند. برای مثال، سیستم آیتم‌هایی را که کاربر دوست ندارد را حذف می‌کند یا امتیاز محتوای جدیدتر را بالاتر می‌برد. رتبه‌بندی دوباره همچنین می‌تواند کمک به تضمین تنوع، تازگی و عدالت بین آیتم‌ها کند.تولید کاندیداها اولین مرحله از سیستم پیشنهاد‌دهنده است. با دادن یک کوئری، سیستم مجموعه‌ای از کاندیداهای مرتبط را ارائه می‌دهد. سه روش رایج تولید کاندیدا، فیلتر کردن بر اساس محتوا (content-based filtering)، پالایش گروهی (collaborative filtering) و روش‌های ترکیبی می‌باشند. ما در فیلیمو از روش‌های مختلفی استفاده کردیم و در نهایت مدل‌هایی که نتایج بهتری داشتند امتیاز بالاتری گرفتند و نمایش داده شدند.مدل‌های بر اساس محتوااین مدل‌ها فقط بر اساس محتوای یک فیلم، فیلم‌های دیگر را پیشنهاد می‌دهد و در واقع هیچ تاثیری از کاربر نمی‌پذیرد.  مهمترین مدل بر اساس محتوا استفاده شده در این سیستم مدل خوشه‌بندی است.الگوریتم‌های خوشه‌بندیخوشه‌بندی، فرآیندی است که به کمک آن می‌توان مجموعه‌ای از اشیاء را به گروه‌های مجزا افراز کرد. هر افراز یک خوشه نامیده می‌شود. اعضاء هر خوشه با توجه به ویژگی‌هایی که دارند به یکدیگر بسیار شبیه هستند و همچنین میزان شباهت بین خوشه‌ها کمترین مقدار است. در چنین حالتی هدف از خوشه‌بندی، نسبت دادن برچسب‌هایی به فیلم‌ها است که نشان‌دهنده عضویت هر فیلم به خوشه است.مهمترین ویژگی‌هایی که برای خوشه‌سازی فیلم‌ها مورد استفاده قرار گرفت به شرح زیر است: ژانر و دسته بندی، سال ساخت، نوع محتوا (سریال یا فیلم)، گروه سنی، کارگردان‌(ها)، ایرانی یا خارجی، بازیگران. این ویژگی‌ها هر کدام با توجه به نتایج ارزیابی‌ها، وزن‌های متفاوتی دارند و در ضمن تعدادی از این ویژگی‌ها در مرحله بعد از خوشه‌بندی، برای رتبه‌بندی دوباره هر فیلم نیز مورد استفاده قرار می‌گیرد.الگوریتم‌های زیادی را برای تست و ارزیابی خوشه‌بندی مورد بررسی قرار دادیم که در زیر اسامی آنها را آورده‌ایم. در نهایت با توجه به نتایج خوشه‌ها از الگوریتم   Hierarchical clustering که بهترین نتیجه را داشت استفاده کردیم. البته باید توجه داشت تعداد حالت‌ها برای همه الگوریتم‌های خوشه‌بندی و به دست آوردن بهترین پارامترهای آن‌ها بسیار زیاد بود و ما با محدود کردن آن‌ها به این نتیجه رسیدیم.الگوریتم K meansالگوریتم DBSCANالگوریتم GMMالگوریتم  Hierarchical clustering شکل 4. شمایی از سه الگوریتم خوشه بندی K means ،GMM و Hierarchical clusteringبه علاوه برای نمایش خوشه‌ها  از ابزار Gephi که یکی از بهترین ابزارها در این حوزه است، استفاده کردیم.شکل 5. خوشه بندی همه فیلمهای فیلیمو با استفاده از ابزار Gephi. این گراف دارای  دو نوع  گره هست، گره هایی که شماره خوشه را تعیین میکنند و گره هایی که شماره فیلمها را مشخص میکنند.مدل‌های پالایش گروهیاین مدل‌ها فقط بر اساس تاریخچه تماشای کاربران ساخته و به روز رسانی می‌شود و محتوای فیلم‌ها تاثیری بر روی آن‌ها ندارد. در این سیستم ما از مدل‌های word2vec و (Global Vectors(GloVe به عنوان مدل‌های پالایش گروهی استفاده کردیم.شکل 6. مقایسه پالایش مبتنی بر محتوا و پالایش گروهیمدل‌های word2vec و  GloVeامروزه یکی از مرسوم‌ترین و رایج‌ترین روش‌ها در زمینه پردازش زبان طبیعی، محاسبه و نشان دادن هر کلمه توسط یک بردار است. در میان این روش‌ها،  skip-gram با نمونه‌های منفی ( skip-gram with negative sampling) یکی از روش‌های شناخته شده است . می‌توان نشان داد که سیستم‌های پیشنهاد دهنده آیتم به آیتم مبتنی بر پالایش گروهی را نیز می‌توان با استفاده از روش‌های موجود در پردازش زبان طبیعی مانند skip-gram مدل‌سازی نمود. بنابراین همانند محاسبه بردار برای نمایش کلمات در فضای برداری می‌توان برای هر آیتم نیز برداری منحصر به فرد را محاسبه نمود. برای این منظور تنها لازم است لیست تعامل کاربر با آیتم‌های مختلف را همانند یک جمله فرض کرد. به عنوان مثال یک کاربر فیلیمو که علاقه ی زیادی به فیلم‌های کمدی-ایرانی دارد احتمالا تعداد زیادی از این نوع فیلم را مشاهده نموده است. بنابراین به احتمال زیاد، در لیست فیلم‌های مشاهده شده توسط این کاربر، فیلم‌های کمدی-ایرانی زیادی در کنار یکدیگر قرار گرفته اند. روش‌هایی مانند skip-gram در پردازش زبان طبیعی نیز بر پایه‌ی چنین فرضی عمل می‌کنند، یعنی کلمات نزدیک به هم موجود در یک جمله به احتمال زیاد دارای شباهت زیادی از لحاظ معنایی با یکدیگر می‌باشند. به همین ترتیب لیست فیلم‌های دیده شده توسط هر کاربر می‌تواند دارای فیلم‌هایی باشد که شباهت زیادی از لحاظ ژانر، بازیگر، کارگردان و عوامل دیگر (به نوعی شباهت معنایی) با یکدیگر دارند. از این رو می توان لیست فیلم‌های مشاهده شده توسط تمامی کاربران را همانند جملاتی در نظر گرفت و با کنار هم قراردادن این لیست‌ها ( جملات‌)‌ در کنار یکدیگر مجموعه داده‌ای ( متن ) را فراهم نمود. در این مجموعه داده هر فیلم همانند یک کلمه در نظر گرفته می‌شود که می‌توان با استفاده از روش‌هایی مانند skip-gram و word2vec برای نمایش هر یک، برداری را محاسبه نمود. پس از محاسبه بردار متناظر با هر فیلم، برای یافتن فیلم مشابه با یک فیلم دیگر، تنها لازم است نزدیک‌ترین همسایه‌های برداری آن فیلم را محاسبه نمود.نتایج به دست آمده از این مدل بسیار قابل قبول می باشد اما مشکلاتی نیز دارد.  به عنوان  مثال، هنگام ترند شدن برخی فیلم‌ها در فیلیمو، تعداد زیادی از کاربران که دارای سلایق مختلف می باشند فیلم‌های مشابهی را مشاهده می‌کنند که همین امر باعث می شود فیلم‌های مختلفی که بعضا هیچ گونه شباهتی با یکدیگر ندارند در کنار یکدیگر قرار بگیرند و باعث کاهش کیفیت مدل شوند. یکی دیگر از مشکلات این روش، شروع سرد برای آیتم‌های جدید یا بسیار کم بازدید می‌باشد. در واقع به دلیل کمبود تعامل کاربران با این دسته از آیتم‌ها، فراوانی آن‌ها در داده‌های آموزشی بسیار کم است و از این رو مدل‌سازی آن‌ها در فضای برداری به درستی انجام نمی‌شود. این مشکل در پردازش زبان طبیعی نیز برای کلمات بسیار کم کاربرد  وجود دارد.مدل GloVe نیز مانند مدل word2vec سعی بر آن دارد تا بتواند برای هر کلمه (آیتم) برداری را محاسبه نماید. اما برخلاف مدل word2vec که از یک شبکه feed forward برای این منظور استفاده می‌کند، مدل GloVe مبتنی بر روش‌های matrix factorization می‌باشد. برای این منظور ابتدا یک ماتریس n * n که در آن n تعداد کلمات (آیتم) می‌باشد و n_ij نشان دهنده ی تعداد دفعات تکرار دو کلمه i , j با یکدیگر در یک متن می‌باشد، ساخته می‌شود. سپس با استفاده از روش‌های matrix factorization این ماتریس به یک ماتریس با ابعاد کوچکتر مانند n * t تبدیل می‌شود. t نشان‌دهنده‌ی تعداد ویژگی‌هایی است که برای هر کلمه در نظر گرفته‌ایم که در طی فرایند factorization محاسبه می‌شوند. در مدل word2vec، تعداد دفعات تکرار دو کلمه با یکدیگر در متون مختلف، تنها به عنوان داده آموزشی بیشتر در نظر گرفته می‌شود اما در مدل GloVe دفعات تکرار هر دو کلمه با یکدیگر، نقش بیشتری در فرایند آموزش دارد. باید توجه داشت که یکی از معایب بزرگ این مدل استفاده بسیار زیاد از حافظه سیستم به دلیل ساختن ماتریس مورد نظر می باشد. اما از طرفی نسبت به مدل word2vec هزینه محاسباتی کمتری دارد. به همین دلیل از GloVe در فرایند پیشنهاد فیلم به فیلم فیلیمو استفاده شده است چون به روزرسانی سریع مدل پیشنهاد دهنده در بازه های زمانی کوچکتر، اهمیت بسیار بالایی دارد.برای به دست آوردن اندازه شباهت در فضای برداری حاصل شده دو روش مرسوم شباهت سینوسی (Cosine Similarity) و ضرب نقطه ای (Dot Product) وجود دارد که ما از روش ضرب نقطه ای در اکثر مدل‌ها استفاده کردیم.شکل 7. شمایی از فضای برداری فیلمهامدل‌های ترکیبی (hybrid matrix factorization)این مدل‌ها هم از ویژگی‌های فیلم‌ها و هم از تعاملات کاربران استفاده می‌کند. هر کدام از روش‌های مبتنی بر محتوا و پالایش گروهی به تنهایی مشکلاتی دارند، اما مدل‌های ترکیبی سعی دارند این مشکلات را مرتفع  کنند.برای رفع مشکلات بیان شده در مدل word2vec، می توان از روشی ترکیبی، متشکل از مدل‌های پالایش گروهی و مبتنی بر محتوا استفاده نمود. با ترکیب این دو روش، علاوه بر مدل سازی فیلم‌ها و کاربران در فضای برداری، می توان اطلاعات جانبی کاربران و فیلم‌ها را نیز مدل‌سازی نمود. به عنوان مثال، می‌توان برای هر یک از ژانرها، بازیگران و کارگردان‌ها نیز یک بردار منحصر به فرد محاسبه کرد. بنابراین برای هر کاربر و آیتم یک ترکیب خطی از بردارهای ویژگی آن‌ها در نظر گرفته می‌شود. برای مثال، فیلم فروشنده را می‌توان با ویژگی‌های زیر تعریف نمود: اصغر فرهادی، شهاب حسینی، ترانه علیدوستی و سایر عوامل فیلم، سپس بردار مربوط به این فیلم را با جمع برداری هریک از این ویژگی‌ها محاسبه نمود. با استفاده از این روش می‌توان مشکلاتی مانند «شروع سرد» را تا حد بسیار زیادی حل نمود. به عنوان مثال، می‌توان تنها با ترکیب برخی از ویژگی‌های یک آیتم جدید، برداری جهت نمایش آن آیتم محاسبه نمود و با جستجو در فضای برداری برای سایر آیتم‌ها آیتم مشابه با آیتم جدید را پیدا کرد. در این روش به دلیل اضافه شدن حجم زیادی از اطلاعات جانبی برای آیتم‌ها و کاربران، استفاده از روش‌هایی مانند (Alternative Least Square (ALS و سایر روش‌های مبتنی بر matrix factorization به دلیل نداشتن قابلیت مقیاس‌پذیری امکان پذیر نمی‌باشد. برای آموزش این مدل می‌توان از روش‌هایی مبتنی بر یادگیری رتبه‌بندی مانند BPR و یا WARP استفاده نمود. مزیت اصلی این مدل استفاده از داده‌های تعاملی و ویژگی‌های آیتم‌ها و کاربران به صورت همزمان می‌باشد.در این سیستم برای این روش کتابخانه‌ها و ابزارهای مختلفی را مورد ارزیابی قرار دادیم و در نهایت از LightFM که یکی از معروفترین و پرکاربردترین آن‌ها بود و نتایج بهتری داشت، استفاده کردیم.علاوه بر مدل‌های توضیح داده شده مدل‌هایی بر اساس کاوش الگوهای متناوب (Frequent Pattern Discovery) را بررسی و ارزیابی کردیم اما به دلیل نتایج نامطلوب اولیه آنها را کنار گذاشتیم.ترکیب مدل‌هانیاز شدید به سیستم‌های پیشنهاد دهنده، باعث شده مدل‌ها و روش‌های زیادی برای آن‌ها ارائه شوند. تحقیق در مورد بهترین روشی که هم با دادگان ما منطبق باشد و هم دقت بالایی داشته باشد، نیازمند مطالعه و ارزیابی بسیاری بود. یکی از بهترین منابع ما برای ایده گرفتن کنفرانس RecSys  بوده است. این کنفرانس مخصوص سیستم‌های پیشنهاد دهنده است و سالانه مقالات بسیار خوبی در آن ارائه می‌شود. ما با بهره گرفتن از این کنفرانس و منابع دیگر، مدل‌هایی را برای سیستم‌های پیشنهاد دهنده فیلیمو تست و ارزیابی کردیم .ما برای داشتن نتایج مطلوب، نیاز به مدل‌های متنوع و ترکیب آن‌ها در شرایط مختلف داریم. انتخاب بهترین مدل‌ها و اولویت آن‌ها برای سیستم پیشنهاد دهنده فیلم به فیلم، در شرایط مختلف بستگی به زمان انتشار فیلم و تعامل کاربران با آن فیلم دارد. از مدل‌های مبتنی بر محتوا برای فیلم‌هایی که اخیرا منتشر می‌شوند، استفاده می‌شود. مدل‌های مبتنی بر تعامل کاربران نیز زمانی که تعامل کاربران به حد مطلوب بعد از انتشار فیلم برسد، اضافه می‌شود. ترکیب این مدلها بر اساس نتایج ارزیابی مدل‌ها بدین صورت است که مدل‌هایی که بر اساس ارزیابی نتیجه بهتری دارند در اولویت بالاتری برای نمایش قرار می‌گیرند.ارزیابیبرای ارزیابی سیستم‌های پیشنهاد دهنده به طور کلی دو نوع ارزیابی آفلاین و آنلاین وجود دارد.برای ارزیابی آفلاین از معیارهای مختلفی استفاده می‌شود که ما از یکی از معروفترین معیارها  یعنی  normalized Discounted Cumulative Gain استفاده کرده‌ایم.  nDCG معیاری است که به کمک آن می‌توان میزان کیفیت یک رتبه بندی را بررسی نمود. از این معیار معمولا در بررسی میزان کیفیت نتایج الگوریتم‌های جستجو استفاده می‌شود. در واقع این معیار میزان مرتبط بودن خروجی‌ها را اندازه می‌گیرد. ما با استفاده از این معیار مدل‌ها را به این صورت ارزیابی می‌کنیم که ابتدا هر مدل برای مثال 10 فیلم پیشنهادی برای یک کاربر را ارائه می‌دهد و ما با استفاده از تاریخچه تماشای فیلم‌هایی که کاربر دیده، طبق این معیار مقایسه می‌کنیم. در این مقایسه میزان نزدیکی فیلم‌های پیشنهادی به فیلم‌هایی که کاربر دیده است محاسبه می‌شود و در نهایت  هر مدلی که nDCG بالاتری داشته باشد اولویت بالاتری می‌گیرد.به طور کلی یکی از چالش‌های مهم ما ارزیابی این سیستم و مقایسه آن با سیستم قبلی (سیستمی که به صورت outsource مورد استفاده قرار می‌گرفت) بود. نسخه اول سیستم ما در مقایسه اولیه دو برابر نرخ کلیک بیشتری نسبت به سیستم قبلی داشت و در ادامه این نرخ، بهبود چشمگیری داشت. معیارها و شاخص‌های دیگری هم برای ارزیابی و مخصوصا ارزیابی آنلاین وجود داشت که به علت آماده نبودن زیرساخت لازم فعلا از ارزیابی آن‌ها صرف نظر کردیم.معماری سیستمشمای کلی نسخه اول سیستم پیشنهاد دهنده فیلم به فیلم فیلیمو در تصویر زیر مشاهده می‌کنید.شکل 8. معماری سیستم فیلم به فیلم فیلیمودر این سیستم همانطور که مشاهده می‌کنید مدل ها از پایگاه داده‌های مختلف، اطلاعات فیلم‌ها و تعامل کاربران را دریافت می‌کنند و نتایج هر کدام از مدل‌ها، متناسب با وزن و اولویتی که دارند ترکیب و ذخیره می‌شوند. تقریبا همه قسمت‌ها به غیر از سرویس‌های  Artificial Stupidity و Combined به طور مختصر توضیح داده شدند.سرویس Artificial Stupidityاین سرویس به منظور پر کردن خلاء زمانی مدل‌های هوش مصنوعی ایجاد شده و در حدود سه دقیقه می‌تواند به ازای هر فیلم، بهترین ۱۰۰ فیلم پیشنهادی را تولید و ذخیره کند. در حالی که مدل‌های هوش مصنوعی چند ساعت تا چند روز زمان نیاز دارند تا پیشنهادات را بر اساس اطلاعات تماشای کاربران تولید کنند، این سرویس برای فیلم‌های تازه منتشر شده نتایج اولیه را تولید می کند. در این سرویس، شباهت فیلم‌ها به صورت منطقی با مقایسه میانگین وزنی اطلاعات فیلم‌ها محاسبه می‌شود. داده‌هایی که تا این لحظه استفاده شده به ترتیب اهمیت شامل موارد زیر است:سال ساخت، ژانر و دسته بندی فیلم، تعداد بازیگران مشترک، کارگردان، کشورهای سازنده فیلم، شباهت نوع رسانه (فیلم/سریال)، رده سنی، تعداد تگ‌های مشترک IMDB و TMDB، تهیه کننده و یکسان‌بودن کیفیت پخشسرویس Combinedاین سرویس، در بازه‌های زمانی مشخص، امتیازی که هر مدل به هر پیشنهاد برای هر فیلم داده را به صورت میانگین وزنی با احتساب ضریب در نظر گرفته شده برای هر مدل محاسبه می‌کند و در پایگاه داده نگهداری می‌کند.در پست بعدی معماری کلی سیستم‌های پیشنهاددهنده ارائه خواهد شد.در ضمن برای ساختن مدل‌ها از زبان برنامه‌نویسی پایتون و برای API ها از زبان برنامه‌نویسی GO استفاده شده است.ابزارهای بررسی شدهابزارهای متعددی برای راه‌اندازی سیستم پیشنهاد دهنده وجود دارند که از جامعیت و انطباق پذیری‌های متفاوتی برخوردارند. یکی از این ابزارها Apache Prediction IO است که در اوایل کار مورد بررسی قرار دادیم. PIO یک مجموعه ابزار متن باز یادگیری ماشین است که دارای موتورهای متفاوتی است که  هر موتور، پیاده سازی یکی از الگوریتم‌های یادگیری ماشین است و معماری آن به شکل زیر است:شکل 9. شمایی از معماری PIOهمانطور که در تصویر می‌توان دید، تعامل کاربر با سیستم به صورت بلادرنگ انجام می‌شود؛ به این صورت که رخداد های سمت کاربر (شامل تماشا، لایک) به بخش EventServer سیستم ارسال شده و در HBase ذخیره می‌شوند. سپس در بازه‌های زمانی معین، بخش Training سیستم به صورت آفلاین، مدل ها را که بر اساس SparkML نوشته شده، روی داده‌های جمع آوری شده اجرا می‌کند و نتیجه را در HDFS یا Elasticsearch ذخیره می‌کند و کاربر بدون وقفه می‌تواند خروجی سیستم را مشاهده کند.از میان موتور های مختلف ما موارد زیر را امتحان کردیم:موتور Predictionio-template-recommenderموتور Predictionio-template-similar-productموتور Template-scala-parallel-viewed then boughtموتور Template-scala-parallel-svd-item-similarityبرای مثال ما موتور Predictionio-template-recommender را بررسی کردیم که یک موتور عمومی پیشنهاد دهنده است.  با تغییر کد آن، قابلیت پیشنهاد فیلم به کاربر، فیلم بر اساس فیلم و کاربر بر اساس فیلم افزوده شد. این مدل بر اساس امتیاز هر کاربر به هر محصول، محصولات دیگری را به کاربر پیشنهاد می‌دهد. در morpheus امتیاز ها بر اساس رخداد های مختلفی که کاربر می‌تواند انجام دهد محاسبه می‌شود.استفاده از از راهکارهای آماده و سریع در اولویت کار ما قرار داشت اما به دلایل زیر PIO را کنار گذاشتیم:نتایج اولیه نامطلوب در مقایسه با نتایج اولیه مدل‌هایی مانند word2vecلزوم تغییرات اساسی در موتورهای موجود و توسعه دشوار آنها برای کاربری خاص فیلیمودر نتیجه به دنبال راهکارهای بنیادی برای سیستم پیشنهاد دهنده فیلیمو رفتیم و مدلهای مختلف سیستمهای پیشنهاد دهنده را بررسی، انتخاب و ترکیب کردیم.جمع‌بندیدر این پست، سیستم فیلم به فیلم فیلیمو را بررسی کردیم. این سیستم به هر فیلم، فیلمهای پیشنهادی را بر اساس محتوا و تعامل کاربران نمایش می‌دهد. به علاوه چالش‌ها، مدل‌ها، نحوه ارزیابی و نحوه کارکرد سیستم را به طور مختصر بیان کردیم. این سیستم نسخه اول سیستم پیشنهاد دهنده فیلم به فیلم فیلیمو است و قصد داریم با افزودن مدل‌های دیگر و بهبود مدل‌های فعلی،  پیشنهادات بهتری ارائه دهیم. در ادامه و در پست بعدی سیستم شخصی سازی شده فیلیمو را تشریح خواهیم کرد و نحوه ساخت صفحات شخصی سازی شده و الگوریتم خودرمزگذاری شده (Autoencoder) که الگوریتم اصلی ساخت امتیازات کاربران به همه فیلم‌ها هست را توضیح خواهیم داد.منابعhttps://towardsdatascience.com/recommendation-systems-in-the-real-world-51e3948772f3https://developers.google.com/machine-learning/recommendation/https://netflixtechblog.com/netflix-recommendations-beyond-the-5-stars-part-1-55838468f429https://netflixtechblog.com/netflix-recommendations-beyond-the-5-stars-part-2-d9b96aa399f5https://www.analyticsvidhya.com/blog/2019/07/how-to-build-recommendation-system-word2vec-python/</description><category>امیر واهب</category><author>امیر واهب</author><pubDate>Wed, 22 Apr 2020 17:50:10 +0430</pubDate></item></channel></rss>