آموزش

مقدمه‌ای بر شبکه‌های عصبی عمیق

درک شبکه‌های عصبی عمیق و اهمیت اون‌ها در دنیای یادگیری عمیق مدرنِ هوش مصنوعی

تاریخ انتشار:
31 مرداد 1405
13 دقیقه
یادگیری عمیق
یادگیری عمیق
کاربرهای فینکا در چه شرکت‌هایی مشغول به کار هستند؟

شبکه‌های عصبی عمیق، چشم‌انداز هوش مصنوعی رو در دنیای مدرن کاملاً عوض کردن. اخیراً پیشرفت‌های زیادی در زمینه یادگیری عمیق و شبکه‌های عصبی به دست اومده که کیفیت پروژه‌های هوش مصنوعی رو به شدت بالا برده.

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

اما شبکه‌های عصبی عمیق دقیقاً چی هستن و چرا برای انجام خیلی از تسک‌ها بهترین انتخاب به حساب میان؟ بهترین ابزارها و کتابخونه‌ها برای شروع کار باهاشون کدوما هستن؟

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

شبکه‌های عصبی عمیق چی هستن؟

هدف یک شبکه عصبی مصنوعی (ANN) یا همون شبکه عصبی سنتی ساده، حل تسک‌های کوچیک با یک ساختار شبکه‌ای سرراسته. این شبکه‌ها تا حدودی از شبکه‌های عصبی بیولوژیکی الهام گرفته شدن و از مجموعه‌ای از لایه‌ها تشکیل شدن که هر کدوم وظیفه خاصی دارن. داخل هر لایه هم تعدادی نود وجود داره که با هم کار می‌کنن.

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

برای حل این مسائل، ما از شبکه‌های عصبی عمیق استفاده می‌کنیم. این شبکه‌ها معمولاً ساختار لایه پنهان پیچیده‌ای دارن و از تنوع بالایی از لایه‌های مختلف (مثل لایه کانولوشنال، لایه max-pooling، لایه dense و غیره) استفاده می‌کنن. این لایه‌های اضافی به مدل کمک می‌کنن تا مسئله رو بهتر درک کنه و راه‌حل‌های بهینه‌ای برای پروژه‌های پیچیده ارائه بده. یک شبکه عصبی عمیق نسبت به ANN لایه‌های بیشتری (عمق بیشتری) داره. این لایه‌ها در عین حال که پیچیدگی مدل رو بالا می‌برن، بهش اجازه می‌دن ورودی‌ها رو دقیق‌تر بررسی کنه تا بهترین خروجی رو به دست بیاره.

شبکه‌های عصبی عمیق به خاطر کارایی بالاشون در انجام انواع پروژه‌های یادگیری عمیق، خیلی محبوب شدن. می‌تونی تفاوت‌های بین یادگیری ماشین و یادگیری عمیق رو در یک مقاله جداگانه بخونی.

چرا از DNN استفاده کنیم؟

اگه یک شبکه عصبی عمیق به خوبی ساخته و آموزش داده بشه، می‌تونه با دقت بالایی به نتایج دلخواه برسه. این شبکه‌ها در تمام زمینه‌های یادگیری عمیق، مثل بینایی ماشین، پردازش زبان طبیعی و یادگیری انتقالی (transfer learning) کاربرد دارن و خیلی محبوب هستن.

بهترین مثال برای نشون دادن اهمیت شبکه‌های عصبی عمیق، کاربردشون در تشخیص اشیا با مدل‌هایی مثل YOLO، ترجمه با مدل‌های BERT، و مدل‌های یادگیری انتقالی مثل VGG-19، RESNET-50 و efficient net برای پروژه‌های پردازش تصویره.

برای درک بهتر و بصری‌تر این مفاهیم، پیشنهاد می‌کنم دوره مقدمه‌ای بر یادگیری عمیق در پایتون فینکا رو ببینی.

ابزارها و کتابخونه‌های یادگیری عمیق

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

محبوب‌ترین ابزارها و کتابخونه‌ها برای ساخت شبکه‌های عصبی عمیق، TensorFlow، Keras و PyTorch هستن. از زمان معرفی TensorFlow 2.0، کتابخونه‌های Keras و TensorFlow به صورت یکپارچه با هم ادغام شدن. این ترکیب به کاربرا اجازه می‌ده تا با استفاده از Keras در بستر TensorFlow، شبکه‌های عصبی پیچیده رو خیلی راحت‌تر و با کدهای سطح بالا توسعه بدن.

PyTorch

کتابخونه PyTorch یکی دیگه از فریم‌ورک‌های فوق‌العاده محبوب در یادگیری ماشینه که به کاربرا امکان می‌ده پروژه‌های تحقیقاتی سطح بالایی رو توسعه بدن.

