کتابخانه پای تورچ (PyTorch) برای یادگیری عمیق — راهنمای کامل و کاربردی

۶۵۴۳ بازدید
آخرین به‌روزرسانی: ۱۰ تیر ۱۴۰۲
زمان مطالعه: ۶ دقیقه
کتابخانه پای تورچ (PyTorch) برای یادگیری عمیق — راهنمای کامل و کاربردی

در این راهنما، مقدمه‌ای بر «یادگیری عمیق» با استفاده از کتابخانه «پای تورچ» (PyTorch) ارائه شده است. در پایان این مطلب به وضوح می‌توان مشاهده کرد که استفاده از این کتابخانه برای مدل‌های یادگیری عمیق کار راحتی است. «فیس‌بوک» (Facebook)، کتابخانه PyTorch ۱.۰ را اوایل سال ۲۰۱۸ در یکپارچگی با «گوگل کلود» (Google Cloud)، «سرویس‌های وب آمازون» (Amazon Web Services) و «یادگیری ماشین آژور» (Azure Machine Learning) راه‌اندازی کرد. در مطلب پیش رو، فرض بر این است که مخاطبان با کتابخانه‌های «سایکیت‌لِرن» (Scikit-Learn)، «پانداس» (Pandas)، «نام‌پای» (NumPy) و «سای‌پای» (SciPy) آشنایی دارند. این بسته‌ها پیش‌نیازهای مهمی برای کتابخانه پای‌تورچ محسوب می‌شوند. مباحثی که در این مطلب مورد بررسی قرار می‌گیرند در ادامه بیان شده‌اند.

  1. یادگیری عمیق چیست؟
  2. مقدمه‌ای بر پای‌تورچ
  3. دلایل ترجیح داده شدن PyTorch نسبت به دیگر کتابخانه‌های یادگیری عمیق پایتون
  4. تانسورهای پای‌تورچ
  5. Autograd در پای‌تورچ
  6. بسته «optim» در پای‌تورچ
  7. ماژول‌های nn سفارشی شده در پای‌تورچ
  8. جمع‌بندی و نتیجه‌گیری

یادگیری عمیق چیست؟

«یادگیری عمیق» (Deep Learning) از مباحث زیرمجموعه «یادگیری ماشین» (Machine Learning) با الگوریتم‌های الهام گرفته شده از عملکرد ذهن انسان است. این الگوریتم‌ها با عنوان «شبکه‌های عصبی مصنوعی» (Artificial Neural Networks | ANN) نامیده می‌شوند. مثال‌هایی از این شبکه‌های عصبی، «شبکه‌های عصبی پیچشی» (شبکه‌های عصبی پیچشی | Convolutional Neural Networks) که برای دسته‌بندی تصاویر مورد استفاده قرار می‌گیرند و «شبکه‌های عصبی بازگشتی» (Recurrent Neural Networks) هستند.

مقدمه‌ای بر کتابخانه پای تورچ (PyTorch)

«پای‌تورچ» (PyTorch)، یک کتابخانه یادگیری عمیق «متن‌باز» (Open Source) بر پایه کتابخانه «تورچ» (Torch) است. تورچ بر پایه زبان برنامه‌نویسی Lua ساخته شده. PyTorch دو ویژگی اصلی دارد:

  • محاسبات تانسورها (مانند NumPy) با شتابدهی قدرتمند GPU
  • مشتق خودکار برای ساخت شبکه‌های عصبی آموزشی

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

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

  1. برخلاف دیگر کتابخانه‌ها، مانند «تنسورفلو» (TensorFlow) که در آن کاربر بایدکل گراف کامپیوتری را پیش از اجرای مدل تعریف کند، پای‌تورچ امکان تعریف گراف را به صورت «پویا» نیز فراهم می‌کند.
  2. پای‌تورچ، یک ابزار خوب برای پژوهش‌های یادگیری عمیق است و انعطاف‌پذیری و سرعت بالا را تامین می‌کند.

تانسورهای پای‌تورچ

