مقدمه مقاله انواع شبکه عصبی
شبکههای عصبی زیرمجموعهای از روشها و الگوریتم های یادگیری ماشین هستند که دادهها و الگوها را به روشی متفاوت با استفاده از نورونها و لایههای پنهان یاد میگیرند. شبکههای عصبی بهدلیل ساختار پیچیدهشان بسیار قدرتمند و پرکاربرد هستند و میتوانند در مسائلی که الگوریتمهای یادگیری ماشین سنتی قدرت کامل را ندارند، استفاده شوند.
شبکههای عصبی بیانگر یادگیری عمیق Deep Learning با استفاده از هوش مصنوعی Artificial Intelligence هستند. معماریهای مختلف شبکههای عصبی بهطور خاص برای کار بر روی انواع خاصی از دادهها یا دامنه طراحی شدهاند. در این مقاله از ابتداییترین نوع شبکه عصبی شروع میکنیم و به سمت موارد پیچیدهتر خواهیم رفت.
شبکه عصبی چیست؟
شبکههای عصبی مصنوعی از نورونهای بیولوژیکی در بدن انسان الهام گرفته شدهاند که تحت شرایط خاصی فعال میشوند و در نتیجه عمل مرتبطی انجام میشود. شبکههای عصبی مصنوعی از لایههای مختلفی از نورونهای مصنوعی به هم پیوسته تشکیل شدهاند که با توابع فعالسازی تغذیه میشوند که به روشن/خاموش کردن آنها کمک میکند.
بهطور خلاصه، هر نورون یک نسخه ضربشده از ورودیها (Inputs) و وزنهای (Weights) تصادفی دریافت میکند که با یک مقدار بایاس (bias) استاتیک (که برای هر لایه نورون منحصر به فرد است) اضافه میشود. سپس به یک تابع فعال سازی (Activation Function) مناسب منتقل میشود که مقدار نهایی را که باید از نورون داده شود، تعیین میکند. بر اساس ماهیت مقادیر ورودی، توابع فعال سازی مختلفی وجود دارد.
هنگامی که خروجی (Output) از لایه شبکه عصبی نهایی تولید میشود، تابع تلفات (Loss Function) یا خطا (ورودی در مقابل خروجی) محاسبه میشود و پس انتشار (Backpropagation) طوری انجام میشود که وزنها برای حداقل خطا تنظیم شوند. یافتن مقادیر بهینه وزنها در شبکه عصبی همان چیزی است که عملیات کلی روی آن متمرکز است. برای درک بهتر میتوانیم شکل زیر را در نظر بگیریم.
- وزنها (Weights): وزنها مقادیر عددی هستند که در ورودیها ضرب میشوند. به عبارت ساده، وزنها مقادیری هستند که از طریق شبکههای عصبی توسط ماشین یاد میشوند. وزنها بسته به تفاوت بین خروجیهای پیش بینی شده در مقابل ورودیهای آموزشی خود تنظیم میشوند.
- تابع فعال سازی (Activation Function): تابع فعال سازی یک فرمول ریاضی است که به نورون کمک میکند تا روشن یا خاموش شود.
- لایه ورودی (Input layer): لایه ورودی ابعاد بردار ورودی را نشان میدهد.
- لایه پنهان (Hidden layer): لایه پنهان نشان دهنده گرههای واسطهای است که فضای ورودی را به مناطقی با مرزهای (نرم) تقسیم میکنند. مجموعهای از ورودی وزن دار را میگیرد و از طریق یک تابع فعال سازی خروجی تولید میکند.
- لایه خروجی (Output layer): لایه خروجی نشان دهنده خروجی شبکه عصبی است.
برای مطالعه بیشتر و دقیقتر در حوزه انواع لایههای شبکه عصبی مصنوعی؛ نگاهی به فایل آماده موجود در سایت پی استور بیندازید.
انواع شبکه عصبی مصنوعی
در حال حاضر انواع مختلفی از شبکههای عصبی وجود دارند و یا ممکن است در مرحله توسعه باشند. شبکههای عصبی را میتوان بسته به ساختار، جریان داده، نورونهای مورد استفاده و چگالی آنها، لایهها و فیلترهای فعال سازی و غیره طبقه بندی کرد. در این بخش ۲۷ نوع از انواع شبکه عصبی مشهور آماده شده که هر کدام از آنها به اختصار توضیح داده خواهد شد.
۱- شبکه عصبی پرسپترون Perceptron از انواع شبکه عصبی
شبکه عصبی پرسپترون (Perceptron) یکی از ابتداییترین و سادهترین انواع شبکههای عصبی است که برای حل مسائل دستهبندی Classification استفاده میشود. این شبکه از یک یا چند نرون پرسپترون تشکیل شده است که وظیفه تصمیمگیری بر اساس ورودیها را بر عهده دارند.
هر نورون پرسپترون در واقع یک واحد تصمیمگیری است که شامل دو مؤلفه اصلی، وزنها و تابع فعالسازی است. وزنها وظیفه تاثیرگذاری وزن داده شده به ورودیها را دارند و تابع فعالسازی، بر اساس مقدار وزنها و ورودیها، تصمیم نهایی را اعلام میکند.
معماری شبکه عصبی پرسپترون به سادگی میتواند شامل یک یا چند نرون پرسپترون باشد. این نرونها میتوانند به صورت تکلایه یا چندلایه باشند. با استفاده از مجموعهی آموزشی و تنظیم وزنها، شبکه عصبی پرسپترون میتواند به طور خودکار الگوهای موجود در دادهها را شناسایی و دستهبندی کند.
شبکه عصبی پرسپترون در مسائل سادهتری که قابل جداسازی خطی دادهها است، میتواند مفید باشد. بهعنوان مثال، در مسئله تشخیص دو دستهی دادههای دو بعدی که با یک خط قابل جداسازی هستند، شبکه عصبی پرسپترون قادر به تشخیص و دستهبندی صحیح است.
معمولاً در پرسپترون، از توابع فعالسازی نمایی یا سیگموئید استفاده میشود که بازهی خروجی آنها محدود به یک بازه مشخص است. برای آموزش پارامترهای شبکه، از روشهایی مانند الگوریتم گرادیان کاهشی (Gradient Descent) استفاده میشود. با توجه به سادگی و قدرت محاسباتی پرسپترون، معمولاً برای مسائل ساده و خطی به کار میرود و به عنوان یک الگوریتم یادگیری ماشین محسوب میشود. اما در مسائل پیچیدهتر و غیرخطی، معماریهای پیشرفتهتری از شبکههای عصبی مانند شبکههای عصبی عمیق (Deep Neural Networks) استفاده میشود.
نورون پردازش جمع کردن مقادیر ورودی را با وزن آنها انجام می دهد. سپس مجموع حاصل به تابع فعال سازی ارسال میشود تا یک خروجی باینری تولید کند. میتوان یک مثال ساده از استفاده از شبکه عصبی پرسپترون در MATLAB برای دستهبندی دادهها را در اینجا مشاهده کنیم. توجه داشته باشید که این تنها یک مثال ساده است و برای مسائل پیچیدهتر نیاز به تعریف معماری و پارامترهای مناسب دارید.
% تعریف دادههای آموزشی X = [0 0; 0 1; 1 0; 1 1]; % ورودیها Y = [0; 0; 0; 1]; % خروجیها % تعریف شبکه عصبی پرسپترون net = perceptron; net = train(net, X', Y'); % تست شبکه با داده جدید input = [0.5 0.5]; output = net(input'); % نمایش خروجی disp(output);
در این مثال، ابتدا دادههای آموزشی را تعریف میکنیم (ورودیها و خروجیها)، سپس یک شبکه عصبی پرسپترون با استفاده از تابع perceptron
ایجاد میکنیم. سپس با استفاده از تابع train
، شبکه را با دادههای آموزشی، آموزش میدهیم. در نهایت، با استفاده از شبکه آموزش دیده، یک نمونه جدید را تست کرده و خروجی را دریافت میکنیم. در این مثال، خروجی شبکه در صورتی که ورودی [۰.۵ ۰.۵] باشد نمایش داده میشود.
چنانچه در زمینه انواع شبکه عصبی مصنوعی ارائهای کلاسی خواهید داشت؛ فایل آماده ذیل میتواند منبعی جامع و کامل برای شما عزیزان باشد.
۲- شبکه عصبی پیش خور Feed Forward
شبکه عصبی پیش خور (Feed Forward) یکی از انواع شبکههای عصبی است که در آن اطلاعات به یک سمت (از لایه ورودی به لایه خروجی) جریان دارند، بدون وجود هرگونه فیدبک (یعنی ارتباط برگشتی). این نوع شبکه عصبی در بسیاری از برنامهها و وظایف ماشینی استفاده میشود.
شبکه عصبی پیش خور بهعنوان یکی از انواع شبکه عصبی؛ با ترکیب تعدادی لایه مخفی و یک لایه خروجی عمل میکند. هر لایه مخفی شامل تعدادی نرون است که وظیفه پردازش ویژگیهای ورودی را بر عهده دارند. اطلاعات از لایه ورودی به لایههای مخفی جریان میکنند و در هر لایه مخفی، عملیاتی انجام میشود تا با استفاده از وزنها و توابع فعالسازی، نمایشی از ورودی به دست آید. در نهایت، خروجی نهایی از لایه خروجی استخراج میشود.
شبکه عصبی پیش خور Feed Forward به عنوان یک مدل یادگیری ماشینی قوی استفاده میشود. با تنظیم وزنها و پارامترهای شبکه، میتوان الگوهای پیچیده را در دادهها شناسایی و پیشبینی کرد. این نوع شبکه عصبی در حوزه تشخیص الگو، پردازش تصویر، ترجمه ماشینی، پیشبینی محتوا و بسیاری از وظایف دیگر استفاده میشود.
برای استفاده از شبکه عصبی پیش خور، ابتدا باید معماری شبکه را تعریف کرده و سپس آن را با دادههای آموزشی آموزش داد تا بتواند در وظایف مورد نظر به خوبی عمل کند. همچنین، توجه به تنظیم پارامترها و الگوریتمهای بهینهسازی نیز برای دستیابی به عملکرد بهتر شبکه ضروری است.
% تعریف دادههای آموزشی X = [0 0; 0 1; 1 0; 1 1]; % ورودیها Y = [0; 1; 1; 0]; % خروجیها % تعریف معماری شبکه net = feedforwardnet(3); % شبکه عصبی پیش خور با یک لایه مخفی شامل ۱۰ نرون % آموزش شبکه net = train(net, X', Y'); % تست شبکه با داده جدید input = [0.5 0.5]; output = net(input'); % نمایش خروجی disp(output);
در این مثال، ابتدا دادههای آموزشی را تعریف میکنیم (ورودیها و خروجیها)، سپس یک شبکه عصبی پیش خور با استفاده از تابع feedforwardnet
ایجاد میکنیم. سپس با استفاده از تابع train
، شبکه را با دادههای آموزشی، آموزش میدهیم. در نهایت، با استفاده از شبکه آموزش دیده، یک نمونه جدید را تست کرده و خروجی را دریافت میکنیم.
۳- شبکه عصبی شعاعی پایه Radial Basis Networks
شبکههای عصبی شعاعی پایه (Radial Basis Network | RBF) در واقع شبکههای عصبی پیشخوری (FF) هستند که از تابع شعاعی پایه (Radial Basis Function)، به جای تابع لجستیک (Logistic Function)، بهعنوان تابع فعالسازی استفاده میکنند. شکل زیر نمایش بلوکی این نوع از شبکه عصبی را نشان میدهد.
تابع لجستیک برخی از مقادیر دلخواه را به یک بازه ۰ تا ۱ نگاشت میکند تا به یک پرسش (بله یا خیر) پاسخ دهد. این نوع از شبکههای عصبی برای Classification و سیستمهای تصمیمگیری (Decision Making Systems) مناسب هستند ولی برای مقادیر پیوسته عملکرد خوبی ندارند. این در حالی است که توابع شعاعی پایه به این پرسش پاسخ میدهند که «چقدر از هدف دوریم؟» و این امر موجب میشود تا این شبکههای عصبی برای تخمین تابع و کنترل ماشین مناسب محسوب شوند. بهطور خلاصه باید گفت که شبکههای عصبی شعاعی پایه در واقع نوعی از شبکههای عصبی پیشخور با تابع فعالسازی و ویژگیهای متفاوت هستند.
نمونه کد متلب برای ساخت یک شبکه عصبی شعاعی (RBF) به شکل زیر است:
% تعریف دادههای آموزش x_train = [0 0; 1 0; 0 1; 1 1]; y_train = [0; 1; 1; 0]; % تعداد نورونهای شعاعی num_neurons = 4; % آموزش شبکه عصبی شعاعی net = newrb(x_train', y_train', 0, 1, num_neurons); % تست شبکه با دادههای تست x_test = [0.5 0.5; 0.2 0.8]; y_pred = sim(net, x_test'); % نمایش نتایج disp('پیشبینیها:'); disp(y_pred');
در این کد، ابتدا دادههای آموزش (x_train و y_train) تعریف شدهاند. سپس یک شبکه عصبی شعاعی با تعداد نورونهای مشخص (num_neurons) ایجاد میشود. در این مثال، تعداد نورونها بهصورت دستی به ۴ تنظیم شده است. سپس شبکه با استفاده از دادههای آموزشی، آموزش داده میشود. در نهایت، با استفاده از دادههای تست (x_test)، شبکه عصبی پیشبینی میکند و نتایج را نمایش میدهد. توجه داشته باشید که این یک مثال ساده است و ممکن است نیاز به تنظیمات بیشتری داشته باشد تا بهترین عملکرد را داشته باشد.
۴- شبکه عصبی پیشخور عمیق Deep Feed Forward Neural Networks یکی از انواع شبکه عصبی
شبکه عصبی پیشخور عمیق (Deep Feed Forward Neural Networks | DFF)، در اوایل دهه ۹۰ میلادی، مقدمهای بر بحث شبکههای عصبی شد. این نوع از شبکههای عصبی نیز شبکههای عصبی پیشخور هستند، ولی بیش از یک لایه پنهان (Hidden Layer) دارند.
در هنگام آموزش دادن یک شبکه عصبی پیشخور، تنها بخش کوچکی از خطا به لایه پیشین پاس داده میشود. به همین دلیل، استفاده از لایههای بیشتر، منجر به رشد نمایی زمان آموزش میشود و همین موضوع، موجب میشود که شبکههای عصبی پیشخور عمیق، عملا بدون کاربرد و غیر عملی باشند. در اوایل سال دو هزار میلادی، رویکردهایی توسعه پیدا کردند که امکان آموزش دادن یک شبکه عصبی پیشخور عمیق (DFF) را بهصورت موثر فراهم میکردند.
امروزه، این شبکههای عصبی، هسته سیستمهای یادگیری ماشین مدرن را تشکیل میدهند و هدفی مشابه با هدف شبکههای عصبی پیشخور (FF) را پوشش میدهند؛ اما نتایج بهتری را دربردارند. در ادامه یک نمونه کد MATLAB برای ساخت یک شبکه عصبی پیشخور عمیق (Deep Feed Forward Neural Network) آورده شده است:
% تعریف دادههای آموزش x_train = [0 0; 1 0; 0 1; 1 1]; y_train = [0; 1; 1; 0]; % تعریف معماری شبکه عصبی layers = [ fullyConnectedLayer(10, 'Activation', 'relu') fullyConnectedLayer(1, 'Activation', 'sigmoid') ]; % تعریف تنظیمات آموزش options = trainingOptions('adam', ... 'MaxEpochs', 100, ... 'MiniBatchSize', 2, ... 'InitialLearnRate', 0.01, ... 'Plots', 'training-progress'); % ساخت شبکه عصبی net = trainNetwork(x_train', y_train', layers, options); % تست شبکه با دادههای تست x_test = [0.5 0.5; 0.2 0.8]; y_pred = predict(net, x_test'); % نمایش نتایج disp('پیشبینیها:'); disp(y_pred');
در این کد، ابتدا دادههای آموزش (x_train و y_train) تعریف شدهاند. سپس معماری شبکه عصبی با استفاده از دو لایه (یک لایه مخفی با ۱۰ نورون و یک لایه خروجی با ۱ نورون) مشخص شده است. در اینجا، از توابع فعالسازی ReLU برای لایه مخفی و sigmoid برای لایه خروجی استفاده شده است.
سپس تنظیمات آموزش مشخص شدهاند، و با استفاده از توابع trainNetwork
و trainingOptions
، شبکه آموزش داده میشود. در نهایت، با استفاده از دادههای تست (x_test)، شبکه عصبی پیشبینی میکند و نتایج را نمایش میدهد. لطفاً توجه داشته باشید که این یک مثال ساده است و ممکن است نیاز به تنظیمات بیشتری داشته باشد تا بهترین عملکرد را داشته باشد.
برای مطالعه بیشتر درباره زبان برنامه نویسی متلب؛ پاورپوینت موجود درباره این موضوع را مد نظر قرار دهید.
۵- شبکه عصبی بازگشتی Recurrent Neural Network
شبکه عصبی بازگشتی (Recurrent Neural Networks | RNN) نوع متفاوتی از سلولها با عنوان سلولهای بازگشتی (Recurrent Cells) را معرفی میکنند. اولین شبکه از این نوع، شبکه جردن (Jordan Network) است. در این نوع از شبکه، هر یک از سلولهای پنهان، خروجی خود را با تاخیر ثابت (یک یا تعداد بیشتری تکرار) دریافت میکنند.
پاس دادن حالت به گرههای ورودی (Input Nodes)، تأخیر متغیرها و دیگر موارد در شبکه های عصبی بازگشتی وجود دارد. این نوع از شبکههای عصبی اساسا هنگامی استفاده میشوند که زمینه (Context) مهم است و در واقع یعنی هنگامی که تصمیمگیریها از تکرارهای قبلی یا نمونهها، میتواند نمونههای کنونی را تحت تاثیر قرار دهد.
به عنوان مثالی متداول از این نوع از زمینهها، میتوان به متن (Text) اشاره کرد. در متن، یک کلمه را میتوان تنها در زمینه کلمه یا جمله پیشین تحلیل کرد. در ادامه یک نمونه کد MATLAB برای ساخت یک شبکه عصبی بازگشتی (Recurrent Neural Network – RNN) آورده شده است:
options = trainingOptions('adam', ... 'MaxEpochs', 100, ... 'MiniBatchSize', 1, ... 'InitialLearnRate', 0.01, ... 'Plots', 'training-progress'); % ساخت شبکه عصبی بازگشتی net = trainNetwork(x_train, y_train, layers, options); % تست شبکه با دادههای تست x_test = randn(5, 1, 1); y_pred = predict(net, x_test); % نمایش نتایج disp('پیشبینیها:'); disp(y_pred);
در این کد، ابتدا دادههای آموزش (x_train و y_train) تعریف شدهاند. سپس معماری یک شبکه عصبی بازگشتی با یک لایه LSTM (Long Short-Term Memory) و یک لایه خروجی به شکل توالی (sequence) مشخص شده است.
تنظیمات آموزش نیز با استفاده از تابع trainingOptions
تعیین شدهاند و با استفاده از توابع trainNetwork
و predict
، شبکه عصبی آموزش داده شده و سپس با دادههای تست پیشبینی انجام میشود.
۶- شبکه عصبی خود رمزگذار Auto Encoder
شبکههای عصبی خود رمزگذار (Auto Encoder | AE) برای دستهبندی، خوشهبندی (Clustering) و فشردهسازی ویژگیها (Feature Compression) استفاده میشوند. هنگامی که یک شبکه عصبی پیشخور برای دستهبندی آموزش داده میشود، باید نمونههای X در Y دسته به عنوان ورودی داده شوند و انتظار میرود یکی از سلولهای Y فعالسازی شده باشد. به این مورد، یادگیری نظارت شده (Supervised Learning) گفته میشود. از سوی دیگر، شبکههای عصبی خود رمزگذار را میتوان بدون نظارت، آموزش داد.
با توجه به ساختار این شبکهها (که در آن تعداد لایههای پنهان کوچکتر از تعداد سلولهای ورودی است و تعداد سلولهای خروجی برابر با سلولهای ورودی است) و اینکه AE به نوعی آموزش داده میشود که خروجی تا حد امکان به ورودی نزدیک باشد، شبکه عصبی خود رمزگذار مجبور میشود دادهها را تعمیم دهد و به دنبال الگوهای متداول بگردد. در ادامه یک نمونه کد MATLAB برای ساخت یک شبکه عصبی خودرمزگذار (Autoencoder) آورده شده است:
% تعریف دادههای آموزش x_train = randn(100, 10); % دادههای ورودی % تعریف معماری شبکه عصبی خودرمزگذار encoder_neurons = 5; autoencoder = trainAutoencoder(x_train', encoder_neurons); % استفاده از شبکه آموزش دیده برای رمزگشایی دادهها x_decoded = predict(autoencoder, x_train'); % نمایش نتایج disp('دادههای ورودی:'); disp(x_train); disp('دادههای رمزگشایی شده:'); disp(x_decoded');
در این کد، ابتدا دادههای آموزش (x_train) تعریف شدهاند. سپس با استفاده از تابع trainAutoencoder
، یک شبکه عصبی خودرمزگذار با تعداد نورونهای لایه مخفی تعیین شده (در اینجا encoder_neurons
) آموزش داده میشود.
سپس با استفاده از تابع predict
، دادههای آموزش به شبکه عصبی آموزش دیده فرستاده شده و دادههای رمزگشایی شده در متغیر x_decoded
ذخیره میشود.
۷- شبکه عصبی خود رمزگذار دینوزینگ Denoising AutoEncoder
با وجود جالب بودن شبکههای خود رمزگذار، اما این شبکههای عصبی گاهی به جای پیدا کردن مستحکمترین ویژگی، فقط با دادههای ورودی سازگار میشوند. شبکه عصبی خود رمزگذار دینوزینگ (Denoising AutoEncoder | DAE) اندکی نویز به سلول ورودی اضافه میکنند.
با این کار، شبکه عصبی خود رمزگذار دینوزینگ، مجبور میشود که خروجی را از یک ورودی نویزی، مجددا بسازد و آن را عمومیتر کند و ویژگیهای متداول بیشتری را انتخاب کند. در ادامه یک نمونه کد MATLAB برای ساخت یک شبکه عصبی خودرمزگذار با رمزگشایی با حفظ سطوح نویز (Denoising Autoencoder) آورده شده است:
% تعریف دادههای آموزش x_train = randn(100, 10); % دادههای ورودی % ایجاد نویز در دادههای آموزش noise_factor = 0.2; x_train_noisy = x_train + noise_factor * randn(size(x_train)); % تعریف معماری شبکه عصبی خودرمزگذار دینوزینگ encoder_neurons = 5; autoencoder = trainDenoisingAutoencoder(x_train_noisy', encoder_neurons, ... 'L2WeightRegularization', 0.001, 'SparsityRegularization', 1, 'SparsityProportion', 0.1); % استفاده از شبکه آموزش دیده برای رمزگشایی دادهها x_decoded = predict(autoencoder, x_train_noisy'); % نمایش نتایج disp('دادههای ورودی:'); disp(x_train); disp('دادههای رمزگشایی شده:'); disp(x_decoded');
در این کد، ابتدا دادههای آموزش (x_train) تعریف شدهاند. سپس با افزودن یک سطح نویز به دادههای آموزش (x_train_noisy
)، ورودیهای مدل به صورت تغییر یافته تولید میشوند.
سپس با استفاده از تابع trainDenoisingAutoencoder
، یک شبکه عصبی خودرمزگذار دینوزینگ با تعداد نورونهای لایه مخفی تعیین شده (در اینجا encoder_neurons
) آموزش داده میشود. در این مثال، از روشهای افزودن وزن به مدل (L2WeightRegularization
) و تنظیم ویژگیهای اسپارس (Sparsity) نیز استفاده شده است. سپس با استفاده از تابع predict
، دادههای آموزش به شبکه عصبی آموزش دیده فرستاده شده و دادههای رمزگشایی شده در متغیر x_decoded
ذخیره میشود.
۸- شبکه عصبی خود رمزگذار متغیر Variational Auto Encoder
شبکه عصبی خود رمزگذار متغیر (Variational Auto Encoder | VAE) در مقایسه با شبکه عصبی خود رمزگذار، احتمالات را به جای ویژگیها فشرده میکند. علیرغم تغییرات کوچک که بین دو شبکه عصبی مذکور اتفاق افتاده است، هر یک از این انواع شبکه های عصبی مصنوعی به پرسش متفاوتی پاسخ میدهند. شبکه عصبی خودرمزگذار به پرسش «چگونه میتوان دادهها را تعمیم داد؟» پاسخ میدهد، در حالی که شبکه عصبی خود رمزگذار متغیر به پرسش «اتصال بین دو رویداد چقدر قوی است؟ آیا باید خطا را بین دو رویداد توزیع کرد یا آنها بهطور کامل مستقل هستند؟» پاسخ میدهد.
متأسفانه، در حال حاضر، تابع خاصی در MATLAB برای آموزش Variational Autoencoder (VAE) موجود نیست. با این حال، میتوانید از پکیجهای برنامه نویسی خودرومزگذار متغیر خود را پیادهسازی کنید. یک راه برای پیادهسازی VAE در MATLAB استفاده از توابع کتابخانهٔ Keras در Python و ارتباط آن با MATLAB است. نمونه کد MATLAB که از این راه استفاده میکند به صورت زیر است:
% MATLAB % تعریف دادههای آموزش x_train = randn(100, 10); % انتقال دادههای آموزش به Python py_x_train = py.numpy.array(x_train); % ایجاد متغیر VAE در Python py_vae = py.VAE_module.create_vae(py_x_train); % آموزش VAE py.VAE_module.train_vae(py_vae, py_x_train); % دریافت نتایج از Python py_decoded_data = py.VAE_module.decode_data(py_vae, py_x_train); decoded_data = double(py.array.array('d', py_decoded_data)); % نمایش نتایج disp('دادههای ورودی:'); disp(x_train); disp('دادههای رمزگشایی شده:'); disp(decoded_data);
در این مثال فرض شده است که شما یک کتابخانه Python به نام VAE_module
با توابع مناسب برای ایجاد و آموزش VAE دارید. این توابع باید از کتابخانههای معروف مانند TensorFlow
یا PyTorch
برای پیادهسازی VAE استفاده کنند.
اگر میخواهید اطلاعات بیشتری در مورد این روش یا پیادهسازی دقیقتر VAE در MATLAB داشته باشید، ممکن است بهتر باشد به منابع اطلاعاتی مرتبط با زبان برنامهنویسی Python و کتابخانههای Machine Learning مراجعه کنید.
جهت آشنایی و کسب آگاهی بیشتر درباره کتابخانههای مختلف پایتون همچون تنسورفلو و پایتون؛ فایلهای آماده مرتبط در این زمینه را مطالعه نمایید.
- پاورپوینت کتابخانه پای تورچ (PyTorch) — کلیک کنید.
- پاورپوینت کتابخانه تنسورفلو (TensorFlow) — کلیک کنید.
۹- حافظه کوتاه مدت بلند Long/Short Term Memory
حافظه کوتاه مدت بلند (Long/Short Term Memory | LSTM) نوع جدیدی از سلول حافظه (Memory Cell) را معرفی میکند. این سلول میتواند دادهها را هنگامی که دارای شکاف زمانی (یا تاخیر زمانی) هستند، پردازش کند. شبکه عصبی پیشخور میتواند متن را با به خاطر سپردن ده کلمه پیشین پردازش کند. این در حالی است که LSTM میتواند قابهای ویدئو را با به خاطر سپردن چیزی که در قابهای بسیار پیشین اتفاق افتاده است پردازش کند.
شبکههای LSTM به طور گستردهای برای بازشناسی گفتار (Speech Recognition) و بازشناسی نوشتار (Writing Recognition) مورد استفاده قرار میگیرند. سلولهای حافظه اساسا ترکیبی از یک جفت عنصر که به آنها گیت گفته میشود هستند. این عنصرها، بازگشتی هستند و چگونگی به یاد آوردن و فراموش کردن اطلاعات را کنترل میکنند. در ادامه یک نمونه کد MATLAB برای ساخت یک شبکه عصبی با حافظه کوتاه مدت بلند (LSTM) آورده شده است:
% تعریف دادههای آموزش x_train = randn(100, 10); % دادههای ورودی y_train = randn(100, 1); % خروجیها % تعریف معماری شبکه عصبی با حافظه کوتاه مدت بلند numHiddenUnits = 10; layers = [ sequenceInputLayer(size(x_train,2)) lstmLayer(numHiddenUnits, 'OutputMode', 'last') fullyConnectedLayer(1) regressionLayer ]; % تعریف تنظیمات آموزش options = trainingOptions('adam', ... 'MaxEpochs', 50, ... 'MiniBatchSize', 16, ... 'InitialLearnRate', 0.01, ... 'Plots', 'training-progress'); % ساخت شبکه عصبی با حافظه کوتاه مدت بلند net = trainNetwork(x_train, y_train, layers, options); % تست شبکه با دادههای تست x_test = randn(10, 10); y_pred = predict(net, x_test); % نمایش نتایج disp('پیشبینیها:'); disp(y_pred);
در این کد، ابتدا دادههای آموزش (x_train و y_train) تعریف شدهاند. سپس معماری یک شبکه عصبی با حافظه کوتاه مدت بلند با یک لایه LSTM (و تعداد نورونهای مشخص) و یک لایه خروجی تعریف شده است.
تنظیمات آموزش نیز با استفاده از تابع trainingOptions
تعیین شدهاند و با استفاده از توابع trainNetwork
و predict
، شبکه آموزش دیده و با دادههای تست پیشبینی انجام میشود.
۱۰- شبکه عصبی واحد بازگشتی گِیتی Gated Recurrent Unit
واحد بازگشتی گیتی (Gated Recurrent Unit | GRU) نوعی از LSTM با گیتها و دوره زمانی متفاوت است. این نوع از شبکه عصبی ساده به نظر میآید. در حقیقت، فقدان گیت خروجی، تکرار چندین باره یک خروجی مشابه را برای ورودیها سادهتر میسازد. این نوع از شبکههای عصبی بازگشتی در حال حاضر بیشتر در موتور متن به گفتار (Speech Synthesis) و ترکیب صدا (Music Synthesis) به کار میرود.
البته، ترکیب واقعی LSTM با GRU اندکی متفاوت است. زیرا، همه گیتهای LSTM در یک گیت که به آن گیت به روز رسانی گفته میشود ترکیب شدهاند و گیت بازشناسی (Reset) از نزدیک به ورودی گره خورده است. GRUها نسبت به LSTMها کمتر از منابع استفاده میکنند و اثر مشابهی را دارند. در زیر یک نمونه کد MATLAB برای ساخت یک شبکه عصبی واحد بازگشتی گیتی (Gated Recurrent Unit – GRU) آورده شده است:
% تعریف دادههای آموزش x_train = randn(100, 10); % دادههای ورودی y_train = randn(100, 1); % خروجیها % تعریف معماری شبکه عصبی با واحد بازگشتی گیتی numHiddenUnits = 10; layers = [ sequenceInputLayer(size(x_train,2)) gruLayer(numHiddenUnits) fullyConnectedLayer(1) regressionLayer ]; % تعریف تنظیمات آموزش options = trainingOptions('adam', ... 'MaxEpochs', 50, ... 'MiniBatchSize', 16, ... 'InitialLearnRate', 0.01, ... 'Plots', 'training-progress'); % ساخت شبکه عصبی با واحد بازگشتی گیتی net = trainNetwork(x_train, y_train, layers, options); % تست شبکه با دادههای تست x_test = randn(10, 10); y_pred = predict(net, x_test); % نمایش نتایج disp('پیشبینیها:'); disp(y_pred);
در این کد، معماری یک شبکه عصبی با واحد بازگشتی گیتی (gruLayer
) تعریف شده است. تنظیمات آموزش نیز با استفاده از تابع trainingOptions
تعیین شدهاند. با استفاده از توابع trainNetwork
و predict
، شبکه آموزش دیده و با دادههای تست پیشبینی انجام میشود.
۱۱- شبکه باقیمانده عمیق Deep Residual Network
شبکه باقیمانده عمیق (Deep Residual Network | DRN) یک شبکه عمیق است که در آن، بخشی از دادههای ورودی به لایههای بعدی پاس داده میشوند. این ویژگی، به این شبکهها این امکان را میدهد که تا ۳۰۰ لایه خیلی عمیق باشند، اما در واقع، نوعی از شبکههای پیچشی عمیق بدون تاخیر صریح هستند.
در ادامه یک نمونه کد MATLAB برای ساخت یک شبکه باقیمانده عمیق (Deep Residual Network – ResNet) آورده شده است. این مثال از یک ResNet ساده با ۱۸ لایه استفاده میکند:
% تعریف دادههای آموزش x_train = randn(100, 32, 32, 3); % دادههای ورودی y_train = randn(100, 1); % خروجیها % تعریف معماری شبکه باقیمانده numClasses = 1; inputSize = [32 32 3]; layers = [ imageInputLayer(inputSize) convolution2dLayer(7, 64, 'Padding', 3, 'Stride', 2) batchNormalizationLayer reluLayer maxPooling2dLayer(3, 'Stride', 2, 'Padding', 1) residualBlock(64, 3, 64) residualBlock(128, 3, 128) residualBlock(256, 3, 256) averagePooling2dLayer(7) fullyConnectedLayer(numClasses) regressionLayer ]; % تعریف تابع residualBlock function layers = residualBlock(numFilters, numBlocks, stride) layers = [ convolution2dLayer(3, numFilters, 'Padding', 'same', 'Stride', stride) batchNormalizationLayer reluLayer convolution2dLayer(3, numFilters, 'Padding', 'same') batchNormalizationLayer additionLayer('Name', 'residual_addition') reluLayer ]; for i = 1:(numBlocks - 1) layers = [layers, convolution2dLayer(3, numFilters, 'Padding', 'same')]; layers = [layers, batchNormalizationLayer]; layers = [layers, reluLayer]; layers = [layers, convolution2dLayer(3, numFilters, 'Padding', 'same')]; layers = [layers, batchNormalizationLayer]; layers = [layers, additionLayer('Name', 'residual_addition')]; layers = [layers, reluLayer]; end end % تعریف تنظیمات آموزش options = trainingOptions('adam', ... 'MaxEpochs', 20, ... 'MiniBatchSize', 16, ... 'InitialLearnRate', 0.001, ... 'Plots', 'training-progress'); % ساخت شبکه باقیمانده net = trainNetwork(x_train, y_train, layers, options); % تست شبکه با دادههای تست x_test = randn(10, 32, 32, 3); y_pred = predict(net, x_test); % نمایش نتایج disp('پیشبینیها:'); disp(y_pred);
در این کد، معماری ResNet با استفاده از لایههای convolution2dLayer
، batchNormalizationLayer
، reluLayer
، و additionLayer
تعریف شده است. همچنین تابع residualBlock
برای ایجاد بلوکهای باقیمانده در شبکه استفاده شده است. توابع trainNetwork
و predict
نیز برای آموزش و تست شبکه به ترتیب استفاده شدهاند.
۱۲- زنجیره مارکوف Markov Chains
زنجیرههای مارکوف (Markov Chains) مفهومی از گرافها هستند که در آن، هر یالی یک احتمال دارد. در زمانهای قدیم، از زنجیرههای مارکوف برای ساخت متن استفاده میشد؛ برای مثال، بعد از کلمه Hello، با احتمال %۰/۰۰۵۳ کلمه Dear و با احتمال %۰.۰۳۵۵۱ کلمه You میآید.
شبکههای عصبی مبتنی بر زنجیره مارکوف به عنوان یک مدل مختصر و با توجه به وابستگی به حالتهای گذشته برای پیشبینی یا تولید دنبالهها مورد استفاده قرار میگیرند. یک روش معمول برای این کار استفاده از شبکههای بازگشتی (Recurrent Neural Networks – RNNs) است. در زیر یک نمونه کد MATLAB برای ساخت یک مدل RNN مبتنی بر زنجیره مارکوف آورده شده است:
% تعریف دادههای آموزش sequenceLength = 100; numSequences = 50; inputSize = 1; X_train = randn(sequenceLength, numSequences, inputSize); % تعریف معماری شبکه بازگشتی numHiddenUnits = 10; layers = [ sequenceInputLayer(inputSize) lstmLayer(numHiddenUnits, 'OutputMode', 'sequence') fullyConnectedLayer(1) regressionLayer ]; % تعریف تنظیمات آموزش options = trainingOptions('adam', ... 'MaxEpochs', 50, ... 'MiniBatchSize', 16, ... 'InitialLearnRate', 0.01, ... 'Plots', 'training-progress'); % ساخت شبکه بازگشتی net = trainNetwork(X_train, X_train, layers, options); % تست شبکه با دادههای تست X_test = randn(sequenceLength, 10, inputSize); Y_pred = predict(net, X_test); % نمایش نتایج disp('پیشبینیها:'); disp(Y_pred);
در این کد، یک مدل بازگشتی با یک لایه LSTM تعریف شده است. این مدل برای پیشبینی یا تولید دنبالهها بر اساس زنجیره مارکوف از دادههای آموزش استفاده میکند. توجه داشته باشید که این کد یک مثال ساده است. میتوانید مدل را با تنظیمات و معماری مختلف تغییر داده و آن را با نیاز خود تطبیق دهید.
برای داشتن ارائهای جذاب و مخاطب پسند با موضوع زنجیره مارکوف؛ فایل آماده موجود در این زمینه را مطالعه نمایید.
۱۳- شبکه عصبی هاپفیلد Hopfield Networks
شبکههای هاپفیلد (Hopfield Networks | HN) بهعنوان یکی از انواع شبکه عصبی؛ روی مجموعه محدودی از نمونهها آموزش دیدهاند بنابراین، به یک نمونه شناخته شده با نمونه مشابهی پاسخ میدهند. پیش از آموزش، هر سلول بهعنوان یک سلول ورودی، در طول آموزش بهعنوان یک سلول پنهان و در هنگام استفاده، بهعنوان یک سلول خروجی کار میکند. یک شبکه هاپفیلد در تلاش است تا نمونههای آموزش دیدهای را بسازد، این شبکهها برای دینوزینگ و بازگردانی ورودیها مورد استفاده قرار میگیرند. در صورتی که به این شبکهها نیمی از یک تصویر یا توالی یاد گرفته شده ارائه شود، نمونه کامل را بازمیگردانند.
بهصورت کلی شبکههای هاپفیلد یک نوع از شبکههای عصبی از دستهی شبکههای بازگشتی هستند که برای حل مسائل بهینهسازی و حافظهٔ آشفته به کار میروند. در زیر یک نمونه کد MATLAB برای ساخت یک شبکه هاپفیلد آورده شده است:
% تعریف دادههای آموزش patterns = [+1, -1, +1, -1; -۱, -۱, +۱, +۱]; % تعریف معماری شبکه هاپفیلد numNeurons = size(patterns, 2); net = newhop(patterns); % تست حافظه شبکه inputPattern = [+1, -1, +1, +1]; outputPattern = sim(net, {1, numNeurons, [], inputPattern}); % نمایش نتایج disp('الگوی ورودی:'); disp(inputPattern); disp('الگوی خروجی:'); disp(cell2mat(outputPattern{end}));
در این کد، patterns
مجموعهای از الگوها (الگوهای حافظه) است که شبکه به آنها آموزش داده میشود. سپس با استفاده از تابع newhop
یک شبکه هاپفیلد ایجاد میشود. در نهایت، با استفاده از تابع sim
، الگوی ورودی تست شده و الگوی خروجی نمایش داده میشود.
لطفاً توجه داشته باشید که شبکههای هاپفیلد در عمل معمولاً برای حل مسائل خاصی مانند حافظه آشفته مورد استفاده قرار میگیرند و نیاز به تنظیمات ورودی و آموزش خاص دارند. این نمونه کد بهعنوان یک مثال ساده برای شبکه هاپفیلد عرضه شده است و میتوانید آن را با توجه به نیازهای خود تغییر دهید.
۱۴- ماشین بولتزمن Boltzmann Machines
ماشینهای بولتزمن (Boltzmann Machines | BM) از این جهت که برخی از سلولها به عنوان ورودی علامتگذاری میشوند و پنهان باقی میمانند، شباهت بسیاری زیادی به شبکههای هاپفیلد دارند. سلولهای ورودی به محض اینکه سلولهای پنهان حالت خود را به روز رسانی میکنند، به سلولهای خروجی مبدل میشوند (در طول آموزش، ماشین بولتزمن/شبکه هاپفیلد، سلولها را یکی یکی به روز رسانی میکند و این کار به صورت موازی انجام نمیشود).
به طور کلی ماشینهای بولتزمن یک نوع از مدلهای گرافی احتمالاتی هستند که در زمینهٔ یادگیری ماشین مورد استفاده قرار میگیرند. در زیر یک نمونه کد MATLAB برای ساخت یک ماشین بولتزمن آورده شده است:
% تعریف تابع لاگیت logistic = @(x) 1./(1 + exp(-x)); % تعریف دادههای آموزش data = [+1, -1, +1, -1; -۱, -۱, +۱, +۱]; % تعداد نورونها numVisible = size(data, 1); numHidden = size(data, 2); % پارامترهای ماشین بولتزمن weights = randn(numVisible, numHidden); visibleBias = randn(numVisible, 1); hiddenBias = randn(numHidden, 1); % تعریف تنظیمات آموزش learningRate = 0.1; numEpochs = 100; % آموزش ماشین بولتزمن for epoch = 1:numEpochs % محاسبه احتمالات نورونهای پنهان hiddenProb = logistic(weights' * data + repmat(hiddenBias, 1, size(data, 2))); % نمونهبرداری از نورونهای پنهان hiddenStates = hiddenProb > rand(numHidden, size(data, 2)); % محاسبه احتمالات نورونهای قابل مشاهده visibleProb = logistic(weights * hiddenStates + repmat(visibleBias, 1, size(data, 2))); % نمونهبرداری از نورونهای قابل مشاهده visibleStates = visibleProb > rand(numVisible, size(data, 2)); % بهروزرسانی وزنها و بایاسها weights = weights + learningRate * (data * hiddenStates' - visibleStates * hiddenProb'); visibleBias = visibleBias + learningRate * sum(data - visibleStates, 2); hiddenBias = hiddenBias + learningRate * sum(hiddenProb - hiddenStates, 2); end % نمایش وزنها و بایاسها disp('وزنها:'); disp(weights); disp('بایاس نورونهای قابل مشاهده:'); disp(visibleBias); disp('بایاس نورونهای پنهان:'); disp(hiddenBias);
در این کد، ماشین بولتزمن با تعداد نورونهای قابل مشاهده و پنهان دلخواه ایجاد شده است. احتمالات نورونهای پنهان و قابل مشاهده با تابع لاگیت محاسبه شده و سپس از این احتمالات برای نمونهبرداری استفاده میشود. ماشین بولتزمن در هر دوره با استفاده از الگوریتم آموزش متغیر Gibbs بهروزرسانی میشود.
۱۵- ماشین بولتزمن محدود Restricted Boltzmann Machine
ماشین بولتزمن محدود (RBM | Restricted Boltzmann Machine) در ساختار شبیه به BM است. اما به دلیل محدود بودن، فقط امکان آموزش دادن آن با استفاده از پسانتشار، صرفا به عنوان پیشخور وجود دارد (تنها با این تفاوت که دادههای پاس داده شده پسانتشار، یکبار به لایه ورودی برگشت داده میشوند).
در حقیقت ماشین بولتزمن محدود یک نوع از مدلهای گرافی احتمالاتی است که در زمینهٔ یادگیری ماشین و ابزارهای کاهش بعد مورد استفاده قرار میگیرد. در زیر یک نمونه کد MATLAB برای ساخت یک RBM آورده شده است:
% تعریف دادههای آموزش data = [+1, -1, +1, -1; -۱, -۱, +۱, +۱]; % تعداد نورونهای قابل مشاهده و پنهان numVisible = size(data, 1); numHidden = 2; % پارامترهای ماشین بولتزمن محدود weights = randn(numVisible, numHidden); visibleBias = randn(numVisible, 1); hiddenBias = randn(numHidden, 1); % تعداد دورههای آموزش و نرخ یادگیری numEpochs = 1000; learningRate = 0.1; % آموزش ماشین بولتزمن محدود for epoch = 1:numEpochs % محاسبه احتمالات نورونهای پنهان hiddenProb = 1./(1 + exp(-(weights' * data + repmat(hiddenBias, 1, size(data, 2))))); % نمونهبرداری از نورونهای پنهان hiddenStates = hiddenProb > rand(numHidden, size(data, 2)); % محاسبه احتمالات نورونهای قابل مشاهده visibleProb = 1./(1 + exp(-(weights * hiddenStates + repmat(visibleBias, 1, size(data, 2))))); % نمونهبرداری از نورونهای قابل مشاهده visibleStates = visibleProb > rand(numVisible, size(data, 2)); % بهروزرسانی وزنها و بایاسها deltaWeights = learningRate * (data * hiddenStates' - visibleStates * hiddenProb'); deltaVisibleBias = learningRate * sum(data - visibleStates, 2); deltaHiddenBias = learningRate * sum(hiddenProb - hiddenStates, 2); weights = weights + deltaWeights; visibleBias = visibleBias + deltaVisibleBias; hiddenBias = hiddenBias + deltaHiddenBias; end % نمایش وزنها و بایاسها disp('وزنها:'); disp(weights); disp('بایاس نورونهای قابل مشاهده:'); disp(visibleBias); disp('بایاس نورونهای پنهان:'); disp(hiddenBias);
در این کد، ماشین بولتزمن محدود با تعداد نورونهای قابل مشاهده و پنهان مشخص ایجاد شده است. ماشین با الگوریتم آموزش متغیر Gibbs بهروزرسانی میشود.
۱۶- شبکه گرافیکی معکوس پیچشی عمیق Deep Convolutional Inverse Graphics Network یکی از انواع شبکه عصبی
شبکه گرافیکی معکوس پیچشی عمیق (Deep Convolutional Inverse Graphics Network – DCIGN) یک نوع از معماری شبکههای عصبی عمیق است که برای حل مسائل گرافیک معکوس در حوزههایی نظیر بینایی ماشین و پردازش تصویر بهکار میرود. این شبکهها به طور عمده در مسائل تفسیر و بازسازی تصاویر، تفسیر ساختار سهبعدی، و تولید تصاویر مصنوعی مورد استفاده قرار میگیرند.
عبارت “گرافیک معکوس” به معنای تلاش برای بازیابی و پیشبینی ویژگیها یا جزئیات اولیه تصویر ورودی از نقاطی نظیر نواحی، سهبعدیها، جهتها، و مشخصات دیگر است. در معماری DCIGN، شبکه عصبی عمیق با لایههای پیچشی (Convolutional Layers) و لایههای ترکیب (Pooling Layers) برای استخراج ویژگیهای تصویری از ورودی استفاده میشود. سپس لایههایی به نام “گرافیک معکوس” اقدام به بازسازی ویژگیهای اولیه تصویر میکنند.
معمولاً این شبکهها در کنار دادههای برچسبدار برای یادگیری نقشه گرافیک معکوس ویژگیها مورد آموزش قرار میگیرند. DCIGN میتواند در وظایفی نظیر بازیابی تصاویر، تفسیر ساختار سهبعدی اشیاء، یادگیری نمایشهای بازنمایی تصاویر و یا تولید تصاویر مصنوعی مفید باشد.
برای ارائه نمونه کد متلب برای شبکه گرافیکی معکوس پیچشی عمیق (DCIGN) بایستی وظایف مختلف و دیتاستهای خاص تعریف شوند. اما میتوانید به صورت عمومی با استفاده از توابع و لایههای پیچشی و گرافیک معکوس در متلب یک معماری DCIGN ایجاد کنید. در اینجا یک الگوی ساده برای یک DCIGN در متلب آمده است:
% تعریف معماری شبکه layers = [ imageInputLayer([64 64 3]) % یک ورودی با ابعاد 64x64 و ۳ کانال برای تصاویر RGB convolution2dLayer(3, 64, 'Padding', 'same') reluLayer maxPooling2dLayer(2, 'Stride', 2) convolution2dLayer(3, 128, 'Padding', 'same') reluLayer maxPooling2dLayer(2, 'Stride', 2) % افزودن لایههای گرافیک معکوس برای بازگردانی ویژگیها transposedConv2dLayer(4, 128, 'Stride', 2, 'Cropping', 'same') reluLayer transposedConv2dLayer(4, 64, 'Stride', 2, 'Cropping', 'same') reluLayer transposedConv2dLayer(4, 3, 'Stride', 2, 'Cropping', 'same') % خروجی با ۳ کانال برای تصویر RGB regressionLayer ]; % تنظیمات آموزش options = trainingOptions('adam', ... 'MaxEpochs', 20, ... 'MiniBatchSize', 16, ... 'InitialLearnRate', 0.001, ... 'Plots', 'training-progress'); % ساخت و آموزش شبکه net = trainNetwork(trainingData, targetData, layers, options);
توجه داشته باشید که این کد یک الگوی ساده است و نیاز به تنظیمات دقیقتر و تطبیق با دیتاست مورد استفاده دارد. برای استفاده از این الگو، شما باید دادههای آموزش و هدف خود را جایگزین trainingData
و targetData
کنید و مطابق با ویژگیها و اندازههای دیتاست خود، لایهها و پارامترهای شبکه را تنظیم کنید.
۱۷- شبکههای مولد تخاصمی Generative Adversarial Networks
شبکههای مولد تخاصمی یا Generative Adversarial Networks (GANs) یک نوع از معماریهای شبکههای عصبی عمیق هستند که به صورت همزمان دو شبکه به نام مولد و ممیز (تمییزدهنده) با هم همکاری یا رقابت میکنند. این دو شبکه در یک فرآیند آموزش متقابل شرکت میکنند تا مولد بتواند دادههای مصنوعی تولید کند که به نظر بیاید به دادههای واقعی شبیهتر باشند.
مولد در GAN تلاش میکند دادههایی تولید کند که به نظر مثل دادههای واقعی بیایند، در حالی که ممیز سعی میکند بین دادههای واقعی و دادههای تولید شده توسط مولد تفاوت کند. این فرآیند آموزش باعث بهبود هر دو شبکه میشود و موجب تولید دادههای مصنوعی با کیفیت بالا میشود.
یکی از کاربردهای معروف GAN در تولید تصاویر و ویدئوهای واقعی است. این شبکهها در حوزههای هنرهای تجسمی، تولید تصاویر سنتزی، تولید دادههای آموزشی برای شبکههای عصبی و حتی تصحیح و اصلاح تصاویر استفاده میشوند. تاکنون، GANها از موفقیتهای زیادی در زمینههای مختلف برخوردار بودهاند، اما همچنین با چالشها و مسائلی نظیر پایداری آموزش و حملات ناپایداری مورد بحران قرار گرفتهاند.
به دلیل طولانی بودن و ابتدایی نبودن کد GAN، نمیتوانیم نمونه کد کامل GAN را ارائه دهیم. با این حال، میتوانید یک پیادهسازی ساده GAN با استفاده از MATLAB انجام دهید. در ادامه یک الگوی ساده برای GAN آورده شده است:
% تعریف مولد generator = [ fullyConnectedLayer(256) reluLayer fullyConnectedLayer(28 * 28) tanhLayer reshapeLayer([28, 28, 1]) ]; % تعریف ممیز discriminator = [ imageInputLayer([28, 28, 1]) fullyConnectedLayer(256) leakyReluLayer(0.01) fullyConnectedLayer(1) sigmoidLayer ]; % تعریف تنظیمات GAN gan = ganNetwork(generator, discriminator, options); % تنظیمات آموزش options = trainingOptions('adam', ... 'MaxEpochs', 100, ... 'MiniBatchSize', 128, ... 'Verbose', true, ... 'Plots', 'training-progress'); % دادههای آموزش data = imageDatastore('path_to_dataset', 'IncludeSubfolders', true, 'LabelSource', 'foldernames'); % آموزش GAN trainedGAN = trainNetwork(zeros(28, 28, 1, 128), [], gan, options);
توجه داشته باشید که این کد یک پیادهسازی ساده است و برای بهبود کیفیت و کارایی GAN، نیاز به تنظیمات دقیقتر و استفاده از یک معماری پیچیدهتر و معتبرتر دارد. همچنین، دقت کنید که برای آموزش GAN بهتر است از دادههای متنوع و کیفیت بالا استفاده کنید. برای پیادهسازی GAN در MATLAB، میتوانید از توابع ganNetwork
و trainNetwork
بهعنوان ابزارهای کمکی استفاده کنید.
۱۸- شبکه دکانولوشنی Deconvolution Network
شبکه دکانولوشنی یا Deconvolution Network (DN) یک نوع شبکه عصبی عمیق است که برای کاربردهای مختلف در پردازش تصویر و بینایی ماشین استفاده میشود. این شبکه اصطلاحاً به عنوان یک شبکه پیچشی معکوس یا شبکه دکانولوشن شناخته میشود.
در شبکههای عصبی کانولوشنی، لایههای کانولوشن برای استخراج ویژگیهای تصویری به کار میروند. در حالی که در شبکه دکانولوشنی، عمل برعکس از کانولوشن انجام میشود تا تصویر اصلی یا نمایشی با وضوح بالاتر از ویژگیهای استخراج شده حاصل شود.
این شبکه معمولاً در وظایفی مانند بازیابی تصویر، تصحیح تصاویر، یادگیری نمایشهای با ویژگیهای بالا و غیره استفاده میشود. همچنین در بخشهای مختلف از حوزههایی مانند پردازش تصویر پزشکی، تشخیص اشیاء و سیگنالهای تصویری نیز از این شبکهها استفاده میشود. شما میتوانید از توابع و لایههای مربوط به دکانولوشن در کتابخانههای متلب مانند Deep Learning Toolbox استفاده کنید.
برای ساخت یک مدل دکانولوشنی در متلب، میتوانید از توابعی مانند transposedConv2dLayer
یا deconvolution2dLayer
که در این کتابخانهها قابل دسترسی هستند، استفاده کنید. سپس با ترتیب اضافه کردن لایهها و تنظیمات مربوطه، مدل خود را ایجاد کنید. یک نمونه ساده میتواند به صورت زیر باشد:
layers = [ transposedConv2dLayer(filterSize, numFilters, 'Name', 'deconv1') batchNormalizationLayer('Name', 'bn1') reluLayer('Name', 'relu1') transposedConv2dLayer(filterSize, numFilters, 'Name', 'deconv2') batchNormalizationLayer('Name', 'bn2') reluLayer('Name', 'relu2') % ادامه لایهها و تنظیمات به دلخواه ]; options = trainingOptions('adam', 'MaxEpochs', 50, 'InitialLearnRate', 0.001); % آموزش مدل net = trainNetwork(trainingData, layers, options);
در این کد، لایههای transposedConv2dLayer
برای دکانولوشن و لایههای batchNormalizationLayer
و reluLayer
نیز برای استفاده از عملگرهای نرمالسازی و فعالسازی به کار گرفته شدهاند. شما میتوانید تعداد و نوع لایهها را بر اساس نیاز و وظیفه مورد نظرتان تغییر دهید.
۱۹- شبکه ماشین حالت سیال Liquid State Machine
ماشین حالت سیال یا Liquid State Machine (LSM) یک نوع مدل محاسباتی در حوزه علوم عصبی مصنوعی است. این مدل معمولاً بر اساس تئوری هوش مصنوعی الهام گرفته شده از عملکرد مغز و سیستمهای حسگری-حرکتی در مغز حیوانات است. در یک ماشین حالت سیال، یک سیستم دینامیکی با ویژگیهای سیال (مانند مایع) برای نمایش اطلاعات و ورودیها به کار میرود. این سیستم به عنوان “مخزن” (reservoir) شناخته میشود و به واسطه خاصیت دینامیکی خود، قادر به پردازش الگوها و اطلاعات زمانی است.
نکته اساسی در ماشین حالت سیال این است که اطلاعات ورودی به صورت تصادفی در مخزن وارد میشوند و سپس با تحلیل خروجیهای مخزن، الگوها و ویژگیهای مفید استخراج میشوند. این الگوها میتوانند برای مسائل تشخیص الگو، پیشبینی زمانی، وظایف مرتبط با حواسپراکنده و… به کار روند. ماشین حالت سیال به عنوان یک الگوریتم آموزش نظارتنشده برای پردازش اطلاعات زمانی مورد استفاده قرار میگیرد و در حال حاضر در زمینههای مختلف از جمله پردازش سیگنال، تشخیص الگو، و تحلیل دینامیک سیستمها به کار میرود.
توابع مدلهای ماشین حالت سیال در متلب به صورت آماده موجود نیستند و نیاز به پیادهسازی دستی دارند. این الگوریتم به دلیل پیچیدگی و ابتدایی بودن نیاز به تخصص بالا در حوزههای مرتبط دارد. به عنوان یک راهنمای کلی، شما میتوانید با استفاده از توابع مربوط به شبکههای عصبی موجود در کتابخانه Deep Learning Toolbox در متلب، یک مدل LSM خود را پیادهسازی کنید. اما توجه داشته باشید که این پیادهسازی به دلیل پیچیدگی ویژگیهای خاص LSM، نیازمند تحقیقات و تخصص است.
۲۰- ماشین یادگیری حداکثری Extreme Learning Machine
ماشین یادگیری حداکثری (Extreme Learning Machine | ELM) تلاشی برای کاهش پیچیدگی نهفته در پس شبکههای عصبی پیشخورFF است. این کار با ساخت لایههای پنهان اسپارس با اتصالات تصادفی، انجام میشود. این نوع از شبکههای عصبی به قدرت محاسباتی کمتری نیاز دارند، اما کارایی واقعی آنها به شدت بستگی به وظیفه قابل انجام و دادهها دارد.
ماشین یادگیری حداکثری یا Extreme Learning Machine (ELM) یک نوع مدل سریع و ساده برای یادگیری ماشین است که به طور اصلی برای مسائل طبقهبندی و پیشبینی استفاده میشود. در اینجا یک نمونه کد متلب برای پیادهسازی ELM بر روی دادههای آموزشی و تست آورده شده است:
% مثال: ELM برای دستهبندی دادهها % تعریف دادههای آموزشی X_train = randn(100, 10); % 100 نمونه ورودی با ۱۰ ویژگی Y_train = randi([1, 3], 100, 1); % برچسبهای دستهبندی % تعریف دادههای تست X_test = randn(20, 10); % 20 نمونه ورودی تست % تعریف تعداد نورونها در لایه پنهان num_neurons = 50; % محاسبه وزنها و بایاسها به صورت تصادفی input_weights = randn(num_neurons, size(X_train, 2)); bias = randn(num_neurons, 1); % محاسبه خروجی لایه پنهان با تابع فعالسازی سیگموید hidden_output = sigmoid(input_weights * X_train' + bias); % محاسبه وزنهای خروجی به صورت تصادفی output_weights = pinv(hidden_output') * Y_train; % محاسبه خروجی مدل برای دادههای تست hidden_output_test = sigmoid(input_weights * X_test' + bias); predicted_labels = round(output_weights' * hidden_output_test); % ارزیابی دقت مدل accuracy = sum(predicted_labels' == Y_test) / length(Y_test); disp(['دقت مدل: ', num2str(accuracy * 100), '%']); % تابع سیگموید function y = sigmoid(x) y = 1 ./ (1 + exp(-x)); end
در این کد، تابع sigmoid
تابع فعالسازی سیگموید را تعریف میکند. ELM ابتدا وزنها و بایاسهای لایه پنهان را به صورت تصادفی ایجاد کرده و سپس خروجی لایه پنهان و وزنهای خروجی را با استفاده از ماتریسهای تصویر محاسبه میکند. در نهایت، دقت مدل با استفاده از دادههای تست ارزیابی میشود.
۲۱- شبکه عصبی خود رمزگذار اسپارس Sparse AutoEncoder
شبکه عصبی خود رمزگذار اسپارس (Sparse AutoEncoder | SAE) نیز یک نوع دیگر از شبکههای عصبی مصنوعی خود رمزگذار است که در برخی موارد، میتواند برخی از الگوهای گروهی پنهان موجود در دادهها را آشکار کند. ساختار شبکه عصبی خود رمزگذار اسپارس نیز مشابه با AE است، در این نوع از شبکههای عصبی، تعداد لایه پنهان، بیشتر از تعداد سلول لایه ورودی/خروجی است.
یک نمونه ساده برای ایجاد یک Sparse AutoEncoder با MATLAB زیر آمده است:
% تعریف تعداد ورودیها و نرونهای مخفی inputSize = اندازه_ورودی; % مثلا ۷۸۴ برای یک تصویر 28x28 hiddenSize = 20 % تعداد نرونهای مخفی sparsityParam = 0.2 % مقدار مورد نظر برای lambda = 0.6ک % تعریف توابع هزینه و گرادیان costFunction = @(params) sparseAutoencoderCost(params, inputSize, hiddenSize, lambda, sparsityParam, beta); % تنظیمات آپتیمایزر options = optimset('MaxIter', 100, 'Display', 'iter'); % تولید پارامترهای اولیه تصادفی initialTheta = initializeParameters(hiddenSize, inputSize); % آموزش شبکه عصبی [optTheta, cost] = fminlbfgs(costFunction, initialTheta, options); % استخراج وزنها از پارامترهای آموزش دیده W1 = reshape(optTheta(1:hiddenSize * inputSize), hiddenSize, inputSize); % تابع هزینه Sparse AutoEncoder function [cost, grad] = sparseAutoencoderCost(theta, inputSize, hiddenSize, lambda, sparsityParam, beta) W1 = reshape(theta(1:hiddenSize * inputSize), hiddenSize, inputSize); b1 = theta(hiddenSize * inputSize + 1:hiddenSize * inputSize + hiddenSize); W2 = W1'; b2 = theta(hiddenSize * inputSize + hiddenSize + 1:end); % کد محاسبه خروجی شبکه عصبی % ... % کد محاسبه تابع هزینه % ... % کد محاسبه گرادیان % ... grad = [W1grad(:); b1grad(:); W2grad(:); b2grad(:)]; end % تابع مقداردهی اولیه پارامترها function W = initializeParameters(hiddenSize, visibleSize) epsilon = 0.12; W = rand(hiddenSize, visibleSize) * 2 * epsilon - epsilon; end
۲۲- شبکه باور عمیق Deep Belief Network
شبکه باور عمیق (DBN) یک نوع از شبکههای عصبی عمیق است که از ترکیب لایههای مختلف به نامهای لایه مشاهدهپذیر (Visible Layer) و لایه پنهان (Hidden Layer) تشکیل شده است. این شبکه از دو نوع لایه اصلی تشکیل شده است: لایه مشاهدهپذیر و لایه پنهان. این دو لایه به طور معمول به صورت متناوب قرار میگیرند.
DBN از معماری باور عمیق استفاده میکند که در آن لایههای پنهان اطلاعات مهمی از دادههای ورودی را به دست میآورند و سپس این اطلاعات به لایههای پنهان بعدی منتقل میشوند. این فرآیند به صورت تدریجی انجام میشود و هر لایه پنهان به عنوان ویژگیهای سطح بالاتر و سختتر قابل استخراج عمل میکند.
یکی از ویژگیهای مهم DBN این است که هر لایه میتواند بهعنوان یک مدل محتاط (Restricted Boltzmann Machine | RBM) توصیف شود. RBM لایههای مشاهدهپذیر و پنهان را به صورت مستقل از یکدیگر آموزش میدهد و سپس این لایهها با یکدیگر ترکیب میشوند تا DBN ساخته شود.
از DBNها بهعنوان مدلهای تولیدی و تبدیلی برای تولید داده جدید یا استخراج ویژگیهای نهان از دادههای ورودی استفاده میشود. همچنین، این شبکهها در مسائلی مانند تشخیص اشیاء، تشخیص چهره، ترجمه ماشینی و سایر وظایف یادگیری عمیق به خوبی عمل کردهاند.
متأسفانه کتابخانههای متلب به طور مستقیم پشتیبانی از پیادهسازی شبکههای باور عمیق (Deep Belief Networks) ندارند. با این حال، میتوانید از پیادهسازیهای موجود در دیگر زبانها (مانند Python) استفاده کرده و با استفاده از تبدیلهای متلب، نتایج مورد نظر خود را به متلب منتقل کنید.
برای پیادهسازی DBN معمولا از کتابخانههایی مانند Deep Learn Toolbox (برای متلب) یا TensorFlow و Keras (برای Python) استفاده میشود. در ادامه یک نمونه کد Python برای DBN با استفاده از کتابخانه Keras آمده است. این کد را میتوانید در محیط Python اجرا کرده و نتیجه را در متلب بهرهمند شوید.
# نصب کتابخانه Keras # pip install keras from keras.models import Sequential from keras.layers import Dense from keras.optimizers import RMSprop from sklearn.model_selection import train_test_split import numpy as np # تعریف مدل DBN def build_dbn(input_size, hidden_layers): model = Sequential() # افزودن لایههای پنهان به مدل for units in hidden_layers: model.add(Dense(units, activation='sigmoid', input_dim=input_size)) return model # مثال استفاده از مدل DBN input_size = 784 # مثال: تصویرهای 28x28 به عنوان ورودی hidden_layers = [500, 300, 100] # تعداد نرونهای لایههای پنهان # ساخت مدل DBN dbn_model = build_dbn(input_size, hidden_layers) # نمایش معماری مدل dbn_model.summary()
۲۳- شبکه پیچشی عمیق Deep Convolutional Network
شبکه پیچشی عمیق (Deep Convolutional Network | DCN) در حال حاضر، ستاره شبکههای عصبی است. این نوع از شبکههای عصبی، دارای سلولهای پیچشی (یا لایههای پولینگ) و کرنلهایی هستند که هر یک، به هدف متفاوتی خدمتدهی میکند. کرنلهای پیچشی در واقع دادههای ورودی را پردازش میکنند و لایههای پولینگ (گردآوری) این کار را با کاهش ویژگیهای غیر لازم، سادهتر میکنند.
کتابخانههای MATLAB از شبکههای پیچشی عمیق (Convolutional Neural Networks | CNN) پشتیبانی میکنند و میتوانید از این کتابخانهها برای پیادهسازی شبکههای پیچشی عمیق استفاده کنید. یک نمونه ساده از یک شبکه پیچشی عمیق در MATLAB به صورت زیر است:
% تعیین ویژگیهای ورودی inputSize = [28 28 1]; % ابعاد تصویر ورودی % تعیین معماری شبکه layers = [ imageInputLayer(inputSize) % لایه ورودی convolution2dLayer(3, 64, 'Padding', 'same') % لایه پیچشی با ۶۴ فیلتر reluLayer() % لایه تابع فعالسازی ReLU maxPooling2dLayer(2, 'Stride', 2) % لایه حذف اطلاعات غیرضروری fullyConnectedLayer(10) % لایه کاملاً متصل برای طبقهبندی softmaxLayer() % لایه تابع فعالسازی softmax classificationLayer() % لایه خروجی برای طبقهبندی ]; % تعریف تنظیمات آموزش options = trainingOptions('sgdm', 'MaxEpochs', 10, 'InitialLearnRate', 0.001); % آموزش شبکه net = trainNetwork(trainingData, layers, options); % استفاده از شبکه آموزش دیده برای پیشبینی predictedLabels = classify(net, testData); % محاسبه دقت accuracy = sum(predictedLabels == testLabels) / numel(testLabels); disp(['دقت شبکه: ' num2str(accuracy)]);
در اینجا، convolution2dLayer
لایه پیچشی را تعریف میکند و maxPooling2dLayer
لایه حذف اطلاعات غیرضروری است. fullyConnectedLayer
لایهای است که تمامی نرونهای یک لایه با هم متصل هستند و به عنوان لایهی کاملاً متصل برای طبقهبندی استفاده میشود. این یک معماری سادهتر است و میتوانید با تغییر تعداد و نوع لایهها، شبکه را به تناسب با وظیفه خود تغییر دهید.
۲۴- شبکه حالت پژواک Echo State Network
شبکه حالت پژواک (Echo State Network | ESN)، زیرنوعی از شبکههای عصبی بازگشتی با رویکرد آموزشی ویژهای است. دادهها به ورودی و سپس، در صورتی که برای تکرارهای چندگانه مورد نظارت باشند، به خروجی پاس داده میشود (بدین شکل، این امکان فراهم میشود که ویژگیهای بازگشتی دخیل شوند). پس از انجام این کار، فقط وزنهای بین سلولهای پنهان به روز رسانی میشود. البته، این نوع از شبکههای عصبی کاربردهای قابل توجهی ندارند.
به صورت کلی شبکه حالت پژواک یا ESN یک نوع از شبکههای عصبی بازگشتی (RNN) است. در این شبکه، یک لایه پنهان به نام حالت پژواک به وجود میآید که وظیفه حفظ و انتقال اطلاعات به طور مستقیم از ورودی به خروجی را دارد. در زیر یک نمونه کد MATLAB برای ایجاد یک شبکه حالت پژواک آمده است:
% تعیین پارامترها inputSize = 1; % اندازه ورودی outputSize = 1; % اندازه خروجی reservoirSize = 100; % اندازه حالت پژواک spectralRadius = 0.9; % شعاع طیفی % تولید ورودی و خروجی آموزشی numDataPoints = 1000; inputData = randn(1, numDataPoints); outputData = sin(inputData); % ساخت ماتریس وزنهای حالت پژواک W_in = randn(reservoirSize, 1); W_reservoir = randn(reservoirSize, reservoirSize); W_out = randn(outputSize, reservoirSize); % مقداردهی اولیه برای حالت پژواک x = zeros(reservoirSize, 1); % آموزش حالت پژواک for t = 2:numDataPoints u = inputData(t); x = tanh(W_in * u + W_reservoir * x); end % محاسبه خروجی با استفاده از حالت پژواک آموزش دیده y_pred = W_out * x; % نمایش نتایج figure; plot(outputData, 'LineWidth', 2, 'DisplayName', 'واقعی'); hold on; plot(y_pred, 'LineWidth', 2, 'DisplayName', 'پیشبینی'); xlabel('زمان'); ylabel('مقدار'); title('پیشبینی با استفاده از حالت پژواک'); legend('show'); grid on;
توجه داشته باشید که این کد یک مثال ساده برای آموزش و پیشبینی با استفاده از حالت پژواک است و ممکن است نیاز به تنظیمات بیشتر و تغییرات بر اساس وظیفهی خاص شما داشته باشد. همچنین، در اینجا فقط مراحل آموزش و یک نمونه از خروجی پیشبینی آورده شده است.
۲۵- شبکه عصبی کوهنن Kohonen Network
شبکه عصبی کوهنن (Kohonen Network | KN)، ویژگی فاصله تا سلول را معرفی میکند. این نوع از شبکههای عصبی برای دستهبندی استفاده میشوند و تلاش میکنند تا سلولهای خود را برای بیشینه واکنش به یک ورودی خاص آماده کنند. هنگامی که برخی از سلولها به روز رسانی میشوند، نزدیکترین همسایههای آنها نیز به همین ترتیب به روز رسانی میشوند. همچون ماشین بردار پشتیبان (Support Vector Machine)، این نوع از شبکهها نیز معمولا همیشه به عنوان شبکههای عصبی «واقعی» به حساب نمیآیند.
در کل شبکه کوهنن یک نوع از شبکههای عصبی خودسازمانده است که برای نقشهبرداری خودسازمانده از دادهها مورد استفاده قرار میگیرد. در اینجا یک نمونه ساده از یک شبکه کوهنن در MATLAB آورده شده است:
% تعیین پارامترها inputSize = 2; % اندازه ورودی (برای مثال، دو ویژگی) mapSize = [10 10]; % اندازه نقشه کوهنن learningRate = 0.1; % نرخ یادگیری epochs = 100; % تعداد دورههای آموزش % تولید دادههای آموزشی data = rand(100, inputSize); % مقداردهی اولیه وزنها به صورت تصادفی weights = rand(mapSize(1), mapSize(2), inputSize); % آموزش شبکه for epoch = 1:epochs for i = 1:size(data, 1) % محاسبه فاصله از هر نرون به داده ورودی distances = sum((weights - repmat(data(i, :), [mapSize, 1])).^2, 3); % یافتن نرون برنده (کمترین فاصله) [minDistance, winnerIndex] = min(distances(:)); [winnerRow, winnerCol] = ind2sub(size(distances), winnerIndex); % بهروزرسانی وزنها بر اساس نرون برنده و داده ورودی weights = weights + learningRate * exp(-((1:mapSize(1)) - winnerRow).^2 / (2 * minDistance^2))' * ... exp(-((1:mapSize(2)) - winnerCol).^2 / (2 * minDistance^2)) * ... (data(i, 🙂 - weights); end end % نمایش نقشه کوهنن figure; scatter(data(:, 1), data(:, 2), 'filled'); hold on; for i = 1:mapSize(1) for j = 1:mapSize(2) plot(weights(i, j, 1), weights(i, j, 2), 'ro', 'MarkerSize', 10, 'LineWidth', 2); end end title('نقشه کوهنن'); xlabel('ویژگی ۱'); ylabel('ویژگی ۲');
۲۶- ماشین بردار پشتیبان Support Vector Machine
ماشین بردار پشتیبان یا SVM یک الگوریتم یادگیری ماشین متعلق به دستهبندی و رگرسیون است. این الگوریتم به ویژه برای مسائل دستهبندی در دادههای خطی و غیرخطی مورد استفاده قرار میگیرد. هدف اصلی SVM، ایجاد یک صفحه یا هایپرپلان (hyperplane) در فضای ویژگیها است که دادهها را به نحوی جدا کند تا بهترین تفکیک بین دستهها ایجاد شود.
ویژگی اصلی SVM استفاده از بردارهای پشتیبان (support vectors) است. بردارهای پشتیبان نقاط داده در مجموعه آموزش هستند که به تشخیص و مکانیابی هایپرپلان کمک میکنند. هایپرپلان به نحوی انتخاب میشود که فاصله کمینه بین دادههای دو دسته را بیشینه کند. این فاصله به عنوان حاشیه (margin) نیز شناخته میشود.
الگوریتم SVM به دو نوع تفکیک خطی (linear) و غیرخطی (non-linear) تقسیم میشود. در حالت خطی، هایپرپلان یک صفحه خطی است، در حالت غیرخطی، از تبدیلهای غیرخطی (مانند توابع هسته) برای مدل کردن مجموعه دادههای پیچیدهتر استفاده میشود. از مزایای SVM میتوان به دقت بالا در دستهبندی، عملکرد خوب در فضاهای با ابعاد بالا، و قابلیت کنترل برازش بالا اشاره کرد.
در جهت شرح و بسط بیشتر ماشین بردار پشتیبان؛ مجموعه آموزشی پی استور پاورپوینتی را آماده نموده و در اختیار شما بزرگواران قرار داده که مطالعه آن خالی از لطف نمیباشد.
یک ساختار کلی برای استفاده از SVM در MATLAB را می توان بدین صورت در نظر گرفت. برای این منظور، از تابع fitcsvm
موجود در MATLAB برای آموزش مدل SVM استفاده خواهیم کرد. فرض کنید دادههای آموزشی شامل ویژگیها X
و برچسبها y
باشند. در اینجا یک نمونه کد میآید:
% تولید دادههای آموزشی rng(1); % برای تولید داده تصادفی یکسان X_train = [mvnrnd([1, 1], eye(2), 100); mvnrnd([4, 4], eye(2), 100)]; y_train = [-ones(100, 1); ones(100, 1)]; % آموزش مدل SVM svmModel = fitcsvm(X_train, y_train); % نمایش مرز تصمیمگیری figure; % h = plot(svmModel); title('مرز تصمیمگیری SVM برای دستهبندی دو دسته'); % نمایش دادههای آموزشی hold on; scatter(X_train(y_train == -1, 1), X_train(y_train == -1, 2), 'g', 'filled'); scatter(X_train(y_train == 1, 1), X_train(y_train == 1, 2), 'r', 'filled'); legend('مرز تصمیمگیری', 'کلاس -۱', 'کلاس ۱'); hold off; % تولید دادههای تست X_test = [mvnrnd([1, 1], eye(2), 20); mvnrnd([4, 4], eye(2), 20)]; y_test_actual = [-ones(20, 1); ones(20, 1)]; % پیشبینی با استفاده از مدل SVM y_test_pred = predict(svmModel, X_test); % نمایش نتایج پیشبینی figure; scatter(X_test(y_test_pred == -1, 1), X_test(y_test_pred == -1, 2), 'g', 'filled'); hold on; scatter(X_test(y_test_pred == 1, 1), X_test(y_test_pred == 1, 2), 'r', 'filled'); title('نتایج پیشبینی SVM بر روی دادههای تست'); legend('کلاس پیشبینی شده -۱', 'کلاس پیشبینی شده ۱'); hold off;
۲۷- ماشین تورینگ عصبی Neural Turing Machine
ماشین تورینگ عصبی یا NTM یکی از انواع شبکه عصبی و یک مدل یادگیری عمیق است که به صورت ترکیبی از معماری شبکههای عصبی با ماشینهای تورینگ معرفی شده است. این مدل توسط Alex Graves و دیگران در سال ۲۰۱۴ معرفی شد و یک ترکیب از شبکه عصبی با حافظه قابل دسترسی (memory-augmented neural network) میباشد.
یکی از ویژگیهای برجسته NTM این است که به مدل امکان استفاده از یک حافظه خارجی برای ذخیره و بازخوانی اطلاعات میدهد. این حافظه با ساختاری شبیه به حافظه تورینگ کلاسیک عمل میکند که میتواند برخی از ویژگیهایی از جمله نویسش و خواندن داشته باشد.
در NTM، یک شبکه عصبی که به عنوان کنترلگر (controller) شناخته میشود، با حافظه ورودی و حافظه خروجی ارتباط دارد. این امکان اینجاست که شبکه عصبی، اطلاعات را به حافظه ذخیره کرده و از حافظه برای حل مسائل خاصی استفاده کند. این ارتباطات بین شبکه عصبی و حافظه توسط عملیات خواندن و نویسی محتوا در حافظه انجام میشود.
NTM معمولاً در مسائلی که نیاز به حفظ و بازخوانی اطلاعات در طول زمان دارند، عملکرد خوبی دارد، از جمله مسائل مربوط به توالیها و دنبالهها. این مدل به عنوان یک پل بین شبکههای عصبی و قابلیتهای حافظه ماشینهای تورینگ کلاسیک در مسائل بازگشتی و بازیابی اطلاعات عمل میکند.