Artificial Intelligence - هوش مصنوعی  
انجمن را در گوگل محبوب کنيد :

بازگشت   Artificial Intelligence - هوش مصنوعی > مقالات و اسلاید ها > مقالات و اسلایدهای فارسی مرتبط با هوش مصنوعی


 
تبليغات سايت
Iranian Association for the Advancement of Artificial Intelligence
ارسال تاپيک جديد  پاسخ
 
LinkBack ابزارهاي تاپيک نحوه نمايش
قديمي ۰۶-۱۳-۱۳۸۹, ۰۵:۲۶ بعد از ظهر   #1 (لینک دائم)
Administrator
 
آواتار Astaraki
 
تاريخ عضويت: خرداد ۱۳۸۷
محل سكونت: تهران-کرج!
پست ها: 3,465
تشكرها: 754
16,337 تشكر در 3,127 پست
My Mood: Mehrabon
ارسال پيغام Yahoo به Astaraki
Thumbs up یادگیری شبکه عصبی با استفاده از الگوریتم رقابت استعماری

یادگیری شبکه عصبی با استفاده از الگوریتم رقابت استعماری

اين پست از وبسايت محاسبات تکاملی و الگوریتم رقابت استعماری ميباشد.پس براي مطالعه بيشتر به منبع آن مراجعه کنيد.


مقدمه
پستی که در ادامه می خوانید، به یادگیری شبکه عصبی با استفاده از الگوریتم رقابت استعماری می پردازد. البته مطالب ارائه شده عمومی بوده و شامل استفاده از الگوریتم های دیگری همچون الگوریتم ژنتیک یا 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 مختلف را ترسیم می کنیم و خطی که بیشترین عبور (برازش) را داشته باشد، انتخاب می کنیم. همین. البته اصلاً در مورد برازش خط اصلاً نیازی به این همه انرژی گذاشتن نیست! جواب مسئله را دوستان ریاضی کار حل کرده اند و تر و تمیز در اختیار گذاشته اند. مثلاً این لینک ویکیپدیا را ببینید.



شکل 1: برازش خطی تعداد نقطه. در این شکل بهترین خط عبوری از میان این نقاط ترسیم شده است.

حالا اگر نقاط ما در حالتی مثل سهمی قرار گرفته بودند چه باید کرد؟ هیچ کاری! رابطه بالا را به صورت جامعتر (y=ax^2+bx+c) رابطه سهمی می نویسیم و به دنبال سه پارامتر مناسب برای a و b و c می گردیم. خوشبختانه جواب این حالت (کلاً چند جمله ای از هر درجه ای) نیز بصورت تحلیلی وجود دارد. شکل زیر، برازش منحنی با استفاده از یک معادله سهمی را نشان می دهد.


شکل 2: برازش تعداد نقطه توسط معادله مرتبه دو. در این شکل بهترین سهمی عبوری از میان این نقاط ترسیم شده است.


اگر رابطه پیچیده شد، چه باید کرد؟ این بار در کنار روشهای دیگر (مثلاً چند جمله ای های درجه بالاتر که کم کم کارایی خود را از دست خواهند داد)، شبکه عصبی نیز مفید خواهد بود. با این روند باید شما هم مثل من به این نتیجه رسیده باشید، که شبکه عصبی یک رابطه و ارتباط بین ورودی و خروجی است.
به عبارت دیگر شبکه عصبی چیزی نیست به جز یک تابع ساده!
شکل زیر ساختار یک شبکه عصبی پرسپترون چند لایه را به همراه ساختار یک نرون نشان می دهد. این شبکه عصبی دارای N تا ورودی و یک خروجی است.


شکل 3: ساختار یک شبکه عصبی پرسپترون چند لایه


شکل 4: ساختار یک نرون مورد استفاده در ساختار شکل 3


هر تابعی که برای برازش منحنی استفاده می شود، پارامترهایی دارد. شبکه عصبی هم از این پارامترها (آنهم به تعداد زیاد) دارد. ما مجموعه آنها را با W نشان می دهیم. برای شبکه عصبی حل بسته و ساده وجود ندارد. یک روش مورد استفاده، روش پس انتشار خطا (Error Back-Propagation) می باشد. این روش از تکنیک های بهینه سازی مبتنی بر گرادیان (Gradient-Based Methods) برای یافتن W استفاده می کند. منتها این تنها روش نیست. روشهای بهینه سازی تکاملی نیز برای این منظور استفاده می شوند.