با اینکه PyTorch ممکنه در زمینه بصری‌سازی یه مقدار ضعف داشته باشه، اما این مسئله رو با عملکرد سریع و بهینه‌اش و نصب راحت‌تر روی GPU برای ساخت مدل‌های شبکه عصبی عمیق جبران می‌کنه.

دوره مقدمه‌ای بر یادگیری عمیق با PyTorch فینکا بهترین نقطه شروع برای یادگیری این فریم‌ورکه.

TensorFlow و Keras

فریم‌ورک TensorFlow گزینه‌های فوق‌العاده متنوعی برای بصری‌سازی پروژه‌های یادگیری عمیق در اختیار توسعه‌دهنده‌ها قرار می‌ده. داشبورد گرافیکی TensorBoard یک انتخاب عالی برای بصری‌سازی، تحلیل و تفسیر داده‌ها و نتایج پروژه‌ست.

ادغام شدن کتابخونه Keras هم باعث می‌شه بتونیم پروژه‌ها رو سریع‌تر و با کدهای ساده‌تری بسازیم؛ به همین دلیل، انتخاب خیلی محبوبی برای پروژه‌های طولانی‌مدته. دوره مقدمه‌ای بر TensorFlow در پایتون یک نقطه شروع عالی برای افراد مبتدیه تا کار با TensorFlow رو یاد بگیرن.

نحوه ساخت یک شبکه عصبی عمیق پایه

در این بخش، بعضی از مفاهیم اساسی شبکه‌های عصبی عمیق و نحوه ساخت چنین شبکه‌ای از صفر رو با هم بررسی می‌کنیم.

وارد کردن کتابخونه‌های مورد نیاز

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

ساخت یک مدل از نوع Sequential

بعد از اینکه کتابخونه‌های مورد نیاز رو وارد کردیم، از مدل‌سازی نوع Sequential برای ساخت مدل یادگیری عمیق استفاده می‌کنیم. مدل Sequential در واقع یک پشته ساده از لایه‌هاست که یک ورودی و یک خروجی داره. گزینه‌های دیگه‌ای مثل Functional API یا ساخت مدل‌های سفارشی هم وجود دارن، اما کلاس Sequential یک روش سرراست و راحت برای ساخت معماری شبکه عصبی در اختیارمون می‌ذاره.

ساخت معماری شبکه عصبی عمیق

اول یک input shape اضافه می‌کنیم که معمولاً ابعادش با ابعاد تصاویری که در پروژه استفاده می‌کنی برابره. این ابعاد شامل عرض، ارتفاع و تعداد کانال‌های رنگی تصویره. در کد مثال پایین، ارتفاع و عرض تصویر ۲۵۶ و سیستم رنگی اون RGB هست که با عدد ۳ نشون داده شده (عدد ۱ برای تصاویر سیاه‌سفید یا gray-scale استفاده می‌شه). بعدش لایه‌های پنهان مورد نیاز رو با استفاده از لایه‌های کانولوشن و max-pooling در اندازه‌های مختلف می‌سازیم. در نهایت، با استفاده از یک لایه flatten، خروجی‌ها رو به یک آرایه یک‌بعدی تبدیل می‌کنیم و یک لایه dense رو هم به عنوان لایه خروجی نهایی در نظر می‌گیریم.

لایه‌های پنهان، پیچیدگی شبکه عصبی رو بیشتر می‌کنن. لایه کانولوشنال برای فیلتر کردن اطلاعات، عملیات convolution رو روی تصاویر انجام می‌ده. اندازه هر فیلتر در لایه کانولوشن مشخص می‌کنه که چه ویژگی‌هایی از ورودی استخراج بشن. لایه max-pooling هم با انتخاب بزرگ‌ترین مقادیر از بین ویژگی‌های استخراج‌شده، ابعاد داده‌ها رو کاهش می‌ده.

لایه flatten ابعاد فضایی رو تبدیل به یک بعد می‌کنه تا محاسبات سریع‌تر انجام بشن. لایه dense ساده‌ترین لایه‌ست که خروجی لایه‌های قبلی رو می‌گیره و معمولاً به عنوان لایه خروجی نهایی استفاده می‌شه. کانولوشن دوبعدی یک ضرب عنصر به عنصر روی ورودی دوبعدی انجام می‌ده. تابع فعال‌سازی ReLU هم با اضافه کردن خاصیت غیرخطی بودن، عملکرد محاسباتی مدل رو بهتر می‌کنه. ما از padding نوع same استفاده می‌کنیم تا ابعاد ورودی و خروجی در لایه‌های کانولوشنال ثابت بمونه.