تانسورهای پای‌تورچ شباهت زیادی به آرایه‌های NumPy دارند، با این تفاوت که می‌توان آن‌ها را روی GPU اجرا کرد. این ویژگی بسیار مهم به حساب می‌آید زیرا می‌تواند محاسبات عددی را شتاب‌دهی کند که این امر خود منجر به افزایش سرعت شبکه‌های عصبی به میزان ۵۰ برابر و یا حتی بیشتر می‌شود.

به منظور استفاده از PyTorch، با مراجعه به سایت این کتابخانه (+) باید ابتدا آن را دانلود و نصب کرد. افرادی که از Conda استفاده می‌کنند، می‌توانند پای‌تورچ را با استفاده از دستور ساده زیر نصب کنند.

1conda install PyTorch torchvision -c PyTorch

به منظور تعریف تانسور پای‌تورچ، ابتدا باید بسته torch را «وارد» کرد (Import). پای‌تورچ کاربر را قادر به تعریف دو نوع از تانسورها - یعنی تانسور CPU و GPU - می‌کند. در این راهنما، فرض بر آن است که کاربر از سیستم CPU استفاده می‌کند، اما چگونگی تعریف تانسورها در GPU نیز آموزش داده خواهد شد.

1import torch

نوع تانسور پیش‌فرض در پای‌تورچ یک «تانسور شناور» (Float Tensor) است که به صورت torch.FloatTensor تعریف می‌شود. برای مثال، با دستور زیر می‌توان تانسور را از یک لیست پایتون ساخت.

1torch.FloatTensor([[20, 30, 40], [90, 60, 70]])

در صورتی که کاربر از سیستمی که GPU روی آن فعال شده استفاده کند، تانسور مانند آنچه در  شکل زیر نمایش داده شده، تعریف می‌شود.

1torch.cuda.FloatTensor([[20, 30, 40], [90, 60, 70]])

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

1x = torch.FloatTensor([25])
2y = torch.FloatTensor([30])
3x + y

می‌توان ماتریس را تعریف و عملیات ماتریس را انجام داد. در ادامه، روش تعریف ماتریس و ساخت ترانهاده آن نشان داده شده است.

1matrix = torch.randn(4, 5)
2matrix
3matrix.t()

Autograd در پای‌تورچ از روشی استفاده می‌کند که «مشتق خودکار» (Automatic Differentiation) نامیده می‌شود و به صورت عددی مشتق یک تابع را محاسبه می‌کند. مشتق خودکار، «مسیرهای رو به عقب» (backward passes) را در شبکه‌عصبی محاسبه می‌کند. در آموزش، وزن‌های شبکه‌های عصبی به طور تصادفی با اعدادی نزدیک به صفر ولی غیر صفر مقداردهی اولیه می‌شوند. «مسیر رو به عقب» (Backward pass) فرآیندی است که در آن این وزن‌ها از راست به چپ تنظیم می‌شوند و در «مسیر رو به جلو» (forward pass) برعکس کار بیان شده انجام می‌شود (چپ به راست).

torch.autograd، کتابخانه‌ای است که از مشتق خودکار در پای‌تورچ استفاده می‌کند. کلاس مرکزی این بسته torch.Tensor است. برای ردگیری همه عملیات در آن، باید .requires_grad را روی True تنظیم کرد. برای محاسبه همه گرادیان‌ها، ()backward. فراخوانی می‌شود. گرادیان برای این تانسور در خصیصه grad. تجمیع می‌شود.

اگر کاربر قصد جدا کردن یک تانسور از تاریخچه محاسبات را دارد، می‌تواند تابع ()detach. را فراخوانی کند. این امر از ردگیری شدن محاسبات آتی روی تانسورها جلوگیری می‌کند. دیگر راهکار برای پیش‌گیری از ردگیری تاریخچه پوشش‌دهی کد با استفاده از  ()torch.no_grad است.

کلاس‌های Tensor و Function برای ساخت یک گراف «غیر مدور» (acyclic) که تاریخچه کامل محاسبات را رمزنگاری می‌کند به هم پیوسته هستند. خصیصه grad_fn. از تانسور، Function را ارجاع می‌دهد که تانسور را ساخته است. برای محاسبه مشتق، باید ()backward. را در یک Tensor فراخوانی کرد. اگر Tensor شامل یک عنصر باشد، نیازی به تعیین هیچ پارامتری برای تابع ()backward نیست. اگر تانسور شامل بیش از یک عنصر بشود، باید گرادیانی را تعیین کرد که تانسور تطبیق شکل است.

برای مثال، دو تانسور ساخته می شود، یکی با requires_grad تنظیم شده به صورت True، و دیگری با عنوان False. سپس، می‌توان از این دو تانسور برای انجام عملیات «sum» و «addition» استفاده کرد.

1a = torch.tensor([3.0, 2.0], requires_grad=True)
2b = torch.tensor([4.0, 7.0])
3ab_sum = a + b
4ab_sum
5ab_res = (ab_sum*8).sum()
6ab_res.backward()
7ab_res
8a.grad

فراخوانی «grad.» در b، چیزی باز نمی‌گرداند، زیرا requires_grad روی True تنظیم نشده است.

ماژول nn در پای‌تورچ

این ماژول برای ساخت شبکه‌های عصبی در PyTorch است. nn برای تعریف مدل‌ها و مشتق‌گیری از آن‌ها بستگی به autograd دارد. اکنون، کار با تعریف روال آموزش یک شبکه عصبی آغاز می‌شود.

تعریف شبکه عصبی با برخی از پارامترهای قابل یادگیری که به عنوان وزن به آن‌ها ارجاع داده شده انجام می‌شود.

  1. تکرار در یک مجموعه داده از ورودی‌ها
  2. پردازش ورودی‌ها از طریق شبکه
  3. مقایسه نتایج پیش‌بینی شده با مقادیر واقعی و اندازه‌گیری خطا
  4. بازگشت به عقب گرادیان‌ها در پارامترهای شبکه
  5. به روز رسانی وزن‌های شبکه با استفاده از یک قاعده به روز رسانی ساده:

weight = weight — learning_rate * gradient

اکنون می‌توان از بسته nn برای ساخت یک شبکه عصبی دو لایه استفاده کرد.

1N, D_in, H, D_out = 64, 1000, 100, 10
2x = torch.randn(N, D_in)
3y = torch.randn(N, D_out)
4model = torch.nn.Sequential(
5torch.nn.Linear(D_in, H),
6torch.nn.ReLU(),
7torch.nn.Linear(H, D_out),
8)
9loss_fn = torch.nn.MSELoss()
10learning_rate = 1e-4

در ادامه، برخی از پارامترهای استفاده شده در بالا تشریح می‌شوند:

  • N اندازه «دسته» (batch) است. اندازه دسته در واقع تعداد مشاهداتی است که پس از آن وزن‌ها به روز رسانی می‌شوند.
  • D_in ابعاد ورودی است.
  • H بُعد پنهان است.
  • D_out بُعد خروجی است.
  • torch.randn ماتریسی با ابعاد تعیین شده را تعریف می‌کند.
  • torch.nn.Sequential یک پشته خطی از لایه‌ها را مقداردهی اولیه می‌کند.
  • torch.nn.Linear یک انتقال خطی را برای داده‌های ورودی اعمال می‌کند.
  • torch.nn.ReLU تابع واحد یکسوساز خطی مولفه‌ای را اعمال می‌کند.
  • torch.nn.MSELoss معیاری می‌سازد که «میانگین مربعات خطا» (Mean Squared Error) بین n عنصر در ورودی X و هدف y را اندازه‌گیری می‌کند.

بسته optim در PyTorch

اکنون، از بسته optim برای تعریف یک بهینه‌ساز استفاده می‌شود که وزن‌ها را به روز رسانی می‌کند. بسته optim ایده یک الگوریتم بهینه‌سازی را لحاظ و پیاده‌سازی‌هایی از الگوریتم‌های بهینه‌سازی متداول مانند RMSProp ،AdaGrad و Adam را ارائه می‌کند. در اینجا، از بهینه‌ساز Adam که یکی از محبوب‌ترین بهینه‌سازها است استفاده می‌شود.

اولین آرگومانی که این بهینه‌ساز دریافت می‌کند تانسورهایی هستند که باید به روز رسانی شوند. در مسیر رو به جلو، y پیش‌بینی شده با پاس دادن x به مدل صورت می‌پذیرد. پس از آن، «زیان» (Loss) محاسبه و پرینت می‌شود. پیش از اجرای مسیر رو به عقب، همه گرادیان‌ها برای متغیرهایی که با استفاده از بهینه‌ساز به روز رسانی می‌شوند باید صفر شود. این کار بدین دلیل انجام می‌شود که به طور پیش‌فرض، گرادیان‌ها هنگام فراخوانی ()backward. بازنویسی نمی‌شوند. پس از آن، باید تابع پله‌ای روی بهینه‌ساز فراخوانی شود. این کار پارامترهای آن را به روز رسانی می‌کند. چگونگی پیاده‌سازی این کار در کد زیر نشان داده شده است.

1optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
2for t in range(500):
3  y_pred = model(x)
4  loss = loss_fn(y_pred, y)
5  print(t, loss.item())
6  optimizer.zero_grad()
7  loss.backward()
8  optimizer.step()

سفارشی‌سازی ماژول nn در پای‌تورچ

گاهی نیاز به ساخت ماژول‌های سفارشی می‌شود. در این شرایط، nn.Module «زیردسته» (Subclass) می‌شود. سپس نیاز به تعریف forward است که تانسورهای ورودی را دریافت و تانسورهای خروجی را تولید می‌کنند. چگونگی پیاده‌سازی یک شبکه دو لایه با استفاده nn.Module در زیر نشان داده شده است.

مدل شباهت زیادی به آنچه در بالا ارائه شد دارد، اما تفاوت آن‌ها در این است که در اینجا از torch.nn.Module برای ساخت شبکه عصبی استفاده شده است. دیگر تفاوت آن‌ها، استفاده از «بهینه‌ساز گرادیان کاهشی تصادفی» (stochastic gradient descent optimizer) به جای Adam است. می‌توان یک ماژول سفارشی‌سازی nn را به صورت زیر پیاده‌سازی کرد.

1import torch
2
3class TwoLayerNet(torch.nn.Module):
4    def __init__(self, D_in, H, D_out):
5        super(TwoLayerNet, self).__init__()
6        self.linear1 = torch.nn.Linear(D_in, H)
7        self.linear2 = torch.nn.Linear(H, D_out)
8
9    def forward(self, x):
10        h_relu = self.linear1(x).clamp(min=0)
11        y_pred = self.linear2(h_relu)
12        return y_pred
13
14
15N, D_in, H, D_out = 64, 1000, 100, 10
16
17x = torch.randn(N, D_in)
18y = torch.randn(N, D_out)
19
20model = TwoLayerNet(D_in, H, D_out)
21
22criterion = torch.nn.MSELoss()
23optimizer = torch.optim.SGD(model.parameters(), lr=1e-4)
24for t in range(500):
25    y_pred = model(x)
26
27    loss = criterion(y_pred, y)
28    print(t, loss.item())
29
30    optimizer.zero_grad()
31    loss.backward()
32    optimizer.step()

جمع‌بندی

PyTorch امکان پیاده‌سازی انواع مختلفی از لایه‌ها مانند «لایه‌های پیچشی» (Convolutional Layers)، «لایه‌های بازگشتی» (Recurrent Layers) و «لایه‌های خطی» (Linear Layers) را فراهم می‌کند.

اگر این مطلب برایتان مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

^^

بر اساس رای ۱۹ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
kdnuggets
۱ دیدگاه برای «کتابخانه پای تورچ (PyTorch) برای یادگیری عمیق — راهنمای کامل و کاربردی»

عالی بود .ظاهرا با این سایت خیلی کار دارم .چون پایان نامم هوش مصنوعی ویادگیری عمیق هست

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *