آموزش دادن شبکه عصبی در یادگیری عمیق با پایتون

در این بخش یاد می گیریم که چگونه یک شبکه عصبی را آموزش دهیم. همچنین الگوریتم پس‌انتشار خطا (Back Propagation) و روند برگشتی (Backward Pass) در یادگیری عمیق با پایتون را بررسی خواهیم کرد.

آموزش دادن شبکه عصبی

هدف ما این است که مقادیر بهینه وزن‌های شبکه عصبی را برای دستیابی به خروجی مورد نظر پیدا کنیم. برای آموزش یک شبکه عصبی، از روش تدریجی نزولی (Gradient Descent) استفاده می‌کنیم. در ابتدا وزن‌ها به طور تصادفی مقداردهی می‌شوند. پس از مقداردهی تصادفی، پیش‌بینی‌هایی روی یک زیرمجموعه از داده‌ها با فرآیند پیش‌انتشار (Forward Propagation) انجام می‌دهیم، تابع هزینه (Cost Function) مربوطه را محاسبه می‌کنیم و هر وزن w را به میزان متناسب با مشتق تابع هزینه نسبت به وزن dC/dw به‌روزرسانی می‌کنیم. ضریب تناسب این تغییرات که به آن نرخ یادگیری (Learning Rate) گفته می‌شود، ثابت است.

گرادیان‌ها را می‌توان به‌طور کارآمد با استفاده از الگوریتم پس‌انتشار خطا محاسبه کرد. مشاهده کلیدی در پس‌انتشار خطا یا Backpropagation این است که به دلیل قانون زنجیره‌ای مشتق‌گیری (Chain Rule)، گرادیان در هر نورون از شبکه عصبی می‌تواند با استفاده از گرادیان نورون‌هایی که از آن‌ها خروجی داریم محاسبه شود. بنابراین، ما گرادیان‌ها را به‌صورت معکوس محاسبه می‌کنیم؛ ابتدا گرادیان لایه خروجی، سپس لایه پنهانی بالاترین لایه، بعد از آن لایه‌های پنهانی قبلی و به همین ترتیب، تا رسیدن به لایه ورودی محاسبه می‌شود.

الگوریتم پس‌انتشار خطا معمولاً با استفاده از ایده گراف محاسباتی (Computational Graph) پیاده‌سازی می‌شود، جایی که هر نورون به چندین گره در گراف محاسباتی گسترش می‌یابد و عملیات ریاضی ساده‌ای مانند جمع یا ضرب را انجام می‌دهد. در گراف محاسباتی، هیچ وزنی روی لبه‌ها وجود ندارد؛ تمام وزن‌ها به گره‌ها اختصاص داده می‌شوند، بنابراین وزن‌ها تبدیل به گره‌های خود می‌شوند. سپس الگوریتم پس‌انتشار خطا روی گراف محاسباتی اجرا می‌شود. پس از تکمیل محاسبات، تنها گرادیان‌های گره‌های وزن برای به‌روزرسانی لازم است. باقی‌مانده گرادیان‌ها می‌توانند نادیده گرفته شوند.

تکنیک های بهینه سازی با استفاده از شیب نزولی (Gradient Descent)

یکی از توابع بهینه‌سازی که به طور معمول برای تنظیم وزن‌ها بر اساس خطای ایجاد شده استفاده می‌شود، به نام شیب نزولی (Gradient Descent) شناخته می‌شود.

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

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

هنگامی که یک شبکه عصبی یاد می‌گیرد، به آرامی بسیاری از وزن‌ها را تنظیم می‌کند تا بتوانند سیگنال‌ها را به معنی درست تبدیل کنند. نسبت بین خطای شبکه و هر یک از این وزن‌ها یک مشتق است، dE/dw که میزان تغییر خطا را در اثر تغییرات کوچک در وزن محاسبه می‌کند.

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

ارتباط بین خطا، وزن و فعال سازی در یادگیری عمیق

در اینجا دو متغیر خطا و وزن از طریق یک متغیر سوم به نام فعال‌سازی (Activation) به هم مربوط می‌شوند، که وزن از طریق آن عبور می‌کند. برای محاسبه تأثیر تغییرات وزن بر تغییرات خطا، ابتدا باید تأثیر تغییرات فعال‌سازی بر خطا را محاسبه کرده و سپس تأثیر تغییرات وزن بر فعال‌سازی را بررسی کنیم.

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

