«PyTorch چیست» یکی از رایجترین سوالات در حوزهی یادگیری عمیق است؛ این مقاله به معرفی این فریمورک و بررسی دلایل محبوبیت آن میپردازد. PyTorch یک فریمورک یادگیری عمیق متنباز است که به دلیل انعطافپذیری و رابط کاربری ساده شناخته میشود. این ویژگیها تا حد زیادی ناشی از سازگاری آن با زبان برنامهنویسی سطح بالای پایتون است که بین توسعهدهندگان یادگیری ماشین و دانشمندان تحلیل داده بسیار محبوب می باشد.
PyTorch چیست؟
PyTorch یک فریمورک کامل برای ساخت مدلهای یادگیری عمیق است. یادگیری عمیق نوعی از یادگیری ماشین می باشد که معمولاً در کاربردهایی مانند تشخیص تصویر و پردازش زبان مورد استفاده قرار میگیرد. این فریمورک با زبان برنامهنویسی پایتون نوشته شده است و برای اکثر توسعهدهندگان حوزه machine learning، یادگیری و استفاده از آن نسبتاً آسان محسوب میشود.
یکی از ویژگیهای متمایز PyTorch، پشتیبانی بسیار خوب پردازندههای گرافیکی (GPU) و به کار گیری روش «مشتقگیری خودکار با حالت معکوس» (reverse-mode auto-differentiation) میباشد که اجازه میدهد گرافهای محاسباتی در لحظه تغییر یابند. این قابلیت، PyTorch را به گزینهای محبوب برای آزمایشهای سریع و نمونهسازی اولیه تبدیل کرده است.
تصویر(1)
چرا PyTorch؟
حال که به سوال "PyTorch چیست" پاسخ داده شده است می بایست دلایل اهمیت و استفاده از آن نیز بررسی گردد. PyTorch حاصل تلاش توسعهدهندگان مرکز تحقیقات هوش مصنوعی فیسبوک (Facebook AI Research) و چندین آزمایشگاه دیگر است. این فریمورک، کتابخانههای پشتیبان پرسرعت و انعطافپذیر مبتنی بر GPU از پروژه Torch را با یک رابط کاربری پایتونی گرافیکی ترکیب میکند که تمرکز آن روی نمونهسازی سریع، خوانایی کد و پشتیبانی طیف گستردهای از مدلهای یادگیری عمیق است.
PyTorch به توسعهدهندگان اجازه میدهد تا از روش آشنای برنامهنویسی دستوری استفاده کنند و در عین حال خروجی آنها بهصورت گراف باشد. این فریمورک در سال ۲۰۱۷ بهصورت متنباز منتشر شد و ریشههای پایتونی آن باعث شده است در میان توسعهدهندگان یادگیری ماشین بهشدت محبوب شود.
نکته قابلتوجه آن می باشد که PyTorch از نوآوری Chainer در زمینه مشتقگیری خودکار معکوس بهره گرفته است. بهبیان ساده، این روش مانند یک ضبطکننده اقدامات عمل میکند و سپس بهصورت معکوس آنها را بازپخش مینماید تا گرادیانها را محاسبه کند. این ویژگی باعث میشود اشکالزدایی PyTorch نسبتاً ساده شود و برای کاربردهایی نظیر شبکههای عصبی پویا (که در زمان اجرا تغییر میکنند) بسیار مناسب باشد. این فریمورک برای نمونهسازی بسیار محبوب است زیرا هر تکرار میتواند متفاوت باشد.
سازگاری بالا با زبان پایتون
PyTorch در میان توسعهدهندگان پایتون بسیار محبوب است زیرا به زبان پایتون نوشته شده و از شیوه اجرایی فوری و امری (define-by-run eager) استفاده میکند که در آن عملیاتها بهمحض فراخوانی از پایتون، اجرا میشوند. با توجه به افزایش روزافزون محبوبیت زبان برنامهنویسی پایتون، یک نظرسنجی نشان داد که تمرکز فزایندهای روی وظایف مرتبط با هوش مصنوعی و یادگیری ماشین شکل گرفته و همراه آنها، پذیرش PyTorch نیز افزایش یافته است. این امر PyTorch را به انتخابی مناسب برای توسعهدهندگان پایتون که تازه وارد دنیای یادگیری عمیق شدهاند، تبدیل کرده و بسیاری از دورههای آموزشی یادگیری عمیق نیز مبتنی بر PyTorch هستند. API این فریمورک از نسخههای اولیه تاکنون نسبتاً پایدار باقی مانده است و کدهای آن برای توسعهدهندگان باتجربه پایتون بهآسانی قابل درک هستند.
تمرکز بر نمونهسازی سریع و پروژههای کوچک
یکی از نقاط قوت خاص PyTorch، در نمونهسازی سریع و پروژههای کوچک می باشد. سادگی در استفاده و انعطافپذیری بالای آن نیز موجب شده است تا در میان جوامع علمی و تحقیقاتی محبوبیت بالایی داشته باشد.
توسعهدهندگان فیسبوک بهطور پیوسته در حال بهبود کاربردهای عملی PyTorch هستند. نسخههای اخیر شامل بهبودهایی مانند پشتیبانی از ابزار تصویریسازی TensorBoard گوگل و کامپایل در لحظه (Just-in-Time Compilation) بودهاند. همچنین پشتیبانی از ONNX (چارچوب مشترک برای تعامل مدلهای یادگیری عمیق) گسترش یافته است که به توسعهدهندگان امکان میدهد فریمورکها یا محیطهای اجرایی یادگیری عمیق را مطابق با نیاز برنامههای خود انتخاب کنند.
تصویر(2)
مزایای PyTorch چیست؟
برخی ویژگیهای مهم پایتورچ عبارتند از:
-
جامعهای گسترده و پویا در سایت PyTorch.org با مستندات و آموزشهای عالی که انجمنهای آن فعال و پشتیبان هستند.
-
تحت زبان پایتون و سازگار با کتابخانههای معروف پایتون مانند NumPy (برای محاسبات علمی)، SciPy و Cython (برای تبدیل کد پایتون به C و بهبود عملکرد) است. به دلیل شباهت syntax (نحوه نگارش) با پایتون، یادگیری PyTorch برای توسعهدهندگان این زبان نسبتاً ساده است.
-
توسط پلتفرمهای ابری مهم بهخوبی پشتیبانی میشود.
-
زبان اسکریپتنویسی آن با نام TorchScript، ساده و انعطافپذیر است و در حالت eager (اجرای فوری) بهسرعت قابل استفاده می باشد.
-
از پردازش با CPU، GPU و حالت موازی پشتیبانی می کند. این یعنی میتوان کارهای محاسباتی را میان چندین هسته CPU و GPU توزیع کرد و آموزش را روی چندین GPU در چندین ماشین انجام داد.
-
از گرافهای محاسباتی پویا پشتیبانی می کند که امکان تغییر رفتار شبکه در زمان اجرا را فراهم می نماید.
-
PyTorch Hub مخزنی از مدلهای آموزش دیده است که در برخی موارد تنها با یک خط کد قابل فراخوانی هستند.
-
امکان ساخت اجزای جدید به صورت زیرکلاسهایی از کلاسهای استاندارد پایتون، قابلیت اشتراکگذاری آسان پارامترها با ابزارهایی مانند TensorBoard و امکان استفاده درونخطی (inline) از کتابخانهها.
-
مجموعه API های شناختهشده که میتوانند برای توسعه قابلیتهای اصلی مورد استفاده قرار گیرند.
-
پشتیبانی از هر دو حالت eager (برای آزمایش) و گراف (جهت اجرا با کارایی بالا).
-
دارای مجموعهای گسترده از ابزارها و کتابخانهها در حوزههایی مانند بینایی رایانه (computer vision).
-
پشتیبانی از رابط کاربری front-end کاملاً مبتنی بر C++ که برای برنامهنویسان پایتون آشنا است و میتواند جهت ساخت برنامههای C++ با کارایی بالا، مورد استفاده قرار گیرد.
نحوه عملکرد PyTorch
PyTorch و TensorFlow از این جهت مشابه هستند که اجزای اصلی هر دو، تنسورها (tensors) و گرافها (graphs) می باشد.
تصویر(3)
تنسورها
تنسورها یکی از انواع دادههای اصلی در پایتورچ هستند. آنها مشابه آرایههای چندبعدی می باشند و برای ذخیرهسازی و پردازش ورودیها یا خروجیهای یک مدل و همچنین پارامترهای آن مورد استفاده قرار میگیرند. تنسورها مشابه آرایههای چندبعدی ndarrays در NumPy هستند، با این تفاوت که قابلیت اجرا روی GPU ها برای افزایش سرعت محاسبات را دارند.
گرافها
شبکههای عصبی با اعمال مجموعهای از توابع تو در تو روی پارامترهای ورودی، دادهها را تحلیل میکنند. هدف یادگیری عمیق، بهینهسازی این پارامترها از طریق محاسبه مشتقات جزئی آنها (گرادیانها) نسبت به یک معیار خطا (loss) است. در مرحله پیشانتشار (forward propagation)، شبکه عصبی پارامترهای ورودی را دریافت کرده و به هر گره در لایهی بعدی یک نمره اعتماد اختصاص میدهد. این روند تا رسیدن به لایه خروجی ادامه مییابد، جایی که میزان خطای نمره خروجی محاسبه میشود. در مرحله backpropagation (انتشار برگشتی) که در چارچوب فرآیند «گرادیان نزولی» (gradient descent) صورت می گیرد، خطاها مجدداً از طریق شبکه به عقب ارسال شده و وزنها اصلاح میگردند تا عملکرد مدل بهبود یابد.
گرافها ساختارهای دادهای هستند که از گرههای متصل به یکدیگر که رأس یا vertex نامیده میشوند و یالها (edges) تشکیل شدهاند. تمامی فریمورکهای مدرن یادگیری عمیق، بر مبنای مفهوم گرافها می باشند. PyTorch تاریخچه تنسورها و عملیات های اجرا شده را در قالب یک "گراف جهتدار غیر مدور" (DAG) ذخیره میکند که از اشیایی به نام Function تشکیل شده است. در این گراف، برگها همان تنسورهای ورودی و ریشهها تنسورهای خروجی هستند.
تصویر(4)
در بسیاری از فریمورکهای محبوب مانند TensorFlow، گراف محاسباتی یک شیء ایستا (static) می باشد. در مقابل، PyTorch بر اساس گرافهای محاسباتی پویا طراحی شده است؛ در این حالت، گراف محاسباتی هنگام اجرا ساخته و بازسازی میشود و همان کدی که عملیات مرحله پیشروی (forward pass) را انجام میدهد، ساختار موردنیاز برای backpropagation را نیز ایجاد میکند. PyTorch نخستین فریمورک یادگیری عمیق از نوع define-by-run است که تواناییها و عملکردی در حد فریمورکهای گراف ایستا مانند TensorFlow ارائه میدهد.
کاربردهای PyTorch چیست؟
فریمورک پایتورچ به دلیل سادگی و انعطافپذیری شناخته میشود اما کاربردهای PyTorch چیست؟ از کاربردهای رایج آن میتوان به یادگیری تقویتی (reinforcement learning)، طبقهبندی تصویر و پردازش زبان طبیعی (NLP) اشاره کرد.
مثالهایی از کاربردهای PyTorch در کسبوکار، پژوهش و آموزش:
پردازش زبان طبیعی (NLP): از Siri تا Google Translate، شبکههای عصبی عمیق باعث پیشرفتهای چشمگیری در درک زبان طبیعی توسط ماشین شدهاند. اکثر این مدلها زبان را بهعنوان یک دنباله خطی از کلمات یا کاراکترها در نظر میگیرند و مدلهایی به نام شبکههای عصبی بازگشتی (RNN) را برای پردازش این دنباله استفاده میکنند اما بسیاری از زبانشناسان اعتقاد دارند که بهتر است زبان بهعنوان ساختاری درختی و سلسلهمراتبی از عبارات درک شود.
بنابراین پژوهشهای زیادی روی مدلهای یادگیری عمیق بهنام شبکههای عصبی بازگشتیِ سلسلهمراتبی (recursive neural networks) انجام شده است که این ساختار را لحاظ میکنند. با اینکه پیادهسازی این مدلها بسیار دشوار و اجرای آنها ناکارآمد است، PyTorch پیادهسازی این مدلها و سایر مدلهای پیچیده پردازش زبان طبیعی را بسیار سادهتر میکند.
تحقیق: پایتورچ بهدلیل سادگی استفاده، انعطافپذیری و امکان نمونهسازی سریع، انتخاب محبوبی در میان محققان است. دانشگاه استنفورد از انعطافپذیری PyTorch برای پژوهش کارآمد روی رویکردهای الگوریتمی جدید بهره میبرد.
آموزش: Udacity از PyTorch برای آموزش نوآوران حوزه هوش مصنوعی استفاده میکند.
همچنین PyTorch برای افراد زیر اهمیت دارد:
دانشمندان داده: پایتورچ برای برنامهنویسانی که با پایتون آشنایی دارند نسبتاً ساده است. این فریمورک، اشکالزدایی آسان، رابط های برنامهنویسی (API) ساده و سازگاری با مجموعه گستردهای از افزونههای نوشتهشده با پایتون را ارائه میدهد. مدل اجرایی پویا (dynamic execution model) آن نیز برای نمونهسازی عالی می باشد.
توسعهدهندگان نرمافزار: PyTorch مجموعهای از قابلیتها را پشتیبانی میکند که فرآیند استقرار مدلهای هوش مصنوعی را سریع و آسان میسازد. همچنین اکوسیستم غنی از کتابخانهها مانند Captum (برای تفسیر مدل)، skorch (برای سازگاری با scikit-learn) و غیره را برای توسعه در اختیار دارد. PyTorch دارای یک اکوسیستم قدرتمند برای شتابدهندهها مانند Glow (برای آموزش) و NVIDIA TensorRT (برای استنتاج) است.
GPU در PyTorch: کلید یادگیری عمیق
از لحاظ معماری، CPU شامل تعداد اندکی هسته (core) با حافظه کش زیاد است که تنها قادر به اجرای همزمان چند thread نرمافزاری محدود میباشد. در مقابل، یک GPU از صدها هسته تشکیل شده که میتوانند هزاران thread را همزمان مدیریت کنند.
تصویر(5)
شبکههای عصبی پیشرفته یادگیری عمیق میتوانند شامل میلیونها یا حتی چند میلیارد پارامتر باشند که باید از طریق الگوریتم بازانتشار (back-propagation) تنظیم شوند. از آنجایی که شبکههای عصبی از تعداد زیادی نورون مشابه تشکیل شدهاند، ذاتاً موازی (parallel) هستند. این موازیسازی بهطور طبیعی با معماری GPU ها همخوانی دارد و در مقایسه با آموزش تحت CPU، سرعت محاسبات را بهشکل قابل توجهی افزایش میدهد. به همین دلیل، GPU ها پلتفرم اصلی آموزش شبکههای عصبی بزرگ و پیچیده هستند. همچنین عملیات استنتاج (inference) که ماهیتی موازی دارد نیز به خوبی روی GPU ها قابل اجرا می باشد.
تصویر(6)
نتیجهگیری
در این مقاله تلاش شد تا به سوال PyTorch چیست" پاسخ داده شود. PyTorch بهعنوان یکی از قدرتمندترین و محبوبترین فریمورکهای یادگیری عمیق، ترکیب سادگی، انعطافپذیری و عملکرد بالا را ارائه میدهد. این فریمورک، بهواسطه مدل اجرایی پویا، سازگاری بالا با زبان پایتون، پشتیبانی قدرتمند از GPU ها و جامعهای فعال، توانسته است جایگاه ویژهای در میان پژوهشگران، توسعهدهندگان و دانشمندان داده به دست آورد. از آموزش گرفته تا پیادهسازی مدلهای پیچیده در محیطهای تولیدی، PyTorch ابزارهایی را فراهم می کند که مسیر توسعه مدلهای هوش مصنوعی را هموار میسازد. با توجه به رشد سریع فناوریهای هوش مصنوعی و نیاز روزافزون به فریمورکهای معتبر و مقیاسپذیر، بهنظر میرسد که پایتورچ همچنان نقش کلیدی خود را در آینده یادگیری عمیق حفظ خواهد کرد.