ویرگول
ورودثبت نام
مسترباگ
مسترباگسماع قلمی حول برنامه‌نویسی، امنیت و دنیای آنالوگ https://mrbug.ir
مسترباگ
مسترباگ
خواندن ۱۲ دقیقه·۳ ماه پیش

الگوریتم X متن‌باز شد

ریپوی الگوریتم X رو clone کردم، یه Agent انداختم تو کل سورس که فایل‌به‌فایل بگرده و بفهمه واقعاً For You چطوری کار می‌کنه.نتیجه‌اش خیلی جالب‌تر از چیزی بود که فکر می‌کردم؛ مخصوصاً وزن Reply، Share، Follow، Report و اینکه اصلاً یک پست چطور وارد For You می‌شه.چیزهایی که پیدا کردم 👇


الگوریتم X اصلاً دنبال چیست؟

اولین نکته مهم این است:

X لزوماً دنبال پیدا کردن «بهترین پست دنیا» نیست.

بلکه می‌خواهد بفهمد:

بهترین پست برای همین کاربر مشخص، در همین لحظه چیست؟

یعنی ممکن است یک پست برای شما بسیار جذاب باشد و برای کاربر دیگری تقریباً هیچ ارزشی نداشته باشد.

در نتیجه، X بیشتر از اینکه به یک پست یک امتیاز ثابت بدهد، سعی می‌کند رفتار احتمالی هر کاربر را نسبت به آن پست پیش‌بینی کند.

مثلاً:

  • احتمال اینکه Like کنید چقدر است؟

  • احتمال Reply چقدر است؟

  • ممکن است پست را Repost کنید؟

  • آن را برای کسی بفرستید؟

  • روی لینک کلیک کنید؟

  • نویسنده را Follow کنید؟

  • یا برعکس، ممکن است Report یا Block کنید؟

پس قلب الگوریتم جدید، پیش‌بینی رفتار کاربر است.


یک پست چطور وارد For You می‌شود؟

سیستم در چند مرحله کار می‌کند.

به زبان ساده:

کاربر ↓ بررسی رفتارها و علایق قبلی ↓ پیدا کردن تعداد زیادی پست کاندید ↓ حذف پست‌های نامناسب ↓ پیش‌بینی واکنش کاربر به هر پست ↓ امتیازدهی ↓ اعمال تنوع و محدودیت‌ها ↓ Visibility Filtering ↓ نمایش در For You

یعنی الگوریتم اول تعداد زیادی پست پیدا می‌کند و بعد وارد مرحله انتخاب می‌شود.

به این مرحله اول Candidate Generation می‌گویند؛ یعنی «پیدا کردن پست‌های کاندید برای نمایش».

این کاندیدها از دو منبع اصلی می‌آیند.

یکی از حساب‌هایی که Follow کرده‌اید و دیگری از حساب‌هایی که اصلاً Follow نکرده‌اید.


Thunder چیست؟

یکی از اصطلاحات مخصوص خود X در کد، Thunder است.

Thunder بخشی از سیستم است که به پیدا کردن محتوای افرادی کمک می‌کند که کاربر آن‌ها را Follow کرده است.

یعنی به‌طور ساده:

Thunder = منبع محتوای داخل شبکه شما

اگر ۵۰۰ نفر را Follow کرده باشید، Thunder کمک می‌کند از میان محتوای آن‌ها پست‌های مناسب وارد مرحله رتبه‌بندی شوند.

اما بخش جذاب‌تر For You جایی است که X باید محتوایی پیدا کند که از نویسنده‌اش هیچ شناخت مستقیمی ندارید.

اینجاست که سیستم‌های دیگری وارد بازی می‌شوند.


Phoenix؛ مغز اصلی پیشنهاد محتوا

یکی از مهم‌ترین نام‌هایی که در سورس X زیاد دیده می‌شود Phoenix است.

Phoenix را می‌توان موتور هوش مصنوعی اصلی سیستم پیشنهاد محتوای X دانست.

این سیستم هم در پیدا کردن محتوا و هم در رتبه‌بندی آن نقش دارد.

Phoenix سعی می‌کند بفهمد:

با توجه به رفتارهای قبلی این کاربر، احتمالاً از چه محتوایی خوشش خواهد آمد؟

برای این کار، تاریخچه تعامل شما بررسی می‌شود.

مثلاً اینکه:

  • چه موضوعاتی را Like کرده‌اید

  • با چه افرادی Reply داشته‌اید

  • چه پست‌هایی را مدت بیشتری دیده‌اید

  • چه چیزهایی را Share کرده‌اید

  • چه حساب‌هایی را Follow کرده‌اید

از این اطلاعات یک تصویر عددی از علایق شما ساخته می‌شود.

به این نمایش عددی در یادگیری ماشین Embedding می‌گویند؛ یعنی تبدیل کاربر یا محتوا به مجموعه‌ای از اعداد که شباهت‌ها و روابط را برای مدل قابل محاسبه می‌کند.

Phoenix سپس Embedding کاربر را با Embedding پست‌ها مقایسه می‌کند.

به زبان خیلی ساده:

این پست چقدر به چیزهایی که معمولاً این کاربر دوست دارد نزدیک است؟


Two-Tower چیست؟

در بخش Retrieval مربوط به Phoenix از ساختاری به نام Two-Tower استفاده شده است.

Two-Tower یک معماری رایج در سیستم‌های پیشنهاد محتواست.

یک سمت مدل، کاربر را به یک بردار عددی تبدیل می‌کند و سمت دیگر، محتوا را.

بعد فاصله این دو بررسی می‌شود.

مثلاً:

User Embedding ↓ فاصله / شباهت ↑ Post Embedding

اگر دو بردار به هم نزدیک باشند، سیستم احتمال می‌دهد آن محتوا برای آن کاربر مناسب باشد.

این همان چیزی است که باعث می‌شود X بتواند پستی از یک حساب کاملاً ناشناس را وارد For You شما کند.


SimClusters؛ پیدا کردن «قبیله» شما در X

یکی دیگر از اصطلاحات جالب X، SimClusters است.

ایده آن تقریباً این است:

آدم‌هایی که با محتوای مشابه تعامل دارند، احتمالاً علایق مشترکی دارند.

برای مثال فرض کنیم تعداد زیادی کاربر دائماً با این موضوعات تعامل دارند:

Python Linux Docker AI Backend

سیستم می‌تواند از روی این رفتارها یک خوشه یا Cluster ایجاد کند.

اگر شما هم رفتاری مشابه این کاربران داشته باشید، احتمال بیشتری وجود دارد که محتوای محبوب آن خوشه وارد For You شما شود.

به همین دلیل For You فقط بر اساس کسانی که Follow کرده‌اید ساخته نمی‌شود.

در واقع X دائماً سعی می‌کند بفهمد شما به کدام «جامعه‌های موضوعی» نزدیک هستید.

این مسئله یک نتیجه مهم برای تولیدکنندگان محتوا دارد:

ثبات موضوعی احتمالاً به الگوریتم کمک می‌کند مخاطب مناسب شما را بهتر پیدا کند.

مثلاً اگر یک حساب عمدتاً درباره برنامه‌نویسی، DevOps و هوش مصنوعی محتوا منتشر کند، سیستم راحت‌تر می‌تواند بفهمد باید این محتوا را به چه نوع کاربری نشان دهد.


مرحله Ranking؛ جایی که بازی اصلی شروع می‌شود

بعد از اینکه صدها یا هزاران پست کاندید پیدا شدند، X باید آن‌ها را مرتب کند.

اینجا Phoenix Ranking وارد می‌شود.

Phoenix برای هر پست چندین احتمال مختلف محاسبه می‌کند.

مثلاً:

P(Like) P(Reply) P(Repost) P(Share) P(Follow) P(Block) P(Report)

P یعنی Probability یا احتمال.

مثلاً:

P(Reply) = 0.18