سرعت یادگیری و تأثیر گرادیان ها

اگر مقدار گرادیان کوچک باشد، آموزش شبکه عمیق به کندی پیش می‌رود، و اگر مقدار گرادیان بزرگ باشد، سریع‌تر آموزش می‌یابد. هرگونه اشتباه در فرآیند آموزش منجر به خروجی‌های نادرست خواهد شد. فرآیند آموزش شبکه‌ها از خروجی به ورودی که به آن پس‌انتشار خطا (Back Propagation) یا به اختصار “Back Prop” گفته می‌شود، به این شکل است که با شروع از ورودی و حرکت به سمت جلو، پیش‌انتشار (Forward Propagation) صورت می‌گیرد. در حالی که پس‌انتشار معکوس این روند را طی می‌کند و گرادیان را از راست به چپ محاسبه می‌کند.

هر بار که یک گرادیان محاسبه می‌شود، از تمام گرادیان‌های قبلی تا آن نقطه استفاده می‌کنیم.

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

پیشنهاد ویژه : آموزش پایتون

چالش‌ها در الگوریتم های یادگیری عمیق

برای شبکه‌های عصبی کم عمق و عمیق چالش‌هایی وجود دارد، مانند overfitting (برازش بیش از حد) و زمان محاسباتی. شبکه‌های عصبی عمیق (DNNs) تحت تأثیر overfitting قرار می‌گیرند. زیرا استفاده از لایه‌های اضافی انتزاعی به آن‌ها این امکان را می‌دهد که وابستگی‌های نادر در داده‌های آموزشی را مدل‌سازی کنند.

برای مقابله با overfitting، از روش‌های منظم‌سازی مانند Dropout، توقف زودهنگام (Early Stopping)، افزایش داده (Data Augmentation) و یادگیری انتقالی (Transfer Learning) در حین آموزش استفاده می‌شود. روش منظم‌سازی Dropout به‌طور تصادفی واحدهایی را از لایه‌های پنهانی در حین آموزش حذف می‌کند که این کار در جلوگیری از وابستگی‌های نادر کمک می‌کند.

شبکه‌های عصبی عمیق (DNNs) پارامترهای مختلفی از جمله اندازه شبکه (تعداد لایه‌ها و تعداد واحدها در هر لایه)، نرخ یادگیری (Learning Rate) و وزن‌های اولیه را در نظر می‌گیرند. پیدا کردن پارامترهای بهینه به دلیل هزینه بالای زمانی و منابع محاسباتی، همیشه عملی نیست.

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

Dropout (رگولاریزاسیون با حذف تصادفی)

Dropout یک تکنیک رگولاریزاسیون محبوب برای شبکه‌های عصبی است که به‌ویژه شبکه‌های عصبی عمیق (DNNs) به دلیل داشتن لایه‌های زیاد مستعد overfitting (برازش بیش از حد) هستند.

به گفته جفری هینتون، یکی از پیشگامان یادگیری عمیق، اگر شما یک شبکه عصبی عمیق دارید و شبکه شما دچار overfitting نمی‌شود، احتمالاً باید از یک شبکه بزرگ‌تر استفاده کنید و از Dropout استفاده کنید.

Dropout یک تکنیک است که در آن در هر تکرار از الگوریتم شیب نزولی (Gradient Descent)، مجموعه‌ای از گره‌ها به‌طور تصادفی حذف می‌شوند. این بدین معناست که برخی از نورون‌ها به‌طور تصادفی نادیده گرفته می‌شوند، گویی که اصلاً وجود ندارند.

هر نورون با احتمال q حفظ می‌شود و با احتمال 1-q به‌طور تصادفی حذف می‌شود. مقدار q ممکن است برای هر لایه از شبکه عصبی متفاوت باشد. مقدار 0.5 برای لایه‌های پنهان و 0 برای لایه ورودی معمولاً در طیف وسیعی از وظایف مناسب است.

در هنگام ارزیابی و پیش‌بینی، هیچ Dropout اعمال نمی‌شود. خروجی هر نورون ضربدر q می‌شود تا ورودی لایه بعدی همان مقدار مورد انتظار را داشته باشد.

ایده پشت Dropout این است که در یک شبکه عصبی بدون رگولاریزاسیون Dropout، نورون‌ها وابستگی متقابل زیادی پیدا می‌کنند که منجر به overfitting می‌شود.

ترفند پیاده سازی

Dropout در کتابخانه‌هایی مانند TensorFlow و Pytorch با تنظیم خروجی نورون‌های انتخاب شده به صفر پیاده‌سازی می‌شود. یعنی اگرچه نورون وجود دارد، اما خروجی آن به صفر تغییر می‌کند.

توقف زودهنگام (Early Stopping)

ما شبکه‌های عصبی را با استفاده از الگوریتم تکراری گرادیان نزولی (Gradient Descent) آموزش می‌دهیم.

ایده پشت توقف زودهنگام کاملاً شهودی است؛ آموزش را زمانی متوقف می‌کنیم که خطا شروع به افزایش کند. منظور از خطا در اینجا، خطای اندازه‌گیری‌شده روی داده‌های اعتبارسنجی (Validation Data) است؛ بخشی از داده‌های آموزشی که برای تنظیم فراپارامترها (Hyper-parameters) استفاده می‌شود. در این حالت، فراپارامتر همان معیار توقف است.

افزایش داده (Data Augmentation)

این فرآیند به معنای افزایش حجم داده‌های موجود یا غنی‌سازی (Augmenting) آن‌ها با استفاده از داده‌های فعلی و اعمال تغییراتی بر روی آن‌هاست. نوع دقیق این تغییرات به وظیفه‌ای که قصد دستیابی به آن را داریم وابسته است. علاوه بر این، تغییراتی که به شبکه عصبی کمک می‌کنند به معماری آن نیز بستگی دارند.

برای مثال، در بسیاری از وظایف بینایی ماشین مانند طبقه‌بندی اشیاء (Object Classification)، یک تکنیک مؤثر افزایش داده، افزودن داده‌های جدیدی است که نسخه‌های برش‌خورده یا انتقال‌یافته از داده‌های اصلی هستند.

زمانی که یک رایانه تصویری را به‌عنوان ورودی دریافت می‌کند، آن را به‌صورت آرایه‌ای از مقادیر پیکسل‌ها در نظر می‌گیرد. فرض کنید کل تصویر به‌اندازه ۱۵ پیکسل به سمت چپ جابه‌جا شود. اگر این جابه‌جایی را در جهات مختلف و به تعداد زیاد اعمال کنیم، مجموعه‌داده‌ای به دست می‌آید که چندین برابر بزرگ‌تر از مجموعه‌داده اصلی است.

یادگیری انتقالی (Transfer Learning)

فرآیند استفاده از یک مدل ازپیش‌آموزش‌دیده (Pre-trained Model) و تنظیم دقیق (Fine-tuning) آن با مجموعه‌داده خودمان را یادگیری انتقالی می‌نامند. روش‌های مختلفی برای انجام این کار وجود دارد که برخی از آن‌ها در ادامه توضیح داده می‌شوند:

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

  • در ادامه وزن‌های تمام لایه‌های دیگر را منجمد (Freeze) می‌کنیم و شبکه را به‌صورت عادی آموزش می‌دهیم. منظور از منجمد کردن لایه‌ها این است که وزن‌ها در طول گرادیان نزولی یا بهینه‌سازی تغییر نکنند.

ایده اصلی پشت این کار این است که مدل ازپیش‌آموزش‌دیده به‌عنوان استخراج‌کننده ویژگی (Feature Extractor) عمل کند و تنها لایه آخر برای وظیفه‌ی فعلی آموزش داده شود.

5/5 - (1 امتیاز)

راستی! برای دریافت مطالب جدید در کانال تلگرام یا پیج اینستاگرام سورس باران عضو شوید.

دوره آموزش طراحی فروشگاه اینترنتی بدون کد نویسی در 8 ساعت
  • انتشار: ۲ شهریور ۱۴۰۴

دسته بندی موضوعات

آخرین محصولات فروشگاه

مشاهده همه

نظرات

بازخوردهای خود را برای ما ارسال کنید