معماری مدل

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

خروجی
Model: "sequential_2"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv2d_5 (Conv2D)           (None, 256, 256, 256)     7168      
                                                                 
 max_pooling2d_5 (MaxPooling  (None, 128, 128, 256)    0         
 2D)                                                             
                                                                 
 conv2d_6 (Conv2D)           (None, 128, 128, 128)     295040    
                                                                 
 max_pooling2d_6 (MaxPooling  (None, 64, 64, 128)      0         
 2D)                                                             
                                                                 
 conv2d_7 (Conv2D)           (None, 64, 64, 64)        73792     
                                                                 
 max_pooling2d_7 (MaxPooling  (None, 32, 32, 64)       0         
 2D)                                                             
                                                                 
 flatten_2 (Flatten)         (None, 65536)             0         
                                                                 
 dense_4 (Dense)             (None, 64)                4194368   
                                                                 
 dense_5 (Dense)             (None, 10)                650       
                                                                 
=================================================================
Total params: 4,571,018
Trainable params: 4,571,018
Non-trainable params: 0
_________________________________________________________________

نمودار مدل هم به این صورته:

اطلاعات تکمیلی

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

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

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

درک مدل‌های یادگیری عمیق

برای انجام هر تسک خاص در یادگیری ماشین، به یک شبکه عصبی عمیق متناسب با اون نیاز داریم. دو مورد از پرکاربردترین مدل‌های یادگیری عمیق، شبکه‌های عصبی کانولوشنال (CNN) و شبکه‌های عصبی بازگشتی (RNN) هستن. شبکه‌های عصبی کانولوشنال کاربرد بسیار زیادی در پروژه‌های پردازش تصویر و بینایی ماشین دارن.

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

برای پروژه‌های پردازش زبان طبیعی و تحلیل معنایی، معمولاً از شبکه‌های عصبی بازگشتی (RNN) استفاده می‌شه. یکی از نسخه‌های محبوب RNNها، شبکه حافظه طولانی کوتاه‌مدت (LSTM) هست که معمولاً برای کارهایی مثل ترجمه ماشینی، طبقه‌بندی متن و تشخیص گفتار کاربرد داره.

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

چالش‌ها و ملاحظات در شبکه‌های عصبی عمیق

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

نیازهای مربوط به داده‌ها

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

با اینکه تکنیک‌های افزایش داده (data augmentation) می‌تونن به عنوان یک راه‌حل سریع برای بعضی از این مشکلات مفید باشن، اما تأمین داده‌های کافی موضوعیه که باید در هر پروژه یادگیری عمیق جدی گرفته بشه.

منابع محاسباتی

علاوه بر حجم زیاد داده، باید به هزینه محاسباتی بالای شبکه‌های عصبی عمیق هم توجه کنیم. به عنوان مثال، مدل‌هایی مثل GPT-3 حدود ۱۷۵ میلیارد پارامتر دارن!

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

مشکلات آموزش

مدل‌ها ممکنه در طول آموزش با مشکلاتی مثل کم‌برازش (underfitting) یا بیش‌برازش (overfitting) مواجه بشن. کم‌برازش معمولاً به خاطر کمبود داده اتفاق می‌افته، اما بیش‌برازش مشکل رایج‌تریه. این مشکل زمانی رخ می‌ده که دقت مدل روی داده‌های آموزش مدام بالاتر می‌ره، اما روی داده‌های تست ثابت می‌مونه. نتیجه این می‌شه که دقت آموزش بالاست اما دقت اعتبارسنجی (validation accuracy) پایینه؛ این یعنی با یک مدل به شدت ناپایدار طرف هستیم که نمی‌تونه در دنیای واقعی نتایج خوبی ارائه بده.

سخن پایانی

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

شبکه‌های عصبی عمیق ابزارهای فوق‌العاده‌ای برای توسعه اپلیکیشن‌ها و پروژه‌های هوش مصنوعی هستن. این شبکه‌ها به ما اجازه می‌دن تا تسک‌های پردازش تصویر و پردازش زبان طبیعی رو با دقت بسیار بالایی انجام بدیم.

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

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

اشتراک‌گذاری
فهرست مطالب
  • شبکه‌های عصبی عمیق چی هستن؟
  • ابزارها و کتابخونه‌های یادگیری عمیق
  • نحوه ساخت یک شبکه عصبی عمیق پایه
  • درک مدل‌های یادگیری عمیق
  • چالش‌ها و ملاحظات در شبکه‌های عصبی عمیق
  • سخن پایانی

دریافت اپلیکیشن فینکا

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