یعنی مدل حدس می‌زند احتمال اینکه این کاربر به این پست Reply کند حدود ۱۸ درصد است.

بعد برای هر کدام از این رفتارها یک Weight یا وزن در نظر گرفته می‌شود.

به شکل مفهومی:

Score = P(Like) × LikeWeight + P(Reply) × ReplyWeight + P(Share) × ShareWeight - P(Report) × ReportWeight ...

و در نهایت یک امتیاز ساخته می‌شود.


همه Engagementها ارزش یکسان ندارند

یکی از جذاب‌ترین چیزهایی که از پارامترهای منتشرشده مشخص شده این است که X برای رفتارهای مختلف ارزش یکسانی قائل نیست.

مثلاً در تنظیمات منتشرشده، وزن‌هایی شبیه این دیده می‌شود:

رفتاروزنLike+0.5Reply+5Repost+1Share+2ارسال در DM+5Copy Link+20Quote+5Follow Author+4Click+0.4Open Link+0.2

اما در سمت منفی:

رفتار منفیوزنNot Interested-43.2Block-31.2Mute-58.8Report-234

در نگاه اول ممکن است وسوسه شوید نتیجه بگیرید:

پس یک Reply دقیقاً معادل ۱۰ Like است.

اما این برداشت درست نیست.

چون وزن‌ها در تعداد واقعی Like یا Reply ضرب نمی‌شوند.

بلکه روی احتمال پیش‌بینی‌شده رفتار یک کاربر مشخص اعمال می‌شوند.

پس الگوریتم چیزی شبیه این را محاسبه می‌کند:

احتمال Like × 0.5 + احتمال Reply × 5 + احتمال Follow × 4 - احتمال Report × 234

نه اینکه تعداد Likeهای واقعی را بشمارد و با تعداد Report مقایسه کند.


چرا Copy Link وزن بالایی دارد؟

یکی از عجیب‌ترین اعداد، وزن بالای Copy Link است.

از دید محصول، این مسئله اتفاقاً منطقی است.

Like رفتار بسیار کم‌هزینه‌ای است.

کاربر یک دکمه را لمس می‌کند و تمام.

اما وقتی کسی لینک یک پست را Copy می‌کند، احتمالاً یکی از این اتفاق‌ها افتاده:

  • می‌خواهد آن را برای فرد دیگری بفرستد

  • می‌خواهد بعداً نگه دارد

  • محتوا آن‌قدر ارزشمند بوده که قصد دارد آن را خارج از X به اشتراک بگذارد

در نتیجه Share شدن محتوا می‌تواند نشانه قوی‌تری از ارزش واقعی آن باشد.

برای تولیدکننده محتوا یک نتیجه عملی داریم:

محتوایی که کاربر بخواهد برای دیگری بفرستد، ممکن است برای الگوریتم ارزش بسیار بیشتری از محتوایی داشته باشد که فقط یک Like سریع می‌گیرد.


Reply فقط برای بحث نیست

Reply نیز در سیستم اهمیت بالایی دارد.

این یعنی محتوایی که گفتگو ایجاد می‌کند می‌تواند Signal قوی‌تری برای سیستم بسازد.

مثلاً این جمله:

JavaScript زبان محبوبی است.

احتمالاً گفتگوی زیادی ایجاد نمی‌کند.

اما:

اگر امروز از صفر شروع می‌کردید، برای Backend سراغ Node.js می‌رفتید یا Django؟

احتمال Reply بیشتری دارد.

البته این به معنی استفاده از Clickbait یا ایجاد دعوای مصنوعی نیست.

چون الگوریتم سمت منفی ماجرا را نیز نگاه می‌کند.


Rage Bait ممکن است نتیجه معکوس بدهد

بعضی تولیدکنندگان محتوا سال‌ها از چیزی استفاده کرده‌اند که به آن Rage Bait می‌گویند؛ یعنی محتوایی که عمداً کاربر را عصبانی می‌کند تا Reply و Quote بیشتری بگیرد.

مثلاً یک ادعای شدید و بحث‌برانگیز مطرح می‌شود تا مردم برای مخالفت وارد گفتگو شوند.

اما ساختار فعلی الگوریتم یک مشکل بزرگ برای این روش دارد.

درست است که ممکن است:

Reply ↑ Quote ↑

اما در همان زمان:

Mute ↑ Block ↑ Not Interested ↑ Report ↑

هم بالا بروند.

و سیگنال‌های منفی وزن بسیار بالایی دارند.

پس X فقط دنبال Engagement نیست.

چیزی که از معماری سیستم برداشت می‌شود بیشتر شبیه این است:

Engagement با رضایت کاربر


Follow بعد از دیدن یک پست، یک Signal مهم است

یکی از رفتارهایی که Phoenix پیش‌بینی می‌کند:

Follow Author

است.

یعنی مدل بررسی می‌کند:

احتمال دارد کاربر پس از دیدن این پست، نویسنده را Follow کند؟

این Signal از نظر محصول بسیار منطقی است.

اگر یک پست باعث شود کاربر تصمیم بگیرد:

این آدم ارزش دنبال کردن دارد.

احتمالاً آن محتوا واقعاً برایش مفید بوده است.

بنابراین برای یک حساب تخصصی، صرفاً گرفتن Like کافی نیست.

بهتر است محتوا طوری باشد که کاربر بعد از خواندنش به این نتیجه برسد:

من محتوای بیشتری از این شخص می‌خواهم.


Dwell Time؛ کاربر واقعاً روی پست ماند یا رد شد؟

یکی دیگر از Signalها به مدت توجه کاربر مربوط می‌شود.

در سیستم اصطلاح‌هایی مثل:

  • Dwell

  • Dwell Time

  • Active Seconds

  • Click Dwell

  • Video Quality View

وجود دارد.

Dwell Time یعنی مدت زمانی که کاربر روی یک محتوا توقف می‌کند.

مثلاً تصور کنید دو پست دارید.

کاربر پست اول را در ۰.۳ ثانیه رد می‌کند.

اما روی پست دوم ۲۰ ثانیه می‌ماند و آن را می‌خواند.

حتی اگر هیچ Likeای ثبت نکند، رفتار دوم احتمالاً اطلاعات مفیدی برای مدل دارد.

به همین دلیل محتوای قابل خواندن، Threadهای مفید، نمودارها، تصاویر اطلاعاتی و ویدیوهای خوب می‌توانند از نظر Attention Signal ارزشمند باشند.


AgeFilter؛ عمر یک پست هم مهم است

یکی از فیلترهای موجود در pipeline سیستم، AgeFilter است.

AgeFilter همان‌طور که از اسمش مشخص است، سن پست را بررسی می‌کند.

در پیکربندی منتشرشده، در یکی از مسیرهای For You پست‌های قدیمی‌تر از حدود ۴۸ ساعت از Candidateها حذف می‌شوند.

این یعنی برای بخش مهمی از توزیع الگوریتمی، محتوای تازه اهمیت زیادی دارد.

البته این موضوع به معنی این نیست که یک پست بعد از ۴۸ ساعت دیگر قابل مشاهده نیست.

بلکه آن پست ممکن است در بعضی مسیرهای Recommendation دیگر به عنوان Candidate در نظر گرفته نشود.

از نظر عملی:

عملکرد اولیه پست اهمیت زیادی دارد.


Author Diversity؛ چرا X ده پست پشت سر هم از یک نفر نشان نمی‌دهد؟

یکی دیگر از بخش‌های جالب سیستم، Author Diversity است.

هدف آن حفظ تنوع نویسندگان Feed است.

فرض کنید الگوریتم تشخیص دهد ۵ پست شما برای یک کاربر بسیار جذاب هستند.

بدون محدودیت، ممکن بود For You او این‌طور شود:

پست شما پست شما پست شما پست شما پست شما

طبیعتاً تجربه کاربری خوبی نیست.

