مقدمه آموزش یادگیری عمیق با پایتون
هوش مصنوعی یکی از جذابترین موضوعات در زمینه ساختن آینده بشر است و تلاشهای زیادی صورت گرفته تا با استفاده از هوش مصنوعی، زندگی راحت و با آگاهی، برای انسانها به وجود آید. در این میان استفاده از الگوریتمهای متنوع یادگیری ماشین، برای درک مسائل و حل و فصل آنها به پیشرفت در زمینههای مختلف کمک کرده است. پس درک کامل این الگوریتمها برای پیشرفت و یا خلق ایدههای جدید و جذاب لازم و ضروری است.
باید بدانیم یادگیری ماشین زیر مجموعه هوش مصنوعی است و مفاهیم استفاده شده در یادگیری ماشین ارتباط مستقیمی با هوش مصنوعی دارد. اول از همه اجازه دهید توضیح مختصری در مورد یادگیری ماشین داشته باشیم تا در ادامه، به بحث اصلی یعنی یادگیری عمیق با پایتون بپردازیم.
یادگیری ماشین
یادگیری عمیق Deep Learning نوعی از یادگیری ماشین Machine Learning است که روشی را که انسانها برای بهدست آوردن دانش خاصی بکار میبرند را تقلید میکند. در طی سالهای گذشته، مدل یادگیری عمیق در مقایسه با مدلهای استانداردی که در این زمینه وجود دارند محبوبتر شده است. اگر بخواهیم یادگیری عمیق را با مدلهای سنتی و قدیمی مقایسه کنیم باید گفت الگوریتمهای سنتی خطی هستند اما مدلهای یادگیری عمیق، (عموماً شبکههای عصبی) قابل استفاده برای مسائل غیر خطی هستند. حالا ببینیم شبکههای عصبی چه نوعی از شبکهها هستند.
شبکه های عصبی
شبکههای عصبی مبتنی بر مجموع عصبهای متصل به هم هستند. دقیقاً مانند سیناپسهای مغز، میتوانند سیگنالها را به دیگر اعصاب انتقال دهند. بنابراین میتوانند مانند سلولهای مغز بههمپیوسته عمل کنند. شبکههای عصبی قادر هستند یاد بگیرند و شبیه یک انسان تصمیمگیری کنند.
امروزه استفاده از مدلهای یادگیری عمیق بسیار محبوب است بهطوری که بیشتر شرکتها بدون اینکه درک درستی از یادگیری عمیق داشته باشند از آن استفاده میکنند. اغلب دانشمندان داده در ابتدا مجبور هستند این الگوریتمهای پیچیده را برای کسبوکار سادهسازی کنند، سپس نتایج مدلها را توضیح داده و توجیه کنند، که این کار همیشه در مورد شبکههای عصبی کار سادهای نیست.
در ادامه آموزش، به مبحث اصلی خودمان یعنی آموزش یادگیری عمیق با پایتون خواهیم پرداخت. اگر در مورد شبکه عصبی اطلاعات کمی دارید، میتوانید از آموزش جامع فرادرس در این زمینه که توسط استاد کلامی ارائه شده است، استفاده کنید.
آموزش یادگیری عمیق با پایتون به همراه کدهای کاربردی
در این قسمت از آموزش یادگیری عمیق با پایتون، کدهای کاربردی از پایتون را ارائه خواهیم کرد که میتواند بهراحتی بر روی هر مسئلهای اعمال شود (فقط کافی است کپی، paste کرده و اجرا کنید) در ادامه آموزش به مباحث زیر میپردازیم:
- تنظیم و راهاندازی Tensorflow
- تجزیه شبکههای عصبی مصنوعی، ورودی، خروجی، لایههای پنهان، توابع فعالسازی
- یادگیری عمیق با شبکههای عصبی عمیق
- طراحی مدل با tensorflow/ keras
- تجسم شبکههای عصبی با پایتون
- توضیح با شکل
- تنظیمات و راهاندازی نهایی
برای مطالعه بیشتر در زمینه یادگیری عمیق می توانید از فایل مرتبط با این زمینه بهره بگیرید.
کتابخانه های لازم در ساخت شبکه های عصبی
برای ساخت شبکههای عصبی دو کتابخانه اصلی وجود دارد:
- کتابخانه tensoreflow (توسط گوگل ساختهشده است)
- کتابخانه pytorch (توسط فیس بوک ساختهشده است)
هر دو کتابخانه میتوانند وظایف مشابهی را انجام دهند. کتابخانه tensoreflow کمی مشهورتر است و برای تولید مدل، روش آسانتر و آمادهای را ارائه میکند درحالیکه کتابخانه pytorch برای ساخت نمونههای اولیه سریع، بهتر است.
این دو کتابخانه در بین جامعه برنامه نویسان و مشاغل، محبوب هستند. چون میتوانند از قدرت پردازندههای گرافیکی NVIDIA استفاده کنند و این امر برای پردازش مجموعه دادههای بزرگ (Big Data) مانند مجموعههای متنی یا تصاویر بسیار مفید و گاهی ضروری است. در ادامه برای داشتن ارائهای جذاب و مخاطب پسند، فایلهای آمادهای درباره این دو کتابخانه طراحی و تدوین شده که مطالعه آنها خالی از لطف نخواهد بود.
- پاورپوینت کتابخانه تنسورفلو (TensorFlow) —کلیک کنید.
- پاورپوینت کتابخانه پای تورچ (PyTorch) — کلیک کنید.
در این مقاله برای یادگیری عمیق با Python، قصد داریم از TensorFlow/ Keras استفاده کنیم، یک ماژول سطح بالا از TensorFlow که بسیار کاربرپسندتر از خود TensorFlow است.
نصب TensorFlow
اولین مرحله نصب TensorFlow از طریق ترمینال است، با کد زیر این کار را انجام میدهیم:
pip install tensorflow
اگر میخواهید از پشتیبانی GPU استفاده و آن را فعال کنید، میتوانید از سایتهای دیگر و رسمیتری این آموزش را تهیه یا اینکه از نوشته ما در ادامه استفاده کنید. بعد از راهاندازی، دستورات پایتون توسط دستگاه شما به CUDA ترجمه شده و توسط پردازندههای گرافیکی پردازش میشود. بنابراین مدلهای شما بهطور باورنکردنی سریعتر اجرا خواهند شد. اکنون میتوانیم ماژولهای اصلی TensorFlow Keras را در کامپیوتر خود وارد کرده و کد نویسی را شروع کنیم:
from tensorflow.keras import models, layers, utils, backend as k import matplotlib.pyplot as plt import shap
شبکه های عصبی مصنوعی
شبکه های عصبی مصنوعی ANN از لایههای ورودی، میانی و خروجی تشکیلشدهاند. هر لایه با تعدادی نورون (که گره هم نامیده میشود)، مشخص میشود. یک واحد محاسباتی، ورودیهای وزندار را از طریق یک تابع فعالساز (که به نورون کمک میکند تا روشن یا خاموش شود) به هم متصل میکند.
وزنها، مانند بسیاری از الگوریتمهای یادگیری ماشین، بهطور تصادفی مقداردهی اولیه و در طول آموزش بهینهسازی میشوند تا تابع loss را به حداقل برسانند. به طور کلی لایهها را میتوان بهصورت زیر دستهبندی کرد:
۱- لایه ورودی
لایه ورودی وظیفه دارد بردار ورودی را به شبکه عصبی منتقل کند. اگر ماتریسی از ۳ ویژگی داشته باشیم N X 3، این لایه ۳ عدد را بهعنوان ورودی میگیرد و همان ۳ عدد را به لایه بعدی ارسال میکند.
۲- لایه های مخفی
این لایهها گرههای میانی یا واسط را نشان میدهند. لایه های پنهان، چندین تغییر شکل را به صورت عددی اعمال میکنند تا دقت نتیجه نهایی را بهبود بخشند و ضمناً خروجی با تعداد نورونها تعریف میشود.
۳- لایه خروجی
لایه خروجی، خروجی نهایی شبکه عصبی را برمیگرداند. اگر در حال انجام یک طبقهبندی باینری یا رگرسیون ساده باشیم، لایه خروجی باید ۱ نورون داشته باشد (بهطوری که فقط ۱ عدد را برمیگرداند). در مورد یک طبقهبندی چند کلاسه با ۵ کلاس مختلف، لایه خروجی باید ۵ نورون داشته باشد.
جهت ارائه کاربردی در این زمینه میتوانید فایل آماده شبکه عصبی مصنوعی ANN را از لینک زیر مطالعه کنید.
سادهترین شکل شبکه عصبی مصنوعی، PERCEPTRON است، مدلی که فقط یک لایه دارد و بسیار شبیه به مدل رگرسیون خطی است. اینکه در یک پرسپترون چه اتفاقی میافتد معادل است بااینکه سؤال کنیم در یک گره از یک شبکه عصبی چندلایه، چه اتفاقی میافتد. اجازه دهید این مورد را تجزیه کنیم.
فرض کنید مجموعه دادهای از N ردیف، ۳ ویژگی و ۱ متغیر هدف داریم (یعنی باینری ۱/۰):
اعدادی بین ۰ و ۱ قراردادیم (دادهها همیشه باید قبل از اینکه وارد شبکه عصبی شوند باید درجهبندی شوند)
درست مانند هر مورداستفاده دیگر از یادگیری ماشین، قصد داریم مدلی را برای پیشبینی هدف با استفاده از ویژگیها بهصورت ردیف به ردیف آموزش دهیم. پس با ردیف اول شروع میکنیم:
در ادامه آموزش یادگیری عمیق با پایتون به بحث آموزش مدل می رسیم.”آموزش یک مدل” به چه معناست؟ آموزش مدل یعنی جستجوی بهترین پارامترها در یک فرمول ریاضی که خطای پیشبینیها را به حداقل میرساند. در مدلهای رگرسیون (یعنی رگرسیون خطی) باید بهترین وزنها را پیدا کنید، در مدلهای مبتنی بر درخت (یعنی جنگل تصادفی) به دنبال یافتن بهترین نقاط تقسیم هستیم.
معمولاً وزنها بهطور تصادفی مقداردهی اولیه میشوند و با جلو رفتن یادگیری تنظیم میشوند. در اینجا همه آنها را با عدد ۱ تنظیم میکنیم:
تا اینجا کاری متفاوت از رگرسیون خطی انجام ندادهایم. اکنون یک ارتقاء از مدل خطی Σ(Xi*Wi)=Y به یک مدل غیرخطی F(Σ(Xi*Wi))=Y داریم. تابع فعالسازی (ACTIVATION) را وارد میکنیم.
تابع فعالسازی، خروجی گره را مشخص میکند. تعداد زیادی از توابع فعال سازی وجود دارند و حتی میتوان برخی از توابع سفارشی را ایجاد کرد، اگر یک تابع خطی ساده را در مثال خود تنظیم کنیم، میبینیم که هیچ تفاوتی با مدل رگرسیون خطی نخواهد داشت.
ما باید از یک تابع فعالسازی استپ باینری استفاده کنیم که فقط ۱ یا ۰ را برمیگرداند:
ما خروجی پرسپترون خود را داریم، یک شبکه عصبی تک لایه که برخی از ورودیها را میگیرد و ۱ خروجی را برمیگرداند. در ادامه آموزش مدل با مقایسه خروجی با هدف، محاسبه خطا و بهینهسازی وزنها، تکرار مجدد کل فرآیند ادامه مییابد. ما در ادامه بحث آموزش یادگیری عمیق با پایتون فایل پاورپوینت پرسپترون چندلایه را داریم که میتوانید جهت داشتن ارائهای جذاب مطالعه کنید.
شبکه های عصبی عمیق در آموزش یادگیری عمیق با پایتون
میتوان گفت که همه مدلهای یادگیری عمیق، شبکههای عصبی هستند اما همه شبکههای عصبی مدلهای یادگیری عمیق نیستند. بهطورکلی، یادگیری “عمیق” زمانی اعمال میشود که الگوریتم حداقل ۲ لایه پنهان داشته باشد (بنابراین درمجموع ۴ لایه همراه با دو لایه ورودی و خروجی).
تصور کنید که فرآیند وزن دهی به نورونها را ۳ بار بهطور همزمان تکرار کنیم، ازآنجاییکه هر گره (مجموع وزنها و تابع فعالسازی) یک مقدار را برمیگرداند، اولین لایه پنهان با ۳ خروجی را خواهیم داشت.
حالا بیایید دوباره این کار را با استفاده از آن ۳ خروجی قبلی بهعنوان ورودی لایه پنهان دوم انجام دهیم، که ۳ عدد جدید را برمیگرداند. درنهایت، یک لایه خروجی (فقط ۱ گره) اضافه میکنیم تا پیشبینی نهایی مدل خود را بهدست آوریم.
توجه کنید که که لایهها میتوانند تعداد نورونها و عملکرد فعالسازی متفاوتی داشته باشند و در هر گره، وزنها برای بهینهسازی نتیجه نهایی، آموزش داده میشوند. به همین دلیل است که هر چه لایههای بیشتری اضافه کنید، تعداد پارامترهای قابلآموزش بیشتر میشود. در لینک زیر نمونهای از سورس کد شبکه عصبی را جهت مطالعه و آموزش بیشتر شما عزیزان قراردادهایم در صورت تمایل میتوانید نگاهی به این فایل داشته باشید.
طراحی مدل در آموزش یادگیری عمیق با پایتون
برای آموزش یادگیری عمیق با پایتون، سادهترین راه برای ساخت شبکه عصبی، استفاده از کتابخانه TensorFlow و کلاس Sequential Keras است. اجازه دهید از کلاس Keras برای ساختن Perceptron از مثالی که قبلا زدیم، استفاده کنیم. پس تا الان، مدلی با یک لایه متراکم داریم. این لایه اساسیترین لایه است چون تمام ورودیهای خود را به همه نورونها انتقال میدهد و هر نورون یک خروجی ارائه میدهد.
model = models.Sequential(name="Perceptron", layers=[ layers.Dense( #a fully connected layer name="dense", input_dim=3, #with 3 features as the input units=1, #and 1 node because we want 1 output activation='linear' #f(x)=x ) ]) model.summary()
تابع Dense تصویری از ساختار و اندازه (ازنظر پارامترهای آموزش) ارائه میدهد. در این مورد، ما فقط (۳ وزن و ۱ bias) داریم، بنابراین بسیار ساده است.
اگر میخواهید از یک تابع فعالسازی استفاده کنید که قبلاً در Keras گنجانده نشده است، مانند تابع step باینری که در مثال تصویری نشان دادیم، باید از TensorFlow خام استفاده کنید:
# define the function import tensorflow as tf def binary_step_activation(x): ##return 1 if x>0 else 0 return K.switch(x>0, tf.math.divide(x,x), tf.math.multiply(x,0)) # build the model model = models.Sequential(name="Perceptron", layers=[ layers.Dense( name="dense", input_dim=3, units=1, activation=binary_step_activation ) ])
اکنون بیایید سعی کنیم از پرسپترون به یک شبکه عصبی عمیق حرکت کنیم. احتمالاً سؤالاتی برایتان پیش می آید:
سؤال اولی که ممکن است برایتان پیش بیاید این است که باید از چندلایه استفاده کنیم؟ پاسخ درست این است که “انواع مختلف لایه ها را امتحان کنید و ببینید کدام یک بهتر عمل می کند”. معمولاً با ۲ لایه پنهان متراکم با Dropout کار میکنیم، تکنیکی که با تنظیم تصادفی ورودیها روی ۰، برازش اضافی را کاهش میدهد. لایههای پنهان برای غلبه بر غیرخطی بودن دادهها مفید هستند، بنابراین اگر به غیرخطی بودن نیاز ندارید، میتوانید از آن اجتناب کنید. لایههای پنهان زیاد باعث برازش بیشازحد میشود.
سوال دومی که ممکن است از خودتان بپرسید این است که چند نورون لازم است؟ تعداد نورونهای لایه پنهان باید بین اندازه لایه ورودی و اندازه لایه خروجی باشد. قانون کلی که ما استفاده کردیم این است (تعداد ورودی + ۱ خروجی)/۲.
سؤال سوم این میتواند باشد که چه تابع فعالسازی استفاده کنیم؟ در اینجا تعداد زیادی تابع وجود دارد و نمیتوانیم بگوییم که یکی از آنها کاملاً بهتر است. بههرحال، پرکاربردترین تابع ReLU است، یک تابع خطی تکهتکه که خروجی را تنها در صورت مثبت بودن برمیگرداند و بیشتر اوقات برای لایههای مخفی استفاده میشود.
علاوه بر این، لایه خروجی باید دارای یک فعالسازی سازگار با خروجی مورد انتظار باشد. بهعنوانمثال، تابع خطی برای مسائل رگرسیون مناسب است درحالیکه Sigmoid اغلب برای دسته بندی استفاده میشود.
یک مجموعه داده ورودی از N ویژگی و ۱ متغیر هدف باینری را فرض میکنیم:
n_features = 10 model = models.Sequential(name="DeepNN", layers=[ ### hidden layer 1 layers.Dense(name="h1", input_dim=n_features, units=int(round((n_features+1)/2)), activation='relu'), layers.Dropout(name="drop1", rate=0.2), ### hidden layer 2 layers.Dense(name="h2", units=int(round((n_features+1)/4)), activation='relu'), layers.Dropout(name="drop2", rate=0.2), ### layer output layers.Dense(name="output", units=1, activation='sigmoid') ]) model.summary()
توجه داشته باشید که کلاس Sequential تنها راه برای ساختن شبکه عصبی با Keras نیست. کلاس Model انعطاف و کنترل بیشتری روی لایهها میدهد و میتوان از آن برای ساخت مدلهای پیچیدهتر با ورودی/خروجیهای متعدد استفاده کرد. دو تفاوت عمده وجود دارد:
- در کلاس model لایه ورودی باید مشخص شود درحالیکه در کلاس Sequential در بعد ورودی اولین لایه متراکم ذکرشده است.
- لایهها مانند اشیا ذخیره میشوند و میتوانند روی خروجیهای لایههای دیگر مانند: خروجی = لایه (…) (ورودی) اعمال شوند.
به این صورت میتوانید از کلاس Model برای ساخت Perceptron و DeepNN خود استفاده کنید:
# Perceptron inputs = layers.Input(name="input", shape=(3,)) outputs = layers.Dense(name="output", units=1, activation='linear')(inputs) model = models.Model(inputs=inputs, outputs=outputs, name="Perceptron") # DeepNN ### layer input inputs = layers.Input(name="input", shape=(n_features,)) ### hidden layer 1 h1 = layers.Dense(name="h1", units=int(round((n_features+1)/2)), activation='relu')(inputs) h1 = layers.Dropout(name="drop1", rate=0.2)(h1) ### hidden layer 2 h2 = layers.Dense(name="h2", units=int(round((n_features+1)/4)), activation='relu')(h1) h2 = layers.Dropout(name="drop2", rate=0.2)(h2) ### layer output outputs = layers.Dense(name="output", units=1, activation='sigmoid')(h2) model = models.Model(inputs=inputs, outputs=outputs, name="DeepNN")
همیشه میتوان بررسی کرد که آیا تعداد پارامترها در Model با تعداد پارامتر در Sequential یکسان است یا خیر. تا این قسمت از آموزش با برخی از اصطلاحات و موارد مهم و روش یادگیری عمیق آشنا شدید برای یادگیری کامل و به صورت تخصصی نیز می توانید از آموزش یادگیری عمیق با پایتون فرادرس و هم از فایل آماده پاورپونت کراس مجموعه پی استور جهت ارائه خود استفاده کنید.
- آموزش یادگیری عمیق با پایتون – تنسورفلو و کراس TensorFlow و Keras — کلیک کنید
- پاورپوینت کتابخانه یادگیری عمیق کرس (Keras) — کلیک کنید.
سخن آخر در مورد آموزش یادگیری عمیق با پایتون
در این مقاله آموزشی در مورد آموزش یادگیری عمیق با پایتون برای نشان دادن نحوه طراحی و ساخت شبکههای عصبی مصنوعی، عمیق و غیر عمیق صحبت شد. در طول آموزش سعی کردیم بصورت گامبهگام آنچه را که در داخل یک نورون و بهطورکلی در داخل لایهها اتفاق میافتد، تجزیه کنیم.
در قسمت دوم آموزش، از TensorFlow برای ایجاد چند شبکه عصبی، از Perceptron گرفته تا شبکه پیچیدهتر استفاده کردیم. سپس، مدل یادگیری عمیق را آموزش دادیم. در ادامه می توانید در وقت مناسب از مقاله آموزش پایتون پیشرفته نیز برای یادگیری استفاده کنید. از این که تا انتها با ما همراه بودید سپاسگزاریم.