آموزش شبکه عصبی (Neural Network Training) توسط الگوریتم رقابت استعماری (ICA)
پستی که در ادامه می خوانید، به یادگیری شبکه عصبی با استفاده از الگوریتم رقابت استعماری می پردازد. البته مطالب ارائه شده عمومی بوده و شامل استفاده از الگوریتم های دیگری همچون الگوریتم ژنتیک یا GA (Genetic Algorithms)، الگوریتم ازدحام ذرات یا PSO (Particle Swarm Optimization) و شبیه سازی تبرید فلزات یا SA (Simulated Annealing) نیز خواهد شد. حتی به نظر می رسد که استفاده از هر یک از عناوین زیر برای این پست مناسب بود.
- آموزش شبکه عصبی (Neural Network Training) توسط الگوریتم رقابت استعماری (Imperialist Competitive Algorithm)
- آموزش (تعیین وزنهای) شبکه عصبی (Neural Network Training) توسط الگوریتم های تکاملی (Evolutionary Algorithms)
- آموزش (تعیین وزنهای) شبکه عصبی (Neural Network Training) توسط الگوریتم ژنتیک (Genetic Algorithms)
- آموزش (تعیین وزنهای) شبکه عصبی (Neural Network Training) توسط الگوریتم پرندگان یا الگوریتم ازدحام ذرات (Particle Swarm Optimization)
- آموزش (تعیین وزنهای) شبکه عصبی (Neural Network Training) توسط الگوریتم تبرید فلزات شبیه سازی شده (Simulated Annealing)
“این پست اختصاصی وبسایت محاسبات تکاملی و الگوریتم رقابت استعماری تهیه شده است و درج آن در رسانه های چاپی و یا مجازی فقط با کسب اجازه از وبسایت مذکور، مجاز می باشد.”
شبکه عصبی
قبل از شروع بحث، مروری کوتاه بر شبکه های عصبی خواهیم داشت. البته به زودی یک فیلم جامع در مورد آموزش عملی شبکه به زبان ساده در همین سایت (بهینه سازی تکاملی و الگوریتم رقابت استعماری) عرضه خواهد شد. جهت مطلع شدن از عرضه شدن این محصول، در خبرنامه ایمیلی ما عضو شوید (این لینک).
شبکه عصبی فارغ از حواشی آن که به بحث نورون و سیناپس و … (کلی از این لغت ها) ارتباط دارد (که از دیدگاه من اصلاً ربطی ندارد) یک ابزار برای تقریب تابع (Function Approximation) است. ما با ابزارهای ساده تقریب تابع، مثل چند جمله ای ها آشنا هستیم. مثلاً رابطه y=ax+b یک خط را نشان می دهد. یک مثال از تقریب خطی را در شکل زیر می بینیم. این خط 2 پارامتر a و b دارد. اگر ما مجموعه ای از نقاط داشته باشیم و بخواهیم بهترین خط گذرنده از این نقاط را پیدا کنیم، باید یک جستجو برای یافتن بهترین a و b انجام دهیم. همین که کلمه جستجو را بر زبان خود جاری ساختیم! یعنی به یک ابزار جستجو نیاز داریم. ساده ترین روش جستجو این است که هر a و b ممکن را که به ذهنمان می رسد، امتحان کنیم (جستجوی جامع)! یعنی خطوط مختلف تشکیل شده با این a و b مختلف را ترسیم می کنیم و خطی که بیشترین عبور (برازش) را داشته باشد، انتخاب می کنیم. همین. البته اصلاً در مورد برازش خط اصلاً نیازی به این همه انرژی گذاشتن نیست! جواب مسئله را دوستان ریاضی کار حل کرده اند و تر و تمیز در اختیار گذاشته اند. مثلاً این لینک ویکیپدیا را ببینید.
حالا اگر نقاط ما در حالتی مثل سهمی قرار گرفته بودند چه باید کرد؟ هیچ کاری! رابطه بالا را به صورت جامعتر (y=ax^2+bx+c) رابطه سهمی می نویسیم و به دنبال سه پارامتر مناسب برای a و b و c می گردیم. خوشبختانه جواب این حالت (کلاً چند جمله ای از هر درجه ای) نیز بصورت تحلیلی وجود دارد. شکل زیر، برازش منحنی با استفاده از یک معادله سهمی را نشان می دهد.
اگر رابطه پیچیده شد، چه باید کرد؟ این بار در کنار روشهای دیگر (مثلاً چند جمله ای های درجه بالاتر که کم کم کارایی خود را از دست خواهند داد)، شبکه عصبی نیز مفید خواهد بود. با این روند باید شما هم مثل من به این نتیجه رسیده باشید، که شبکه عصبی یک رابطه و ارتباط بین ورودی و خروجی است.
به عبارت دیگر شبکه عصبی چیزی نیست به جز یک تابع ساده!
شکل زیر ساختار یک شبکه عصبی پرسپترون چند لایه را به همراه ساختار یک نرون نشان می دهد. این شبکه عصبی دارای N تا ورودی و یک خروجی است.
هر تابعی که برای برازش منحنی استفاده می شود، پارامترهایی دارد. شبکه عصبی هم از این پارامترها (آنهم به تعداد زیاد) دارد. ما مجموعه آنها را با W نشان می دهیم. برای شبکه عصبی حل بسته و ساده وجود ندارد. یک روش مورد استفاده، روش پس انتشار خطا (Error Back-Propagation) می باشد. این روش از تکنیک های بهینه سازی مبتنی بر گرادیان (Gradient-Based Methods) برای یافتن W استفاده می کند. منتها این تنها روش نیست. روشهای بهینه سازی تکاملی نیز برای این منظور استفاده می شوند.
الگوریتم رقابت استعماری
الگوریتم رقابت استعماری (Imperialist Competitive Algorithm) که به اختصار ICA نامیده می شود، یکی از جدید ترین الگوریتم های بهینه سازی تکاملی است. این الگوریتم همانگونه که از نام آن بر می آید، بر مبنای مدلسازی فرایند اجتماعی سیاسی پدیده استعمار بنا نهاده شده است. از این جهت در نوع خود یک الگوریتم جدید بوده و قابل رقابت با سایر الگوریتم های تکاملی از جمله الگوریتم های ژنتیک، الگوریتم پرندگان و کلونی مورچگان و غیره می باشد. از جهت کاربرد نیز تا کنون در حل مسائل زیادی در زمینه بهینه سازی از جمله در مهندسی برق، کامپیوتر، صنایع، مکانیک، اقتصاد، مدیریت و … استفاده شده است. دلیل استقبال بالا از این الگوریتم در کنار کارایی بالای آن، بیشتر به جنبه نوآوری و جدید و جذاب بودن آن برای متخصصین حوزه بهینه سازی بر می گردد. شکل زیر روند اعمال الگوریتم رقابت استعماری به یک مسئله بهینه سازی در حالت کلی را نشان می دهد. یادگیری شبکه عصبی نیز که یک مسئله بهینه سازی است، همین روند را خواهد داشت.
آموزش شبکه عصبی
آموزش شبکه عصبی همانگونه که در بالا نیز بدان اشاره گردید، همان تعیین وزنهای مناسب برای شبکه عصبی است. برای این منظور باید از یک روش بهینه سازی قوی و سریع استفاده کرد.
آموزش شبکه عصبی با استفاده از الگوریتم رقابت استعماری (ICA)
سوال اول: چرا آموزش شبکه عصبی با استفاده از الگوریتم های تکاملی؟
از روی این سوال خیلی از موارد بدون پرسیدن آن، رد می شویم. اما اتفاقاً این مهم ترین سوال است. چرا در کنار وجود الگوریتم های بهینه سازی مبتنی بر گرادیان (Gradient-Based Methods) که الگوریتمی مثل پس انتشار خطا (Error Back-Propagation) از آن ها استخراج می شود و خیلی سریع هم هست، باید برویم سراغ روشهای تکاملی مثل الگوریتم ICA؟ بیایید مزایا و معایب هر روش را بررسی کنیم.
- الگوریتم های بهینه سازی مبتنی بر گرادیان و الگوریتم پس انتشار خطا (BP) خیلی سریع هستند.
- الگوریتم های بهینه سازی مبتنی بر گرادیان و الگوریتم پس انتشار خطا (BP) مشکل افتادن در دام مینیمم محلی را دارند.
- الگوریتم های بهینه سازی مبتنی بر گرادیان و الگوریتم پس انتشار خطا (BP) فقط به دسته ای خاص و استاندارد از شبکه های عصبی مثل پرسپترون چند لایه (BP) و آر بی اف که حل بسته برای مشتق تابع هدف نسبت به وزنها را دارند، قابل اعمال هستند.
- الگوریتم های بهینه سازی تکاملی در مقایسه با الگوریتم های مبتنی بر گرادیان کند هستند.
- الگوریتم های بهینه سازی تکاملی قابلیت فرار از دام محلی را دارند.
- الگوریتم های بهینه سازی تکاملی وابسته به ساختار خاصی از شبکه نیستند و به هر ساختار تعریف شده ای قابل اعمال هستند.
- به غیر از تعیین وزنها (یادگیری شبکه عصبی) می توان همزمان ساختار شبکه (تعداد لایه ها و تعداد نرونها در هر لایه) را نیز توسط الگوریتم های بهینه سازی تکاملی مثل الگوریتم رقابت استعماری یاد گرفت.
پس استفاده از الگوریتم های تکاملی در شبکه عصبی مزیت فرار از نقاط مینیمم محلی و نیز عدم وابستگی به ساختار معین شبکه را دارد. اما در عوض این الگوریتم ها کند می باشند. البته کند بودن بحث بسیار مهمی است و به همین سادگی نمی توان از آن عبور کرد. در مواردی کند بودن این روشها سایر مزیت های الگوریتم را زیر سوال می برد. در مورد شبکه عصبی نیز همین گونه است. استفاده از الگوریتم های تکاملی در مورد شبکه های عصبی استاندارد (در کنار وجود روشهای مبتنی بر گرادیان سریع) خیلی توجیه پذیر نیست. البته اگر زمان کافی داشته باشیم (میل دادن زمان به بینهایت) استفاده از الگوریتم های تکاملی معمولاً به جواب بهتری نسبت به الگوریتم های مبتنی بر گرادیان ختم خواهد شد. اما در عمل این گونه نیست و ما نمی توانیم مثلاً یک هفته برای یادگیری یک شبکه عصبی وقت بگذرایم وقتی که روش پس انتشار خطا در حدود یکی دو ساعت آن را حل می کند (حتی اگر به جواب کمی ضعیف تر برسد).
اما پرونده استفاده از الگوریتم های تکاملی در یادگیری شبکه عصبی را نباید بسته فرض کرد. شبکه های عصبی زیادی مطرح می شوند که ساختاری دارند که نظم کافی برای گرفتن مشتقات مورد استفاده در روشهای مبتنی بر گرادیان را نداشته و بنابراین روشهایی مثل پس انتشار خطا قابل اعمال نیستند. اینجاست که الگوریتم های تکاملی و در کنار آنها، الگوریتم رقابت استعماری باید مورد استفاده قرار گیرند.
سوال دوم: چرا الگوریتم رقایت استعماری؟
الگوریتم رقایت استعماری (ICA) در کنار روشهای دیگر بهینه سازی به عنوان ابزار نوینی برای محاسبات تکاملی و حل مسائل بهینه سازی مطرح شده و با موفقیت به بسیاری از مسائل در این حوزه اعمال شده است. اکثر مقالات منتشر شده (بعضی از آنها را در این لینک ببینید) نیز از موفقیت و برتری نسبی این الگوریتم حکایت کرده اند.
پیاده سازی و برنامه نویسی عملی آموزش شبکه عصبی در متلب: بخش های مختلف کد مورد استفاده برای یادگیری شبکه عصبی را در زیر می بینیم. این کدها از دستورات تولباکس شبکه عصبی متلب استفاده می کنند. به زودی فیلم جامعی در مورد آموزش عملی برنامه نویسی شبکه عصبی در متلب در همین وبسیات عرضه خواهد شد. همچنین در این لینک فایلهای آموزشی مکاتبه ای از متلبسایت قابل تهیه هستند. بخش های مختلف یک برنامه شبکه عصبی را با هم مرور می کنیم.
بعضی کدهای مروبط به شروع برنامه در اینجا قرار می گیرد.
دسته دیتای مورد استفاده را که معمولاً در یک فایل اکسل یا نوت پد و غیره قرار دارد در این بخش لود می کنیم. در بعضی موارد نیز دیتای مصنوعی را خودمان تولید می کنیم.
دیتا را قبل از اعمال به شبکه عصبی معمولاً نرمالیزه می کنیم. خروجی ها را نیز در بعضی مسائل همانند مسائل طبقه بندی الگو (Pattern Recognition) کد گذاری می کنیم.
دیتای تست و ترین و در بعضی موارد ارزیابی در این بخش جدا می شوند. مثلاً می نویسیم:
ساختار شبکه در این بخش ایجاد می شود. معمولاً از دستور newff در متلب استفاده می کنیم. مثال زیر را ببینید.
%% Network Training
شبکه آموزش دیده را ارزیابی می کنیم.
بعضی تحلیل ها را انجام داده و نمودارهای لازم را می کشیم.
برای استفاده از الگوریتم رقابت استعماری برای آموزش شبکه عصبی چه باید کرد؟
ما سعی می کنیم از ساختار شبکه را با دستور newff ایجاد کنیم. ولی در کل می توان برنامه را از اول بدون استفاده از دستورات تولباکس نیز نوشت.
تابع هزینه
همان ساختار کد بالا را درنظر بگیرید. در آنجا در درستور زیر ساختار شبکه ایجاد شد.
روی این ساختار در workspace متلب کلیک کنید. تمام تنظیمات شبکه را خواهید دید. سعی کنید محل ذخیره شدن وزن های شبکه عصبی را پیدا کرده و به آنها دسترسی پیدا کنید. شما باید بتوانید این وزنهای اولیه تصادفی را دستکاری کنید (در انتهای پست در بخش پیوست توضیحات بیشتری در این مورد داده شده است). تابع هزینه شما به این صورت خواهد بود.
از رشته طولانی Country به ترتیب کدینگی که خود انتخاب کرده اید، وزن لایه های مختلف را جدا کنید.
این وزنها را در محل های مناسبشان در Network قرارداده و دیتای ورودی اموزش را با استفاده از دستور sim متلب به Network داده و خروجی ان را گرفته و با خروجی واقعی تست مقایسه کرده و برگردانید.
Load TrainData_X
Load TrainData_Y
NetOut = sim(Network2,TrainData_X)
Cost = mse(NetOut, TrainData_Y)
آموزش شبکه
حال باید شبکه را آموزش دهیم. بدون دستکاری کدهای اولیه دستور train مورد استفاده در آنها را با یک تابع جدید که خودمان می نویسیم عوض کنید. اسم این تابع را مثلاً TrianUsing_ICA_Fcn می گذاریم.
کدهای آماده الگوریتمک رقابت استعماری (یا هر الگوریتم تکاملی دیگری) را در داخل این تابع قرار می دهیم. طول رشته بردار کشور (بعد یا همان تعداد متغیرهای بهینه سازی) را برابر با تعداد کل وزنهای مجهول شبکه در نظر می گیرم. با داشتن تابع هزینه تعریف شده، مثل هر مسئله بهینه سازی دیگری، به این مسئله بهینه سازی نگاه کرده و کدها را به آن اعمال می کنیم. البته این کار نیاز به کمی تغییرات و بازی کردن با کدها را خواهد داشت. اگر به کدهای الگوریتم رقابت استعماری دسترسی ندارید و یا نحوه استفاده از آنها را نمی دانید، این لینک را ببینید.
مقالات منتشر شده
تا کنون مقالات متعددی در مورد استفاده از الگوریتم رقابت استعماری در یادگیری شبکه عصبی، منتشر شده اند. چندین مورد از این مقالات در بخش پایان نامه ها و مقالات در این لینک لیست شده اند. عنوان دو مورد از این مقالات را در زیر می بینید.
Publication Year: 2010
Language: English
Type (Journal/Conference/Book Chapter): Conference Paper
Journal/Conference Title: The 2nd International Workshop on Intelligent System and Applications(ISA2010)
2) Title: Artificial Neural Network Weights Optimization based on Imperialist Competitive Algorithm
Authors: Maryam, Tayefeh Mahmoudi, Nafiseh, Forouzideh, Caro, Lucas, Fattaneh, Taghiyareh
Publication Year: 2009
Language: English
Type (Journal/Conference/Book Chapter): Conference Paper
Journal/Conference Title: Computer Science and Information Technologies 2009, CSIT’2009: Fourth International Scientific and Technical Conference, 15-17 October 2009, Lviv, Ukraine
مولفین: حميد لطيفي، مجيد لطيفي
سال انتشار: 1388
زبان: فارسی
نوع مقاله (کنفرانس/ژورنال/فصل کتاب): کنفرانس
راهنمایی بیشتر
متلب سایت، اخیراً پنج فیلم آموزشی در زمینه شبکه های عصبی مصنوعی و کاربرد آنها در حوزه های مختلف منتشر کرده است که یکی از آنها دقیقاً موارد تئوریک و عملی مرتبط با این مبحث را بطور کامل توضیح می دهد. عنوان پنج فیلم آموزشی متلب سایت عبارتند از:
- فیلم آموزش عملی طبقه بندی و بازشناسی الگو با استفاده از شبکه های عصبی (به فارسی)
- فیلم آموزش عملی پیش بینی سریهای زمانی با استفاده از شبکه های عصبی (به فارسی)
- فیلم آموزش عملی ترکیب شبکه عصبی و الگوریتم رقابت استعماری ICA (به فارسی)
- فیلم آموزش عملی ترکیب شبکه عصبی و الگوریتم ازدحام ذرات PSO (به فارسی)
- فیلم آموزش عملی ترکیب شبکه عصبی و الگوریتم ژنتیک (به فارسی)
بطور ویژه توصیه می شود، فیلم آموزش عملی ترکیب شبکه عصبی و الگوریتم رقابت استعماری ICA (به فارسی) را برای رفع هر گونه مشکل احتمالی خود استفاده نمایید. استفاده از سایر فیلم ها نیز برای توسعه کار به کاربردها و حالت های جدیدتر توصیه می شوند.
خبر جدید (14 ژوئن 2011): یک نسخه از کدهای آماده برای دانلود بر روی همین سایت (محاسبات تکاملی) قرار گرفت. برچسپ شبکه عصبی و دانلود کدهای آماده را در میان برچسپ های سایت ببینید.
________________________
پیوست: نحوه تغییر تنظیمات شبکه
یک ساختار شبکه در حالت نوعی با دستور زیر ایجاد می کنیم.
مطابق شکل زیر، بر روی متغیر شبکه ایجاد شده در workspace متلب کلیک می کنیم.
با انجام این کار لیست کامل پارامترهای شبکه را می بینیم.
Neural Network object:
architecture:
numInputs: 1
numLayers: 3
biasConnect: [1; 1; 1]
inputConnect: [1; 0; 0]
layerConnect: [0 0 0; 1 0 0; 0 1 0]
outputConnect: [0 0 1]
numOutputs: 1 (read-only)
numInputDelays: 0 (read-only)
numLayerDelays: 0 (read-only)
subobject structures:
inputs: {1×1 cell} of inputs
layers: {3×1 cell} of layers
outputs: {1×3 cell} containing 1 output
biases: {3×1 cell} containing 3 biases
inputWeights: {3×1 cell} containing 1 input weight
layerWeights: {3×3 cell} containing 2 layer weights
functions:
adaptFcn: ‘trains’
divideFcn: (none)
gradientFcn: ‘gdefaults’
initFcn: ‘initlay’
performFcn: ‘mse’
plotFcns: {‘plotperform’,’plottrainstate’,’plotregression’}
trainFcn: ‘trainlm’
parameters:
adaptParam: .passes
divideParam: (none)
gradientParam: (none)
initParam: (none)
performParam: (none)
trainParam: .show, .showWindow, .showCommandLine, .epochs,
.time, .goal, .max_fail, .mem_reduc,
.min_grad, .mu, .mu_dec, .mu_inc,
.mu_max
weight and bias values:
محل قرار گرفتن و ذخیره شدن وزن های لایه های ورودی، میانی و بیاس را در زیر می بینیم. در این میان IW، وزنهای لایه ورودی، LW وزنهای لایه میانی و b مقادیر بایاس را در خود دارد.
LW: {3×3 cell} containing 2 layer weight matrices
b: {3×1 cell} containing 3 bias vectors
other:
name: ”
برای ایجاد تغییرات در وزنهای شبکه موقعیت آنها را در نظر میگیرم. شبکه تعریف شده در بالا یک شبکه با 6 ورودی، 4 نورون در لایه اول، 2 نورون در لایه دوم و یک نورون در لایه خروجی است. بنابراین ماتریس وزنهای لایه اول باید 4*6 یا 6*4 باشد.
ans =
[4×6 double]
[]
[]
0.7384 0.3105 1.0734 1.0726 -0.1836 0.3654
0.7417 -0.7356 0.8497 -0.0267 0.7598 -0.8486
-0.8474 -0.5032 -0.7778 0.6822 0.6638 0.7931
0.7593 0.0861 0.8643 -0.6578 0.8440 0.7971
ماتریس فوق، مقادیر وزنهای لایه اول (از ورودی به لایه اول) است. مثلاً با دستور زیر می توانیم همه این وزنها را یک کنیم.
نتیجه به صورت زیر می شود.
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
به همین صورت برای لایه های غیر از لایه اول نیز خواهیم داشت.
ans =
[] ……. ……. ……. [] ……. ……. ……. []
[2×4 double] ……….. [] ……. ……. ……. []
[] ……. ……. ……. [1×2 double] ………. []
در این میان ماتریس 4*2 وزنهای لایه اول به دوم و 2*1 وزنهای لایه دوم به لایه سوم (خروجی) است. برای دسترسی به آنها و یا ایجاد تغییرات، باید به موقعیت دقیق آنها اشاره کنیم.
0.7494 …….. 1.0194 ……… 0.6519 …….. 0.8639
0.6740 ……. -0.2818 ……. -0.8599 ……. -1.2243
>> Network.LW{3,2}
ans =
-0.6176 -1.2564
به این ترتیب ملاحظه می کنید تابع هزینه باید ساختار شبکه را بگیرد و ماتریس کروموزوم یا کشور ما را ابتدا به تکه های مختلف ماتریس وزنها جدا کند، این بخش ها را در محل واقعی انها قرار دهد. شبکه را با دستور sim و با استفاده از دیتاهای موجود اجرا کند (اجرا نه اموزش) و در نهایت mse دیتای آموزش را به عنوان میزان هزینه برگرداند.
با عرض سلام و خسته نباشید. این بخش آموزش شبکه عصبی (Neural Network Training) توسط الگوریتم رقابت استعماری (ICA) خیلی جالب بود. آیا می شود کد آن را بطور کامل به ایمیل اینجانب ارسال نمایید. چون با توضیحات داده شده من نتوانستم آن را پیاده سازی کنم. باتشکر
shaghayegh_gharavi@yaoo.com
با سلام.
یک نمونه از کدهای مرتبط با این موضوع به زودی پس از برخی آماده سازی های بر روی سایت در همین پست، قرار خواهند گرفت.
این کدها در حال حاضر در سایت در لینک زیر منتشر شده اند.
http://www.icasite.info/2011/07/blog-post_13.html