برای همین X امتیاز پست‌های متوالی از یک نویسنده را کاهش می‌دهد.

در کد پارامتری مانند:

AuthorDiversityDecay

وجود دارد.

Decay یعنی کاهش تدریجی.

پس حتی اگر یک حساب بسیار خوب باشد، سیستم سعی می‌کند Feed را به یک نفر تحویل ندهد.

این موضوع نشان می‌دهد انتشار تعداد بسیار زیادی پست در مدت کوتاه، الزاماً به معنی تصاحب For You نیست.


OON چیست؟

یکی از اصطلاح‌هایی که در سیستم X زیاد دیده می‌شود OON است.

OON مخفف:

Out Of Network

است.

یعنی محتوایی که از حساب‌هایی می‌آید که شما Follow نکرده‌اید.

در مقابل آن، محتوای کسانی که Follow کرده‌اید داخل Network قرار می‌گیرد.

در بعضی مراحل الگوریتم، برای OON یک Weight Factor جداگانه وجود دارد.

اما نکته جالب این است که بخش بسیار بزرگی از For You اساساً برای پیدا کردن همین محتوای Out Of Network ساخته شده است.

این همان چیزی است که امکان Viral شدن یک حساب کوچک را فراهم می‌کند.

شما لزوماً به ۱۰۰ هزار Follower نیاز ندارید تا یک پستتان به ۱۰۰ هزار نفر برسد.

اگر سیستم تشخیص دهد پست شما برای یک Cluster خاص از کاربران جذاب است، می‌تواند آن را به کاربران خارج از شبکه شما پیشنهاد کند.


user-cred-v2؛ فقط تعداد Follower مهم نیست

یکی دیگر از اجزای جالب سورس، سیستمی با نام:

user-cred-v2

است.

این بخش به نوعی به اعتبار شبکه‌ای حساب‌ها مربوط می‌شود.

در آن از ساختارهایی شبیه PageRank استفاده شده است.

PageRank همان ایده معروفی است که گوگل در سال‌های ابتدایی برای سنجش اهمیت صفحات وب استفاده می‌کرد.

ایده ساده‌اش این است:

همه لینک‌ها ارزش یکسان ندارند؛ مهم است چه کسی به شما لینک داده است.

در شبکه اجتماعی هم می‌توان منطق مشابهی داشت:

فقط تعداد Follower مهم نیست؛ مهم است چه حساب‌هایی با شما ارتباط و تعامل دارند.

در نتیجه ۱۰ هزار Follower بی‌کیفیت الزاماً از هزار Follower واقعی و مرتبط ارزشمندتر نیستند.


Ranking و Visibility دو چیز متفاوت‌اند

یکی از مهم‌ترین نکات معماری X این است که:

Ranking با Visibility فرق دارد.

Ranking تصمیم می‌گیرد:

این پست در چه جایگاهی نمایش داده شود؟

اما Visibility تصمیم می‌گیرد:

آیا این پست اصلاً اجازه نمایش دارد؟

به این بخش Visibility Filtering می‌گویند.

در سیستم Visibility خروجی‌هایی مثل این دیده می‌شود:

ALLOW INTERSTITIAL DROP

ALLOW یعنی محتوا عادی نمایش داده شود.

INTERSTITIAL یعنی محتوا پشت یک هشدار یا مرحله واسط نمایش داده شود.

مثلاً:

این محتوا ممکن است حساس باشد.

و DROP یعنی سیستم محتوا را در آن سطح از نمایش حذف کند.

پس ممکن است یک پست از نظر Ranking بسیار جذاب باشد، اما Visibility اجازه انتشار گسترده آن را ندهد.


Shadowban از اینجا قابل فهم‌تر می‌شود

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

معماری منتشرشده نشان می‌دهد X واقعاً چندین مرحله جداگانه برای محدود کردن Visibility دارد.

یعنی مسئله همیشه این نیست که:

الگوریتم پست من را دوست نداشت.

ممکن است پست یا حتی خود Account وارد سیستم‌های Safety یا Visibility شده باشد.

X همچنین قابلیتی با عنوان Under the Hood معرفی کرده است.

Under the Hood را می‌توان چیزی شبیه «نمایش بخشی از اطلاعات داخلی درباره وضعیت حساب» دانست.

هدف آن این است که بعضی کاربران بتوانند ببینند آیا Label خاصی روی حساب یا محتوای آن‌ها اعمال شده است یا خیر.


Label یعنی چه؟

در سیستم‌های داخلی شبکه‌های اجتماعی، Label یک برچسب ماشینی یا سیستمی است.

مثلاً ممکن است یک محتوا Labelهایی مرتبط با این موضوعات بگیرد:

Spam Adult Content Violence Sensitive Media Abusive Behavior

Label لزوماً به معنی حذف محتوا نیست.

ممکن است فقط نحوه توزیع آن را تغییر دهد.

مثلاً:

  • نمایش محدود شود

  • در بعضی Recommendationها وارد نشود

  • پشت Warning قرار بگیرد

  • یا در شرایط شدید Drop شود


آیا کل راز الگوریتم X لو رفته؟

خیر.

این شاید مهم‌ترین نکته کل ماجرا باشد.

اوپن‌سورس شدن این Repository به این معنی نیست که از فردا هر کسی می‌تواند دقیقاً محاسبه کند:

اگر این جمله را بنویسم ۲۷۴٬۰۰۰ Impression می‌گیرم.

بعضی قسمت‌ها همچنان عمومی نیستند.

از جمله بخشی از:

  • سیستم‌های Anti-Spam

  • Bot Detection

  • Safety Rules

  • داده‌های واقعی کاربران

  • زیرساخت Production

  • بعضی Promptهای Grox

  • Experimentهای داخلی

همچنین X دائماً A/B Test انجام می‌دهد.

یعنی ممکن است دو کاربر در یک زمان Weight یا رفتار کمی متفاوت از سیستم ببینند.

پس باید این سورس را بیشتر به‌عنوان یک نقشه معماری دید، نه دفترچه تقلب برای Viral شدن.


پس برای تولید محتوا چه چیزی یاد می‌گیریم؟

اگر بخواهیم تمام این معماری را به چند نکته عملی تبدیل کنیم، شاید مهم‌ترین نتیجه این باشد:

Like مهم است، اما همه‌چیز نیست.

احتمالاً محتوایی برای X جذاب‌تر است که باعث رفتارهایی مثل این شود:

Reply Quote Share DM Share Copy Link Follow Dwell

در مقابل، محتوا باید احتمال این رفتارها را پایین نگه دارد:

Not Interested Mute Block Report

پس بهترین محتوا الزاماً محتوایی نیست که بیشترین واکنش را ایجاد کند.

بهتر است محتوایی باشد که بیشترین واکنش مثبت واقعی را ایجاد کند.


مهم‌ترین برداشت از الگوریتم X

اگر بخواهیم کل سورس را در یک جمله خلاصه کنیم:

X دیگر صرفاً نمی‌پرسد:

«این پست چند لایک گرفته؟»

بلکه می‌پرسد:

«این کاربر مشخص، با توجه به رفتار قبلی‌اش، احتمالاً با این پست چه خواهد کرد؟»

و این تفاوت بسیار بزرگی است.

For You در واقع یک Feed ثابت نیست.

برای هر کاربر، در هر لحظه، Feed تقریباً از نو ساخته می‌شود.

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

به همین دلیل شاید دقیق‌ترین تعریف از الگوریتم جدید X این باشد:

X دنبال محبوب‌ترین محتوا نیست؛ دنبال محتوایی است که پیش‌بینی می‌کند برای شما بیشترین ارزش را خواهد داشت.

هوش مصنوعی
۵
۰
مسترباگ
مسترباگ
سماع قلمی حول برنامه‌نویسی، امنیت و دنیای آنالوگ https://mrbug.ir
شاید از این پست‌ها خوشتان بیاید