شبکه عصبی عمیق چیست؟ – طرز کار به زبان ساده
در عصر مدرن، «شبکههای عصبی عمیق» (Deep Neural Networks | DNNs) منشاء تغییرات بسیاری در حوزه هوش مصنوعی بودهاند و پیشرفت روزافزون سطح تحقیقات در یادگیری عمیق، باعث افزایش چشمگیر کیفیت پروژههای کاربردی شده است. شبکههای عصبی عمیق، توسعهدهندگان را قادر ساخته تا به نتایج پایدار و با کیفیت بالاتری دست پیدا کنند. در این مطلب از مجله فرادرس یاد میگیریم شبکه عصبی عمیق چیست، شامل چه کتابخانههایی میشود و چگونه میتوانیم ساختار یک شبکه عصبی پایه را طراحی و ایجاد کنیم. شبکههایی که طی چند سال اخیر جایگزین انواع مختلفی از تکنیکهای یادگیری ماشین شدهاند.
در این مطلب ابتدا یاد میگیریم منظور از شبکه عصبی عمیق چیست و چگونه کار میکند. سپس به معرفی ابزارها و کتابخانههای یادگیری عمیق میپردازیم و نحوه ساخت یک شبکه عصبی عمیق را شرح میدهیم. در انتها این مطلب از مجله فرادرس، با دو مورد از رایجترین مدلهای یادگیری عمیق آشنا میشویم و چند نمونه از چالشهای مربوط به این حوزه را بررسی میکنیم.
منظور از شبکه عصبی عمیق چیست؟
کاربرد یک شبکه عصبی مصنوعی یا همان شبکه عصبی ساده در حل مسائل جزئی خلاصه میشود. تا حدودی میتوان ساختار شبکههای عصبی را شبیه به شبکههای عصبی زیستی در نظر گرفت. مجموعهای از لایهها که برای اجرا عملی خاص طراحی شدهاند. هر لایه متشکل از مجموعهای از موجودیتها با عنوان «گره» یا node است که با یکدیگر در تعامل هستند. این شبکهها اغلب از یک لایه ورودی، یک یا چند لایه پنهان و یک لایه خروجی تشکیل میشوند. در حالی که همچنان میتوان از روشهای قدیمی و «جداول درستی» (Truth tables) برای حل مسائل ریاضیاتی ساده استفاده کرد، یافتن راهحل برای پردازش تصویر، بینایی کامپیوتر و پردازش زبان طبیعی به اتخاذ رویکرد پیچیدهتری نیاز دارد.
در فعالیت مختلفی از شبکههای عصبی عمیق استفاده میشود. شبکههایی که اغلب دارای ساختاری پیچیده با گستره متنوعی از لایهها همچون لایه پیچشی، لایه «بیشینههموار» (Max-pooling)، لایه متراکم و انواع دیگر لایههای منحصربهفرد هستند. این لایهها، مدل یادگیری ماشین را قادر میسازند تا درک بهتری از مسائل بهدست آورده و راهحل بهینهای برای پروژههای پیچیده ارائه دهد. در نوع عمیق شبکههای عصبی، تعداد لایهها یا عمق بیشتر بوده و هر لایه علاوهبر افزایش پیچیدگی مدل، در پردازش دقیقتر ورودیها و تولید خروجی ایدهآل نیز موثر است.
با آموزش دادن شبکه عصبی عمیق، دستیابی به نتایج دلخواه با دقت بالا ممکن میشود. شبکههای عصبی عمیق محبوبیت بالایی در یادگیری عمیق دارند و در زمینههایی همچون «یادگیری انتقالی» (Transfer Learning) مورد استفاده قرار میگیرند. به عنوان مثال و از جمله کاربردهای شبکههای عصبی عمیق میتوان به مدل YOLO در تشخیص اشیاء، مدل BERT در ترجمه زبانی و مدلهای VGG-19، RESNET-50 و EfficientNET در یادگیری انتقالی اشاره کرد.
شبکه عصبی عمیق چگونه کار می کند؟
حالا که میدانیم منظور از شبکه عصبی عمیق چیست، در این بخش با نحوه کارکرد این شبکهها آشنا میشویم. بهطور کلی یک شبکه عصبی عمیق متشکل از یک لایه ورودی، یک لایه خروجی و حداقل یک لایه پنهان است. هرچه تعداد لایهها بیشتر باشد یعنی شبکه عصبی عمیقتر بوده و هر لایه وظیفه متفاوتی در فرایند آموزش برعهده دارد. برای درک بهتر این فرایند میتوانیم نگاهی به مغز انسان داشته باشیم. مغز ما بهجای یادگیری ساختار هر چهره بهصورت مجزا، تنها یک چهره اولیه و پایه را به عنوان مدل، مبنا قرار داده و دیگر چهرهها را مطابق با آن شناسایی میکند. به همین خاطر، ویژگیهایی مانند چشمها، گوشها یا ابروها در کسری از ثانیه بررسی میشوند. اختلاف میان چهره جدید و مدل پایه بر اساس نوعی سیگنال الکتریکی با شدت متغیر اندازهگیری شده و نتیجه نهایی از ترکیب تفاوتها بهدست میآید.
گرههای هر لایه در شبکه عصبی شبیه به نورونهای مغز انسان هستند و هر لایه نیز از چندین گره تشکیل شده است. شبکه عصبی اطلاعات جمعآوری شده از سنسورها یا دادههایی که بهطور مستقیم توسط فرد توسعهدهنده آماده و پردازش شدهاند را تجزیه و تحلیل میکند. این دادهها ممکن است از جنس محتوای تصویری، متنی یا حتی صوتی باشند که در ادامه به مقادیر عددی تبدیل میشوند. دادهای که وارد شبکه عصبی میشود باید از اولین لایه تا لایه خروجی پردازش شده و نتیجه آن برای حل مسئلهای مشخص مورد استفاده قرار گیرد. دادهها در اولین لایه شبکه دریافت و نوعی تابع فعالسازی بر آنها اعمال میشود. سپس خروجی لایه اول به لایه بعدی انتقال مییابد. در مطلب مفصلتری از مجله فرادرس درباره انواع توابع فعالسازی توضیح دادهایم که میتوانید آن را از لینک زیر مطالعه کنید:
ارتباط میان دو لایه شبکه عصبی از نوع وزندار است. مقادیر وزنی که میزان تاثیرگذاری دادهها را بر نتایج لایه بعدی و در نهایت نتایج نهایی مشخص میکنند.
چگونه شبکه های عصبی را با فرادرس یاد بگیریم؟
تا اینجا مطلب، با مفهوم شبکههای عصبی و نحوه کارکرد آنها آشنا شدیم. دیدیم که چگونه این ساختارهای الهام گرفته از مغز انسان، قادر به یادگیری و حل مسائل پیچیده هستند. اما شبکههای عصبی انواع مختلفی دارند که هر کدام برای حل مسائل خاصی طراحی شدهاند. دو نوع مهم از شبکههای عصبی عبارتاند از:
- شبکههای عصبی پیچشی (CNN): این شبکهها در پردازش تصویر و بینایی کامپیوتر کاربرد گستردهای دارند. برای مثال، در تشخیص چهره، شناسایی اشیاء در تصاویر، و حتی در خودروهای خودران برای درک محیط اطراف استفاده میشوند.
- شبکههای عصبی بازگشتی (RNN): شبکههایی که در پردازش دادههای متوالی مانند متن یا سریهای زمانی بهکار گرفته میشوند. از کاربرد این شبکهها میتوان به ترجمه ماشینی، بازشناسی گفتار و پیشبینی قیمت سهام اشاره کرد.
اهمیت این شبکهها در جهان امروز غیرقابل انکار است. اجزاء سازندهای که در بطن بسیاری از فناوریهای پیشرفته از دستیارهای صوتی گرفته تا سیستمهای توصیهگر قرار دارند. اگر قصد دارید به طور جدی در این حوزه فعالیت کنید، پیشنهاد میکنیم از مجموعه فیلمهای آموزشی پروژهمحور فرادرس که لینک آن در بخش زیر قرار گرفته است بهرهمند شوید. این دورهها که توسط اساتید مجرب و شناخته شده تهیه شدهاند، شما را گام به گام با مفاهیم و کاربردهای عملی شبکههای عصبی آشنا میکنند:
شما با شرکت در این دورهها، نه تنها دانش نظری خود را تقویت میکنید، بلکه با انجام پروژههای عملی، مهارتهای لازم برای ورود به بازار کار در حوزه هوش مصنوعی و یادگیری عمیق را کسب خواهید کرد. این دورهها فرصتی عالی برای یادگیری از متخصصان و کسب تجربه در زمینه طراحی و پیادهسازی شبکههای عصبی هستند.
ابزار ها و کتابخانه های یادگیری عمیق
ساخت شبکههای عصبی از پایه، به توسعهدهندگان کمک میکند تا درک مناسبی از مفاهیم اولیه بهدست آورده و با ایجاد تغییر در این شبکهها، به حل مسائل ساده خود بپردازند. با این حال، چنین فرایندی زمانبر بوده و نیازمند صرف هزینه بالایی است. از همین جهت، ابزارها و کتابخانههای مختلفی در اختیار ما قرار گرفتهاند که با استفاده از آنها میتوانیم تنها با چند خط کد، شبکههای عصبی عمیق را توسعه داده و برای مسائل پیچیده راهحل پیدا کنیم. از جمله محبوبترین کتابخانههای یادگیری عمیق برای ساخت شبکههای عصبی میتوان به TensorFlow، Keras و PyTorch اشاره داشت. البته نسخه دوم کتابخانه TensorFlow با کتابخانه Keras یکپارچه بوده و نیازی به نصب جداگانه هر کدام نیست. در ادامه این بخش، توضیح کاملتری از این کتابخانهها ارائه میدهیم.
PyTorch
کتابخانهای محبوب و کاربردی در یادگیری ماشین که بسیار در توسعه پروژههای صنعتی و تحقیقاتی بهکار گرفته میشود. اگرچه این کتابخانه کمی در زمینه مصورسازی دارای ضعف و محدودیت است، در عوض نسبت به سایر فریمورکها پیچیدگی کمتری داشته و علاوهبر عملکرد سریعتر، طریقه نصب و راهاندازی آسانتری نیز دارد.
TensorFlow و Keras
فریمورک TensorFlow امکانات مصورسازی گستردهای را برای کاربردهای یادگیری عمیق در اختیار توسعهدهندگان قرار میدهد. به این صورت، کاربران میتوانند خود نوع ترسیم، تجزیه و تحلیل و تفسیر نتایج را انتخاب کنند. از طرف دیگر، یکپارچه شدن کتابخانه Keras با TensorFlow امکان کدنویسی سادهتر شبکههای عصبی را مهیا ساخته و آن را به گزینهای ایدهال برای طراحی و توسعه پروژههای بلندمدت تبدیل کرده است.
نحوه ساخت شبکه عصبی عمیق پایه
پس از آنکه یاد گرفتیم شبکه عصبی عمیق چیست و آشنایی خوبی از کتابخانههای کاربردی آن بهدست آوردیم، در ادامه این بخش از مطلب مجله فرادرس شرح کاملی از مراحل طراحی و پیادهسازی یک شبکه عصبی عمیق پایه ارائه میدهیم. برای آشنایی بیشتر با کتابخانههای TensorFlow و Keras در یادگیری عمیق میتوانید آموزش یادگیری عمیق در پایتون فرادرس را که در ادامه آورده شده است مشاهده کنید:
بارگذاری کتابخانه های مورد نیاز
اولین قدم انتخاب کتابخانه مناسب برای مسئله مورد نظر است. در اینجا ما از فریمورکهای یادگیری عمیق TensorFlow و Keras برای ساخت شبکه عصبی عمیق کمک میگیریم:
1# Importing the necessary functionality
2import tensorflow as tf
3from tensorflow.keras.models import Sequential
4from tensorflow.keras.layers import Input, Dense, Conv2D
5from tensorflow.keras.layers import Flatten, MaxPooling2D
ایجاد مدل از نوع ترتیبی
پس از اتمام بارگذاری کتابخانههای مورد نظر، از مدلسازی ترتیبی برای ایجاد مدل یادگیری عمیق استفاده میکنیم. مدل ترتیبی، پشتهای از لایهها با یک مقدار ورودی و خروجی است. برای ایجاد مدل تنها کافی است کلاس Sequentialرا فراخوانی کنیم:
1# Creating the model
2DNN_Model = Sequential()
طراحی و ساخت معماری شبکه عصبی عمیق
در این مرحله ابتدا باید اندازه یا ابعاد ورودی را که برابر با ابعاد تصاویر بهکار رفته در پروژه است وارد کنیم. اندازهای که شامل سه مقدار عرض، طول و نوع کدگذاری رنگی تصاویر است. در مثال ما مقدار طول و عرض هر تصویر برابر با ۲۵۶ بوده و پارامتر سوم مقداری برابر با ۳ یا همان مدل رنگی RGB دارد. همچنین برای تصاویر سیاه و سفید از مقدار ۱ استفاده میشود. در قدم بعد، لایههای پیچشی و بیشینههموار را با اندازههای فیلتر مختلف به عنوان لایههای پنهان قرار میدهیم. برای دو لایه آخر نیز یک لایه «مسطح» (Flatten) که خروجیهای قبلی را در یک بعد خلاصه میکند و یک لایه متراکم را به عنوان لایه پایانی انتخاب میکنیم.
لایههای پنهان باعث افزایش پیچیدگی شبکه عصبی میشوند. لایههای پیچشی برای درک الگو دادهها، عملیات ریاضیاتی کانولوشن را بر روی تصاویر اعمال میکنند. اندازه هر فیلتر در لایه پیچشی بر ویژگیهای استخراج شده از ورودی تاثیر مستقیم دارد. از طرف دیگر، لایه بیشینههموار، تنها بزرگترین مقادیر را از خروجی لایه قبل جدا کرده و باعث کاهش اندازه ویژگیها میشود.
لایه مسطح بهمنظور محاسبات سریعتر، ابعاد داده را به یک بعد کاهش میدهد و در آخر میتوان از لایه متراکم به عنوان سادهترین لایهای نام برد که خروجی را از لایه مسطح دریافت و نقش لایه پایانی را ایفا میکند. در کانولوشن ۲ بعدی، عملیات ضرب «عضو به عضو» (Elementwise) بر یک ورودی ۲ بعدی اعمال میشود. همچنین باید توجه داشت که تابع ReLU رویه مدل را از حالت خطی خارج کرده و انجام محاسبات را تسهیل میبخشد. همانطور که در قطعه کد زیر ملاحظه میکنید، برای حفظ ابعاد ورودی و خروجی از فاصلهگذاری یا Padding یکسانی استفاده شده است:
1# Inputting the shape to the model
2DNN_Model.add(Input(shape = (256, 256, 3)))
3
4# Creating the deep neural network
5DNN_Model.add(Conv2D(256, (3, 3), activation='relu', padding = "same"))
6DNN_Model.add(MaxPooling2D(2, 2))
7DNN_Model.add(Conv2D(128, (3, 3), activation='relu', padding = "same"))
8DNN_Model.add(MaxPooling2D(2, 2))
9DNN_Model.add(Conv2D(64, (3, 3), activation='relu', padding = "same"))
10DNN_Model.add(MaxPooling2D(2, 2))
11
12# Creating the output layers
13DNN_Model.add(Flatten())
14DNN_Model.add(Dense(64, activation='relu'))
15DNN_Model.add(Dense(10))
معماری مدل
در تصویر زیر شاهد معماری شبکه عصبی طراحی شده هستید:
همچنین با اجرا قطعه کد زیر میتوانیم نمودار کاملتری از ساختار لایههای شبکه ترسیم کنیم:
1tf.keras.utils.plot_model(DNN_Model, to_file='model_big.png', show_shapes=True)
خروجی مانند زیر خواهد بود:
اطلاعات تکمیلی
پس از طراحی و ساخت، لازم است تا مدل پیکربندی و به اصطلاح کامپایل شود. کامپایل مدل شامل دو فرایند «انتشار رو به جلو» (Forward Propagation) و «انتشار رو به عقب» (Backpropagation) میشود. در انتشار رو به جلو تمام اطلاعات ضروری از گرههای مختلف شبکه عبور کرده تا به لایه خروجی برسند. سپس در لایه خروجی مقادیر جدید پیشبینی میشوند. فرایند انتشار رو به عقب در مرحله آموزش یا همان برازش مدل اتفاق میافتد. به این صورت که برای نزدیکتر شدن مقادیر پیشبینی شده به دادههای حقیقی و دستیابی به نتایج دقیقتر، پارامترهای وزنی مجدد تنظیم شده و در هر دور از اجرا تغییر میکنند.
آشنایی با مدل های یادگیری عمیق
تا اینجا یاد گرفتیم شبکه عصبی عمیق چیست و با نحوه پیادهسازی آن نیز در زبان برنامهنویسی پایتون آشنا شدیم. بهطور کلی اجرا محاسبات هر عمل مربوط به یادگیری ماشین، نیازمند نوعی شبکه عصبی عمیق است. دو مدلی که بیش از همه مورد استفاده قرار میگیرند، «شبکه عصبی پیچشی» (Convolutional Neural Network | CNN) و «شبکه عصبی بازگشتی» (Recurrent Neural Network | RNN) نام دارند. همچنین عمده کاربرد شبکههای عصبی پیچشی در پروژههای پردازش تصویر و بینایی کامپیوتر خلاصه میشود.
در این شبکهها، بهجای اجرا عملیاتهای معمول ماتریسی در لایههای پنهان، از عملیات کانولوشن استفاده میشود. از این طریق قابلیت مقیاسپذیری شبکه افزایش یافته و نتایج موثر و دقیقتری بهدست میآید. به عنوان مثال حجم دادهها و تصاویر قابل محاسبه در کاربردهایی همچون دستهبندی تصاویر و تشخیص اشیاء بالا بوده و شبکههای عصبی پیچشی (CNN) راهکار مناسبی برای این موضوع ارائه میدهند.
اما در دیگر مسائل بهویژه پردازش زبان طبیعی یا NLP این شبکههای عصبی بازگشتی (RNN) هستند که بسیار کاربرد دارند. از جمله انواع محبوب این شبکهها، «حافظه طولانی کوتاه مدت» (Long Short Term Memory | LSTM) است که در پروژههایی مانند ترجمه ماشینی، دستهبندی متون و بازشناسی گفتار از آن استفاده میشود. این قبیل از شبکههای عصبی برای کسب عملکرد بهینه، اطلاعات مهم و اساسی را مرتب و از گرههای ابتدایی به لایههای بعدی انتقال میدهند.
شبکههای عصبی و یادگیری عمیق مفاهیم مهمی در زمینه هوش مصنوعی هستند. در واقع، یادگیری عمیق زیرمجموعهای از شبکههای عصبی است که بر استفاده از شبکههایی با لایههای متعدد تمرکز دارد. این معماریهای پیچیده به الگوریتمها اجازه میدهند تا ویژگیهای سطح بالاتر را از دادههای خام استخراج کنند و عملکرد بالایی به نمایش بگذارند. همانطور که در این مطلب خواندیم، زبان برنامهنویسی پایتون نقشی حیاتی در توسعه و پیادهسازی مدلهای یادگیری عمیق ایفا میکند. به همین منظور، پلتفرم فرادرس دورههای آموزشی جامعی را از مفاههیم پایه تا کاربردی تهیه کرده است که مشاهده آنها را از طریق لینکهای زیر به شما پیشنهاد میکنیم:
- فیلم آموزش مبانی یادگیری عمیق فرادرس
- فیلم آموزش رایگان دیپ لرنینگ فرادرس
- فیلم آموزش یادگیری عمیق در پایتون فرادرس
چالش های شبکه عصبی عمیق چیست؟
در این مطلب به نحوه طراحی و ایجاد شبکههای عصبی عمیق با فریمورک TensorFlow اشاره داشتیم. با این حال استفاده از شبکههای عصبی در پروژههای مختلف با چالشهای خاصی همراه است که هر توسعهدهنده باید از آنها مطلع باشد. در ادامه این بخش، تعدادی از این چالشها را معرفی میکنیم.
دسترسی به داده ها
داده از جمله مهمترین پیشنیازها در یادگیری عمیق است. جزئی که وجود آن برای ایجاد یک مدل دقیق و کارآمد ضرورت دارد. در بسیاری از موارد و برای جلوگیری از وقوع مشکلاتی همچون بیشبرازش، شبکههای عصبی عمیق نیازمند حجم گستردهای از دادهها هستند. برای مثال در کاربرد تشخیص اشیاء و برای کسب دقت بالا به دادههای زیادی نیاز است. در حالی که از تکنیکهای دادهافزایی به عنوان راهحلی سریع برای این قبیل از مشکلات یاد میشود، همچنان امکان دسترسی به دادههای حقیقی بیشترین اهمیت را دارد.
منابع محاسباتی
علاوهبر دسترسی به دادههای فراوان، باید هزینه محاسباتی بالا شبکههای عصبی را نیز در نظر گرفت. به عنوان مثال، مدلی مانند GPT-3 از ۱۷۵ میلیارد پارامتر تشکیل شده است. آموزش دادن مدلهای یادگیری عمیق برای کاربردهای پیچیده، به واحدهای پردازش گرافیکی (GPUs) توانمندی نیاز دارد. برای آموزش این مدلها پیشنهاد میشود بهجای CPU از پردازندههایی مانند GPU و TPU استفاده شود. باید توجه داشت که هر چه پروژه پیچیدهتر باشد به منابع محاسباتی بیشتری نیاز است.
مشکلات آموزش
امکان دارد مدل در طول فرایند آموزش با مشکلاتی چون کمبرازش یا بیشبرازش مواجه شود. مشکل کمبرازش زمانی پیش میآید که دادههای کمی در دسترس باشند و از طرف دیگر، اگر مدل بیش از حد به مجموعه آموزشی وابسته شود و قادر به تشخیص دادههای جدید نباشد، میگوییم بیشبرازش شده است. در نتیجه دقت آموزش بالا بوده اما دقت آزمون پایین است و نتایج قابل قبولی بهدست نمیآیند.
جمعبندی
شبکههای عصبی عمیق ابزار موثر و کارآمدی برای حل بسیاری از مسائل و پروژههای حوزه هوش مصنوعی از جمله پردازش تصویر و پردازش زبان طبیعی محسوب میشوند. در این مطلب از مجله فرادرس یاد گرفتیم شبکه عصبی عمیق چیست و با طرز کار و پیادهسازی آن به زبان ساده آشنا شدیم. علاوهبر مباحث عنوان شده در این مطلب، بسیار مهم است که طراحان و توسعهدهندگان یادگیری ماشین خود را با آخرین تغییر و تحولات بهروز نگه دارند. زیرا ممکن است مدلهای پرطرفدار حال حاضر، در آینده کاربردی نداشته باشند و گزینههای بهتری در دسترس قرار بگیرند.