الگوریتم رقابت استعماری
الگوریتم رقابت استعماری (Imperialist Competitive Algorithm) که به اختصار ICA نامیده می شود، یکی از جدید ترین الگوریتم های بهینه سازی تکاملی است. این الگوریتم همانگونه که از نام آن بر می آید، بر مبنای مدلسازی فرایند اجتماعی سیاسی پدیده استعمار بنا نهاده شده است. از این جهت در نوع خود یک الگوریتم جدید بوده و قابل رقابت با سایر الگوریتم های تکاملی از جمله الگوریتم های ژنتیک، الگوریتم پرندگان و کلونی مورچگان و غیره می باشد. از جهت کاربرد نیز تا کنون در حل مسائل زیادی در زمینه بهینه سازی از جمله در مهندسی برق، کامپیوتر، صنایع، مکانیک، اقتصاد، مدیریت و ... استفاده شده است. دلیل استقبال بالا از این الگوریتم در کنار کارایی بالای آن، بیشتر به جنبه نوآوری و جدید و جذاب بودن آن برای متخصصین حوزه بهینه سازی بر می گردد. شکل زیر روند اعمال الگوریتم رقابت استعماری به یک مسئله بهینه سازی در حالت کلی را نشان می دهد. یادگیری شبکه عصبی نیز که یک مسئله بهینه سازی است، همین روند را خواهد داشت.

شکل 5: روند اعمال الگوریتم رقابت استعماری به یک مسئله بهینه سازی در حالت کلی


آموزش شبکه عصبی
آموزش شبکه عصبی همانگونه که در بالا نیز بدان اشاره گردید، همان تعیین وزنهای مناسب برای شبکه عصبی است. برای این منظور باید از یک روش بهینه سازی قوی و سریع استفاده کرد.

آموزش شبکه عصبی با استفاده از الگوریتم رقابت استعماری (ICA)
سوال اول: چرا آموزش شبکه عصبی با استفاده از الگوریتم های تکاملی؟

از روی این سوال خیلی از موارد بدون پرسیدن آن، رد می شویم. اما اتفاقاً این مهم ترین سوال است. چرا در کنار وجود الگوریتم های بهینه سازی مبتنی بر گرادیان (Gradient-Based Methods) که الگوریتمی مثل پس انتشار خطا (Error Back-Propagation) از آن ها استخراج می شود و خیلی سریع هم هست، باید برویم سراغ روشهای تکاملی مثل الگوریتم ICA؟ بیایید مزایا و معایب هر روش را بررسی کنیم.
الگوریتم های بهینه سازی مبتنی بر گرادیان و الگوریتم پس انتشار خطا (BP) خیلی سریع هستند.
الگوریتم های بهینه سازی مبتنی بر گرادیان و الگوریتم پس انتشار خطا (BP) مشکل افتادن در دام مینیمم محلی را دارند.
الگوریتم های بهینه سازی مبتنی بر گرادیان و الگوریتم پس انتشار خطا (BP) فقط به دسته ای خاص و استاندارد از شبکه های عصبی مثل پرسپترون چند لایه (BP) و آر بی اف که حل بسته برای مشتق تابع هدف نسبت به وزنها را دارند، قابل اعمال هستند.
الگوریتم های بهینه سازی تکاملی در مقایسه با الگوریتم های مبتنی بر گرادیان کند هستند.
الگوریتم های بهینه سازی تکاملی قابلیت فرار از دام محلی را دارند.
الگوریتم های بهینه سازی تکاملی وابسته به ساختار خاصی از شبکه نیستند و به هر ساختار تعریف شده ای قابل اعمال هستند.
به غیر از تعیین وزنها (یادگیری شبکه عصبی) می توان همزمان ساختار شبکه (تعداد لایه ها و تعداد نرونها در هر لایه) را نیز توسط الگوریتم های بهینه سازی تکاملی مثل الگوریتم رقابت استعماری یاد گرفت.
پس استفاده از الگوریتم های تکاملی در شبکه عصبی مزیت فرار از نقاط مینیمم محلی و نیز عدم وابستگی به ساختار معین شبکه را دارد. اما در عوض این الگوریتم ها کند می باشند. البته کند بودن بحث بسیار مهمی است و به همین سادگی نمی توان از آن عبور کرد. در مواردی کند بودن این روشها سایر مزیت های الگوریتم را زیر سوال می برد. در مورد شبکه عصبی نیز همین گونه است. استفاده از الگوریتم های تکاملی در مورد شبکه های عصبی استاندارد (در کنار وجود روشهای مبتنی بر گرادیان سریع) خیلی توجیه پذیر نیست. البته اگر زمان کافی داشته باشیم (میل دادن زمان به بینهایت) استفاده از الگوریتم های تکاملی معمولاً به جواب بهتری نسبت به الگوریتم های مبتنی بر گرادیان ختم خواهد شد. اما در عمل این گونه نیست و ما نمی توانیم مثلاً یک هفته برای یادگیری یک شبکه عصبی وقت بگذرایم وقتی که روش پس انتشار خطا در حدود یکی دو ساعت آن را حل می کند (حتی اگر به جواب کمی ضعیف تر برسد).
اما پرونده استفاده از الگوریتم های تکاملی در یادگیری شبکه عصبی را نباید بسته فرض کرد. شبکه های عصبی زیادی مطرح می شوند که ساختاری دارند که نظم کافی برای گرفتن مشتقات مورد استفاده در روشهای مبتنی بر گرادیان را نداشته و بنابراین روشهایی مثل پس انتشار خطا قابل اعمال نیستند. اینجاست که الگوریتم های تکاملی و در کنار آنها، الگوریتم رقابت استعماری باید مورد استفاده قرار گیرند.

