شبکه عصبی در متلب — از صفر تا صد

۶۴۵۹ بازدید
آخرین به‌روزرسانی: ۲۴ اردیبهشت ۱۴۰۲
زمان مطالعه: ۱۴ دقیقه
دانلود PDF مقاله
شبکه عصبی در متلب — از صفر تا صدشبکه عصبی در متلب — از صفر تا صد

شبکه‌های عصبی (Neural Networks) شبکه‌هایی از سلول‌های عصبی (نورون یا پی‌ياخته یا عصب) مغز هستند. مغز انسان میلیاردها نورون و تریلیون‌ها ارتباط بین آن‌ها دارد. این نورون‌ها مدام در حال پردازش و ارسال اطلاعات به نورون‌های دیگر هستند. در این آموزش، با پیاده‌سازی شبکه عصبی در متلب برای تقریب توابع و سیستم‌ها آشنا می‌شویم. برای آشنایی بیشتر با مفاهیم و تعاریف شبکه‌های عصبی می‌توانید آموز‌ش‌های «شبکه‌های عصبی مصنوعی» و «ساخت شبکه عصبی» را مطالعه کنید.

997696

در سال ۱۹۰۹، «سانتیاگو رامون کاخال» (Santiago Ramon y Cajal) کشف کرد که مغز از تعداد زیادی نورون متصل به هم تشکیل شده که پیام‌های بسیار ساده تحریکی (Excitatory) و مهاری (Inhibitory) را برای یکدیگر ارسال می‌کنند و تهییج (Excitation) آن‌ها با همین پیام‌های ساده به‌روز می‌شود. یک نورون سه بخش اصلی دارد: جسم سلولی، آکسون یا آسه (Axon) که پیام‌ها را ارسال می‌کند و دندریت یا دارینه (Dendrite) که پیام‌ها را دریافت می‌کند. جسم سلولی ساختار سلول را تشکیل می‌دهد. آکسون یک رشته منشعب است که پیام‌های نورون را به بیرون منتقل می‌کند. دندریت‌ها انشعاب‌های بیشتری دارند و سیگنال سلول‌های عصبی دیگر را دریافت می‌کنند.

نورون و مدل آن
شکل ۱: نورون و مدل آن

خلاصه‌ای از پیشرفت علمی در زمینه شبکه‌های عصبی به شرح زیر است:

  • در سال ۱۹۴۳، مک‌کولوخ (McCulloch) و پیتس (Pitts) اولین مدل ریاضی نورون‌ها را پیشنهاد کردند و نشان دادند که چگونه می‌توان شبکه‌های نورن‌مانند را تحلیل و محاسبه کرد.
  • نخستین ایده‌های یادگیری با شبکه‌های عصبی را هِب (Hebb) در کتابی با عنوان «سازمان‌دهی رفتار» در سال ۱۹۴۹ ارائه کرد.
  • در سال ۱۹۵۱، ادموندز (Edmonds) و مینسکی (Minsky) ماشین یادگیری خود را با بهره‌گیری از ایده هب ساختند.
  • نقطه مهم آغاز یادگیری شبکه نرون‌ را می‌توان کار روزنبلات (Rosenblatt) در سال ۱۹۶۲ دانست. روزنبلات دسته‌ای از شبکه‌های یادگیری نورون‌مانند ساده را ساخت که شبکه عصبی پرسپترون (Perceptron Neural Network) نامیده شد.
  • جان هاپفیلد (John Hopfield) در مقاله مهمی که در سال ۱۹۸۲ منتشر کرد، یک معماری برای شبکه عصبی با نام شبکه هاپفیلد ارائه کرد. از این شبکه عصبی می‌توان برای حل مسائل بهینه‌سازی مانند مسئله فروشنده دوره‌گرد استفاده کرد.
  • یک شبکه عصبی مهم که بسیار مورد استفاده قرار می‌گیرد، با یادگیری پس‌انتشار خطا (Backpropagation) یا BP است. شبکه عصبی پس‌انتشار خطا را اولین بار، وربوس (Werbos) در سال ۱۹۷۴ و پس از او روملهارت و همکارانش (Rumelhart et al) در سال ۱۹۸۶ ارائه کردند. کتاب‌ آن‌ها، با عنوان «پردازش توزیع شده موازی» (Parallel Distributed Processing)، چشم‌انداز گسترده‌ای از رویکردهای شبکه عصبی را بیان کردند.
  • شبکه‌های عصبی با توابع پایه شعاعی (Radial Basis Functions) یا شبکه‌هاب عصبی RBF در سال ۱۹۸۸ معرفی شدند و به دلیل قابلیت تعمیم و ساختار ساده‌شان که از انجام محاسبات طولانی و غیرضروری جلوگیری می‌کرد، نسبت به شبکه‌های پیش‌خور (Feed-forward Network) یا MFNها توجه زیادی را به خود جلب کردند. تحقیقات مربوط به قضایای تقریب جامع (Universal Approximation) نشان دادند که هر تابع غیرخطی را می‌توان روی یک مجموعه فشرده (Compact Set) و با دقت دلخواه با شبکه عصبی RBF تقریب زد. همچنین تحقیقات گسترده‌ای درباره کنترل عصبی RBF سیستم‌های غیرخطی انجام شده که در حال حاضر نیز ادامه دارد.

