الگوریتم mlp
شبکه عصبی پرسپترون چند لایه، دستهای از شبکههای عصبی مصنوعی پیشخور محسوب میشوند.
الگوریتم mlp
در یک شبکه عصبی پرسپترون چند لایه، حداقل سه لایه از نودها وجود خواهند داشت:
- یک لایه ورودی (Input Layer).
- یک لایه نهان (Hidden Layer).
- یک لایه خروجی (Output layer).
نودهای شبکه عصبی که به آنها (Neuron) گفته میشود، واحدهای محاسباتی در یک شبکه عصبی محسوب میشوند. در این شبکه عصبی، از خروجیهای لایه اول (ورودی)، به عنوان ورودیهای لایه بعدی (نهان) استفاده میشود. این کار به همین شکل ادامه پیدا میکند، تا زمانی که، پس از تعداد خاصی از لایهها، خروجیهای آخرین لایه نهان به عنوان ورودیهای لایه خروجی مورد استفاده قرار میگیرد. به لایههایی که بین لایه ورودی و لایه خروجی قرار میگیرند، لایههای نهان (Hidden Layers) گفته میشود. شبکههای پرسپترون چند لایه، مانند شبکههای عصبی پرسپترون تک لایه، حاوی مجموعهای از وزنها نیز هستند که باید برای آموزش و یادگیری شبکه عصبی تنظیم شوند.
الگوریتم پیشخور چیست؟
نخستین بخش در پیادهسازی یک شبکه عصبی پرسپترون چند لایه، توسعه الگوریتم پیشخور است. الگوریتم پیشخور، فرآیندی را کنترل میکند که در نتیجه آ ورودیهای مسأله به یک خروجی تبدیل میشوند. با این حال، فرآیند پیشخور در شبکه پرسپترون چند لایه، به سادگی شبکههای پرسپترون تک لایه نیست. در فرآیند پیشخور در شبکه پرسپترون چند لایه، عملیات تعریف شده در الگوریتم، در تمامی لایههای تعریف شده در شبکه انجام میشود. در این فرایند، خروجی هر لایه به عنوان ورودی لایه بعدی تعریف میشود. برای مشخص کردن خروجی هر لایه، از رابطهای شبیه به رابطه زیر استفاده میشود. این فرایند، تا زمانی ادامه پیدا میکند که خروجی لایه آخر شبکه (لایه خروجی) تولید شود. خروجی هر کدام از نودهای موجود در هر یک از لایههای شبکه عصبی پرسپترون چند لایه، از طریق روابط زیر تولید میشود.
با استفاده از عملیات ماتریسی بسته نرمافزاری numpy در پایتون، میتوان مرحله پیشخور در یک شبکه عصبی پرسپترون چند لایه را به صورت زیر پیادهسازی کرد.
Python def feedforward(self, x): """ Predict the output given the inputs :param x: input vector of features :type x: ndarray :return: All activation values and x values. """ self.z0 = np.dot(self.w0, x) self.output1 = self.sigmoid(self.z0) self.z1 = np.matmul(self.w1, self.output1) self.output2 = self.sigmoid(self.z1) self.z2 = np.matmul(self.w2, self.output2) self.output3 = self.sigmoid(self.z2) return self.z0, self.output1, self.z1, self.output2, self.z2, self.output3
الگوریتم mlp پس انتشار خطا
پس از محاسبه مقدار زیان در مرحله قبل، این مقدار به صورت معکوس (از لایه خروجی به سمت لایه اول) در شبکه انتشار مییابد و با استفاده از مفهوم گرادیان (Gradient) یا شیب، وزنهای شبکه عصبی پرسپترون چند لایه به روزرسانی میشوند. این بخش، مهمترین بخش الگوریتم پس انتشار در آموزش شبکه عصبی پرسپترون چند لایه محسوب میشود.
مراحل یادگیری با استفاده از الگوریتم پس انتشار خطا در شبکه عصبی پرسپترون چند لایه به شرح زیر است:
- با فرض داشتن تعداد J نود لایه نهان و یک نمونه ورودی با تعداد ویژگی در یک شبکه عصبی پرسپترون چند لایه، خروجی نودهای لایه آخر (لایه خروجی)، از طریق رابطه زیر مشخص میشوند. در این رابطه، ، خروجی نود اُم هر کدام از لایههای نهان را نشان میدهد.
yi=f(∑j=1Jwjiyj)
- در مرحله بعد، با توجه به مقادیر خروجی مورد انتظار و خروجی پیشبینی شده برای هر کدام از نودهای لایه خروجی ()، مقدار «دلتا» (Delta) برای هر کدام از نودها، توسط رابطه زیر محاسبه میشود. در این رابطه، yexpectedi خروجی مورد انتظار نود در لایه خروجی و ypredictedi، خروجی پیشبینی شده توسط نود i در لایه خروجی است.
δi=(ypredictedi–yexpectedi)⋅(yexpectedi)⋅(1–yexpectedi)
- برای هر کدام از نودهای لایه نهان (j)، مقدار دلتا از طریق رابطه زیر محاسبه میشود.
δj=(Oj)(1–Oj)∑iwjiδi
- برای تنظیم کردن وزنهای تمامی نودها در شبکه عصبی پرسپترون چند لایه، از روش «گرادیان کاهشی» (Gradient Descent) استفاده میشود.
در این روش، وزنهای تمامی نودها از طریق رابطه عمومی زیر تنظیم میشوند.
Δwij=ηδjyn
- به طور خاص، برای تنظیم وزن نود j از لایه نهان (از نود n لایه ورودی به سمت نود j لایه نهان)، از رابطه زیر استفاده میشود.
در این رابطه، xn مقدار نود n لایه ورودی را نشان میدهد.
Δwnj=ηδjxn
- همچنین، برای تنظیم وزن نود i از لایه خروجی (از نود j لایه نهان به سمت نود i لایه خروجی)، از رابطه زیر استفاده میشود.
در این رابطه، مقدار خروجی نود j لایه نهان را نشان میدهد.
Δwji=ηδiOj
در روابط نمایش داده شده، نرخ یادگیری شبکه عصبی پرسپترون چند لایه است:
اَبَرپارامتری که برای تنظیم نرخ تغییرات وزنهای شبکه عصبی مورد استفاده قرار میگیرد، معمولا در ابتدای کار شبکه عصبی پرسپترون چند لایه، مقدار کوچکی برای این اَبَرپارامتر در نظر گرفته میشود. با این حال، توصیه میشود که در طی فرایند یادگیری و با افزایش تعداد تکرارهای این شبکه، به تدریج مقدار این اَبَرپارامتر افزایش پیدا کند. از کدهای زیر، برای پیادهسازی الگوریتم پس انتشار خطا در شبکه عصبی پرسپترون چند لایه استفاده میشود.
Python for _ in range(self.itr): for xi, target in zip(self.x, self.y): self.feedforward(xi) cost = target.T - self.output3 for i in range(self.w2.shape[0]): self.w2[i] += -self.learn * cost.sum() * \ self.sigmoid(self.z2) * (1 - self.sigmoid(self.z2)) * \ self.output2[i] for i in range(self.w1.shape[0]): for j in range(self.w1.shape[1]): self.w1[i, j] += -self.learn * cost.sum() * \ self.sigmoid(self.z2) * (1 - self.sigmoid(self.z2)) * self.w2[i] * \ self.sigmoid(self.z1[i]) * (1 - self.sigmoid(self.z1[i])) * \ self.output1[j] for i in range(self.w0.shape[0]): for j in range(self.w0.shape[1]): self.w0[i, j] += -self.learn * cost.sum() * \ self.sigmoid(self.z2) * (1 - self.sigmoid(self.z2)) * self.w2[i] * \ self.sigmoid(self.z1[i]) * (1 - self.sigmoid(self.z1[i])) * \ self.w1[i, j] * self.sigmoid(self.z0[i]) * (1 - \ self.sigmoid(self.z0[i])) * xi[j].
نظرات خود را در ارتباط با مقالهی آموزشی “الگوریتم mlp” بنویسید.
در ارتباط با شاخههای مختلف هوش مصنوعی در این لینک بیشتر بخوانید.
ارسال پاسخ