Pyro: زبان برنامه‌نویسی اپن‌سورس اوبر مناسب برای مدل‌سازی احتمالات


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

اولین کسی باشید که به این سؤال پاسخ می‌دهید

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

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

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

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

ساخت مدل‌های احتمالاتی به صورت مستقیم کاری بسیار سنگین است و پیاده‌سازی آن مشکلات زیادی پیشرو دارد. Probabilistic Programming Language یا به اختصار PPL (زبان برنامه‌نویسی احتمالاتی)، این مشکلات را با ترکیب احتمالات به همراه قدرت محاسباتی زبان‌های برنامه‌نویسی حل می‌کند. یک برنامهٔ احتمالاتی، ترکیبی از محاسبات قطعی به همراه ورودی‌های سَمپِل و رَندوم است‌‌ که این محاسبات باعث ایجاد یک شِمای کلی در مورد داده‌ها می‌گردند.

احتمالات به صورت ضمنی در این نتایج دخیل شده‌اند و نیازی به پیاده‌سازی فرمول‌های مختلف نیست و همان‌طور که انتظار می‌رود، از قاعده‌ای جهانی برای آن استفاده شده است و هر مدل محاسباتی احتمالات را می‌توان بدین صورت نوشت. همچنین باید بگوییم که Pyro بر پایهٔ زبان برنامه‌نویسی Python ساخته شده است که باعث می‌شود برای اکثر دولوپرها آشنا باشد (برای شروع یادگیری این زبان، به دورهٔ آموزش پایتون در سکان آکادمی مراجعه نمایید.)

زبان‌های برنامه‌نویسی احتمالاتی، یکسری الگوریتم استنتاجی عمومی‌ ارائه می‌دهند که می‌توانند با دخالت بسیار کم دولوپر نتیجهٔ مورد نظر را بازگردانند که برای روشن‌تر شدن این مسئله، به این قضیه از دید کامپایلر یک PPL نگاه کنید. به عبارت دیگر، این ویژگی به ما اجازه می‌دهد تا تیم‌های مدل‌سازی و متخصصین بررسی داده‌ها را از هم مجزا سازیم. 

ایدهٔ اصلی این است که استنتاج را به صورت یک مدل توصیف کنیم که در Pyro از آن با نام Guide (راهنما) یاد می‌کنیم. مطمئناً ما نمی‌توانیم به راحتی یک Guide صحیح بنویسیم زیرا استنتاج کار دشواری است. در عوض، این سیستم از راه‌حل‌های متغیر استفاده می‌کند، بدین صورت که خانواده‌ای از راهنماهای پارامتریک را مشخص کرده و یک مسألهٔ بهینه را با آن حل می‌کند تا راهنما را به سمت توزیع‌های قبلی مدل هدایت کند. این بهینه‌سازی می‌تواند به وسیلهٔ مفهومی تحت عنوان Automatic Differentiation، که راه‌حلی برای بهینه‌سازی محاسبات با گرادیانت بالا است، به صورت خودکار اجرا شود.

این زبان بر روی یک لایبرری قدرتمند تحت عنوان PyTorch بیلد می‌شود که شامل یکسری Automatic Differentiation سریع است که از پردازندهٔ گرافیکی برای محاسبات ریاضیاتی بهره می‌گیرید. PyTorch گرادیانت را به صورت داینامیک می‌سازد که باعث می‌شود زبان Pyro بتواند ساختار Stochastic Control را در خود داشته باشد بدین صورت که گزینه‌های رَندومی در Pyro وجود دارند که می‌توانند حضور گزینه‌های رَندوم دیگر را در برنامه کنترل کنند.

وجود ساختار Stochastic Control برای ساخت یک PPL عمومی الزامی است و از آنجا که Pyro استنتاج بهینهٔ خودکاری را در اختیار دارد که منعطف بوده و قابلیت مقیاس‌پذیری برای دیتاسِت‌های بسیار بزرگ را دارا است، می‌توانید انتظار آن را داشته باشید که هر مدل احتمالاتی را به شما ارائه دهد. در Pyro هر دو حالت Generative Model و Inference Guides می‌توانند شبکه‌های عصبی ژرف را در قالب یک کامپوننت‌ در اختیار داشته باشند و نتایج مدل‌های احتمالاتی عمیق، نوید دستاورد‌های بسیار عالی‌ را در پروژه‌های اخیر می‌دهند مخصوصاً در حل مسائل یادگیری ژرف به صورت Unsupervised و Semi-supervised.

آشنایی با اصول طراحی زبان برنامه‌نویسی Pyro
در توسعهٔ Pyro سعی شده است تا اصول چهارگانهٔ زیر عملی گردند:‌

- عمومیت:‌ Pyro یک PPL عمومی است که می‌تواند هر توزیع محاسباتی احتمالاتی را ارائه دهد و این کار را بر پایهٔ زبان محبوب Python با اضافه کردن سَمپل‌ها، بررسی‌ و استنتاج‌ نتایج صورت می‌دهد.

- مقیاس‌پذیری:‌ Pyro می‌تواند فقط با اضافه کردن کمی کد برای دیتاسِت‌های بزرگ نیز اجرا شود که این کار را با تکنیک‌های مدرن بهینه‌سازی بلک‌باکس انجام می‌دهد که از تکه‌های کوچک اطلاعات برای تخمین‌ زدن استنتاج استفاده می‌کند.

- مینیمالیستی:‌ Pyro سبُک بوده و به راحتی قابل‌مدیریت است. در واقع، Pyro بر روی یک هسته‌ کوچک، قدرتمند و کاملاً انتزاعی پیاده‌سازی شده است و هر جایی که لازم بوده بخش‌های سنگین به PyTorch و دیگر لایبرری‌ها واگذار شده است.

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

بعضی از اصول به کار رفته در پیا‌ده‌سازی Pyro در سیاست‌های مخالف یکدیگر قرار دارند! به طور مثال، عمومیت این زبان نیاز به ایجاد ساختار واحد برای برنامه‌های Pyro دارد در حالی که این کار باعث می‌شود مقیاس‌پذیری به مشکل برخورد. همچنین، خودکار بودن ساختار‌های اجرایی و طراحی مینیمالیستی آن‌ها باعث می‌شود تا دولوپرها بتوانند خیلی سریع دست به طراحی پروتوتایپ‌ بزنند در حالی که کاربران حرفه‌ای می‌خواهند تا محصول انعطاف‌پذیری داشته باشند که بتوانند آن را شخصی‌سازی کنند. به گفته‌ٔ تیم توسعهٔ‌دهنده این زبان اپن‌سورس، آن‌ها در طول تحقیقات خود این خواسته‌ها را از دل تکنیک‌های موجود در دیگر زبان‌های PPL مانند WebPPL و Edward بیرون کشیده‌اند تا در نهایت یک زبان منحصر‌به‌فرد طراحی کنند.