سوال دوم: چرا الگوریتم رقایت استعماری؟
الگوریتم رقایت استعماری (ICA) در کنار روشهای دیگر بهینه سازی به عنوان ابزار نوینی برای محاسبات تکاملی و حل مسائل بهینه سازی مطرح شده و با موفقیت به بسیاری از مسائل در این حوزه اعمال شده است. اکثر مقالات منتشر شده (بعضی از آنها را در این لینک ببینید) نیز از موفقیت و برتری نسبی این الگوریتم حکایت کرده اند.

پیاده سازی و برنامه نویسی عملی آموزش شبکه عصبی در متلب:
بخش های مختلف کد مورد استفاده برای یادگیری شبکه عصبی را در زیر می بینیم. این کدها از دستورات تولباکس شبکه عصبی متلب استفاده می کنند. به زودی فیلم جامعی در مورد آموزش عملی برنامه نویسی شبکه عصبی در متلب در همین وبسیات عرضه خواهد شد. همچنین در این لینک فایلهای آموزشی مکاتبه ای از متلبسایت قابل تهیه هستند. بخش های مختلف یک برنامه شبکه عصبی را با هم مرور می کنیم.

كد:
%% Start of Program
بعضی کدهای مروبط به شروع برنامه در اینجا قرار می گیرد.
كد:
%% Data generation or loading
دسته دیتای مورد استفاده را که معمولاً در یک فایل اکسل یا نوت پد و غیره قرار دارد در این بخش لود می کنیم. در بعضی موارد نیز دیتای مصنوعی را خودمان تولید می کنیم.
كد:
%% Data Normalization
دیتا را قبل از اعمال به شبکه عصبی معمولاً نرمالیزه می کنیم. خروجی ها را نیز در بعضی مسائل همانند مسائل طبقه بندی الگو (Pattern Recognition) کد گذاری می کنیم.
كد:
%% Train and Test Data
دیتای تست و ترین و در بعضی موارد ارزیابی در این بخش جدا می شوند. مثلاً می نویسیم:
كد:
TrPercent = 80;
TrNum = round(TrPercent/100 * DataNum);

R = randperm(DataNum);
TrIndex = R(1:TrNum);
TsIndex = R(TrNum+1:end);

Xtr = XN(TrIndex,:);
Xts = XN(TsIndex,:);

Ytr = YN(TrIndex,:);
Yts = YN(TsIndex,:);

%% Network Structure

ساختار شبکه در این بخش ایجاد می شود. معمولاً از دستور newff در متلب استفاده می کنیم. مثال زیر را ببینید.
كد:
pr = [-1 1];
PR = repmat(pr,InputNum,1);
Network = newff(PR, [10 5 1],{'tansig' 'tansig' 'purelin'});
Network.trainParam.epochs = 100;
Network.trainParam.goal = 0.0001;

%% Network Training
حال شبکه را آموزش می دهیم.
كد:
Network = train(Network,Xtr',Ytr');

%% Network Assessment

شبکه آموزش دیده را ارزیابی می کنیم.

كد:
%% Network Analysis and Display
بعضی تحلیل ها را انجام داده و نمودارهای لازم را می کشیم.

كد:
%% End of Program

برای استفاده از الگوریتم رقابت استعماری برای آموزش شبکه عصبی چه باید کرد؟
ما سعی می کنیم از ساختار شبکه را با دستور newff ایجاد کنیم. ولی در کل می توان برنامه را از اول بدون استفاده از دستورات تولباکس نیز نوشت.

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

