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

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

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

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

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

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

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

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

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

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

به طور کلی، با بررسی خروجی یک برنامهٔ احتمالاتی، می‌توانیم مسأله را استنتاج کنیم؛ به عبارت دیگر، «برای اینکه این دادهٔ رندوم یک مقدار قطعی را بازگرداند، چه چیزی باید درست و واقعی باشد؟»

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

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

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

این زبان بر روی یک لایبرری عالی تحت عنوان PyTorch، بیلد می‌شود که شامل Automatic Differentiationهای سریع است که از GPU برای محاسبات ریاضیاتی بهره می‌گیرید. PyTorch گرادیانت را به صورت داینامیک می‌سازد که باعث می‌شود زبان Pyro بتواند ساختار Stochastic Control را در خود داشته باشد؛ بدین صورت که گزینه‌های رندومی در برنامه Pyro وجود دارند که می‌توانند حضور گزینه‌های رندوم دیگر را در برنامه کنترل کنند.

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

در Pyro، هر دو حالت  Generative Model و Inference Guides می‌توانند شبکه‌های عصبی عمیق را در قالب یک کامپوننت‌ در اختیار داشته باشند. نتایج مدل‌های احتمالاتی عمیق، نوید دستاورد‌های بسیار عالی‌ را در پروژه‌های اخیر می‌دهند؛ مخصوصاً در حل مسأله‌های یادگیری ژرف به صورت Unsupervised و Semi-supervised.

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

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

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

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

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

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

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

منبع