خانه » آموزش ساخت شبکه عصبی از ابتدا در پایتون بدون tensorflow

آموزش ساخت شبکه عصبی از ابتدا در پایتون بدون tensorflow

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

شبکه عصبی چیست؟

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

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

یک لایه ورودی ، x
مقدار دلخواه از لایه های پنهان
یک لایه خروجی ، ŷ
مجموعه ای از وزن ها و عرض از مبدا (biases) بین هر لایه ، W و b
انتخاب تابع فعال سازی ( activation function) برای هر لایه پنهان ، σ. در این آموزش ، ما از تابع فعال سازی Sigmoid استفاده خواهیم کرد.

نمودار زیر معماری یک شبکه عصبی 2 لایه را نشان می دهد (توجه داشته باشید که هنگام شمارش تعداد لایه ها در یک شبکه عصبی معمولاً لایه ورودی حذف می شود)

ایجاد کلاس شبکه عصبی در پایتون به سادگی کد ذیل می باشد.

 
 
 
 

آموزش شبکه عصبی

خروجی ŷ یک شبکه عصبی 2 لایه ساده:

 در معادله بالا ، وزن W و عرض از مبدا b تنها متغیرهایی هستند که بر خروجی تأثیر می گذارند.

به طور طبیعی ، مقادیر مناسب برای وزن ها و عرض از مبدا  قدرت پیش بینی ها را تعیین می کند. روند تنظیم این متغیرها به عنوان آموزش شبکه عصبی شناخته می شود.

هر تکرار از روند آموزش شامل مراحل زیر است:

  • محاسبه خروجی پیش بینی شده ŷ ، معروف به feedforward
  • به روزرسانی وزن ها  و عرض از مبدا ها ، معروف به backpropagation

نمودار توالی زیر روند کار را نشان می دهد.

Feedforward

همانطور که در نمودار متوالی بالا مشاهده کردیم ، feedforward یک حساب ساده است و برای یک شبکه عصبی ساده  2 لایه ، خروجی شبکه عصبی به صورت زیر است:

بیایید یک تابع feedforward را در کد پایتون خود اضافه کنیم تا دقیقاً همان کار را انجام دهد. توجه داشته باشید که برای سادگی ، عرض از مبدا  را 0 در نظر گرفته ایم.

با این حال ، ما هنوز به راهی برای ارزیابی پیش بینی های خود نیاز داریم (یعنی پیش بینی های ما چقدر فاصله دارند)؟ تابع Loss به ما این امکان را می دهد تا دقیقاً این کار را انجام دهیم.

تابع ضرر (Loss Function)

تابع های ضرر  زیادی وجو دارد،‌در این آموزش ما از مجموع مربعات خطا (sum-of-sqaures error ) بعنوان تابع ضرر استفاده می کنیم
  مجموع  مربعات خطا، مجموع توان دو تفاوت بین هر مقدار پیش بینی شده و مقدار واقعی است.
هدف ما یافتن بهترین مجموعه وزن ها و عرض از مبدا ها برای به حداق رساندن تابع ضرر می باشد.

Backpropagation

اکنون که خطای پیش بینی خود را اندازه گیری کردیم ، باید راهی برای بازخورد خطا و به روزرسانی وزن و عرض از مبدا خود پیدا کنیم.
برای یافتن مقدار مناسب ، باید مشتقات تابع ضرر را با توجه به وزن ها و عرض از مبدا ها بدانیم.
همانظور که میدانید مشتق یک تابع، شیب تابع است.

 

اگر مشتق داشته باشیم ، می توانیم با افزایش / کاهش  وزن ها و عرض از مبدا ها را به روز کنیم (به نمودار بالا مراجعه کنید). این به عنوان کاهش گرادیان ( gradient descent) شناخته می شود.

 ما نمی توانیم مشتق تابع ضرر را با توجه به وزن و عرض از مبدا مستقیما محاسبه کنیم زیرا معادله تابع ضرر شامل وزن و عرض از مبدا نیست. بنابراین ، برای محاسبه آن به قانون مشتق  زنجیره ای نیاز داریم.

 مشتق (شیب) تابع ضرر با توجه به وزن ها ، به ما این امکان را می دهد تا  وزن ها را متناسب با آن تنظیم کنیم.

 بیایید عملکرد backpropagation را به کد پایتون خود اضافه کنیم.

 

 

حل یک مثال

اکنون که کد پایتون کامل خود را برای انجام feedforward   و backpropagation داریم ، بیایید شبکه عصبی خود را در یک مثال اعمال کنیم و ببینیم که چگونه کار می کند.

شبکه عصبی ما باید مجموعه ای از وزن مناسب را بیاموزد. 

بیایید شبکه عصبی را برای 1500 تکرار آموزش دهیم و ببینیم چه اتفاقی می افتد. با نگاهی به نمودارloss در هر تکرار، می توانیم به طور واضح شاهد کاهش تلفات باشیم. این کاهش متناسب با الگوریتم کاهظ  گرادیان است که ما قبلاً در مورد آن صحبت کردیم.

بیایید به پیش بینی نهایی (خروجی) از شبکه عصبی پس از 1500 تکرار نگاهی بیندازیم.

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

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

 

 

دیدگاه‌ خود را بنویسید

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

*

code

به بالای صفحه بردن