فصل اول – معرفی شبکه های عصبی
ما با یک ایده کلی از اینکه شبکه های عصبی چیست و چرا ممکن است به آنها علاقه مند باشید شروع می کنیم. شبکه های عصبی که شبکه های عصبی مصنوعی نیز نامیده می شوند (اگرچه به نظر می رسد در سال های اخیر بخش “مصنوعی” را کنار گذاشته ایم)، نوعی یادگیری ماشینی هستند که اغلب با یادگیری عمیق ترکیب می شوند. ویژگی تعیین کننده یک شبکه عصبی عمیق داشتن دو یا چند لایه پنهان است – مفهومی که به زودی توضیح داده خواهد شد، اما این لایه های پنهان لایه هایی هستند که شبکه عصبی کنترل می کند. به طور منطقی می توان گفت که اکثر شبکه های عصبی مورد استفاده نوعی یادگیری عمیق هستند.

شکل 1.01: به تصویر کشیدن زمینه های مختلف هوش مصنوعی و جایی که آنها به طور کلی در آن قرار می گیرند.
تاریخچه مختصر
از زمان ظهور رایانه ها، دانشمندان در حال تدوین راه هایی هستند که ماشین ها را قادر می سازد ورودی بگیرند و خروجی مورد نظر را برای کارهایی مانند طبقه بندی و رگرسیون تولید کنند. علاوه بر این، به طور کلی، یادگیری ماشینی تحت نظارت و بدون نظارت وجود دارد. یادگیری ماشینی تحت نظارت زمانی استفاده می شود که داده های از پیش تعیین شده و برچسب گذاری شده داشته باشید که می توانند برای آموزش استفاده شوند. فرض کنید داده های حسگر برای سروری با معیارهایی مانند نرخ آپلود/دانلود، دما و رطوبت دارید که همگی بر اساس زمان برای هر 10 دقیقه سازماندهی شده اند. به طور معمول این سرور همانطور که در نظر گرفته شده کار می کند و قطعی ندارد، اما گاهی اوقات قطعات از کار می افتند و باعث قطعی می شوند. ممکن است داده ها را جمع آوری کنیم و سپس آنها را به دو کلاس تقسیم کنیم: یک کلاس برای زمان ها/مشاهدات زمانی که سرور به طور عادی کار می کند، و کلاس دیگر برای زمان ها/مشاهدات زمانی که سرور در حال قطعی است. هنگامی که سرور از کار می افتد، می خواهیم آن داده های حسگر را که منجر به خرابی می شود به عنوان داده هایی که قبل از خرابی بوده اند برچسب گذاری کنیم. هنگامی که سرور به طور عادی کار می کند، ما به سادگی آن داده ها را به عنوان “عادی” برچسب گذاری می کنیم.
آنچه هر سنسور در این مثال اندازه گیری می کند، ویژگی نامیده می شود. گروهی از ویژگی ها یک مجموعه ویژگی را تشکیل می دهند (که به عنوان بردار/آرایه نشان داده می شوند) و مقادیر یک مجموعه ویژگی را می توان به عنوان نمونه نامید. نمونه ها به مدل های شبکه عصبی وارد می شوند تا آنها را طوری آموزش دهند که خروجی های مورد نظر از این ورودی ها را متناسب باشند یا بر اساس آنها در مرحله استنتاج پیش بینی کنند.
برچسب های “عادی” و “شکست” طبقه بندی یا برچسب هستند. همچنین ممکن است ببینید که از آنها به عنوان اهداف یا حقایق اساسی یاد می شود در حالی که ما با یک الگوریتم یادگیری ماشین مطابقت داریم. این اهداف طبقه بندی هایی هستند که هدف یا هدفی هستند که درست و صحیح شناخته شده اند تا الگوریتم یاد بگیرد. برای این مثال، هدف این است که در نهایت الگوریتمی را برای خواندن داده های حسگر و پیش بینی دقیق زمان قریب الوقوع خرابی آموزش دهیم. این تنها یک نمونه از یادگیری تحت نظارت در قالب طبقه بندی است. علاوه بر طبقه بندی، رگرسیون نیز وجود دارد که برای پیش بینی مقادیر عددی مانند قیمت سهام استفاده می شود. همچنین یادگیری ماشینی بدون نظارت وجود دارد که در آن ماشین ساختار داده ها را بدون دانستن برچسب ها/کلاس ها از قبل پیدا می کند. مفاهیم اضافی (به عنوان مثال، یادگیری تقویتی و یادگیری ماشین نیمه نظارتی) وجود دارد که زیر چتر شبکه های عصبی قرار می گیرند. برای این کتاب، ما بر طبقه بندی و رگرسیون با شبکه های عصبی تمرکز خواهیم کرد، اما آنچه در اینجا پوشش می دهیم منجر به موارد استفاده دیگری می شود.
شبکه های عصبی در دهه 1940 تصور شدند، اما فهمیدن نحوه آموزش آنها به مدت 20 سال یک راز باقی ماند. مفهوم پس انتشار (که بعدا توضیح داده شد) در دهه 1960 مطرح شد، اما شبکه های عصبی هنوز توجه زیادی را به خود جلب نکردند تا اینکه در سال 2010 شروع به برنده شدن در مسابقات کردند. از آن زمان، شبکه های عصبی به دلیل توانایی گاهی اوقات به ظاهر جادویی خود در حل مشکلاتی که قبلا غیرقابل حل تلقی می شدند، مانند زیرنویس تصویر، ترجمه زبان، سنتز صوتی و تصویری و موارد دیگر، در حال افزایش شهاب سنگ بوده اند.
در حال حاضر، شبکه های عصبی راه حل اصلی برای اکثر مسابقات و مشکلات تکنولوژیکی چالش برانگیز مانند خودروهای خودران، محاسبه ریسک، تشخیص تقلب و تشخیص زودهنگام سرطان هستند.
شبکه عصبی چیست؟
شبکه های عصبی “مصنوعی” از مغز ارگانیک الهام گرفته شده اند و به کامپیوتر ترجمه می شوند. این یک مقایسه کامل نیست، اما نورون ها، فعال سازی ها و ارتباطات متقابل زیادی وجود دارد، حتی اگر فرآیندهای زیربنایی کاملا متفاوت باشند.

شکل 1.02: مقایسه یک نورون بیولوژیکی با یک نورون مصنوعی.
یک نورون به خودی خود نسبتا بی فایده است، اما، هنگامی که با صدها یا هزاران (یا بسیاری بیشتر) از نورون های دیگر ترکیب می شود، ارتباط متقابل روابط و نتایجی را ایجاد می کند که اغلب از هر روش یادگیری ماشین دیگری بهتر عمل می کند.

شکل 1.03: نمونه ای از یک شبکه عصبی با 3 لایه پنهان از هر کدام 16 نورون.
انیمیشن بالا نمونه هایی از ساختارهای مدل و تعداد پارامترهایی را که مدل باید یاد بگیرد تا خروجی های مورد نظر را تنظیم کند، نشان می دهد. جزئیات آنچه در اینجا دیده می شود موضوعات فصل های آینده است.
وقتی از این طریق به آن نگاه می کنید، ممکن است نسبتا پیچیده به نظر برسد. شبکه های عصبی به عنوان “جعبه سیاه” در نظر گرفته می شوند زیرا ما اغلب نمی دانیم چرا آنها به نتیجه گیری می رسند. با این حال، ما درک می کنیم که آنها چگونه این کار را انجام می دهند.
لایه های متراکم، رایج ترین لایه ها، از نورون های به هم پیوسته تشکیل شده اند. در یک لایه متراکم، هر نورون یک لایه معین به هر نورون لایه بعدی متصل می شود، به این معنی که مقدار خروجی آن به ورودی نورون های بعدی تبدیل می شود. هر اتصال بین نورون ها دارای وزنی است که با آن مرتبط است ، که یک عامل قابل آموزش برای استفاده از مقدار این ورودی است و این وزن در مقدار ورودی ضرب می شود. هنگامی که همه وزن های ورودی به نورون ما سرازیر می شوند، جمع می شوند و یک سوگیری، یک پارامتر قابل آموزش دیگر، اضافه می شود. هدف از سوگیری جبران خروجی مثبت یا منفی است، که می تواند به ما کمک کند تا انواع واقعی داده های پویا را ترسیم کنیم. در فصل 4، نمونه هایی از نحوه عملکرد آن را نشان خواهیم داد.
مفهوم وزن ها و سوگیری ها را می توان به عنوان “دستگیره” در نظر گرفت که می توانیم آنها را تنظیم کنیم تا مدل خود را با داده ها مطابقت دهیم. در یک شبکه عصبی، ما اغلب هزاران یا حتی میلیون ها مورد از این پارامترها را داریم که توسط بهینه ساز در طول آموزش تنظیم شده اند. برخی ممکن است بپرسند، “چرا فقط تعصب یا فقط وزن نداشته باشیم؟” سوگیری ها و وزن ها هر دو پارامترهای قابل تنظیم هستند و هر دو بر خروجی نورون ها تأثیر می گذارند، اما این کار را به روش های مختلف انجام می دهند. از آنجایی که وزن ها ضرب می شوند، فقط اندازه را تغییر می دهند یا حتی علامت را به طور کامل از مثبت به منفی تغییر می دهند یا برعکس. خروجی = وزن · ورودی + بایاس بی شباهت به معادله یک خط نیستy = mx+b. ما می توانیم این را با موارد زیر تجسم کنیم:

شکل 1.04: نمودار خروجی یک نورون تک ورودی با وزن 1، بایاس 0 و ورودی x.
تنظیم وزن بر شیب عملکرد تأثیر می گذارد:

شکل 1.05: نمودار خروجی یک نورون تک ورودی با a weight of 2, bias of 0 and input x.
با افزایش مقدار وزن، شیب تندتر می شود. اگر وزن را کاهش دهیم، شیب کاهش می یابد. اگر وزن را نفی کنیم ، شیب به منفی تبدیل می شود:

شکل 1.06: نمودار خروجی یک نورون تک ورودی با a weight of -0.70, bias of 0 and input x.
این باید به شما ایده ای در مورد چگونگی تأثیر وزن بر مقدار خروجی نورون که از آن دریافت می کنیم بدهدinputs·weights+bias.
حالا، پارامتر بایاس چطور؟ سوگیری عملکرد کلی را جبران می کند. به عنوان مثال، با
a weight of 1.0 and a bias of 2.0:

شکل 1.07: نمودار خروجی یک نورون تک ورودی با a weight of 1, bias of 2 and input x.
همانطور که بایاس را افزایش می دهیم، خروجی تابع به طور کلی به سمت بالا تغییر می کند. اگر بایاس را کاهش دهیم، خروجی کلی تابع به سمت پایین حرکت می کند. به عنوان مثال ، با منفی bias:

شکل 1.08: نمودار خروجی یک نورون تک ورودی با a weight of 1.0, bias of -0.70 and input x.
همانطور که می بینید، وزن ها و سوگیری ها به تأثیر بر خروجی نورون ها کمک می کنند، اما این کار را به روش های کمی متفاوت انجام می دهند. این زمانی منطقی تر خواهد شد که توابع فعال سازی را در فصل 4 پوشش دهیم. با این حال، امیدواریم که می توانید تفاوت بین وزن ها و تعصبات و اینکه چگونه آنها ممکن است به طور جداگانه به تأثیرگذاری بر خروجی کمک کنند، مشاهده کنید. دلیل این موضوع به زودی اعلام خواهد شد.
به عنوان یک بررسی کلی، عملکرد گام به معنای تقلید از یک نورون در مغز بود، چه “شلیک” باشد یا نه – مانند یک سوئیچ روشن-خاموش. در برنامه نویسی، یک سوئیچ روشن و خاموش به عنوان یک تابع، تابع مرحله نامیده می شود، زیرا اگر آن را نمودار کنیم، مانند یک مرحله به نظر می رسد.

شکل 1.09: نمودار یک تابع مرحله.
برای یک تابع مرحله ای ، اگر مقدار خروجی نورون ، که با مجموع محاسبه می شود
(inputs · weights) + bias, بزرگتر از 0 ، نورون آتش می گیرد (بنابراین 1 را خروجی می دهد). در غیر این صورت، شلیک نمی کند و از طریق یک 0 . فرمول یک نورون ممکن است چیزی شبیه به این باشد:
خروجی = مجموع(inputs * weights) + bias
سپس معمولا یک تابع فعال سازی را برای این خروجی اعمال می کنیم که با activation() مشخص می شود:
خروجی = فعال سازی (خروجی)
در حالی که می توانید از یک تابع مرحله برای عملکرد فعال سازی خود استفاده کنید، ما تمایل داریم از چیزی کمی پیشرفته تر استفاده کنیم. شبکه های عصبی امروزی تمایل دارند از توابع فعال سازی آموزنده تری (به جای یک تابع مرحله) استفاده کنند، مانند تابع فعال سازی خطی اصلاح شده (ReLU)، که در فصل 4 به طور عمیق به آن خواهیم پرداخت. خروجی هر نورون می تواند بخشی از لایه خروجی پایانی و همچنین ورودی لایه دیگری از نورون ها باشد. در حالی که عملکرد کامل یک شبکه عصبی می تواند بسیار بزرگ شود، بیایید با یک مثال ساده با 2 لایه پنهان از 4 نورون شروع کنیم.

شکل 1.10: مثال شبکه عصبی پایه.
در کنار این 2 لایه پنهان، دو لایه دیگر نیز در اینجا وجود دارد – لایه های ورودی و خروجی. لایه ورودی داده های ورودی واقعی شما را نشان می دهد، به عنوان مثال، مقادیر پیکسل از یک تصویر یا داده های حسگر دما. در حالی که این داده ها می توانند به شکل دقیقی که جمع آوری شده اند “خام” باشند، معمولا داده های خود را از طریق عملکردهایی مانند نرمال سازی و مقیاس بندی پیش پردازش می کنید و ورودی شما باید به صورت عددی باشد. مفاهیمی مانند مقیاس بندی و نرمال سازی بعدا در این کتاب پوشش داده خواهد شد. با این حال، پیش پردازش داده ها با حفظ ویژگی های آن و داشتن مقادیر در محدوده های مشابه بین 0 تا 1 یا -1 و 1 معمول است. برای رسیدن به این هدف، از یکی یا هر دو توابع مقیاس بندی و نرمال سازی استفاده خواهید کرد. لایه خروجی هر چیزی است که شبکه عصبی برمی گرداند. با طبقه بندی، جایی که هدف ما پیش بینی کلاس ورودی است، لایه خروجی اغلب به تعداد نورون هایی دارد که مجموعه داده های آموزشی دارای کلاس ها است، اما همچنین می تواند یک نورون خروجی واحد برای طبقه بندی باینری (دو کلاس) داشته باشد. ما بعدا در مورد این نوع مدل بحث خواهیم کرد و در حال حاضر، روی یک طبقه بندی کننده تمرکز می کنیم که از یک نورون خروجی جداگانه برای هر کلاس استفاده می کند. به عنوان مثال، اگر هدف ما طبقه بندی مجموعه ای از تصاویر به عنوان “سگ” یا “گربه” باشد، در مجموع دو کلاس وجود دارد. این بدان معناست که لایه خروجی ما از دو نورون تشکیل شده است. یک نورون با “سگ” و دیگری با “گربه” مرتبط است. همچنین می توانید فقط یک نورون خروجی داشته باشید که “سگ” یا “سگ نیست”.

شکل 1.11: تصویر بصری انتقال داده های تصویری از طریق یک شبکه عصبی، دریافت طبقه بندی
برای هر تصویری که از این شبکه عصبی عبور می کند، خروجی نهایی دارای یک مقدار محاسبه شده در نورون خروجی “cat” و یک مقدار محاسبه شده در نورون خروجی “dog” خواهد بود. نورون خروجی که بالاترین امتیاز را دریافت کرده است، به پیش بینی کلاس برای تصویری که به عنوان ورودی استفاده می شود، تبدیل می شود.

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

شکل 1.13: فرمول کامل برای عبور رو به جلو از یک مدل شبکه عصبی نمونه.
به طور طبیعی، این بسیار گیج کننده به نظر می رسد، و موارد فوق در واقع بخش آسان شبکه های عصبی است. این به طور قابل درک مردم را دور می کند. با این حال، در این کتاب، ما قصد داریم همه چیز را از ابتدا کدنویسی کنیم، و هنگام انجام این کار، باید متوجه شوید که هیچ قدمی در مسیر تولید تابع بالا وجود ندارد که درک آن بسیار چالش برانگیز باشد. به عنوان مثال، تابع فوق را می توان در توابع تو در تو پایتون مانند:

شکل 1.14: کد پایتون برای عبور رو به جلو از یک مدل شبکه عصبی نمونه.
ممکن است عملکردهایی در آنجا وجود داشته باشد که هنوز آنها را درک نکرده اید. به عنوان مثال، شاید شما ندانید تابع log چیست، اما این چیز ساده ای است که ما به آن خواهیم پرداخت. سپس ما یک عملیات جمع داریم، یک عملیات نمایی (باز هم، ممکن است دقیقا ندانید که این کار چه کاری انجام می دهد، اما کار سختی نیست). سپس ما یک محصول نقطه ای داریم، که هنوز فقط در مورد درک نحوه عملکرد آن است، اگر بدانید ضرب چگونه کار می کند، هیچ چیز بالای سر شما وجود ندارد! در نهایت، ما چند جابه جایی داریم که به عنوان ذکر شده است. T، که دوباره، هنگامی که یاد می گیرید که آن عملیات چه کاری انجام می دهد، مفهوم چالش برانگیزی نیست. هنگامی که هر یک از این عناصر را از هم جدا کردیم و یاد گرفتیم که آنها چه کاری انجام می دهند و چگونه کار می کنند، ناگهان، همه چیز آنقدرها دلهره آور یا عجیب به نظر نمی رسد. هیچ چیز در این پاس رو به جلو نیازی به آموزش فراتر از جبر پایه دبیرستان ندارد! برای انیمیشنی که نحوه عملکرد همه اینها را در پایتون نشان می دهد، می توانید انیمیشن زیر را بررسی کنید، اما مطمئنا انتظار نمی رود که بلافاصله متوجه شوید که چه اتفاقی در حال رخ دادن است. نکته این است که این موضوع به ظاهر پیچیده را می توان به بخش های کوچک و قابل درک تقسیم کرد که هدف فصل های آینده است!
یک شبکه عصبی معمولی دارای هزاران یا حتی میلیون ها پارامتر قابل تنظیم (وزن و تعصب) است. به این ترتیب شبکه های عصبی به عنوان توابع عظیمی با تعداد زیادی پارامتر عمل می کنند. مفهوم یک تابع طولانی با میلیون ها متغیر که می تواند برای حل یک مسئله استفاده شود، چندان دشوار نیست. با این تعداد متغیرهای مربوط به نورون ها ، که به عنوان لایه های به هم پیوسته مرتب شده اند ، می توانیم تصور کنیم که ترکیبی از مقادیر برای این متغیرها وجود دارد که خروجی های دلخواه را به همراه دارد. یافتن این که ترکیبی از مقادیر پارامتر (وزن و اریب) بخش چالش برانگیز است.
هدف نهایی برای شبکه های عصبی تنظیم وزن و سوگیری آنها (پارامترها) است، بنابراین هنگامی که برای یک مثال هنوز دیده نشده در ورودی اعمال می شود، خروجی مورد نظر را تولید می کنند. هنگامی که الگوریتم های یادگیری ماشین تحت نظارت آموزش داده می شوند، نمونه های الگوریتم ورودی ها و خروجی های مورد نظر مرتبط با آنها را نشان می دهیم. یکی از مسائل اصلی این مفهوم، برازش بیش از حد است – زمانی که الگوریتم فقط یاد می گیرد که داده های آموزشی را متناسب کند، اما در واقع چیزی در مورد وابستگی های ورودی-خروجی زیربنایی “درک” نمی کند. این شبکه اساسا فقط داده های آموزشی را “به خاطر سپرد” می کند.
بنابراین، ما تمایل داریم از داده های “درون نمونه” برای آموزش یک مدل استفاده کنیم و سپس از داده های “خارج از نمونه” برای اعتبارسنجی یک الگوریتم (یا یک مدل شبکه عصبی در مورد ما) استفاده کنیم. درصدهای مشخصی برای هر دو مجموعه داده برای پارتیشن بندی داده ها در نظر گرفته شده است. به عنوان مثال، اگر مجموعه داده ای از 100,000 نمونه از داده ها و برچسب ها وجود داشته باشد، بلافاصله 10,000 را برمی دارید و آنها را کنار می گذارید تا داده های “خارج از نمونه” یا “اعتبارسنجی” شما باشند. سپس مدل خود را با 90000 داده درون نمونه یا “آموزشی” دیگر آموزش می دهید و در نهایت مدل خود را با 10000 داده خارج از نمونه که مدل هنوز ندیده است، اعتبارسنجی می کنید. هدف این است که مدل نه تنها داده های آموزشی را به طور دقیق پیش بینی کند، بلکه در حین پیش بینی داده های اعتبارسنجی خارج از نمونه خودداری شده نیز به طور مشابه دقیق باشد.
به این تعمیم می گویند، به این معنی که به جای به خاطر سپردن داده ها، متناسب با داده ها را یاد بگیرید. ایده این است که ما یک شبکه عصبی را بر روی بسیاری از نمونه های داده “آموزش” می دهیم (به آرامی وزن ها و سوگیری ها را تنظیم می کنیم). سپس داده های خارج از نمونه را که شبکه عصبی هرگز ارائه نشده است می گیریم و امیدواریم که بتواند این داده ها را نیز به طور دقیق پیش بینی کند.
اکنون باید درک کلی از اینکه شبکه های عصبی چیست یا حداقل هدف چیست و چگونه برای رسیدن به این هدف برنامه ریزی می کنیم، داشته باشید. برای آموزش این شبکه های عصبی، ما محاسبه می کنیم که چقدر “اشتباه” هستند و از الگوریتم ها برای محاسبه خطا (به نام ضرر) استفاده می کنند و سعی می کنیم پارامترهای آنها (وزن ها و سوگیریها) را به آرامی تنظیم کنیم تا در بسیاری از تکرارها، شبکه به تدریج اشتباه کمتری پیدا کند. هدف همه شبکه های عصبی تعمیم است، به این معنی که شبکه می تواند نمونه های زیادی از داده هایی را که قبلا دیده نشده اند ببیند و مقادیری را که امیدواریم به دست آوریم، به طور دقیق خروجی دهد. شبکه های عصبی را می توان برای چیزی بیش از طبقه بندی استفاده کرد. آنها می توانند رگرسیون (پیش بینی یک مقدار، مفرد)، خوشه بندی (اختصاص داده های بدون ساختار به گروه ها) و بسیاری از وظایف دیگر را انجام دهند. طبقه بندی فقط یک کار رایج برای شبکه های عصبی است.