كد:
Network = newff(PR, [10 5 1],{'tansig' 'tansig' 'purelin'});

روی این ساختار در workspace متلب کلیک کنید. تمام تنظیمات شبکه را خواهید دید. سعی کنید محل ذخیره شدن وزن های شبکه عصبی را پیدا کرده و به آنها دسترسی پیدا کنید. شما باید بتوانید این وزنهای اولیه تصادفی را دستکاری کنید. تابع هزینه شما به این صورت خواهد بود.

كد:
function Cost = ICA_CostFunction_Fcn(Country,Network);

از رشته طولانی Country به ترتیب کدینگی که خود انتخاب کرده اید، وزن لایه های مختلف را جدا کنید.

كد:
[W U V , …] = GetNetworkWeightsFromCountry_Fcn(Country);

این وزنها را در محل های مناسبشان در Network قرارداده و دیتای ورودی اموزش را با استفاده از دستور sim متلب به Network داده و خروجی ان را گرفته و با خروجی واقعی تست مقایسه کرده و برگردانید.
كد:
Network2 = Change Network With W U V …
Load TrainData_X
Load TrainData_Y
NetOut = sim(Network2,TrainData_X)
Cost = mse(NetOut, TrainData_Y)
end

آموزش شبکه
حال باید شبکه را آموزش دهیم. بدون دستکاری کدهای اولیه دستور train مورد استفاده در آنها را با یک تابع جدید که خودمان می نویسیم عوض کنید. اسم این تابع را مثلاً TrianUsing_ICA_Fcn می گذاریم.

كد:
Function TrainedNetwork = TrianUsing_ICA_Fcn(Network,Xtr,Ytr);

کدهای آماده الگوریتمک رقابت استعماری (یا هر الگوریتم تکاملی دیگری) را در داخل این تابع قرار می دهیم. طول رشته بردار کشور (بعد یا همان تعداد متغیرهای بهینه سازی) را برابر با تعداد کل وزنهای مجهول شبکه در نظر می گیرم. با داشتن تابع هزینه تعریف شده، مثل هر مسئله بهینه سازی دیگری، به این مسئله بهینه سازی نگاه کرده و کدها را به آن اعمال می کنیم. البته این کار نیاز به کمی تغییرات و بازی کردن با کدها را خواهد داشت. اگر به کدهای الگوریتم رقابت استعماری دسترسی ندارید و یا نحوه استفاده از آنها را نمی دانید، این لینک را ببینید.
كد:
BestWeights = FindBestWeightsUsingICA_Fcn(Network,Xtr,Ytr);

TrainedNetwork = Modify Network with Best Weights;

end

مقالات منتشر شده
تا کنون مقالات متعددی در مورد استفاده از الگوریتم رقابت استعماری در یادگیری شبکه عصبی، منتشر شده اند:

Title: Neural Network Learning based on Chaotic Imperialist Competitive Algorithm


Title: Artificial Neural Network Weights Optimization based on Imperialist Competitive Algorithm


عنوان: شبكه هاي عصبي تركيب شده با الگوريتم رقابت استعماري براي طبقه بندي ديتاهاي بازار بورس تهران

ويرايش شده توسط Astaraki; ۰۶-۱۳-۱۳۸۹ در ساعت ۰۶:۰۴ بعد از ظهر
Astaraki آفلاين است   پاسخ با نقل قول
از Astaraki تشكر كرده است:
ali_darinoos (۱۲-۱۳-۱۳۸۹)

  #ADS
نشان دهنده تبلیغات
تبليغگر
 
 
 
تاريخ عضويت: -
محل سكونت: -
سن: 2010
پست ها: -
 

نشان دهنده تبلیغات is online  
پاسخ



كاربران در حال ديدن تاپيک: 1 (0 عضو و 1 مهمان)
 

قوانين ارسال
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is فعال
شکلکها فعال است
كد [IMG] فعال است
كدهاي HTML غير فعال است
Trackbacks are فعال
Pingbacks are فعال
Refbacks are فعال




زمان محلي شما با تنظيم GMT +3.5 هم اکنون ۰۳:۱۹ قبل از ظهر ميباشد.


Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.1.0 ©2007, Crawlability, Inc.

Teach and Learn at Hexib | Sponsored by www.Syavash.com and Product In Review

استفاده از مطالب انجمن در سایر سایت ها، تنها با ذکر انجمن هوش مصنوعي به عنوان منبع و لینک مستقیم به خود مطلب مجاز است

Inactive Reminders By Icora Web Design