در ادامه، مدل ریاضی یک شبکه ساده RBF و پیاده‌سازی آن در متلب را بیان می‌کنیم.

یک شبکه عصبی ساده RBF

شبکه‌های عصبی RBF سه لایه دارند: لایه ورودی (Input Layer)، لایه پنهان یا مخفی (Hidden Layer) و لایه خروجی (Output Layer). نورون‌های لایه مخفی با یک تابع پایه شعاعی (RBF) فعال (تحریک) می‌شوند. لایه مخفی از آرایه‌ای از واحدهای محاسباتی تشکیل شده که گره‌های مخفی (Hidden Nodes) نامیده می‌شوند. هر گره مخفی شامل یک بردار cc مرکزی است که یک بردار پارامتری با طولی مشابه با بردار ورودی xx است. فاصله اقلیدسی بین بردار مرکز و بردار ورودی xx شبکه به صورت x(t)cj(t)||x (t) - c_j (t) || تعریف می‌شود.

شکل ۲ مدل شبکه عصبی ساده‌ای را نشان می‌دهد. در این شکل، ورودی‌ها یا همان نورون‌های ورودی x1x_1 تا xnx_n هستند. وزن‌ها نیز w1w _1 تا wnw _ n هستند که در هریک از ورودی‌ها ضرب می‌شوند.

عنصر دیگر این شبکه عصبی تابع جمع NetiNet _ i است که حاصل‌ضرب ورودی‌ها در وزن‌ها را جمع می‌کند. بخش دیگر این شبکه، تابع فعال‌سازی ff است. و در نهایت، خروجی بخش آخر این شبکه را تشکیل می‌دهد.

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

Neti=iwijxj+bi\large Net _ i = \sum _i w _ {i j } x_j + b _ i

ui=f(Neti)\large u _ i = f ( Net _ i )

yi=g(ui)=h(Neti)\large y _ i =g ( u _ i ) = h ( N e t _ i )

که در آن، g(ui)=uig ( u _ i ) = u _ i و yi=f(Neti)y _ i = f ( Net _ i ) است. مقدار bib_i نیز بایاس است.

یک مدل شبکه عصبی ساده
شکل ۲: یک مدل شبکه عصبی ساده

تابع فعال‌ساز f(Neti)f ( Net _i ) معمولاً به یکی از این سه صورت است:‌

۱. مقدار آستانه (Threshold Value):

