آنچه در این صفحه می خوانید:
- Pytorch چیست؟
- تاریخچه PyTorch
- ویژگی های Pytorch
- چه کارهایی با Pytorch میتوان انجام داد؟
- مقایسه Pytorch با تنسور فلو
- مثال Pytorch
Pytorch چیست؟
PyTorch یک کتابخانه یادگیری ماشین اوپن سورس است که بر اساس کتابخانه Torch ساخته شده است و برای برنامه هایی مانند بینایی ماشین و پردازش زبان طبیعی مورد استفاده قرار می گیرد. در درجه اول توسط گروه تحقیق هوش مصنوعی فیس بوک تهیه شده است. این نرم افزار رایگان و اوپن سورس است که تحت مجوز اصلاح شده BSD منتشر شده است. اگرچه ارتباط با پایتون صحیح تر و تمرکز اصلی توسعه آن است، اما PyTorch همچنین دارای ویژگی فرانت اند ++C است. علاوه بر این، نرم افزار زبان برنامه نویسی احتمالی Pyro Uber از PyTorch به عنوان بک اند استفاده می کند.
PyTorch یک بسته محاسبات علمی مستقر در پایتون است که از قدرت واحدهای پردازش گرافیک استفاده می کند. همچنین یکی از سکوهای تحقیق یادگیری عمیق ترجیح داده شده برای ارائه حداکثر انعطاف پذیری و سرعت است. این برای ارائه دو مورد از ویژگی های سطح بالا شناخته شده است. محاسبات تنسور با پشتیبانی از پردازش GPU قوی و ایجاد شبکه های عصبی عمیق در سیستم های اتوگراد مبتنی بر نوار انجام می شود. بسیاری از کتابخانه های موجود پایتون وجود دارند که می توانند نحوه یادگیری عمیق و هوش مصنوعی را تغییر دهند و این یکی از این کتابخانه ها است. یکی از دلایل مهم موفقیت PyTorch این است که کاملاً Pythonic است و می توان مدل های شبکه عصبی را ساخت. این بازیکن در مقایسه با سایر رقبای خود هنوز بازیکن جوانی است، اما سرعت بسیار خوبی کسب می کند.
تاریخچه PyTorch
از زمان انتشار آن در ژانویه سال 2016، بسیاری از محققان به طور فزاینده ای پی پیچ را تصویب کردند. به دلیل سهولت در ساخت شبکه های عصبی بسیار پیچیده، به سرعت به کتابخانه تبدیل شده است. این یک رقابت سخت به TensorFlow می دهد، مخصوصاً هنگامی که برای کارهای تحقیقاتی استفاده می شود. با این حال، به دلیل برچسب های هنوز "جدید" و "در دست ساخت"، توسط توسعه دهنده ها پذیرفته شده است. سازندگان PyTorch پیش بینی کرده بودند که این کتابخانه بسیار ضروری است و به آنها امکان می دهد همه محاسبات عددی را به سرعت اجرا کنند. این یک روش ایده آل است که کاملاً با سبک برنامه نویسی پایتون مطابقت دارد. این اجازه را به دانشمندان یادگیری عمیق، توسعه دهندگان یادگیری ماشین و اشکال زدایی شبکه های عصبی داده است که بخشی از کد را در زمان واقعی اجرا و آزمایش کنند. بنابراین آنها لازم نیست که منتظر بمانند تا کل کد اجرا شود تا بررسی کند که آیا این کار می کند یا نه.
ویژگی های Pytorch
PyTorch دو ویژگی سطح بالا را ارائه می دهد:
- محاسبات Tensor (مانند NumPy) با شتاب زیاد از طریق واحدهای پردازش گرافیک (GPU)
- شبکه های عصبی عمیق بر روی یک سیستم خودکار مبتنی بر نوار ساخته شده است.
از دیگر ویژگی ها می توان به موارد زیر اشاره کرد:
- TorchScript: برای تسریع در مسیر تولید، یک انتقال یکپارچه بین حالت مشتاق و حالت گراف را فراهم می کند. PyTorch با TorchScript، سهولت استفاده و انعطاف پذیری را در حالت مشتاق فراهم می کند، در حالی که یکپارچه سازی برای سرعت، بهینه سازی و عملکرد در محیط های سی پلاس پلاس به حالت گراف انتقال می یابد.
- آموزش توزیع شده:آموزش توزیع مقیاس پذیر و بهینه سازی عملکرد در تحقیق و تولید توسط بک اند torch.distributed فعال می شود. با بهرهگیری از پشتیبانی نیتیو برای اجرای ناهمزمان از فعالیتهای جمعی و ارتباط peer-to-peer که از پایتون و ++C قابل دستیابی است، عملکرد را در هر دو تحقیق و تولید بهینه کنید.
- Python-First: ادغام یادگیری عمیق در پایتون باعث می شود تا از کتابخانه ها و بسته های محبوب برای نوشتن آسان لایه های شبکه عصبی در پایتون استفاده شود. PyTorch یکاتصال یکپارچه پایتون به فریمورک++C نیست بلکه ساخته شده است که به شدت در پایتون ادغام شود، بنابراین می تواند با کتابخانه ها و بسته های محبوب مانند Cython و Numba استفاده شود.
- ابزارها و كتابخانه ها: اکوسیستم غنی از ابزارها و کتابخانه ها PyTorch را گسترش می دهد و از توسعه در بینایی ماشین، NLP و موارد دیگر پشتیبانی می کند. جامعه ای فعال از محققان و توسعه دهندگان برای گسترش PyTorch و حمایت از توسعه در مناطقی از بینایی ماشین تا یادگیری تقویت، اکوسیستم غنی از ابزارها و کتابخانه ها را ایجاد کرده اند.
- پشتیبانی نیتیو ONNX: برای دسترسی مستقیم به سیستم عامل های سازگار با ONNX، ران تایم، تجسم سازها و موارد دیگر، مدل های استاندارد را با فرمت ONNX صادر کنید.
- همکاری در ابر: PyTorch به خوبی در سیستم عامل های ابری بزرگ پشتیبانی می کند، توسعه ای بدون اصطکاک و مقیاس پذیری آسان از طریق تصاویر از پیش ساخته، آموزش در مقیاس بزرگ در GPU، امکان اجرای مدل ها در یک محیط مقیاس تولید و موارد دیگر.
چه کارهایی با Pytorch میتوان انجام داد؟
هرکسی که در زمینه یادگیری عمیق و هوش مصنوعی فعالیت می کند، احتمالاً قبلاً با TensorFlow، محبوب ترین کتابخانه منبع باز Google کار کرده است. با این حال، آخرین چارچوب یادگیری عمیق PyTorch مشکلات عمده ای را از نظر کار تحقیقاتی را حل می کند. احتمالاً PyTorch بزرگترین رقیب TensorFlow تا به امروز است و در حال حاضر یک کتابخانه یادگیری عمیق و هوش مصنوعی بسیار مطلوب در جامعه تحقیقاتی است. شما همیشه می توانید از بسته های پایتون مورد علاقه خود مانند NumPy ،SciPy و Cython استفاده کنید تا در صورت لزوم عملکردها و خدمات PyTorch را گسترش دهید. PyTorch یک کتابخانه پویا است و بسیار انعطاف پذیر است و می توانید طبق نیازها و تغییرات خود از آن استفاده کنید، که هم اکنون توسط بسیاری از محققان، دانشجویان و توسعه دهندگان هوش مصنوعی پذیرفته شده است.
مقایسه Pytorch با تنسور فلو
در حالی که هر دو تنسور فلو و PyTorch اوپن سورس هستند، توسط دو ویزارد مختلف ایجاد شده اند. Tensorflow مبتنی بر Theano است و توسط گوگل توسعه یافته است، در حالی که PyTorch مبتنی بر Torch است و توسط Facebook ساخته شده است. مهمترین تفاوت این دو در نحوه تعریف این فریمورک ها نمودارهای محاسباتی است. در حالی که TensorFlow یک نمودار استاتیک ایجاد می کند، PyTorch به یک نمودار پویا اعتقاد دارد. خوب این به چه معنا است؟ در Tensorflow ابتدا باید کل نمودار محاسباتی مدل را تعریف کرده و سپس مدل ML خود را اجرا کنید. اما در PyTorch می توانید نمودار خود را بصورت همزمان تعریف یا دستکاری کنید. این امر به ویژه در هنگام استفاده از ورودی های با طول متغیر در RNN مفید است.
Tensorflow دارای منحنی یادگیری شیب دار تر از PyTorch است. PyTorch pythonic تر است و مدل های ML ساختاری احساس شهودی تر می کنند. از سوی دیگر، برای استفاده از Tensorflow، شما باید کمی بیشتر در مورد کار (نشست ها، متغیرها و غیره) کار کنید و بنابراین یادگیری Tensorflow نسبت به PyTorch کمی دشوارتر می شود.
Tensorflow جامعه ای بسیار بزرگتر از PyTorch دارد. این بدان معنی است که پیدا کردن منابعی برای یادگیری Tensorflow و همچنین یافتن راه حل برای مشکلات خود آسان تر می شود. همچنین بسیاری از آموزش ها و MOOC به جای استفاده از PyTorch ،Tensorflow را پوشش می دهند. دلیل این امر این است که PyTorch یک فریمورک نسبتاً جدید در مقایسه با Tensorflow است. بنابراین، از نظر منابع، مطالب بسیار بیشتری درباره Tensorflow نسبت به PyTorch خواهید یافت.
این مقایسه بدون ذکر TensorBoard ناقص خواهد بود. TensorBoard ابزاری درخشان است که تجسم مدل های ML شما را مستقیماً در مرورگر شما امکان پذیر می کند. PyTorch چنین ابزاری ندارد، اگرچه همیشه می توانید از ابزارهایی مانند Matplotlib استفاده کنید. اگرچه، ادغام هایی در خارج وجود دارد که به شما امکان می دهد از Tensorboard با PyTorch استفاده کنید. اما بصورت نیتیو پشتیبانی نمی شود.
سرانجام، Tensorflow برای مدل های تولید و مقیاس پذیری بسیار بهتر است. این ساخته شده است تا آماده تولید باشد. در حالی که، PyTorch برای یادگیری آسان تر و کار با آن سبک تر است و از این رو برای پروژه های شور و ساخت نمونه های سریع سریع نسبتاً بهتر است.
واقعیت این است که برخی افراد بهتر است از PyTorch استفاده کنند در حالی که برخی دیگر استفاده از Tensorflow را بهتر می دانند. هر دو فریمورک های بزرگی هستند که جامعه بزرگی در پشت سر خود دارند و پشتیبانی زیادی دارند. هر دو کار را انجام می دهند.
مثال Pytorch
در اینجا ما از تنسورهای PyTorch برای قرار دادن شبکه دو لایه در داده های تصادفی استفاده می کنیم. باید به صورت دستی پاس های رو به جلو و عقب را از طریق شبکه پیاده سازی کنیم:
# -*- coding: utf-8 -*-
import torch
dtype = torch.float
device = torch.device("cpu")
# device = torch.device("cuda:0") # Uncomment this to run on GPU
# N is batch size; D_in is input dimension;
# H is hidden dimension; D_out is output dimension.
N, D_in, H, D_out = 64, 1000, 100, 10
# Create random input and output data
x = torch.randn(N, D_in, device=device, dtype=dtype)
y = torch.randn(N, D_out, device=device, dtype=dtype)
# Randomly initialize weights
w1 = torch.randn(D_in, H, device=device, dtype=dtype)
w2 = torch.randn(H, D_out, device=device, dtype=dtype)
learning_rate = 1e-6
for t in range(500):
# Forward pass: compute predicted y
h = x.mm(w1)
h_relu = h.clamp(min=0)
y_pred = h_relu.mm(w2)
# Compute and print loss
loss = (y_pred - y).pow(2).sum().item()
if t % 100 == 99:
print(t, loss)
# Backprop to compute gradients of w1 and w2 with respect to loss
grad_y_pred = 2.0 * (y_pred - y)
grad_w2 = h_relu.t().mm(grad_y_pred)
grad_h_relu = grad_y_pred.mm(w2.t())
grad_h = grad_h_relu.clone()
grad_h[h < 0] = 0
grad_w1 = x.t().mm(grad_h)
# Update weights using gradient descent
w1 -= learning_rate * grad_w1
w2 -= learning_rate * grad_w2