f(Neti)={1Neti>00Neti0\large f ( N e t _ i ) = \begin {cases} \begin{matrix} 1 & Net _ i > 0 \\ 0 & N et _ i \le 0 \end {matrix} \end {cases}

تابع آستانه در شکل زیر داده شده است.

تابع آستانه
شکل ۳: تابع آستانه

۲. تابع خطی:

f(Neti)={0NetiNeti0kNetiNeti0<Neti<Neti1fmaxNetiNeti1\large f ( N e t _ i ) = \begin {cases} \begin{matrix} 0 & Net _ i \le Net_{i0} \\ k N e t _i & Net _ {i0} < Net_i < N e t _ {i1} \\ f _ { m a x } & N e t _ i \ge N e t _ { i 1 } \end {matrix} \end {cases}

برای مثال، با انتخاب Neti0=30Net _ {i 0 } = 30، Neti1=70N e t _ {i 1 } = 70 و fmax=5.0f _ { ma x } = 5.0 تابع خطی به صورت شکل ۴ خواهد بود.

تابع خطی
شکل ۴: تابع خطی

۳. تابع غیرخطی:

توابع سیگموئید (Sigmoid) و گوسی (Gaussian)‌ در شبکه‌های عصبی بسیار مورد استفاده قرار می‌گیرند. سیگموئید به صورت زیر تعریف می‌شود:

f(Neti)=11+eNetiT\large f ( Net _ i ) = \frac { 1 } { 1 + e ^ - \frac { Net _ i } { T } }

به عنوان مثال، با انتخاب T=1.0T = 1.0 شکل این تابع به صورت زیر خواهد بود.

تابع سیگموئید
شکل ۵: تابع سیگموئید

طراحی و شبیه‌سازی شبکه عصبی در متلب

شبکه عصبی تابع پایه شعاعی (RBF) یک شبکه عصبی چندلایه است. شبکه عصبی RBF از سه لایه با واحدهای (نورون‌های) پردازنده تشکیل می‌شود (در ساده‌ترین حالت).

شبکه عصبی RBF

ساختار یک شبکه عصبی RBF سه لایه در شکل ۶ نشان داده شده است.

ساختار شبکه عصبی RBF
شکل ۶: ساختار شبکه عصبی RBF

در شبکه عصبی RBF بردار ورودی x=[xi]T\mathbf{x} = [x _ i ] ^ T است. فرض می‌کنیم mm نورون در لایه مخفی وجود داشته باشد، و بردار تابع پایه شعاعی در لایه مخفی h=[hj]T\mathbf{h} = [h _j]^ T و hjh _ j تابع گوسی نورون jj‌ در لایه مخفی باشد، و داشته باشیم:

hj=exp(xcj22bj2)\large h _ j = \text {exp} \left( - \frac { ||x - c _ j|| ^ 2} {2 b _ j ^ 2 } \right )

که در آن، c=[cij]=[c11c1mcn1cnm]c = [c _ { i j } ] = \begin {bmatrix} c _ { 11} & \cdots & c _ { 1 m } \\ \vdots & \cdots & \vdots \\ c _ { n 1 } & \cdots & c _ {n m } \end {bmatrix} مختصات نقطه مرکزی تابع گوسی نورون jj برای iiاُمین ورودی است. همچنین، در بردار b=[b1,,bm]T\mathbf{b} = [b_1, \cdots, b _ m ] ^ T مقدار bjb _ j طول تابع گوسی را برای نورون jj نشان می‌دهد.

مقدار وزن RBF برابر است با:

w=[w1,,wm]T\large \mathbf { w} = [w _ 1 , \cdots, w _ m ]^ T

خروجی شبکه عصبی RBF به صورت زیر است:

y(t)=wTh=w1h1+w2h2++wmhm\large y ( t ) = \mathbf {w}^T \mathbf {h } = w _ 1 h _ 1 + w _ 2 h _ 2 + \cdots + w _ m h _ m

شبیه‌سازی شبکه عصبی RBF در متلب

یک شبکه عصبی RBF را با ساختار 1511 - 5 - 1 در نظر بگیرید که ورودی آن، x=x1x = x _ 1 است و داریم:

b=[b1    b2    b3    b4    b5]T\large \mathbf {b } = [b _ 1 \; \; b _ 2 \;\; b _ 3 \;\; b _ 4 \;\; b _ 5]^T

c=[c11    c12    c13    c14    c15]T\large \mathbf {c } = [c _ {11} \; \; c _ {12} \;\; c _ {13} \;\; c _ {14} \;\; c _ {15}]^T

h=[h1    h2    h3    h4    h5]T\large \mathbf {h} = [h _ 1 \; \; h _ 2 \;\; h _ 3 \;\; h _ 4 \;\; h _ 5]^T

w=[w1    w2    w3    w4    w5]T\large \mathbf {w} = [w _ 1 \; \; w _ 2 \;\; w _ 3 \;\; w _ 4 \;\; w _ 5]^T

y(t)=wTh=w1h1+w2h2+w3h3+w4h4+w5h5.\large y ( t ) = \mathbf {w} ^ T \mathbf {h } = w _ 1 h _ 1 + w _ 2 h _ 2 + w _ 3 h _ 3 + w _ 4 h _ 4 +w _ 5 h _ 5.

فرض می‌کنیم ورودی sint\sin t باشد. خروجی RBF در شکل ۷ و خروجی‌های لایه مخفی در شکل ۸ نشان داده شده‌اند.

خروجی RBF
شکل ۷: خروجی RBF
خروجی نورون‌های لایه مخفی
شکل ۸: خروجی نورون‌های لایه مخفی

ابتدا شکل زیر را در سیمولینک پیاده‌سازی می‌کنیم.

سیمولینک

تابع spacemodel.m به صورت زیر است:

1function [sys,x0,str,ts] = spacemodel(t,x,u,flag)
2switch flag,
3case 0,
4[sys,x0,str,ts]=mdlInitializeSizes;
5case 3,
6sys=mdlOutputs(t,x,u);
7case {2,4,9}
8sys=[];
9otherwise
10error(['Unhandled flag = ',num2str(flag)]);
11end
12function [sys,x0,str,ts]=mdlInitializeSizes
13sizes = simsizes;
14sizes.NumContStates = 0;
15sizes.NumDiscStates = 0;
16sizes.NumOutputs = 7;
17sizes.NumInputs = 1;
18sizes.DirFeedthrough = 1;
19sizes.NumSampleTimes = 0;
20sys = simsizes(sizes);
21x0 = [];
22str = [];
23ts = [];
24function sys=mdlOutputs(t,x,u)
25x=u(1); %Input Layer
26%i=1
27%j=1,2,3,4,5
28%k=1
29c=[-0.5 -0.25 0 0.25 0.5]; %cij
30b=[0.2 0.2 0.2 0.2 0.2]'; %bj
31W=ones(5,1); %Wj
32h=zeros(5,1); %hj
33for j=1:1:5
34h(j)=exp(-norm(x-c(:,j))^2/(2*b(j)*b(j))); %Hidden Layer
35end
36y=W'*h; %Output Layer
37sys(1)=y;
38sys(2)=x;
39sys(3)=h(1);
40sys(4)=h(2);
41sys(5)=h(3);
42sys(6)=h(4);
43sys(7)=h(5);

برای رسم نتایج برنامه را به صورت زیر می‌نویسیم.

1close all;
2% y=y(:,1);
3% x=y(:,2);
4% h1=y(:,3);
5% h2=y(:,4);
6% h3=y(:,5);
7% h4=y(:,6);
8% h5=y(:,7);
9figure(1);
10plot(out.t,out.y(:,1),'k','linewidth',2);
11xlabel('time(s)');ylabel('y');
12figure(2);
13plot(out.y(:,2),out.y(:,3),'k','linewidth',2);
14xlabel('x');ylabel('hj');
15hold on;
16plot(out.y(:,2),out.y(:,4),'k','linewidth',2);
17hold on;
18plot(out.y(:,2),out.y(:,5),'k','linewidth',2);
19hold on;
20plot(out.y(:,2),out.y(:,6),'k','linewidth',2);
21hold on;
22plot(out.y(:,2),out.y(:,7),'k','linewidth',2);

اکنون یک شبکه عصبی RBF را با ساختار ۲5۱۲ - 5 - ۱ در نظر بگیرید که ورودی آن x=[x1,x2]T\mathbf{x} = [x_1, x _ 2 ] ^T است و داریم:

b=[b1    b2    b3    b4    b5]T\large \mathbf {b } = [b _ 1 \; \; b _ 2 \;\; b _ 3 \;\; b _ 4 \;\; b _ 5]^T

c=[c11    c12    c13    c14    c15c21    c22    c23    c24    c25]T\large \mathbf {c } = \begin {bmatrix} c _ {11} \; \; c _ {12} \;\; c _ {13} \;\; c _ {14} \;\; c _ {15} \\ c _ {21} \; \; c _ {22} \;\; c _ {23} \;\; c _ {24} \;\; c _ {25} \end{bmatrix}^T

h=[h1    h2    h3    h4    h5]T\large \mathbf {h} = [h _ 1 \; \; h _ 2 \;\; h _ 3 \;\; h _ 4 \;\; h _ 5]^T

w=[w1    w2    w3    w4    w5]T\large \mathbf {w} = [w _ 1 \; \; w _ 2 \;\; w _ 3 \;\; w _ 4 \;\; w _ 5]^T

y(t)=wTh=w1h1+w2h2+w3h3+w4h4+w5h5.\large y ( t ) = \mathbf {w} ^ T \mathbf {h } = w _ 1 h _ 1 + w _ 2 h _ 2 + w _ 3 h _ 3 + w _ 4 h _ 4 +w _ 5 h _ 5.

دو ورودی sint\sin t را در نظر می‌گیریم.

خروجی RBF در شکل ۹ نشان داده شده است و شکل‌های ۱0 و ۱۱ خروجی‌های لایه مخفی را نشان می‌دهند.

خروجی RBF
شکل ۹: خروجی RBF
خروجی لایه مخفی برای ورودی اول
شکل ۱۰: خروجی لایه مخفی برای ورودی اول
خروجی لایه مخفی برای ورودی دوم
شکل ۱۱: خروجی لایه مخفی برای ورودی دوم

برای پیاده‌سازی این شبکه عصبی با دو ورودی، سیستم را به صورت زیر در سیمولینک تشکیل می‌دهیم.

سیمولینک

تابع spacemodel.m به صورت زیر است:

1function [sys,x0,str,ts] = spacemodel(t,x,u,flag)
2switch flag,
3case 0,
4[sys,x0,str,ts]=mdlInitializeSizes;
5case 3,
6sys=mdlOutputs(t,x,u);
7case {2,4,9}
8sys=[];
9otherwise
10error(['Unhandled flag = ',num2str(flag)]);
11end
12function [sys,x0,str,ts]=mdlInitializeSizes
13sizes = simsizes;
14sizes.NumContStates = 0;
15sizes.NumDiscStates = 0;
16sizes.NumOutputs = 8;
17sizes.NumInputs = 2;
18sizes.DirFeedthrough = 1;
19sizes.NumSampleTimes = 0;
20sys = simsizes(sizes);
21x0 = [];
22str = [];
23ts = [];
24function sys=mdlOutputs(t,x,u)
25x1=u(1); %Input Layer
26x2=u(2);
27x=[x1 x2]';
28%i=2
29%j=1,2,3,4,5
30%k=1
31c=[-0.5 -0.25 0 0.25 0.5;
32-0.5 -0.25 0 0.25 0.5]; %cij
33b=[0.2 0.2 0.2 0.2 0.2]'; %bj
34W=ones(5,1); %Wj
35h=zeros(5,1); %hj
36for j=1:1:5
37h(j)=exp(-norm(x-c(:,j))^2/(2*b(j)*b(j))); %Hidden Layer
38end
39yout=W'*h; %Output Layer
40sys(1)=yout;
41sys(2)=x1;
42sys(3)=x2;
43sys(4)=h(1);
44sys(5)=h(2);
45sys(6)=h(3);
46sys(7)=h(4);
47sys(8)=h(5);

برای رسم نتایج، برنامه‌ را به صورت زیر می‌نویسیم و اجرا می‌کنیم.

1close all;
2% y=y(:,1);
3% x1=y(:,2);
4% x2=y(:,3);
5% h1=y(:,4);
6% h2=y(:,5);
7% h3=y(:,6);
8% h4=y(:,7);
9% h5=y(:,8);
10figure(1);
11plot(out.t,out.y(:,1),'k','linewidth',2);
12xlabel('time(s)');ylabel('y');
13figure(2);
14plot(out.y(:,2),out.y(:,4),'k','linewidth',2);
15xlabel('x1');ylabel('hj');
16hold on;
17plot(out.y(:,2),out.y(:,5),'k','linewidth',2);
18hold on;
19plot(out.y(:,2),out.y(:,6),'k','linewidth',2);
20hold on;
21plot(out.y(:,2),out.y(:,7),'k','linewidth',2);
22hold on;
23plot(out.y(:,2),out.y(:,8),'k','linewidth',2);
24figure(3);
25plot(out.y(:,3),out.y(:,4),'k','linewidth',2);
26xlabel('x2');ylabel('hj');
27hold on;
28plot(out.y(:,3),out.y(:,5),'k','linewidth',2);
29hold on;
30plot(out.y(:,3),out.y(:,6),'k','linewidth',2);
31hold on;
32plot(out.y(:,3),out.y(:,7),'k','linewidth',2);
33hold on;
34plot(out.y(:,3),out.y(:,8),'k','linewidth',2);

آموزش شبکه عصبی با الگوریتم پس انتشار

شکل ۱۲ ساختار یک شبکه سه لایه را برای الگوریتم پس انتشار (BP) نشان می‌دهد. این الگوریتم، یکی از روش‌های آموزش شبکه عصبی است. اولین لایه (سمت چپ) لایه ورودی است که از داده‌های ورودی تغذیه می‌شود. لایه بعدی، لایه مخفی است که در آن، واحدهای پردازنده به واحدهای لایه قبل و بعد متصل هستند.

ساختار شبکه عصبی پس‌انتشار
شکل ۱۲: ساختار شبکه عصبی پس‌انتشار

همان‌طور که در شکل ۵ می‌بینیم، لایه‌ها کاملاً با هم ارتباط دارند؛ بدین معنی که هر واحد پردازش با همه واحدهای لایه قبلی ارتباط دارد. همچنین، واحدهای هر لایه مجزا با یکدیگر ارتباطی ندارند.

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

نمودار بلوکی تقریب سیستم با استفاده از شبکه عصبی پس انتشار در شکل ۱۳ نشان داده شده است.

طرح تقریب با پس انتشار
شکل ۱۳: طرح تقریب با پس انتشار

شکل ۱۴ نیز ساختار شبکه عصبی را برای تقریب نشان می‌دهد.

ساختار شبکه عصبی پس انتشار برای تقریب
شکل ۱۴: ساختار شبکه عصبی پس انتشار برای تقریب

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

۱. محاسبه پیش‌خور:

ورودی لایه مخفی برابر است با:

xj=iwijxi\large x _ j = \sum _ i w _ { i j } x _ i

خروجی لایه مخفی نیز به صورت زیر است:

xj=f(xj)=11+exj\large x' _j = f ( x _ j ) = \frac { 1 } { 1 + e ^ { - x _ j } }

در نتیجه، می‌توان نوشت:

xjxj=xj(1xj)\large \frac { \partial x' _ j } { \partial x _ j } = x' _ j ( 1 - x' _ j )

خروجی لایه خروجی نیز برابر است با:

yo(k)=jwjoxj\large y _ o ( k ) = \sum _j w _ { j o } x' _ j

بنابراین، خطای تقریب به صورت زیر قابل محاسبه است:

e(k)=y(k)yn(k)\large e ( k ) = y ( k ) - y _ n ( k )

تابع شاخص خطا را این‌گونه تعریف می‌کنیم:

E=12e(k)2\large E = \frac {1} { 2 } e ( k ) ^ 2

۲. الگوریتم یادگیری پس انتشار

طبق الگوریتم روش شدیدترین کاهش (گرادیان) مقدار وزن wjow _ { j o } برابر است با:

Δwjo=ηEwjo=ηe(k)yowjo=ηe(k)xj\large \Delta w _ { j o } = - \eta \frac { \partial E } { \partial w _ { j o } } = \eta \cdot e ( k ) \cdot \frac { \partial y _ o } { \partial w _ { j o } } = \eta \cdot e ( k ) \cdot x' _ j

مقدار وزن در لحظه k+1k + 1 به صورت زیر است:

wjo(k+1)=wjo(k)+Δwjo\large w _ { j o } ( k + 1 ) = w _ { j o } ( k ) + \Delta w _ { j o }

یادگیری مقدار وزن wijw _ { i j } برابر است با:

Δwij=ηEwij=ηe(k)yowij\large \Delta w _ {ij } = - \eta \frac { \partial E } { \partial w _ {ij } } = \eta \cdot e ( k ) \cdot \frac { \partial y _ o } { \partial w _ { i j } }

که در آن، از قاعده زنجیره‌ای زیر استفاده شده است:

yowij=yoxjxjxjxjwij=wjoxjxjxi=wjoxj(1xj)xi\large \frac { \partial y _ o } { \partial w _ { ij} } = \frac { \partial y _ o } { \partial x' _ { j} } \cdot \frac { \partial x' _ { j}} { \partial x _ { j} } \cdot \frac { \partial x _ { j}} { \partial w _ { i j} } = w _ { j o } \cdot \frac { \partial x' _ { j}} { \partial x _ { j} } \cdot x _ i = w _ { j o } \cdot x' _ j ( 1 - x' _ j ) \cdot x _ i

مقدار وزن در لحظه k+1k + 1 برابر است با:

wij(k+1)=wij(k)+Δwij\large w _ { i j } ( k + 1 ) = w _ { i j } (k) + \Delta w _ { i j }

با در نظر گرفتن اثر تغییر مقدار وزن قبلی، الگوریتم محاسبه وزن به صورت زیر خواهد بود:

wjo(k+1)=wjo(k)+Δwjo+α(wjo(k)wjo(k1))\large w _ { j o } (k + 1 ) = w _ { j o } ( k ) + \Delta w _ { j o } + \alpha ( w _ { j o } ( k ) - w _ { j o } ( k - 1 ) )

wij(t+1)=wij(t)+Δwij+α(wij(t)wij(t1))\large w _ { i j } (t + 1 ) = w _ { i j } ( t ) + \Delta w _ { i j } + \alpha ( w _ { i j } ( t ) - w _ { i j } ( t - 1 ) )

که در آن، η[0,1]\eta \in [0,1] نرخ یادگیری و α[0,1]\alpha \in [ 0 , 1 ] ضریب مومنتوم است.

با استفاده از تقریب شبکه عصبی پس انتشار، مقدار ژاکوبی را می‌توان به صورت زیر محاسبه کرد:

y(k)u(k)yo(k)u(k)=yo(k)xj×xjxj×xjx(1)=jwjoxj(1xj)w1j\large \frac { \partial y ( k ) } { \partial u ( k ) } \approx \frac { \partial y _ o ( k ) } { \partial u ( k ) } = \frac { \partial y _ o ( k ) } { \partial x'_j } \times \frac { \partial x'_j } { \partial x _ j } \times \frac { \partial x _ j } { \partial x ( 1 ) } = \sum _ j w _ { jo } x'_j ( 1 - x' _ j ) w _ { 1 j }

شبیه‌سازی تقریب شبکه عصبی با یادگیری پس انتشار در متلب

فرض کنید سیستمی با معادله زیر داده شده است:

y(k)=u(k)3+y(k1)1+y(k1)2\large y ( k ) = u ( k ) ^ 3 + \frac { y ( k - 1 ) } {1 + y ( k - 1 ) ^ 2 }

سیگنال ورودی u(k)=0.5sin(6πt)u ( k ) = 0.5 \sin ( 6 \pi t ) است. بردار ورودی شبکه عصبی RBF را به صورت x=[u(k)    y(k)]\mathbf { x } = [ u ( k ) \; \; y ( k ) ] و ساختار شبکه عصبی را 2612 - 6 - 1 انتخاب می‌کنیم. مقدار اولیه Wjo\mathbf {W} _ { jo} و Wij\mathbf {W } _ { i j } را یک مقدار تصادفی، بین [1    +1][-1 \;\; +1 ] در نظر می‌گیریم.

همچنین، η=0.50\eta = 0.50 و α=0.05\alpha = 0.05 را انتخاب می‌کنیم.

برای انجام شبیه‌سازی در متلب، یک m-فایل را با نام exp_1.m ذخیره کرده و برنامه زیر را در آن می‌نویسیم. حاصل اجرای برنامه زیر، شکل‌های ۱۵ تا ۱۷ است. همان‌طور که می‌بینیم، شبکه عصبی با خطای کمی تابع مورد نظر را تقریب زده است.

1%BP approximation
2clear all;
3close all;
4xite=0.50;
5alfa=0.05;
6wjo=rand(6,1);
7wjo_1=wjo;wjo_2=wjo_1;
8wij=rand(2,6);
9wij_1=wij;wij_2=wij;
10dwij=0*wij;
11x=[0,0]';
12u_1=0;
13y_1=0;
14I=[0,0,0,0,0,0]';
15Iout=[0,0,0,0,0,0]';
16FI=[0,0,0,0,0,0]';
17ts=0.001;
18for k=1:1:1000
19time(k)=k*ts;
20u(k)=0.50*sin(3*2*pi*k*ts);
21y(k)=u_1^3+y_1/(1+y_1^2);
22x(1)=u(k);
23x(2)=y(k);
24for j=1:1:6
25I(j)=x'*wij(:,j);
26Iout(j)=1/(1+exp(-I(j)));
27end
28yo(k)=wjo'*Iout; % Output of NNI networks
29e(k)=y(k)-yo(k); % Error calculation
30wjo=wjo_1+(xite*e(k))*Iout+alfa*(wjo_1-wjo_2);
31for j=1:1:6
32FI(j)=exp(-I(j))/(1+exp(-I(j)))^2;
33end
34for i=1:1:2
35for j=1:1:6
36dwij(i,j)=e(k)*xite*FI(j)*wjo(j)*x(i);
37end
38end
39wij=wij_1+dwij+alfa*(wij_1-wij_2);
40%%%%%%%%%%%%%%Jacobian%%%%%%%%%%%%%%%%
41yu=0;
42for j=1:1:6
43yu=yu+wjo(j)*wij(1,j)*FI(j);
44end
45dyu(k)=yu;
46wij_2=wij_1;wij_1=wij;
47wjo_2=wjo_1;wjo_1=wjo;
48u_1=u(k);
49y_1=y(k);
50end
51figure(1);
52plot(time,y,'r',time,yo,'b');
53xlabel('times');ylabel('y and yo');
54figure(2);
55plot(time,y-yo,'r');
56xlabel('times');ylabel('error');
57figure(3);
58plot(time,dyu);
59xlabel('times');ylabel('dyu');
تقریب BP
شکل ۱۵: تقریب BP
خطای تقریب پس انتشار
شکل ۱۶: خطای تقریب پس انتشار
شناسایی مقدار ژاکوبی
شکل ۱۷: شناسایی مقدار ژاکوبی

فیلم آموزش ویدیویی شبکه‌های عصبی مصنوعی در متلب

برای آشنایی بیشتر با شبکه‌های عصبی و پیاده‌سازی آن‌ها در متلب می‌توانید به دروه آموزش ویدئویی «مجموعه آموزش های شبکه های عصبی مصنوعی در متلب» مراجعه کنید. در این آموزشِ ۲۷ ساعت و ۴۶ دقیقه‌ای که شامل ۷ بخش اصلی است، می‌توانید با شبکه‌های عصبی مصنوعی و پیاده‌سازی آن‌ها در متلب از سطح مقدماتی تا پیشرفته آشنا شوید. در بخش اول و دوم این مجموعه، به ترتیب، شبکه‌های عصبی پرسپترون چندلایه یا MLP و شبکه‌های عصبی شعاعی پایه یا RBF در متلب ارائه شده است. در بخش سوم، ماشین‌های بردار پشتیبان یا SVM در متلب بیان شده است. یادگیری غیر نظارت شده و خوشه‌بندی با الگوریتم k-Means، موضوع بخش چهارم از این مجموعه ویدئویی است. شبکه‌های عصبی رقابتی و نگاشت خودسازمان‌ده یا SOM، تحلیل مؤلفه اساسی یا PCA و شبکه‌های عصبی هاپفیلد یا Hopfield Neural Network نیز درس‌های پنجم تا هفتم از این مجموعه آموزش را تشکیل می‌دهند.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

^^

بر اساس رای ۲۹ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
Intelligent Control Design and MATLAB Simulation
۱ دیدگاه برای «شبکه عصبی در متلب — از صفر تا صد»

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

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *