Deeplearning
Deeplearning
net/publication/360017232
CITATIONS READ
0 1
1 author:
Milad Vazan
University of Tabriz
10 PUBLICATIONS 6 CITATIONS
SEE PROFILE
Some of the authors of this publication are also working on these related projects:
All content following this page was uploaded by Milad Vazan on 18 April 2022.
یادگیری عمیق
از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
تالیف و گردآوری:
میالد وزان
:وزان ،میالد-۱۳۷۱ ، سرشناسه
:یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون /تالیف و گردآوری عنوان و نام پديدآور
میالد وزان.
:تهران :میعاد اندیشه .۱۴۰۱ ، مشخصات نشر
۲۰۲ :ص :.مصور ،جدول ،نمودار. مشخصات ظاهری
9۷8-6۲۲-۲۳۱-9۰9-۰ : شابک
:فیپا وضعیت فهرست نویسی
:یادگیری عمیق موضوع
Deep Learning
فراگیری ماشینی
Machine learning
پایتون (زبان برنامهنویسی کامپیوتر)
)Python (Computer program language
ساختار دادهها --الگوهای ریاضی
Data structures (computer science) -- Mathematical models
LB۱۰۶۰ : رده بندی کنگره
۱۵۲۳/۳۷۰ : رده بندی دیویی
8۷99۶۳۷ : شماره کتابشناسی ملی
:فیپا اطالعات رکورد
کتابشناسی
Miaadpub.ir
تلفن انتشارات 02166014797 -02166017448 – 09125120067 :
عنوان کتاب :یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
تالیف و گردآوری :میالد وزان
ناشر :میعاد اندیشه
نوبت چاپ :اول 1401 -
شمارگان 1000 :نسخه
قیمت 1150000 :ریال
شابک978 - 622 – 231 –909–0:
همه ی حقوق مادی و معنوی این اثر برای مولف محفوظ است.
تکثیر و انتشار این اثر به هر صورت ،از جمله بازنویسی ،فتوکپی ،ضبط الکترونیکی
و ذخیره در سیستم های بازیابی و پخش ،بدون دریافت مجوز کتبی و قبلی از مولف
به هر شکلی ممنوع است.
این اثر تحت حمایت «قانون حمایت از حقوق مولفان ،مصنفان و هنرمندان ایران» قرار دارد
نسخه pdfکتاب توسط مولف به صورت رایگان به اشتراک گذاشته شده است
و هرگونه استفاده تجاری از ٱن پیگرد قانونی دارد.
دیگرکتابها
یادگیریماشنیوعلمداده:مبان،مفاهیم،الگوریتمهاوابزارها یادگیریعمیق:اصول،مفاهیمورویکردها
دانلودرایگان دانلودرایگان
پیشگفتار
یادگیری عمیق یک فناوری جدید قدرتمند است که محبوبیت آن روز به روز در حوزههای مختلف
در حالِ افزایش است .از اینرو ،بسیار مهم است که به یادگیری آن بپردازیم .این کتاب برای افراد
مبتدی که هیچ آشنایی با یادگیری عمیق ندارند در نظر گرفته شده است تا خوانندگان را با یک
دوره یِ فوقِ سریع در یادگیری عمیق آماده کند .تنها انتظار ما از خوانندگان این است که از قبل
مهارتهای برنامهنویسی اولیه در زبان پایتون را داشته باشند.
این راهنمایِ کوتاه ،در نظر گرفته شده است تا شما را به عنوان یک مبتدی با درک درستی از
موضوع ،از جمله تجربهیِ عملیِ ملموس در توسعه مدلها ،مجهز کند .اگر در حال حاضر باالتر
از سطح مبتدی هستید ،این کتاب مناسب شما نیست!
میالد وزان
کاشمر-بهار 1401
09370174459
[email protected]
فهرست
25 آزمونک
پیشنیازها فصل دوم:
28 مقدمه
29 دادههای قابل خواندن توسط ماشین در مقابل قابل خواندن توسط انسان
35 رگرسیون
37 خوشهبندی
53 Colab
59 آزمونک
80 Sigmoid
83 tanh
84 ReLU
86 Softmax
97 Adagrad
98 AdaDelta
99 RMSprop
100 Adam
103 پسانتشار
124 آزمونک
124 تمرین
148 آزمونک
162 LSTM
178 آزمونک
198 آزمونک
199 مراجع
مقدمهای بر یادگیری عمیق
1
مقدمهای بر یادگیری عمیق
مقدمه
یادگیری عمیق زیرمجموعهای از یادگیری ماشین است که بر استفاده از شبکههای عصبی برای
حل مسائل پیچیده تمرکز دارد .امروزه به لطف پیشرفتهای نرمافزاری و سختافزاری که به ما
امکان جمعآوری و پردازش مقادیر زیادی داده را میدهد ،محبوبیت بیشتری پیدا کرده است.
چراکه شبکههای عصبی عمیق برای عملکرد خوبی که ما از آن انتظار داریم به مقادیر زیادی داده
و در نتیجهیِ آن به سختافزار قدرتمند برای پردازش این حجم بزرگ داده نیاز دارد.
یادگیری عمیق نیز زیرمجموعهای از هوش مصنوعی و یادگیری ماشین است که در آن
شبکههای عصبی مصنوعی ،الگوریتمهایی که از مغز انسان الهام گرفته شدهاند ،از مقادیر زیادی
داده توانایی یادگیری بدست میآورند .الگوریتم یادگیری عمیق مشابه نحوه یادگیری ما از
تجربهها و نمونهها ،یک کار را به طور مکرر انجام میدهد و هر بار کمی آن را تغییر میدهد تا
نتیجه را بهبود بخشد .با انجام این کار ،به رایانهها کمک میکند تا ویژگیها از دادهها پیدا کنند
و با تغییرات سازگار شوند .قرار گرفتن مکرر در معرض مجموعه دادهها به ماشینها کمک
میکند تا تفاوتها و منطق دادهها را درک کنند و به یک نتیجهگیری قابل اعتماد برسند .در
سادهترین حالت ،یادگیری عمیق را میتوان راهی برای خودکارسازی تجزیه و تحلیل پیشگویانه
( )predictive analyticsدر نظر گرفت.
با پیشرفتها در دهه ،2000تکنیکهایی پدیدار گشتند تا امکان افزایش الیههای شبکههای
عصبی را فراهم کنند .این شبکههای چندالیه باعث شد که این حوزه از تحقیقات هوش مصنوعی
"یادگیری عمیق" نامگذاری شود ،چراکه الگوریتمها دادهها را در چندین الیه پردازش میکنند تا
به پاسخ برسند.
در سال ،2012شبکه های عصبی عمیق شروع به عملکردی بهتر از الگوریتمهای طبقهبندی
سنتی ،از جمله الگوریتمهای یادگیری ماشین کردند .این افزایش کارایی تا حد زیادی بدلیل
افزایش عملکرد پردازندههای رایانه ( )GPUو حجم انبوه دادهای است که اکنون در دسترس
است .دیجیتالی شدن سریع منجر به تولید دادههای در مقیاس بزرگ شده است و این دادهها
اکسیژنی برای آموزش مدلهای یادگیری عمیق هستند .از آن زمان ،هر سال ،یادگیری عمیق
همچنان در حال بهتر شدن و تبدیل به بهترین رویکرد برای حل مشکالت در بسیاری از حوزههای
مختلف شده است.
یادگیری عمیق بدست آورد ،نگاه کرد .بهطور خالصه میتوان مزیتهای کلیدی که هنگام استفاده
از این فناوری وجود دارد را بهصورت زیر فهرست کرد:
▪ عدم نیاز به مهندسی ویژگیها :در یادگیری ماشین ،مهندسی ویژگی یک کار اساسی
و مهم است .چراکه دقت را بهبود میبخشد و گاهی اوقات این فرآیند میتواند به
دانش دامنه در مورد یک مساله خاص نیاز داشته باشد .یکی از بزرگترین مزایای
استفاده از رویکرد یادگیری عمیق ،توانایی آن در اجرای مهندسی ویژگی به صورت
خودکار است .در این رویکرد ،یک الگوریتم دادهها را اسکن میکند تا ویژگیهای
مرتبط را شناسایی کند و سپس آنها را برای ارتقای سریعتر یادگیری ،بدون اینکه به
طور صریح به او گفته شود ،ترکیب میکند .این توانایی به دانشمندان داده کمک میکند
تا مقدار قابل توجهی در زمان صرفهجویی کرده و به دنبال آن نتایج بهتری را نیز
بدست آورند.
▪ حداکثر استفاده از دادههای بدون ساختار :تحقیقات نشان میدهد که درصد زیادی
از دادههای یک سازمان بدون ساختار هستند ،زیرا اکثر آنها در قالبهای مختلفی
همانند تصویر ،متن و غیره هستند .برای اکثر الگوریتمهای یادگیری ماشین ،تجزیه و
تحلیل دادههای بدون ساختار دشوار است .از اینرو ،اینجاست که یادگیری عمیق
مفید میشود .چرا که میتوانید از قالبهای دادهای مختلف برای آموزش الگوریتمهای
یادگیری عمیق استفاده کنید و همچنان بینشهای مرتبط با هدف آموزش را بدست
آورید .برای مثال ،میتوانید از الگوریتمهای یادگیری عمیق برای کشف روابط موجود
بین تجزیه و تحلیل صنعت ،گفتگوی رسانههای اجتماعی و موارد دیگر برای پیشبینی
قیمتهای سهام آینده یک سازمان استفاده کنید.
▪ ارائه نتایج با کیفیت باال :انسانها گرسنه یا خسته میشوند و گاهی اوقات اشتباه
میکنند .در مقابل ،وقتی صحبت از شبکههای عصبی میشود ،اینطور نیست.
هنگامی که یک مدل یادگیری عمیق بدرستی آموزش داده شود ،میتواند هزاران کار
معمولی و تکراری را در مدت زمان نسبتا کوتاهتری در مقایسه با آنچه که برای یک
انسان الزم است ،انجام دهد .عالوه بر این ،کیفیت کار هرگز کاهش نمییابد ،مگر
اینکه دادههای آموزشی حاوی دادههای خامی باشد که نشاندهنده مسالهای نیست که
میخواهید آن راحل کنید.
▪ یادگیری انتقالی :یادگیری عمیق دارای چندین مدل از پیشآموزش دیده با وزنها و
سوگیریهای ثابت است که برخی از این الگوریتمها در پیشبینی بسیار عالی هستند.
16یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
▪ دقت باالی نتایج :هنگامی که یادگیری عمیق با حجم عظیمی از داده آموزش داده
میشود ،میتواند دقت خوبی در مقایسه با الگوریتمهای یادگیری ماشین سنتی داشته
باشد.
با در نظر گرفتن مزایای فوق و استفاده بیشتر از رویکرد یادگیری عمیق ،میتوان
گفت که تاثیر قابل توجه یادگیری عمیق در فناوریهایِ مختلفِ پیشرفته همانند اینترنت
اشیا در آینده بدیهی است .یادگیری عمیق ،راهِ درازی را طی کرده است و به سرعت در
حال تبدیل شدن به یک فناوری حیاتی است که بهطور پیوسته توسط مجموعهای از
کسبوکارها ،در صنایع مختلف مورد استفاده قرار میگیرد.
با این حال باید توجه داشت که یادگیری عمیق همچنین ممکن است بهترین
انتخاب بر اساس دادهها نباشد .به عنوان مثال ،اگر مجموعه داده کوچک باشد،
گاهی اوقات مدلهای یادگیری ماشینِ خطیِ سادهتر ممکن است نتایج دقیقتری
به همراه داشته باشند .هرچند ،برخی از متخصصان یادگیری ماشین استدالل
میکنند که یک شبکهیِ عصبیِ عمیقِ آموزشدیدهیِ مناسب ،همچنان میتواند
با مقادیرِ کمِ داده ،عملکرد خوبی داشته باشد.
سطوح قبلی را به آن اضافه میکند .در سطوح بعدی ،اعالنات (فرمانها) را تجزیه و تحلیل
میکند و تمام نتایج خود را ترکیب میکند .برای باالترین سطحِ ساختارِ سلسله مراتبی ،دستیار
صوتی به اندازه کافی آموخته است که بتواند یک دیالوگ را تجزیه و تحلیل کند و بر اساس آن
ورودی ،اقدام مربوط را ارائه دهد.
در یادگیری عمیق ،نیازی به برنامهنویسیِ صریحِ همهچیز نداریم .آنها میتوانند
بهطور خودکار بازنماییهایی را از دادههایی مانند تصاویر ،ویدیو یا متن ،بدون
معرفی قوانین دستی یاد بگیرند .معماریهایِ بسیار انعطافپذیر آنها میتوانند
مستقیما از دادههای خام یاد بگیرند و در صورت ارائه دادههای بیشتر میتوانند
عملکرد خود را افزایش دهند.
موضوع سوگیریها ( )biasesنیز یک مشکل عمده برای مدلهای یادگیری عمیق است .اگر
یک مدل بر روی دادههایی آموزش ببیند که دارای سوگیری هستند ،مدل آن سوگیریها را در
پیشبینیهای خود بازتولید میکند.
اگرچه مدلهای یادگیری عمیق بسیار کارآمد هستند و میتوانند یک راهحل مناسب برای یک
مشکل خاص پس از آموزش با دادهها فرموله کنند ،اما برای یک مساله مشابه قادر به انجام این
کار نیستند و نیاز به آموزش مجدد دارند .برای نشان دادن این موضوع ،یک الگوریتم یادگیری
عمیق را در نظر بگیرید که یاد میگیرد اتوبوسهای مدرسه همیشه زرد هستند ،اما ناگهان
اتوبوسهای مدرسه آبی میشوند .از اینرو ،باید دوباره آموزش داده شود .برعکس ،یک کودک
پنج ساله مشکلی برای تشخیص وسیله نقلیه به عنوان یک اتوبوس مدرسه آبی ندارد .عالوه بر
این ،آنها همچنین در موقعیتهایی که ممکن است کمی متفاوت با محیطی باشد که با آن
تمرین کردهاند ،عملکرد موثری ندارند .برای مثال DeepMindگوگل سیستمی را برای شکست
49بازی آتاری آموزش داد .با این حال ،هر بار که سیستم یک بازی را شکست میداد ،باید برای
شکست دادن بازی بعدی دوباره آموزش داده میشد .این ما را به محدودیت دیگری در یادگیری
عمیق میرساند ،یعنی در حالی که مدل ممکن است در نگاشت ورودیها به خروجیها فوقالعاده
خوب باشد ،اما ممکن است در درک زمینه دادههایی که آنها مدیریت میکنند خوب نباشد.
الگوی یادگیری عمیق یا بهطور کلیتر الگوریتمهای یادگیری ماشینِ فعلی به صورت مجزا یاد
میگیرد :با توجه به مجموعه دادههای آموزشی ،الگوریتم یادگیری ماشین را روی مجموعه داده
اجرا میکند تا یک مدل تولید کند و هیچ تالشی برای حفظِ دانشِ آموخته شده و استفاده از آن
در یادگیریِ آینده انجام نمیدهد .اگرچه این الگویِ یادگیریِ مجزا بسیار موفقیتآمیز بوده است،
اما به تعداد زیادی نمونه آموزشی نیاز دارد و فقط برای کارهایی که به خوبی تعریف شده و
محدود هستند مناسب است .با دردسترس قرار گرفتن مجموعه دادههای بزرگتر و کاهش
هزینههای محاسباتی ،مدلهایی که قادر به حل وظایف بزرگتر هستند نیز در دسترس شدند .با
این حال ،آموزش یک مدل هر بار که نیاز به یادگیری یک کار جدید دارد ،ممکن است غیرممکن
باشد .چراکه ممکن است دادههای قدیمیتر در دسترس نباشند ،دادههای جدید به دلیل مشکالت
حفظ حریم خصوصی نتوانند ذخیره شوند یا دفعاتی که سیستم باید در آن بروزرسانی شود،
نمیتواند از آموزش یک مدل جدید با تمام دادهها به اندازه کافی مکرر پشتیبانی کند .وقتی
شبکههای عصبی عمیق وظایف جدیدی را یاد میگیرند ،در صورت عدم استفاده از معیارهای
خاص ،دانش جدید بر دانش قدیمیتر اولویت داده میشود و معموال باعث فراموشی دانش دوم
میشود .این موضوع معموال به عنوان فراموشی فاجعهآمیز ()catastrophic forgetting
شناخته میشود (شکل 1-1را ببینید) .فراموشی فاجعهآمیز زمانی اتفاق میافتد که یک شبکه
عصبی آموزشدیده ،زمانی که برای انجام وظایف جدید تطبیق داده میشود قادر به حفظ توانایی
خود برای انجام وظایفی که قبال آموخته است ،نیست.
19 فصل اول :مقدمهای بر یادگیری عمیق
شکل .1-1تصویری از فراموشی فاجعهآمیز .دانشِ آموخته شدهیِ قبلی هنگام یادگیری کالسهای
جدیدی که برای مدتی دیده نشده ،فراموش میشود (به صورت تدریجی محو میشود).
مشکل دیگر شبکههای عصبی عمیق این است که آنها اغلب با فرضیات جهان بسته آموزش
داده میشوند ،یعنی فرض میشود که توزیع دادههای آزمایشی مشابه توزیع دادههای آموزشی
است .با این حال ،هنگامی که در کارهای دنیای واقعی بکار گرفته میشوند ،این فرض درست
نیست و منجر به کاهش قابل توجهی از عملکرد آنها میشود .هنگامی که شبکههای عصبی
عمیق دادههایی را پردازش میکنند که شبیه توزیع مشاهده شده در زمان آموزش نیستند که به
اصطالح خارج ازتوزیع نامیده ( )Out-of-distributionمیشوند ،اغلب پیشبینیهای اشتباهی
انجام میدهند و این کار را با اطمینان بیش از حد انجام میدهند (شکل 2-1را ببینید) .در این
موارد خروجی شبکه یک تناظر مستقیم با راهحل مساله دارد ،یعنی احتمال برای هر کالس .با
این حال ،جمع نمایشِ بردارِ خروجی مجبور است همیشه به یک برسد .این بدان معناست که
وقتی به شبکه یک ورودی نشان داده میشود که بخشی از توزیع آموزشی نیست ،بازهم احتمال
را به نزدیکترین کالس میدهد تا جمع احتماالت به یک برسد .این پدیده منجر به مشکل
شناخته شدهی شبکههای عصبی زیاد مطمئن ( )overconfidentبه محتوایی شده است که هرگز
ندیدهاند.
اگرچه این افت عملکرد برای کاربردهای همانند توصیهگرهای محصول قابل قبول است ،اما
استفاده از چنین سیستمهایی در حوزههای همانند پزشکی و رباتیک خانگی خطرناک است،
چرا که میتوانند باعث بروز حوادث جدی شوند .یک سیستم هوش مصنوعی ایدهآل باید در
صورت امکان به نمونههای خارج از توزیع تعمیم پیدا کند .بنابراین ،توانایی تشخیصِ خارج از
توزیع برای بسیاری از برنامههای کاربردی دنیای واقعی بسیار مهم است و برای تضمین قابلیت
اطمینان و ایمنی سیستمهای یادگیری ماشین ضروری است .به عنوان مثال ،در رانندگی خودران،
ما میخواهیم سیستم رانندگی زمانی که صحنههای غیرعادی یا اشیایی را که قبال ندیده است و
نمیتواند تصمیم ایمن بگیرد را تشخیص دهد ،هشدار بدهد و کنترل را به انسان واگذار کند.
20یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
شکل .2-1هنگامی که یک نمونهی جدیدِ خارج از توزیعِ آموخته شده ارائه شود ،شبکههای عصبی عمیق
یک کالس را از توزیع آموختهشده با اطمینان زیادی پیشبینی میکنند.
در نهایت ،شناختهشدهترین نقطه ضعف شبکههای عصبی ماهیت عدم شفافیت آنهاست.
در حالیکه ،تصمیمات گرفته شده توسط مدلهای مبتنی بر قاعده را میتوان توسط دستورات 𝑓𝑖
و 𝑒𝑠𝑙𝑒 ردیابی کرد ،در یادگیری عمیق چنین چیزی امکان پذیر نخواهد بود .این عدم شفافیت
همان چیزی است که در یادگیری عمیق از آن به عنوان "جعبه سیاه" یاد میشود.
به عبارت ساده ،شما نمیدانید چگونه و یا چرا شبکه عصبی شما خروجی خاصی را بدست
آورده است .به عنوان مثال ،وقتی تصویری از یک گربه را به یک شبکه عصبی تغذیه میکنید و
آن را یک ماشین پیشبینی میکند ،درک اینکه چه چیزی باعث شده است که به این پیشبینی
برسد بسیار سخت است .این سناریو در تصمیمات تجاری مهم خواهند بود .آیا میتوانید تصور
کنید که مدیر عامل یک شرکت بزرگ تصمیمی در مورد میلیونها دالر بگیرد بدون اینکه بفهمد
چرا باید این کار را انجام دهد؟ فقط به این دلیل که "رایانه" میگوید او باید این کار را انجام
دهد؟ در مقایسه ،الگوریتمهایی مانند درخت تصمیم بسیار قابل تفسیر هستند.
الگوریتمهای یادگیری عمیق ،الگوها و همبستگیها را از طریق دادههای تغذیه شده به آن پیدا
میکنند و گاهی تصمیماتی میگیرند که حتی برای مهندسانی که آنها را ایجاد کردهاند ،گیج
کننده است .این امر زمانی که یادگیری عمیق کاری با اهمیت کم را انجام میدهد ،مشکلی را
بوجود نخواهد آورد .اما وقتی تصمیم به سرنوشت یک متهم در دادگاه یا معالجه پزشکی بیمار
باشد ،بسیار سرنوشتساز خواهد بود .چرا که اشتباهات میتواند عواقب زیادی را بههمراه داشته
باشد .طبق گفته گری مارکوس:
"مسئله شفافیت هنوز حل نشده است ،کاربران هنگام استفاده از یادگیری عمیق برای کار در حوزه-
های تشخیص پزشکی و تجارت مالی ،دوست دارند درک کنند که چگونه یک سیستم مشخص یک
تصمیم مشخصی را گرفته است".
21 فصل اول :مقدمهای بر یادگیری عمیق
روی هم رفته ،به گفته اندرو انگ ،یادگیری عمیق راهی عالی برای "ساخت جامعهای مبتنیبر
هوش مصنوعی" است و غلبه بر این کاستیها با کمک سایر فنآوریها ،راه درست برای رسیدن
به این هدف است.
.1اتصال به دنیای هوش مصنوعی کالسیک .مارکوس رهایی از یادگیری عمیق را
پیشنهاد نمیکند ،بلکه ادعا میکند که ما باید از سایر رویکردهای هوش مصنوعی
مانند دانش قبلی ،استدالل و مدلهای شناختیِ غنی همراه با یادگیری عمیق برای
تغییرات دگرگونکننده استفاده کنیم.
.2ساخت چارچوبهای شناختی غنی و پایگاههای اطالعاتیِ دانش در مقیاس بزرگ.
سیستمهای یادگیری عمیق بهطور عمده فقط با همبستگی بین چیزهای خاص پر
شدهاند .بنابراین به دانش زیادی نیاز دارند.
22یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
.3ابزارهایی برای استدالل انتزاعی برای تعمیم مؤثر .ما باید بتوانیم در مورد این چیزها
استدالل کنیم .فرض کنید در مورد اشیاء فیزیکی و موقعیت آنها در جهان اطالعات
داریم ،برای مثال یک فنجان .فنجان حاوی مداد است .سپس سیستمهای یادگیری
عمیق باید بتوانند متوجه این موضوع شوند که اگر سوراخی در ته فنجان ایجاد کنیم،
ممکن است مدادها بیفتند .انسانها همیشه این نوع استدالل را انجام میدهند ،اما
سیستمهای یادگیری عمیق یا بهطور کلیتر هوش مصنوعی فعلی ،این توانایی را
ندارند.
.4مکانیسمهایی برای بازنمایی و القای مدلهای شناختی.
یادگیری عمیق هنوز راه درازی در پیش دارد تا بتواند به ظرفیتهای همتایان
انسانی خود دست یابد.
تاریخچهیِ تحقیقات هوش مصنوعی گاهی اوقات به عنوان یک کشمکش بین دو رویکرد
مختلفِ استدالل نمادین و یادگیری ماشین توصیف میشود .در دهه اول ،استدالل نمادین غالب
بود ،اما یادگیری ماشین در دهه 1990شروع به نفوذ کرد و با انقالب یادگیری عمیق ،این حوزه
را فرا گرفت .با این حال ،به نظر میرسد ،استدالل نمادین تنها مجموعهیِ دیگری از روشهاست
که ممکن است به گسترش و قدرتمندتر کردنِ یادگیری عمیق منجر شود.
نیکو استروم می گوید" :شبکههای دگرگونساز ( )Transformer networksچیزی به نام توجه
( )attentionدارند .بنابراین میتوان یک بردار در شبکه داشت و شبکه میتواند بیشتر از همهیِ
اطالعات دیگر به آن بردار بپردازد .از اینرو اگر پایگاه دانشی از اطالعات دارید ،میتوانید آن را
با بردارهایی که نشان دهنده حقیقت در آن پایگاه دانش هستند ،از قبل پر کنید و سپس میتوانید
از شبکه بخواهید که بسته به ورودی ،به دانش درست توجه کند .به این ترتیب میتوانید سعی
کنید دانشِ ساختار یافتهیِ جهان را با سیستم یادگیری عمیق ترکیب کنید.
شبکههای عصبی گراف نیز وجود دارند که میتوانند دانشِ دربارهیِ جهان را نشان دهند .شما
گرهها و یالهایی بین این گرهها دارید که روابط بین آنها را نشان میدهند .بنابراین ،برای مثال،
میتوانید موجودیتهایی را در گرهها و سپس روابط بین موجودیتها را نشان دهید .میتوانیم
از توجه در بخشی از گراف دانش که برای زمینه یا سوال فعلی مهم است استفاده کنیم.
به نظر میرسد که میتوان تمام دانش را در یک گراف نشان داد .با این حال ،نکتهی مهم اسن
است که چگونه میتوان آن را به روشی کارآمد و مناسب انجام داد؟
"هینتون خیلی وقت پیش این ایده را داشت .او آن را بردار فکر ( )thought vectorنامید.
هر فکری که میتوانید داشته باشید ،میتوانیم با یک بردار نمایش دهیم .دلیل جالب بودن این
23 فصل اول :مقدمهای بر یادگیری عمیق
است که ما میتوانیم هر چیزی را در گراف نشان دهیم ،اما برای اینکه این کار به خوبی هماهنگ
با یک مدل یادگیری عمیق باشد ،باید از طرف دیگر چیزی نیز داشته باشیم که بتوانیم هر چیزی
را با آن نشان دهیم و اتفاقا این همان بردار است .بنابراین ما میتوانیم بین این دو یک نگاشت
ایجاد کنیم".
دستیاران مجازی
محبوبترین برنامه یادگیری عمیق دستیاران مجازی الکسا ،سیری و دستیار گوگل است .هر
تعامل با این دستیارها فرصتی برای آنها فراهم میکند تا در مورد صدا و لهجه شما بیشتر
بیاموزند و در نتیجه یک تجربه ثانویه از تعامل انسانی را برای شما به ارمغان میآورند .دستیاران
مجازی از یادگیری عمیق برای دانستن بیشتر در مورد موضوعات خود استفاده میکنند ،از
ترجیحات غذاخوری شما گرفته تا مکانهای پربازدید یا موسیقیهای مورد عالقه شما .آنها یاد
میگیرند که دستورات شما را با ارزیابی زبان طبیعی انسان برای اجرای آنها درک کنند.
یکی دیگر از قابلیتهایی که به دستیاران مجازی اعطا شده است ،ترجمه گفتار شما به متن،
یادداشتبرداری برای شما و رزرو قرار مالقات است .دستیاران مجازی به معنای واقعی کلمه در
خدمت شما هستند ،چراکه میتوانند همهیِ کارها را از انجام وظایف تا پاسخگویی خودکار به
تماسهای خاص شما گرفته تا هماهنگی وظایف بین شما و اعضای تیمتان انجام دهند.
پیچیدگی برای تعریف شخصیتهای خواننده برای فیلتر کردن اخبار بر اساس پارامترهای
جغرافیایی ،اجتماعی ،اقتصادی همراه با ترجیحات فردی خواننده انجام شده است .از سوی
دیگر ،کشف اخبار کالهبرداری ،یک دارایی مهم در دنیای امروزی است که در آن اینترنت به
منبع اصلی همه اطالعات واقعی و جعلی تبدیل شده است.
تشخیص اخبار جعلی بسیار سخت میباشد ،چراکه رباتها آن را به طور خودکار در کانالها
تکرار میکنند .یادگیری عمیق به توسعه طبقهبندهایی کمک میکند که میتوانند اخبار جعلی یا
مغرضانه را شناسایی کرده و آنها را از گزیدهی اخبار شما حذف کند و در مورد نقض احتمالی
حریم خصوصی به شما هشدار دهند.
هوش عاطفی
در حالیکه رایانهها ممکن است نتوانند احساسات انسانی را تکرار کنند ،به لطف یادگیری عمیق،
درک بهتری از حاالت ما بدست میآورند .الگوهایی مانند تغییر در لحن ،اخمهای خفیف یا
هقهق همگی سیگنالهای داده ارزشمندی هستند که میتوانند به هوش مصنوعی کمک کنند و
حاالت روحی ما را تشخیص دهند .از چنین برنامههایی میتوان برای کمک به شرکتها برای
ارتباط دادن دادههای احساسات برای تبلیغات استفاده کرد یا حتی پزشکان را در مورد وضعیت
عاطفی بیمار آ گاه کرد.
مراقبتهای بهداشتی
پزشکان نمیتوانند 24ساعت شبانه روز را در کنار بیماران خود باشند ،اما تنها چیزی که همه
ما تقریبا همیشه همراه خود داریم تلفنهایمان است .به لطف یادگیری عمیق ،ابزارهای پزشکی
میتوانند دادههایِ عکسهایی که میگیریم و دادههای حرکتی را برای تشخیص مشکالت سالمتی
بالقوه بررسی کنند .نرمافزار بینایی رایانه Robbie.AIاز این دادهها برای ردیابی الگوهای حرکتی
بیمار برای پیشبینی سقوط و همچنین تغییرات در وضعیت روانی کاربر استفاده میکند .یادگیری
عمیق همچنین برای تشخیص سرطان پوست از طریق تصاویر ثابت شده است.
یادگیری عمیق همچنین در تحقیقات بالینی برای یافتن راهحلهایی برای بیماریهای غیرقابل
درمان بهشدت مورد استفاده قرار میگیرد ،اما شک و تردید پزشکان و فقدان مجموعه دادههای
گسترده هنوز چالشهایی را برای استفاده از یادگیری عمیق در پزشکی ایجاد میکند.
شناسایی کالهبرداری
از آنجایی که بانکها به دیجیتالی کردن فرآیند تراکنشهای خود ادامه میدهند ،احتمال
کالهبرداریهای دیجیتالی در حال افزایش است ،بنابراین برای جلوگیری از این نوع کالهبرداری،
25 فصل اول :مقدمهای بر یادگیری عمیق
یادگیری عمیق نقش مهمی ایفا میکند .تشخیص کالهبرداری را میتوان به سرعت از طریق
تکنیکهای یادگیری عمیق انجام داد.
خالصه فصل
▪ هوش مصنوعی سیستمی است که میتواند رفتار انسان را تقلید کند.
▪ در سیستمهای رایانهای ،تجربه در قالب دادهها وجود دارد.
▪ الگوریتم یادگیری عمیق مشابه نحوه یادگیری ما از تجربهها و نمونهها ،یک کار را به طور
مکرر انجام میدهد و هر بار کمی آن را تغییر میدهد تا نتیجه را بهبود بخشد.
▪ مدلهای یادگیری عمیق یکی از داده خوارترین مدلهای داده در دنیای یادگیری ماشین
هستند.
▪ شناختهشدهترین نقطه ضعف شبکههای عصبی ماهیت عدم شفافیت آنهاست.
آزمونک
.1هوش مصنوعی ،یادگیری ماشین و یادگیری عمیق را تعریف کنید.
.2فراموشی فاجعهآمیز در شبکههای عصبی چه زمانی اتفاق میافتد؟
.3مزیت مهم یادگیری عمیق در مقایسه با یادگیری ماشین در چیست؟
.4چند مورد از محدودیت و چالشهای یادگیری عمیق را شرح دهید.
پیشنیازها 2
اهداف یادگیری:
داده چیست؟ ▪
انواع دادهها ▪
آشنایی با رویکردهای متفاوت یادگیری ماشین ▪
مزایا و معایب هر یک از رویکردها ▪
انتخاب و ارزیابی مدل چیست؟ ▪
28یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
مقدمه
یادگیری عمیق زیرمجموعهای از روشهای یادگیری ماشین است .از اینرو ،مروری بر مفاهیم
یادگیری ماشین قبل از فراگیری یادگیری عمیق مفید خواهد بود .این فصل جزئیات مفاهیمی که
برای درک یادگیری عمیق مورد نیاز است را به گونهای ارائه میدهد که پیشنیازها حداقل شود
و اطالعات کاملی در مورد دادهها ،ابزارهای مورد نیاز و مبانی یادگیری ماشین ارائه میدهد.
بهطور کلی ،این فصل به عنوان پایهای برای یادگیری کامل مطالب ارائه شده در این کتاب است.
داده ()Data
کلمه "داده" از کلمه التین dareگرفته شده است که به معنای "چیزی داده شده" است؛ یک
مشاهده یا یک واقعیت در مورد یک موضوع .دادهها اشکال و قالبهای مختلفی دارند ،اما
بهطور کلی میتوان آن را نتیجه آزمایش تصادفی تصور کرد؛ آزمایشی که نتیجه آن را نمیتوان از
قبل تعیین کرد ،اما عملکرد آن هنوز در معرض تجزیه و تحلیل است .دادههای یک آزمایش
تصادفی اغلب در یک جدول یا صفحه گسترده ذخیره میشود .یک قرارداد آماری این است که
متغیرها را که اغلب ویژگیها نامیده میشود ،به عنوان ستون و موارد منفرد را به عنوان ردیف
نشان داده شوند.
داده ها به قطعاتِ متمایز ِاطالعاتی اطالق میشود که معمولً به گونه ای قالببندی و ذخیره می شوند که با
هدف خاصی مطابقت داشته باشد .دادهها میتوانند به اشکال مختلف وجود داشته باشند ،به صورت
اعداد یا متن بر روی کاغذ ،به صورت بیتها یا بایتهای ذخیره شده در حافظه الکترونیکی یا به عنوان
حقایقی که در ذهن یک فرد وجود دارند .با این حال ،در علوم رایانه ،داده ها معمولً به اطالعاتی اشاره
دارند که به صورت الکترونیکی منتقل یا ذخیره میشوند و به شکلی ترجمه شدهاند که برای جابجایی یا
پردازش کارآمد باشند.
برای آموزش الگوریتم یادگیری عمیق ما به دادههای زیادی برای ورودی نیاز
داریم .هر نقطه داده را میتوان یک نمونه یا یک مثال نیز نامید .اگر مسئله
یادگیری بانظارت داشته باشیم ،هر ورودی (بردار) یک خروجی (بردار) مرتبط
خواهد داشت .میتوانید اینها را به عنوان متغیرهای مستقل و وابستهی مرتبط
در نظر بگیرید.
29 فصل دوم :پیشنیازها
دادههای قابل خواندن توسط ماشین در مقابل قابل خواندن توسط انسان
دادهها یک دارایی ضروری برای همهیِ سازمانها هستند و اساس بسیاری از توسعه برنامهها را
تشکیل میدهند و همچنین کاربرد الگوریتم به صحت دادهها و صحت منبع بستگی دارد .نمایش
دادهها در قالب صحیح بدون از بین بردن مقدار اصلی ،بخش مهمی از سیستم مدیریت داده
است.
همه دادهها را میتوان به عنوان قابل خواندن توسط ماشین ،قابل خواندن توسط انسان یا هر
دو دستهبندی کرد .دادههای قابل خواندن توسط انسان از قالبهای زبان طبیعی (مانند یک فایل
متنی حاوی کدهای ASCIIیا سند )PDFاستفاده میکنند ،در حالی که دادههای قابل خواندن
توسط ماشین از زبانهای رایانهای با ساختار رسمی برای خواندن توسط سیستمها یا نرمافزارهای
رایانهای استفاده میکنند .برخی از دادهها هم توسط ماشینها و هم توسط انسان قابل خواندن
هستند ،مانند HTML ،CSVیا .JSON
قالب قابل خواندن توسط ماشین برای دستگاهها و ماشینها طراحی شده است .درک این
قالب برای انسان پیچیده است و همچنین ابزارهای تخصصی برای خواندن محتوای دادههای
قابل خواندن توسط ماشین ضروری است .دادههای ارائه شده در قالب قابل خواندن توسط
ماشین را میتوان بهطور خودکار استخراج کرد و برای پردازش و تجزیه و تحلیل بیشتر بدون
دخالت انسان استفاده کرد.
دادههای قابل خواندن توسط انسان میتواند توسط انسان درک و تفسیر شود .تفسیر دادهها
به تجهیزات یا دستگاههای تخصصی نیاز ندارد .این زبان دارای یک زبان طبیعی است (به عنوان
مثال ،فارسی ،انگلیسی ،فرانسوی و غیره) و نمایش دادهها بدون ساختار است .نمونهای از
قالبهای قابل خواندن توسط انسان یک سند PDFاست .اگرچه PDFیک رسانه دیجیتال
است اما نمایش دادههای آن نیازی به هیچ تجهیزات تخصصی یا رایانهای برای تفسیر ندارد.
عالوه بر این ،اطالعات موجود در سند PDFمعموالً برای انسانها در نظر گرفته شده است ،نه
ماشینها.
انواع دادهها
دادهها در قالبها و انواع مختلفی میآیند .درک خصوصیات هر ویژگی یا جنبه ،اطالعاتی را در
مورد اینکه چه نوع عملیاتی را میتوان بر روی آن ویژگی انجام داد ،ارائه میدهد .به عنوان مثال،
دما در دادههای آب و هوا را میتوان به صورت یکی از فرمتهای زیر بیان کرد:
همهیِ این ویژگیها دمای یک منطقه را نشان میدهند ،اما هر کدام دارای انواع دادهای متفاوتی
هستند.
دمایی که بر حسب سانتیگراد یا فارنهایت بیان میشود عددی و پیوسته است ،زیرا میتوان آن
را با اعداد نشان داد و بین ارقام بینهایت مقدار را گرفت .عدد صحیح شکل خاصی از نوع داده
عددی است که دارای اعشار در مقدار نیست یا بهطور دقیقتر دارای مقادیر بینهایت بین اعداد
متوالی نیست .معموال تعداد چیزی ،تعداد روزهای با دمای کمتر از 0درجه سانتیگراد ،تعداد
31 فصل دوم :پیشنیازها
سفارشات ،تعداد فرزندان یک خانواده و غیره را نشان میدهند .اگر نقطه صفر تعریف شود،
دادههای عددی به یک نسبت یا نوع داده واقعی تبدیل میشوند .به عنوان مثال میتوان به دما در
مقیاس کلوین ،موجودی حساب بانکی و درآمد اشاره کرد.
دادههای رستهای یا اسمی به عنوان دادههایی تعریف میشوند که برای نامگذاری یا
برچسبگذاری متغیرها ،بدون هیچ مقدار کمی استفاده میشوند .معموال هیچ ترتیب ذاتی برای
دادههای اسمی وجود ندارد .بهعنوان مثال ،رنگ یک تلفن هوشمند را میتوان بهعنوان نوع داده
اسمی در نظر گرفت .زیرا نمیتوانیم یک رنگ را با رنگهای دیگر مقایسه کنیم .به عبارت دیگر،
نمیتوان بیان کرد که "قرمز" بزرگتر از "آبی" است .بهعنوان مثالی دیگر ،رنگ چشم یک متغیر
اسمی است که دارای چند دسته (آبی ،سبز ،قهوهای) است و راهی برای مرتبسازی این دستهها
از باالترین به کمترین وجود ندارد.
مجموعه داده
یک مجموعه داده ،مجموعهای از دادهها است که معموالً به صورت جدول ارائه میشود .هر
ستون نشاندهنده یک متغیر خاص (ویژگی) است .هر ردیف مربوط به یک عضو معین از
مجموعه داده مورد نظر است و مقادیر را برای هر یک از متغیرها میکند .هر مقدار به عنوان یک
داده شناخته میشود.
یادگیری بانظارت
یادگیری بانظارت یکی از پرکاربردترین شاخههای یادگیری ماشین است که از دادههای آموزشی
برچسبگذاری شده برای کمک به مدلها در پیشبینی دقیق استفاده میکند .دادههای آموزشی
در اینجا بهعنوان سرپرست و معلم برای ماشینها عمل میکنند ،از این رو به این نام اشاره
میشود .یادگیری بانظارت مبتنیبر تولید خروجی از تجربیات گذشته (دادههای برچسب دار)
است .در یادگیری بانظارت ،یک متغیر ورودی ( 𝑥) با کمک یک تابع نگاشت که توسط یک
مدل یادگیری ماشین آموخته میشود ،به متغیر خروجی ( 𝑦) نگاشت میشود.
)𝑥(𝑓 = 𝑦
در اینجا مدل تابعی را ایجاد میکند که دو متغیر را با هدف نهایی بهم متصل میکند تا برچسب
صحیح دادههای ورودی را پیشبینی کند.
33 فصل دوم :پیشنیازها
یک الگوریتم یادگیری بانظارت همیشه دارای یک متغیر هدف یا نتیجه (یا متغیر
وابسته) است که از مجموعهای از پیشبینی کنندههای ارائه شده (متغیرهای
مستقل) شناسایی میشود .الگوریتم از این مجموعه متغیرها برای ایجاد تابعی
استفاده میکند که ورودیها را به خروجیهای دلخواه نگاشت میکند .این فرآیند
آموزشی تا زمانی که تکرار میشود که مدل به سطح باالیی از دقت دست یابد.
طبقهبندی ()Classification
طبقهبندی یک فرآیند بانظارت است ،یعنی الگوریتم یادگیرنده بر اساس دادههای آموزشی که از
قبل برچسب خوردهاند سعی در یافتن یک ارتباط بین دادهها و برچسبها دارد.
در طبقهبندی کالسها از قبل مشخص هستند و اغلب با عنوان هدف ،برچسب
یا دسته نامیده میشوند.
دادههای دارای برچسب برای آموزش دستهبند استفاده میشود تا بتواند بر روی
دادههای ورودی جدید بهخوبی عمل کند و بتواند کالس درست آن نمونه را
پیشبینی کند .به عبارت دیگر ،هدف این است که یک تقریب خوب برای )𝑥(𝑓
پیدا شود تا بتواند برای دادههای دیدهنشده در فرآیند آموزش پیشبینی انجام
دهد و بگوید که نمونه جدید به کدام یکی از کالسها تعلق دارد.
مسائل طبقهبندی را میتوان از دو دیدگاه متفاوت تقسیمبندی کرد .از دیدگاه تعداد برچسب
که به دو دسته طبقهبندی تکبرچسبی ( )single-label classificationو طبقهبندی
چندبرچسبی ( )multi-label classificationقابل تقسیم هستند و از دیدگاه تعداد کالسها به
دو دسته طبقهبندی دودویی ( )Binary Classificationو طبقهبندی چندکالسی (Multi-
)Class Classificationتقسیمبندی میشوند.
طبقهبندی دودویی که در آن هر نمونه تنها به یکی از دو کالس از پیش تعریفشده اختصاص
داده میشود ،سادهترین نوع طبقهبندی است .طبقهبندی دودویی با تعریف کالسهای بیشتر به
طبقهبندی چندکالسی گسترش مییابد.
34یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
طبقهبندی تک برچسبی
در طبقهبندی دادههای تکبرچسبی ،هر نمونه تنها میتواند با یک برچسب ارتباط داشته باشد و
الگوریتم طبقهبندی در مرحله آموزش برای هر نمونه جدید تنها یک برچسب را پیشبینی میکند.
به طور کلی ،مسائل طبقهبندی تکبرچسبی را میتوان به دو گروه اصلی تقسیم کرد :مسائل
دودویی و چندکالسی.
طبقهبندی دودویی
مساله دستهبندی دودویی سادهترین حالت از مسائل طبقهبندی است که در آن مجموعه کالسها
تنها به دو مورد محدود میشود .در این زمینه ،ما بین کالس مثبت و کالس منفی تمایز قائل
میشویم .یک مثال ساده از مسائل دستهبندی دودویی زمانی است که یک زن به پزشک مراجعه
میکند تا از باردار بودن خود مطلع شود .نتیجه آزمایش ممکن است مثبت یا منفی باشد.
طبقهبندی چندبرچسبی
در مسائل طبقهبندی سنتی ،هر نمونه با یک برچسب کالس مرتبط است .با این حال ،در بسیاری
از سناریوهای دنیای واقعی ،یک نمونه ممکن است با چندین برچسب مرتبط باشد .به عنوان
مثال ،در طبقهبندی اخبار ،بخشی از اخبار مربوط به عرضه آیفون جدید توسط اپل ،هم با
برچسب تجارت و هم با برچسب فناوری مرتبط است .به عبارت دیگر ،هر نمونه به جای تنها
یک برچسب ،با مجموعهای از برچسبها مرتبط است .یادگیری چندبرچسبی یک زمینه یادگیری
ماشین است که به یادگیری از دادههای چندبرچسبی اشاره دارد که در آن هر نمونه با چندین
برچسب بالقوه مرتبط است.
طبقهبندی چندبرچسبی یکی از مسائل مهم در زمینه پردازش زبان طبیعی ،به خصوص در
طبقهبندی متون است .عالوه بر این ،از آن در بسیاری مسائل دنیای واقعی همانند ،بازیابی
35 فصل دوم :پیشنیازها
رگرسیون
تفاوت اصلی بین مدلهای رگرسیون و طبقهبندی این است که الگوریتمهای رگرسیون برای
پیشبینی مقادیر پیوسته (نمرات آزمون) استفاده میشوند ،در حالی که الگوریتمهای طبقهبندی
مقادیر گسسته (مذکر/مونث ،درست/نادرست) را پیشبینی میکنند .رگرسیون یک فرآیند آماری
است که رابطه معناداری بین متغیرهای وابسته و مستقل پیدا میکند .به عنوان یک الگوریتم ،یک
عدد پیوسته را پیشبینی میکند .به عنوان مثال ،ممکن است از یک الگوریتم رگرسیون برای
تعیین نمرهیِ آزمون دانشآموزان بسته به تعداد ساعات مطالعه آنها در هفته استفاده کنید .در
این شرایط ساعات مطالعه شده به متغیر مستقل تبدیل میشود و نمره نهایی آزمون دانشجو
متغیر وابسته است .میتوانید خطی از بهترین تناسب را از طریق نقاط داده مختلف ترسیم کنید
تا پیشبینیهای مدل را هنگام معرفی ورودی جدید نشان دهید .از همین خط میتوان برای
پیشبینی نمرات آزمون بر اساس عملکرد دانشآموز دیگر نیز استفاده کرد.
به عنوان یک مثال دیگر ،فرض کنید میخواهیم سیستمی داشته باشیم که بتواند قیمت یک
خودروی دست دوم را پیشبینی کند .ورودیها ،ویژگیهای خودرو همانند برند ،سال ،مسافت
پیموده شده و اطالعات دیگری که به اعتقاد ما بر ارزش خودرو تاثیر میگذارد و خروجی قیمت
خودرو است .یا ناوبری یک ربات متحرک (اتوموبیل خودران) را در نظر بگیرید؛ خروجی
زاویهای است که در هر بار فرمان باید بچرخد تا بدون برخورد به موانع و انحراف از مسیر
پیشروی کند و ورودیها توسط حسگرهای برروی اتوموبیل همانند دوربین فیلمبرداری GPS ،و
غیره ارائه میشوند.
مزایا
▪ یادگیری بانظارت فرآیند ساده ای است که میتوانید آن را درک کنید.
▪ پس از اتمام فرآیند آموزش ،لزومی نیست که دادههای آموزشی را در حافظه خود نگه دارید.
▪ نتیجه آن در مقابل روش یادگیری بدوننظارت از دقت بیشتری برخوردار است.
▪ از آنجایی دادههای برچسبدار وجود دارند ،میتوانید براحتی مدل خود را تست و اشکال زدایی کنید.
36یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
معایب
▪ یادگیری بانظارت از جنبههای مختلف محدود است بهطوری که نمیتواند برخی از وظایف پیچیده در
یادگیری ماشین را انجام دهد.
▪ اگر ورودی بدهیم که از هیچ یک از کالسهای داده آموزشی نباشد ،ممکن است خروجی ،یک برچسب
کالسِ اشتباه باشد .به عنوان مثال ،فرض کنید یک طبقهبند تصویر را با دادههای گربه و سگ آموزش
دادهاید .سپس اگر تصویر زرافه را بدهید ،خروجی ممکن است گربه یا سگ باشد ،که درست نیست.
▪ برای آموزش به زمان محاسباتی زیادی نیاز دارد.
▪ جمعآوری و برچسبگذاری دادهها پرهزینه و زمانبر است.
یادگیری بدوننظارت
یادگیری بدوننظارت در یادگیری ماشین زمانی است که به هیچ وجه دستهبندی یا برچسبگذاری
دادهها وجود ندارد .وظیفه این است که اطالعات گروهبندی نشده را بر اساس برخی شباهتها
و تفاوتها بدون هیچ گونه راهنمایی ،مرتب کند .به عبارت دیگر ،از ماشین انتظار میرود الگوها
و ساختار پنهان در دادههای بدون برچسب را به تنهایی پیدا کند .به همین دلیل است که به آن
بدوننظارت میگویند .چراکه هیچ راهنمایی وجود ندارد که به ماشین یاد دهد چه چیزی درست
و چه چیزی نادرست است .در این رویکرد ،ماشین این را نمیداند به دنبال چه چیزی است ،اما
میتواند بهطور مستقل دادهها را مرتب کند و الگوهای قانع کنندهای پیدا کند.
یکی از ویژگیهای مهم این مدلها این است ،در حالیکه مدل میتواند روشهای
مختلفی را برای گروهبندی یا سفارش دادههای شما پیشنهاد دهد ،این به شما
بستگی دارد که تحقیقات بیشتری برروی این مدلها انجام دهید تا از چیز مفیدی
رونمایی کنید.
خوشهبندی
خوشهبندی فرآیند تخصیص نمونه دادهها به تعداد معینی از خوشهها است (شکل )1-2به
گونهای که نقاط داده متعلق به یک خوشه دارای ویژگیهای مشابه باشند .به عبارت سادهتر،
خوشهها چیزی نیستند جز گروهبندی نقاط داده به گونهای که فاصله بین نقاط داده درون خوشهها
حداقل باشد .هدف تحلیل خوشهای (در حالت ایدهآل) یافتن خوشههایی است که نمونههای
درون هر خوشه کامال شبیه یکدیگر باشند ،در حالی که هر خوشهای با یکدیگر کامال متفاوت
باشد.
شکل .1-2خوشهبندی.
از آنجایی که خوشهبندی توسط الگوریتم انجام میشود ،این احتمال وجود دارد
که بتوانید همبستگیهای ناشناخته قبلی را در دادهها کشف کنید که میتواند
به شما در برخورد با یک چالش تجاری از دیدگاه جدید کمک کند.
کاهش ابعاد
کاهش ابعاد به فرآیند کاهش تعداد ویژگیها در مجموعه دادهها اشاره دارد ،در حالی که تا آنجا
که ممکن است تغییرات در مجموعه داده اصلی حفظ شود .فرآیند کاهش ابعاد اساسا دادهها را
از فضای ویژگیهای با ابعاد باال به فضای ویژگیهای با بعد کمتر تبدیل میکند .به طور همزمان،
مهم است که ویژگیهای معنی دار موجود در دادهها در طول تبدیل از بین نروند.
کاهش ایعاد یک مرحله پیشپردازش داده است .به این معنا که قبل از آموزش
مدل ،کاهش ابعاد را انجام میدهیم.
38یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
فرض کنید میخواهیم به یک کودک یک زبان جدید ،به عنوان مثال انگلیسی ،آموزش دهیم .اگر
این کار را طبق اصل یادگیری بانظارت انجام دهیم ،به سادگی یک فرهنگ لغت با کلمات
انگلیسی و ترجمه به زبان مادریاش ،به عنوان مثال فارسی ،به او میدهیم .شروع یادگیری برای
کودک نسبتاً آسان خواهد بود و احتماال با بهخاطر سپردن ترجمهها میتواند خیلی سریع پیشرفت
کند .با این حال ،او در خواندن و درک متون به زبان انگلیسی مشکل خواهد داشت ،چراکه او
فقط ترجمههای کلمات فارسی-انگلیسی و نه ساختار دستوری جمالت انگلیسی را یاد گرفته
است.
طبق اصل یادگیری بدوننظارت ،سناریو کامالً متفاوت به نظر میرسد .بهعنوان مثال پنج
کتاب انگلیسی را به کودک تقدیم میکردیم و یادگیری را به خودش بدست آورد .البته این کار
بسیار پیچیدهتر است!! بهعنوان مثال ،با کمک "دادهها" ،کودک میتواند تشخیص دهد که کلمه
"من" به طور نسبتاً مکرر در متون وجود دارد و در بسیاری از موارد در ابتدای یک جمله نیز آمده
است و از آن نتیجهگیری کند.
این مثال تفاوت بین یادگیری بانظارت و بدوننظارت را نشان میدهد .یادگیری بانظارت در
بسیاری از موارد الگوریتم سادهتری است .با این حال ،مدل فقط زمینههایی را میآموزد که به
صراحت در مجموعه دادههای آموزشی وجود دارند و به عنوان ورودی به مدل داده شدهاند .برای
مثال ،کودکی که انگلیسی را یاد میگیرد ،می تواند کلمات فارسی را به خوبی به انگلیسی ترجمه
کند ،اما خواندن و درک متون انگلیسی را یاد نگرفته است.
از سوی دیگر ،یادگیری بدوننظارت ،با کار بسیار پیچیدهتری مواجه است ،زیرا باید ساختارها
را بهطور مستقل شناسایی و یاد بگیرد .در نتیجه زمان و تالش تمرین نیز بیشتر است .با این
حال ،مزیت این است که مدل آموزشدیده ،زمینههایی را نیز تشخیص میدهد که به صراحت
آنها را فرانگرفته است .کودکی که با کمک پنج رمان انگلیسی ،زبان انگلیسی را به خود آموزش
داده است ،احتماالً میتواند متون انگلیسی را بخواند ،تک تک کلمات را به فارسی ترجمه کند
و همچنین گرامر انگلیسی را درک کند.
مناسب و با رایانهای قدرتمند آموزش دهیم ،میتوانیم یک مدل طبقهبند تصویرِ مبتنیبر یادگیری
بانظارتِ بسیار خوب بسازیم.
همانطور که الگوریتم بانظارت بر روی دادهها آموزش میبیند ،میتواند عملکرد خود را (از
طریق تابع هزینه) با مقایسه برچسب تصویر پیشبینیشده خود با برچسب تصویر واقعی که در
مجموعه داده داریم ،اندازهگیری کند .الگوریتم ،به صورت صریح سعی میکند این تابع هزینه را
به حداقل برساند؛ بهطوری که خطای آن در تصاویری که قبال دیده نشده است (مجموعه آزمون)
تا حد امکان کم باشد .به همین دلیل است که برچسبها بسیار قدرتمند هستند ،آنها با ارائه
یک معیار خطا به هدایت الگوریتم کمک میکنند .الگوریتم از معیار خطا برای بهبود عملکرد
خود در طول زمان استفاده میکند .بدون چنین برچسبهایی ،الگوریتم نمیداند که چقدر در
طبقهبندی درست تصاویر موفق است یا نه .با این حال ،گاهی اوقات هزینهی برچسبگذاری
دستی یک مجموعه داده بسیار باال است.
عالوه بر این ،به همان اندازهای که مدلهای یادگیری بانظارت قدرتمند هستند ،در تعمیمدهیِ
دانشِ فراتر از موارد برچسبگذاری شدهای که روی آنها آموزش دیدهاند نیز ،محدود هستند .از
آنجایی که اکثر دادههای جهان بدونبرچسب هستند ،با استفاده از یادگیری بانظارت ،توانایی
هوش مصنوعی برای گسترش عملکرد خود به نمونههایی که قبال دیده نشدهاند ،محدود است.
به عبارت دیگر ،یادگیری بانظارت در حل مسائل هوش مصنوعی محدود ( )Narrow AIعالی
است ،اما در حل مسائل از نوع هوش مصنوعی قوی ،چندان خوب نیست.
در مقابل ،برای مسائلی که الگوها ناشناخته هستند یا بهطور دائم در حال تغییر هستند یا
مجموعه دادههای برچسبگذاریشده کافی برای آنها نداریم ،یادگیری بدوننظارت واقعا
میدرخشد .یادگیری غیرنظارتی ،به جای هدایت شدن توسط برچسبها ،با یادگیریِ ساختارِ
زیربنایی دادههایی که روی آنها آموزش دیده است ،کار میکند .یادگیری بدوننظارت این کار را
با تالش برای بازنمایی از دادههایی که روی آن آموزش میبیند با مجموعهای از پارامترها انجام
میدهد .با انجام این یادگیری بازنمایی ( ،)representation learningیادگیری بدوننظارت
میتواند الگوهای متمایزی را در مجموعه داده شناسایی کند.
یادگیری بازنمایی تعریف 1.2
یادگیری بازنمایی زیرمجموعهای از یادگیری ماشین است که هدف آن بدست آوردن ویژگیهای خوب و
مفید از دادهها بهطور خودکار ،بدون آن که یک مهندس ویژگی درگیر با مساله باشد .در این رویکرد ،ماشین
دادههای خام را به عنوان ورودی میگیرد و بهطور خودکار بازنماییهای مورد نیاز برای شناسایی ویژگی را
کشف میکند و سپس بهطور خودکار ویژگیهای جدید را یاد میگیرد و آن را اعمال میکند .به عبارت دیگر،
هدف یادگیری بازنمایی یافتن تبدیلی است که دادههای خام را به بازنمایی که برای یک وظیفه یادگیری
ماشین مناسبتر است (به عنوان مثال طبقهبندی) نگاشت میکند .از آنجا که این روش میتواند به
عنوان یادگیری ویژگیهای معنادار تفسیر شود ،به آن یادگیری ویژگی نیز گفته میشود.
40یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
در مثال مجموعه داده تصویر (این بار بدونبرچسب) ،یادگیری بدوننظارت ممکن است
بتواند تصاویر را بر اساس شباهت آنها به یکدیگر و تفاوت آنها با بقیه شناسایی و گروهبندی
کند .به عنوان مثال ،تمام تصاویری که شبیه صندلی هستند باهم و همه تصاویری که شبیه به گربه
هستند با هم گروهبندی میشوند .البته ،خود یادگیری بدوننظارت نمیتواند این گروهها را به
عنوان "صندلی" یا "گربه" برچسبگذاری کند .با این حال ،اکنون که تصاویر مشابه با هم
گروهبندی شدهاند ،انسان وظیفه برچسبگذاری بسیار سادهتری دارد .بهجای برچسبگذاری
میلیونها تصویر با دست ،انسانها میتوانند به صورت دستی همهیِ گروههای مجزا را
برچسبگذاری کنند و این برچسبها برای همه اعضای هر گروه اعمال شوند .
از اینرو ،یادگیری بدوننظارت ،مسائل حل نشدنی قبلی را قابل حلتر میکند و در یافتنِ
الگوهایِ پنهان ،هم در دادههای گذشتهیِ در دسترسِ برای آموزش و هم در دادههایِ آینده ،بسیار
چابکتر عمل میکند .حتی اگر یادگیری بدوننظارت در حل مسائل خاص (مسائل محدود
هوش مصنوعی) مهارت کمتری نسبت به یادگیری بانظارت دارد ،اما در مقابله با مشکالتِ بازتر
از نوع هوش مصنوعی قوی و تعمیم این دانش بهتر است .مهمتر از آن ،یادگیری بدوننظارت
میتواند بسیاری از مشکالت رایجی را که دانشمندان داده هنگام ساخت راه حلهای یادگیری
ماشین با آن مواجه میشوند ،برطرف کند.
مزایا
▪ میتواند آنچه که ذهن انسان نمیتواند تصور کند را ببیند.
▪ بدست آوردن دادههای بدون برچسب نسبتاً سادهتر است.
معایب
▪ هزینه بیشتری دارد زیراممکن است نیاز به مداخله انسانی برای درک الگوها و ارتباط آنها با دانش حوزه
داشته باشد.
▪ سودمندی و مفید بودن نتایج همیشه قابل تایید نیست ،زیرا هیچ برچسب یا معیار خروجی برای تایید
مفید بودن آن وجود ندارد.
▪ نتایج اغلب دقت کمتری دارند.
یادگیری تقویتی
یادگیری تقویتی ریشه در روانشناسی یادگیری حیوانات دارد و در مورد یادگیری رفتار بهینه در
یک محیط برای بدست آوردن حداکثر پاداش است .این رفتار بهینه از طریق تعامل با محیط و
41 فصل دوم :پیشنیازها
مشاهدات نحوه واکنش آن آموخته میشود .به یادگیرنده (عامل) برای اقدامات صحیح جایزه
داده میشود و برای اعمال اشتباه تنبیه در نظر گرفته میشود.
در غیاب ناظر ،یادگیرنده به دنبال یک خطمشی موثر برای حل یک وظیفهیِ تصمیمگیری
است .چنین خطمشی دیکته میکند که چگونه عامل باید در هر حالتی که ممکن است با آن مواجه
شود رفتار کند تا با آزمون و خطا در تعامل با یک محیط پویا ،کل پاداش مورد انتظار را بیشینه
کند (یا تنبیه را کمینه کند) .از آنجایی که میتواند اقداماتی را که منجر به موفقیت نهایی در یک
محیط دیدهنشده میشود بدون کمک ناظر بیاموزد ،یادگیری تقویتی یک الگوریتم بسیار قدرتمند
است.
اما چرا ما به تمایز بین انتخاب مدل و ارزیابی مدل نیاز داریم؟ دلیل آن بیشبرازش است.
اگر خطای تعمیم مدل انتخابی خود را بر روی همان دادههایی که برای انتخاب مدل برنده
استفاده کردهایم (با فرض اینکه انتخاب مدل براساس مجموعه آموزشی صورت گرفته باشد)
تخمین بزنیم ،یک تخمین خوشبینانه بدست خواهیم آورد .چرا؟ پاسخ ساده است!! مدل
یادگیری ماشین توانسته است به سادگی دادههای آموزشی را به خاطر بسپارد .از اینرو ارزیابی
کارایی و جلوگیری از چنین مسائلی ،ما به دادههای کامال مستقل برای تخمین خطای تعمیم یک
مدل نیاز داریم.
استراتژی پیشنهادی برای انتخاب مدل به مقدار دادههای موجود بستگی دارد .اگر دادههای
زیادی در دسترس باشد ،ممکن است دادهها را به چند بخش تقسیم کنیم که هر کدام هدف
خاصی را دنبال میکنند .به عنوان مثال ،برای تنظیم ابرپارامتر ،ممکن است دادهها را به سه
مجموعه تقسیم کنیم :آموزش /اعتبارسنجی /آزمایش .مجموعه آموزشی برای آموزش مدلهای
مختلف به تعداد ترکیبهای مختلف ابرپارامترهای مدل استفاده میشود .سپس این مدلها بر
روی مجموعه اعتبارسنجی ارزیابی میشوند و مدلی که بهترین عملکرد را در این مجموعه
اعتبارسنجی داشته باشد به عنوان مدل برنده انتخاب میشود .سپس ،مدل بر روی دادههای
آموزشی به همراه دادههای اعتبارسنجی با استفاده از مجموعه ابرپارامترهای انتخابی بازآموزی
میشود و عملکرد تعمیم با استفاده از مجموعه آزمون برآورد میشود .اگر این خطای تعمیم
مشابه خطای اعتبارسنجی باشد ،بر این باور هستیم که مدل روی دادههای دیده نشده عملکرد
خوبی خواهد داشت.
آنچه ما بهطور ضمنی در طول بحث باال فرض کردهایم این است که دادههای آموزش،
اعتبارسنجی و آزمون از یک توزیع نمونهبرداری شدهاند .اگر اینطور نباشد ،همه تخمینها کامالً
اشتباه خواهند بود .به همین دلیل ضروری است که قبل از ساخت مدل اطمینان حاصل شود
که توزیع دادهها تحت تأثیر تقسیمبندی دادههای شما قرار نمیگیرد.
اما چه میشود اگر دادههای کم ،تنها چیزی است که ما داریم؟ چگونه انتخاب و ارزیابی مدل
را در این مورد انجام دهیم؟ پاسخ این است ارزیابی مدل تغییر نمیکند چراکه ما هنوز به یک
مجموعه آزمایشی نیاز داریم که بر اساس آن بتوانیم خطای تعمیم مدل نهایی انتخابشده را
تخمین بزنیم .از اینرو ،دادهها را به دو مجموعه ،یک مجموعه آموزشی و یک مجموعه آزمایشی
تقسیم میکنیم .آنچه در مقایسه با روش قبلی تغییر میکند ،نحوه استفاده ما از مجموعه آموزشی
است .یکی از این تکنیک ها اعتبارسنجی متقابل است که در ادامه بخش به آن پرداخته خواهد
شد .بهطور خالصه اما میتوان گفت ،اعتبارسنجی متقابل تکنیکی است که مجموعه آموزشی
اصلی را به دو مجموعه داده آموزشی و آزمایشی (اعتبارسنجی) تقسیم میکند.
43 فصل دوم :پیشنیازها
تقسیمبندی دادهها
هر چند الگوریتمهای یادگیری ماشین بانظارت ابزارهای شگفتانگیز و قدرتمند در
پیشبینی و دستهبندی هستند ،اما این سوال بهوجود میآید که این پیشبینیها تا چه
اندازه دقیق هستند و آیا راهی برای سنجش میزان کارایی مدل وجود دارد؟ از آنجایی که
این الگوریتمها دارای نمونههای برچسب خورده میباشند ،این پرسش را میتوان با
تقسیم نمونههای آموزشی به چندین بخش ،پاسخ داد.
با تقسیمبندی دادهها ابتدا ،آموزش را روی بخشی از دادهها انجام داده ،سپس برای
سنجش میزان کارای مدل و قابلیت تعمیمدهی آن از دادههای آزمایشی استفاده میکنیم.
تعمیمدهی نشاندهنده میزان عملکرد مدل ،در برخورد با دادههایی است ،که تاکنون مدل
آنها را در فرآیند آموزش مشاهده نکرده است .البته در طراحی مدلهای یادگیری ماشین
در بیشتر اوقات مجموعه دادههای مسئله مورد نظر را عالوه بر دادههای آموزشی و
آزمایشی به بخش دیگری نیز تقسیم میکنیم ،نحوهیِ این تقسیمبندی بهصورت زیر
میباشد:
▪ مجموعه آموزشی :بهطور معمول بزرگترین در بین این سه دسته دادهها میباشد
و برای یافتن پارامترهای مدل مورد استفاده قرار میگیرد .مجموعه داده آموزشی
رابطه اساسی بین دادهها و برچسبهای آن را به بهترین وجه ممکن توضیح
میدهد.
▪ مجموعه آزمایشی :اندازهگیری عملکرد یک مدل را براساس توانایی مدل در
پیشبینی داده هایی که در فرآیند یادگیری نقشی نداشته میسنجند ،مجموعه
آزمایشی همان دادههای دیده نشده در فرآیند یادگیری هستند .این مجموعه کارایی
مدل نهایی را میسنجد .اگر مدلی عملکرد خوبی در مجموعه آموزشی داشته
باشد و همچنین متناسب با مجموعه آزمون باشد ،یعنی برچسب درست را برای
تعداد زیادی از دادههای ورودی نادیده پیشبینی کند ،حداقل بیشبرازش صورت
44یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
گرفته است .الزم به ذکر است که مجموعه آزمون معموالً فقط یک بار به محض
مشخص شدن کامل پارامترها و ابرپارامترهای مدل برای ارزیابی عملکرد
تعمیمدهی مدل استفاده میشود .با این حال ،برای تقریب عملکرد پیشبینی یک
مدل در طول آموزش ،از یک مجموعه اعتبارسنجی استفاده میشود.
▪ مجموعه اعتبارسنجی :در ارزیابی انواع مختلف مدلها و الگوریتمها برای مسئله
مورد نظر از مجموعه اعتبارسنجی استفاده میشود .از این دادهها برای تنظیم
ابرپارامترها و جلوگیری از بیشبرازش مدل استفاده تا بهترین مدل انتخاب شود.
هیچ قانون کلی در مورد نحوه تقسیم دادهها وجود ندارد .با این حال ،مجموعه
اعتبارسنجی باید به اندازه کافی بزرگ باشد تا بتوانیم تفاوت عملکردی را که
میخواهیم بدست آوریم ،اندازهگیری کنیم.
بخش تقسیم میکنیم :مجموعه آموزشی و آزمایشی .هنگام ارزیابی نحوه عملکرد یک مدل ساخته
شده بر روی مجموعه آموزشی ،هم در مجموعه آموزشی و هم در مجموعه آزمایشی ،میخواهیم
خطای پیشبینی تا حد امکان کم باشد .اگر مدل دارای خطای پیشبینی کم در مجموعه آموزشی
باشد ،اما خطای پیشبینی باال در مجموعه آزمایشی داشته باشد ،گفته میشود که مدل دارای
واریانس باالیی است و در نتیجه دادهها منجر به بیشبرازش شده است .به طور کلی ،مدلهای
پیچیدهتر واریانس باالتری دارند .این به این دلیل است که یک مدل پیچیده میتواند دادههای
خاصی را که با آن مطابقت دارد را با دقت بیشتری دنبال کند .با این حال ،از آنجایی که یک مدل
پیچیده دادهها را با دقت بیشتری دنبال میکند ،به احتمال زیاد رابطه واقعی را در دادههای
آموزشی نشان میدهد و در نتیجه سوگیری کمتری دارد .از اینرو ،انتخاب مدلی با سوگیری نسبتا
کمتر تنها با هزینه واریانس باالتر قابل دستیابی است.
از سوی دیگر ،اگر مدل دارای خطای پیشبینی باال در هر دو مجموعه آموزشی و آزمایشی
باشد ،گفته میشود که مدل دارای سوگیری باالیی است و در نتیجه دادهها را نادیده میگیرد.
بهطور خالصه ،اگر مدل مبتنی بر دادههای آموزشی بسیار پیچیده باشد ،خطای پیشبینی در
دادههای آموزشی کم خواهد بود .به عبارت دیگر ،مدل معموال منجر به بیشبرازش میشود و در
نتیجه به خوبی با دادههای آزمایشی مطابقت ندارد و باعث خطای پیشبینی باالتر برای مجموعه
آزمایشی میشود .هدف یافتن راهحل بهینه است و این یک موازنه بین سوگیری و واریانس است.
راههای مختلفی برای تنظیم سوگیری و واریانس وجود دارد .اکثر الگوریتمها دارای
پارامترهایی هستند که پیچیدگی مدل را تنظیم میکنند .این فرآیند اغلب به عنوان "تنظیم
ابرپارمترها" شناخته میشود ،که بخشی ضروری از مرحله ارزیابی مدل است.
سوگیری ناتوانی یک مدل یادگیری ماشین برای بدست آوردن رابطه واقعی بین
متغیرهای داده است .این امر ناشی از فرضیات اشتباهی است که درون الگوریتم
یادگیری است .مدل با سوگیری باال توجه بسیار کمی به دادههای آموزشی دارد
و مدل را بیش از حد ساده میکند و همیشه منجر به خطای باالیی در آموزش و
دادههای آزمون میشود.
روشهای ارزیابی
در حالیکه آموزش مدل یک گام کلیدی است ،نحوه تعمیمدهی مدل برروی دادههای دیده نشده
جنبهای به همان اندازه مهم است که باید پس از طراحی هر مدل یادگیری ماشین در نظر گرفته
شود .باید این اطمینان حاصل شود که آیا مدل واقعا کارا است و میتوان به نتایج پیشبینیهای
آن اعتماد کرد یا خیر.
یک الگوریتم طبقهبندی میتواند برروی یک مجموعه داده خاص با مجموعهای منحصر به
فرد از پارامترها آموزش داده شود که میتواند مرز تصمیمگیری را متناسب با دادهها ایجاد کند.
نتیجه آن الگوریتم خاص نهتنها به پارامترهای ارائه شده برای آموزش مدل بستگی دارد ،بلکه به
نوع دادههای آموزشی نیز بستگی دارد .اگر دادههای آموزشی حاوی واریانس کم یا دادهها
یکنواخت باشد ،ممکن است مدل منجر به بیشبرازش گردد و نتایج جانبدارانهای را نسبت به
دادههای دیده نشده ایجاد کند .بنابراین ،از رویکردهایی همانند اعتبارسنجی متقابل برای
بهحداقل رساندن بیشبرازش استفاده میشود .اعتبارسنجی متقابل تکنیکی است که مجموعه
آموزشی اصلی را به دو مجموعه داده آموزشی و آزمایشی (اعتبارسنجی) تقسیم میکند .رایجترین
روش اعتبارسنجی متقابل ،اعتبارسنجی متقابل چند-بخشی است که مجموعه داده اصلی را به
kبخش با اندازه یکسان تقسیم میکند k .یک عدد مشخص شده توسط کاربر است که معموال
5یا 10انتخاب میشود .در این روش هر بار یکی از زیر مجموعههای kبهعنوان مجموعه
اعتبارسنجی (آزمون) مورد استفاده قرار میگیرد و k-1زیر مجموعهی دیگر برای تشکیل یک
مجموعه آموزشی کنار هم قرار میگیرند .برای بدست آوردن کارآیی کل مدل ،برآورد خطا در
تمام آزمایشها بهطور میانگین محاسبه میشود.
در تکنیک اعتبارسنجی متقابل چند-بخشی هر یک از دادهها دقیقا یک بار در یک
مجموعه آزمایشی قرار و یک بار در یک مجموعه آموزشی قرار میگیرد .این امر
بهطور قابل توجهی بایاس و واریانس را کاهش میدهد ،چراکه تضمین میکند
هر نمونهای از مجموعه داده اصلی این شانس را دارد که در مجموعه آموزشی
و آزمایشی ظاهر شود .اگر داده های ورودی محدودی داشته باشیم ،اعتبارسنجی
متقابل چند-بخشی از بهترین روشها برای ارزیابی کارآیی یک مدل است.
مثبت راستین(𝑷𝑻) :به عنوان مثال ،وقتی مقدار واقعی کالس "بله" بود ،مدل هم "بله" را •
پیشبینی کرد (یعنی پیشبینی درست)
مثبت کاذب)𝑷𝑭( :به عنوان مثال ،یعنی زمانی که مقدار واقعی کالس "نه" بود ،اما مدل •
"بله" را پیشبینی کرد (یعنی پیشبینی اشتباه)
منفی کاذب)𝑵𝑭( :به عنوان مثال ،زمانی که مقدار واقعی کالس "بله" بود ،اما مدل "نه" را •
پیشبینی کرد (یعنی پیشبینی اشتباه)
منفی راستین)𝑵𝑻( :به عنوان مثال ،یعنی زمانی که مقدار واقعی کالس "نه" بود و مدل هم •
"نه" را پیشبینی کرد (یعنی پیشبینی درست).
جدول .1-2ماتریس درهمریختگی
کالس پیشبینیشده
مثبت منفی
مثبت مثبت راستین منفی کاذب
)(TP )(FN
کالس واقعی
رایجترین معیاری که از ماتریس درهمریختگی بدست میآید دقت ( )accuracyیا معکوس آن،
خطای پیشبینی ( )prediction errorاست:
𝑁𝑇 𝑇𝑃 +
= دقت
𝑁𝑇 𝑇𝑃 + 𝐹𝑁 + 𝐹𝑃 +
دقت = 1 −خطای پیشبینی
معنی است که مدل به اندازه کافی قابل اعتماد و قوی نیست و از این رو استفاده از آن را محدود
میکند.
به عنوان مثال ،ما 980سیب و 20پرتقال داریم و یک مدل داریم که هر میوه را به عنوان
یک سیب دستهبندی میکند .از اینرو دقت مدل 980/1000=%98است و بر اساس معیار
دقت ،ما یک مدل بسیار دقیق داریم .با این حال ،اگر ما از این مدل برای پیشبینی میوهها در
آینده استفاده کنیم ،با شکست مواجه خواهیم شد .چرا که این مدل تنها میتواند یک کالس را
پیشبینی کند.
دریافت تصویری کامل از مدل ،به عنوان مثال اینکه چگونه دادهها را درک میکند و چگونه
میتواند پیشبینی کند ،به درک عمیق ما از مدل کمک میکند و به بهبود آن کمک میکند .بنابراین،
فرض کنید مدلی را ایجاد کردهاید که دقت %90را بدست میآورد ،از اینرو چگونه میخواهید
آن را بهبود ببخشید؟ برای تصحیح یک اشتباه ،ابتدا باید متوجه آن اشتباه شویم .بهطور مشابه،
برای بهبود مدل ما باید به نحوهیِ عملکرد مدل در سطح عمیقتری نگاه کنیم .با این حال ،این
کار تنها با نگاه کردن به معیار دقت بدست نمیآید و از اینرو معیارهای دیگری نیز در نظر گرفته
میشود .معیارهایی همانند ،صحت ( ، )precisionفراخوانی( )recallو F1نمونههایی از این
معیارها هستند.
فراخوانی ،به توانایی یک مدل در پیشبینی موارد مثبت از کل موارد مثبت راستین اشاره
میکند .در حالیکه صحت ،کسری از موارد مثبت راستین را در بین نمونههایی که به عنوان مثبت
پیشبینی شدهاند ،اندازهگیری میکند .صحت و فراخوانی به تنهایی ممکن است برای ارزیابی
مدل مناسب نباشد ،بنابراین از امتیاز F1استفاده میشود که هم صحت و هم فراخوانی را شامل
میشود و نشان میدهد طبقهبند چقدر دقیق است .هرچه امتیاز F1بیشتر باشد ،کارآیی مدل ما
بهتر است .نحوهیِ محاسبات این معیارها بهصورت زیر است:
𝑃𝑇
= فراخوانی
𝑃𝑇 𝐹𝑁 +
𝑃𝑇
= صحت
𝑃𝑇 𝐹𝑃 +
فراخوانی ∗ صحت
× F1 = 2
فراخوانی +صحت
49 فصل دوم :پیشنیازها
بهطور سریع وارد " "read-evaluate-print-loopشوید .پس از اجرای برنامه ،با تصویری
همانند زیر روبهرو میشوید:
اعالن ">>>" بیانگر این است که نصب با پایتون موفقیتآمیز بوده و پایتون شروع بهکار کرده
است.
51 فصل دوم :پیشنیازها
نصب کتابخانهها
برای مدیریت کتابخانههای پایتون باید از Pipاستفاده کنید Pip .یک ابزار ضروری است که به
شما امکان میدهد بستههای مورد نیاز خود را بارگیری ،بروزرسانی و حذف کنید .عالوهبراین با
استفاده از آن میتوان وابستگیهای مناسب و سازگاری بین نسخهها را بررسی کنید.
نصب یک کتابخانه با استفاده از Pipدر خط فرمان ویندوز صورت میگیرد .برای مثال فرض
کنید میخواهیم کتابخانه NumPyرا نصب کنیم .مراحل زیر نحوه نصب این کتابخانه را نشان
میدهد:
▪ ابتدا کلیدهای " "Win+Rرا فشار دهید تا کادر اعالن باز شود و سپس در کادر باز شده،
" "cmdرا وارد کنید .سپس دستور زیر را در خط فرمان وارد کنید:
> pip install numpy
▪ برای اطمینان از نصب کتابخانه ،از خط فرمان پایتون را اجرا کرده و دستور زیر را بنویسید:
>>> import numpy
▪ اگر کتابخانه بهدرستی نصب شده باشد پیغامی مشاهده نمیشود .در صورتی کتابخانه در
رایانه شما نصب نشده باشد با اجرای دستور فوق ،این پیغام را مشاهده خواهید کرد:
Traceback (most recent call last):
>File "<stdin>", line 1, in <module
ImportError: No module named numpy
Jupyter Notebook
Jupyter Notebookیک ابزار فوقالعاده قدرتمند برای توسعه و ارائه پروژههای یادگیری ماشین
بهصورت تعاملی است که میتواند عالوه بر اجرای کد ،شامل متن ،تصویر ،صدا و یا ویدیو
باشد .یک ،Notebookکد و خروجی آن را با مصورسازی ،متنِ روایی ،معادالت ریاضی و سایر
رسانهها در قالب یک سند واحد ترکیب میکند .به عبارت دیگر ،یک ،Notebookیک سند واحد
است که در آن میتوانید کد را اجرا کنید ،خروجی را نمایش دهید و همچنین توضیحات،
52یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
فرمولها ،نمودارها را اضافه ،تا کار خود را شفافتر ،قابل فهم ،تکرارپذیر و قابل اشتراکگذاری
کنید.
برای نصب ،Jupyter Notebookالزم است پایتون را از قبل نصب کرده باشید .حتی اگر
قصد داشته باشید از جوپیتر برای سایر زبانهای برنامهنویسی استفاده کنید ،پایتون ستون اصلی
جوپیتر است .برای نصب جوپیتر کافی است در خط فرمان ویندوز دستور زیر را بنویسید:
> pip install jupyter
پس از اجرای دستور فوق ،مرورگر وب پیشفرض شما با Jupyterراهاندازی میشود .هنگام
راهاندازی Jupyter Notebookبه دایرکتوری خط فرمان توجه فرمایید ،چرا که این دایرکتوری به
فهرست اصلی تبدیل میشود که بالفاصله در جوپیتر نوتبوک ظاهر میشود و تنها به پروندهها
و زیردایرکتوریهایی موجود در آن دسترسی خواهید داشت .با اجرای دستور jupyter notebook
با صفحهای همانند زیر روبهرو میشوید:
با این حال ،این صفحه هنوز یک notebookنیست و تنها میزکار جوپیتر است که برای مدیریت
نوتبوکهای جوپیتر شما طراحی شده است و آن را بهعنوان راهاندازی برای پیگردی
( ،)exploringویرایش و ایجاد notebookهای خود در نظر بگیریدnotebook .ها و میزکار
جوپیتر مبتنیبر مرورگر است و جوپیتر یک سرور محلی پایتون راهاندازی میکند تا این برنامهها
را به مرورگر وب شما ارتباط دهد.
برای ایجاد یک notebookجدید به به دایرکتوری که قصد دارید اولین notebookخود را در
ایجاد کنید بروید و بر روی دکمه کشویی " " Newکه در قسمت باالی میزکار در سمت راست
است کلیک کرده و گزینه ""Python 3را انتخاب کنید:
53 فصل دوم :پیشنیازها
پس از آن ،اولین نوتبوک شما در یک برگه جدید ( )new tabهمانند تصویر زیر باز میشود:
اگر به میزکار Jupyterبازگردید ،فایل جدید Untitled.ipynbرا مشاهده خواهید کرد و باید متن
سبز رنگی را مشاهده کنید که به شما میگوید نوتبوک شما در حال اجرا است.
بیاید نحوه اجرای یک سلول را با یک مثال کالسیک آزمایش کنیم print('Hello World!') :را
در نوار ابزار باال کلیک کنید یا دکمههای در یک سلول تایپ کنید و برروی دکمه
Ctrl+Enterرا فشار دهید .نتیجه آن به این صورت خواهد بود:
Colab
Colaboratoryیا به اختصار Colabیک محصول تحقیقاتی گوگل (سرویس ابری) است که
به توسعهدهندگان اجازه میدهد کدهای پایتون را از طریق
مرورگر خود بنویسند و اجرا کنند Google Colab .یک
ابزار عالی برای کارهای یادگیری عمیق است و به توسعه
مدلها با استفاده از چندین کتابخانه مانند ،Keras
Tensorflow ،OpenCv ،Pytorchو غیره کمک میکند Colab .یک نوتبوک مبتنیبر
Jupyterاست که نیازی به نصب ندارد و دارای نسخه رایگان عالی است که دسترسی رایگان
به منابع محاسباتی Googleمانند GPUو TPUرا میدهد.
چرا Colab؟
Colabبرای همه چیز ایدهآل است ،از بهبود مهارتهای کدنویسی پایتون گرفته تا کار با
کتابخانههای یادگیری عمیق ،مانند TensorFlow ،Keras ،PyTorchو .OpenCV
میتوانید نوتبوکها را در Colabایجاد ،بارگذاری ،ذخیره و به اشتراک بگذاریدGoogle ،
Driveخود را نصب کنید و از هر چیزی که در آنجا ذخیره کردهاید استفاده کنید ،نوتبوکها
را مستقیما از GitHubبارگذاری کنید ،فایلهای Kaggleرا بارگذاری کنید ،نوتبوکهای
خود را باگیری کنید و تقریبا هر کار دیگری را که ممکن است بخواهید انجام دهید را انجام
دهید.
54یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
.3با حساب GMailخود وارد شوید .اگر حساب GMailندارید یکی بسازید:
.4به محض تکمیل فرآیند ورود به سیستم ،آماده استفاده از Google Colabهستید.
.5با کلیک بر روی File> New notebookبهراحتی می توانید یک نوتبوک
Colabجدید در این صفحه ایجاد کنید.
پایتورچ ()PyTorch
PyTorchیک محیط کاری یادگیری ماشین مبتنیبر Torchاست
که برای طراحی شبکه عصبی ایدهآل است PyTorch .توسط
آزمایشگاه تحقیقاتی هوش مصنوعی فیسبوک توسعه یافته و در
ژانویه 2016به عنوان یک کتابخانه رایگان و منبعباز منتشر شد و عمدتا در بینایی رایانه ،یادگیری
عمیق و برنامههای پردازش زبان طبیعی استفاده میشود و از توسعه نرمافزار مبتنیبر ابر پشتیبانی
میکند .پیادهسازی یک شبکه عصبی در PyTorchنسبت به سایر محیطها سادهتر و شهودی
است .با پشتیبانی از CPUو ،GPUشبکههای عصبی عمیق پیچیده را میتوان با مجموعه
دادههای بزرگ آموزش داد.
مزایا و معایب
مزایا
▪ یادگیری آسان
▪ انعطافپذیر و سریع
▪ اشکالزدایی آسان
معایب
▪ عدم وجود ابزار مصورسازی مانند tensor board
تنسورفلو ()TensorFlow
TensorFlowیکی از محبوبترین محیطهای
کاری یادگیری ماشین و یادگیری عمیق است که
توسط توسعهدهندگان و محققان استفاده میشود.
TensorFlowدر ابتدا در سال 2007توسط تیم
Google Brainراهاندازی شد و میتواند بر روی
CPUو تسریعکنندههای تخصصی هوش مصنوعی ،از جمله GPUو TPUاجرا شود.
TensorFlowدر لینوکس 64بیتی ،macOS ،ویندوز و پلتفرمهای محاسباتی موبایل ،از
جمله اندروید و iOSدر دسترس است .مدلهای آموزش دیده در TensorFlowرا میتوان
بر روی دسکتاپ ،مرورگرها و حتی میکروکنترلرها مستقر کرد .این پشتیبانی گسترده،
57 فصل دوم :پیشنیازها
TensorFlowرا منحصر به فرد و آماده تولید میکند .چه در حال کار با مسائل بینایی رایانه،
پردازش زبان طبیعی یا مدلهای سری زمانی باشید TensorFlow ،یک پلتفرم یادگیری ماشین
بالغ و قوی با قابلیتهای زیاد است.
مزایا و معایب
مزایا
▪ پشتیبانی عالی از گرافهای محاسباتی ،هم برای محاسبات و هم برای مصورسازی
▪ میتوان TensorFlowرا بر روی دسکتاپ ،مرورگرها و حتی میکروکنترلرها مستقر کرد.
معایب
▪ منحنی یادگیری شیب دار به دلیل APIهای سطح پایین (یادگیری دشوار)
▪ درک برخی از پیامهای خطا در TensorFlowمیتواند بسیار دشوار باشد.
کراس ()Keras
Kerasیک رابط برنامهنویسی است که
دانشمندان داده را قادر میسازد بهراحتی
به پلتفرم یادگیری عمیق TensorFlow
دسترسی داشته باشند و از آن استفاده کنند .این یک رابط برنامهنویسی برنامه کاربردی ()API
و محیط کاری یادگیری عمیق منبعباز است که در پایتون نوشته شده است که برروی
TensorFlowاجرا میشود و اکنون در آن پلتفرم ادغام شده است Keras .قبال از چندین
پشتگاه ( )back endپشتیبانی میکرد اما با شروع نسخه 2.4.0در ژوئن 2020بهطور انحصاری
با TensorFlowمرتبط شده است Keras .بهعنوان یک APIسطح باال ،برای انجام
آزمایشهای آسان و سریع طراحی شده است که نسبت به سایر گزینههای یادگیری عمیق نیاز به
کدنویسی کمتری دارد .هدف تسریع اجرای مدلهای یادگیری ماشین ،به ویژه ،شبکههای عصبی
عمیق ،از طریق یک فرآیند توسعه با "سرعت تکرار باال" است .مدلهای Kerasمیتوانند بر
روی CPUیا GPUاجرا شوند و در چندین پلتفرم از جمله مرورگرهای وب و دستگاههای
تلفن همراه Androidو iOSمستقر شوند Keras .کندتر از TensorFlowو PyTorch
است اما معماری سادهای دارد و خواناتر ،مختصرتر ،کاربر پسند و قابلتوسعه استKeras .
بیشتر برای مجموعه دادههای کوچک مناسب است و به دلیل طراحی ساده و قابل درک آن برای
مبتدیان توصیه میشود.
58یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
مزایا و معایب
مزایا
▪ APIسطح بال عالی
▪ یادگیری آسان
▪ تولید آسان مدلها
▪ کاربرپسند
▪ نیازی به داشتن پیشینه قوی در یادگیری عمیق نیست.
معایب
▪ برای مجموعه داده های کوچک مناسب است
▪ گاهی اوقات در GPUکند است.
اگر مبتدی هستید یا مدلهای سادهای را برای مسئله امتحان میکنیدKeras ،
بهترین گزینه برای شما است .چراکه شروع با آن کار آسانتر است ،آنقدر آسان
که برای آموزش یک شبکه عصبی عمیق نیازی به دانستن چیزی در مورد
یادگیری عمیق ندارید!! PyTorchاگرچه از این نظر نیز نمره خوبی میگیرد (در
مقایسه با تنسورفلو خالص) اما Kerasبهتر است.
خالصه فصل
▪ دادهها به قطعات متمایز اطالعاتی اطالق میشوند که معموال به گونهای قالببندی و ذخیره
میشوند که با هدف خاصی مطابقت داشته باشد.
▪ هر نقطه داده اغلب با یک بردار ویژگی نشان داده میشود ،هر ورودی در بردار نشاندهنده
یک ویژگی است.
▪ دادهها را میتوان به عنوان قابل خواندن توسط ماشین ،قابل خواندن توسط انسان یا هر دو
دستهبندی کرد.
▪ یادگیری بانظارت یکی از پرکاربردترین شاخههای یادگیری ماشین است که از دادههای
آموزشی برچسبگذاری شده برای کمک به مدلها در پیشبینی دقیق استفاده میکند.
▪ در طبقهبندی کالسها از قبل مشخص هستند و اغلب با عنوان هدف ،برچسب یا دسته
نامیده میشوند.
59 فصل دوم :پیشنیازها
▪ رگرسیون یک فرآیند آماری است که رابطه معناداری بین متغیرهای وابسته و مستقل پیدا
میکند و به عنوان یک الگوریتم ،یک عدد پیوسته را پیشبینی میکند.
▪ یادگیری بدوننظارت در یادگیری ماشین زمانی است که به هیچ وجه دستهبندی یا
برچسبگذاری دادهها وجود ندارد.
آزمونک
.1رویکردهای متفاوت یادگیری ماشین را نام ببرید ،تفاوتها ،مزایا و معایب هر یک شرح
دهید؟
.2منظور از تعمیمدهی در یادگیری ماشین چیست؟
.3تفاوت پارامتر و ابرپارامتر در چیست؟
.4چرا برای آموزش یک الگوریتم یادگیری ماشین ،دادهها تقسیمبندی میشوند؟
.5آیا مدلی که در مجموعهی آموزشی به دقتی برابر ٪98دست یافته است ولی در مجموعه
داده آزمون دقتی برابر ٪79دارد ،میتواند مدل قابل قبولی باشد یا خیر؟ دلیل بیاورید.
.6فرض کنید مدلی در یک مجموعه داده با دو کالس متفاوت و به شدت نامتوازن دقتی برابر
99٪بدست آورده است ،آیا تنها با براساس معیار دقت میتوان گفت این مدل کارایی بسیار
باالیی دارد؟ علت را شرح دهید.
.7از مجموعه داده اعتبارسنجی به چه دلیل استفاده میشود؟
.8بیشبرازش به چه علت اتفاق میافتد؟
.9واریانس باال و سوگیری باال چه چیزی را نشان میدهد؟
شبکههای عصبی پیشخور
3
اهداف یادگیری:
آشنایی با پرسپترون ▪
آشنایی با شبکه عصبی پیشخور ▪
بهینهسازها ▪
توابع زیان ▪
پیادهسازی شبکه عصبی در keras ▪
62یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
مقدمه
در این فصل ،به معرفی ساختار شبکههای عصبی میپردازیم ،نحوهیِ عملکرد یک نورون را به
تفصیل شرح میدهیم و سپس فرآیند آموزش در شبکههای عصبی و مفاهیمی که در این زمینه
وجود دارند را تشریح خواهیم کرد .این مفاهیم به عنوان پایهای برای فصلهای بعدی هستند.
شبکههای عصبی مصنوعی یا بهطور خالصه ANNدستهای از مدلهای یادگیری ماشین هستند
که بهطور کلی از مطالعات مربوط به سیستم عصبی مرکزی پستانداران الهام گرفته شدهاند .به
عبارت دیگر ،آنها یک مدل محاسباتی هستند که نحوهیِ عملکرد سلولهای عصبی در مغز
انسان را تقلید میکند .هر شبکه عصبی مصنوعی از چندین "نورون" مرتبط تشکیل شده است
که در "الیهها" سازماندهی شدهاند .نورونهای هر یک از الیهها ،پیامها را به نورونهای الیه
بعدی میفرستند.
شبکه عصبی مصنوعی تالشی برای شبیهسازی شبکهای از نورونهایی است که
مغز انسان را تشکیل میدهند تا رایانه بتواند توانایی یادگیری بدست آورد و به
شیوهای انسانی تصمیم بگیرد.
یک شبکه عصبی مصنوعی دارای یک الیه ورودی ،یک الیه خروجی و یک یا چند الیه پنهان
میباشد که بهم متصل هستند .الیه اول از نورونهای ورودی تشکیل شده است .این نورونها
دادهها را به الیههای عمیقتر میفرستند .هر الیه بعد از الیه ورودی ،بهجای ورودی خام ،خروجی
الیه قبلی را به عنوان ورودی دریافت میکند .در نهایت ،آخرین الیه خروجی مدل را تولید میکند.
نمونههای آموزشی بهطور مستقیم مشخص میکنند که برای هر ورودی 𝑥 چه خروجی باید
تولید شود .الیه خروجی سعی در محاسبه مقداری دارد که نزدیک به خروجی مشخص برای
نمونههای آموزشی مشابه باشد .با این حال ،رفتار الیههای داخلی مستقیما تحت تاثیر نمونههای
آموزشی نیستند و این الگوریتم آموزشی است که با تصمیمگیریهای خود در جهت تولید خروجی
موردنظر ،چگونگی عملکرد این الیهها را تعیین میکند .در نتیجه ،عملکرد الیههای داخلی
براساس خروجی مطلوبی که تحت نمونههای آموزشی بدست آورده است ،بهصورت واضح
مشخص نیست و همانند یک جعبه سیاه عمل میکند ،از اینرو به این الیهها ،الیه پنهان گفته
میشود.
63 فصل سوم :شبکههای عصبی پیشخور
وظیفه الیههای پنهان ،تبدیل ورودی به چیزی است که الیه خروجی میتواند از
آن استفاده کند .با افزایش تعداد الیههای پنهان ،به سمت یک شبکه عمیق
میرویم که توانایی حل مسائل پیچیدهتر را نسبت به همتایان کم عمق خود دارا
میباشد.
دانشمندان علوم اعصاب شناختی ،از زمانی که دانشمندان رایانه برای اولین بار اقدام به ساخت
شبکه عصبی مصنوعی اولیه کردند ،اطالعات بسیار زیادی در مورد مغز انسان آموختهاند .یکی
از چیزهایی که آنها آموختند این است که بخشهای مختلف مغز مسئول پردازش جنبههای
مختلف اطالعات هستند و این بخشها به صورت سلسلهمراتبی مرتب شدهاند .بنابراین ،ورودی
وارد مغز میشود و هر سطح از نورونها بینش را ارائه میدهد و سپس اطالعات به سطح باالتر
بعدی منتقل میشود .این دقیقا مکانیزمی است که ANNها سعی در تکرار آن دارند.
شبکههای عصبی مصنوعی به دلیل تطبیقپذیر بودن قابل توجه هستند ،به این
معنی که با یادگیری از دادهها ،خود را اصالح میکنند و در اجراهای بعدی اطالعات
بیشتری کسب میکنند.
برای اینکه شبکههای عصبی مصنوعی بتواند توانایی یادگیری بدست آورند ،باید حجم
عظیمی از دادهها را در اختیار داشته باشند که مجموعه آموزشی نامیده میشود .هنگامی که
میخواهید به شبکههای عصبی مصنوعی بیاموزید که چگونه یک گربه را از سگ تشخیص دهد،
مجموعه آموزشی هزاران تصویر با برچسب سگ ارائه میکند تا شبکه شروع به یادگیری کند.
هنگامی که با حجم قابل توجهی از دادهها آموزش داده شد ،سعی میکند دادههای آینده را بر
اساس آنچه که فکر میکند میبیند (یا میشنود ،بسته به مجموعه دادهها) در دستههای مختلف
طبقهبندی کند .در طول دوره آموزش ،خروجی ماشین با توضیحات ارائه شده توسط انسان
(برچسبها) از آنچه باید مشاهده شود مقایسه میشود .اگر آنها یکسان باشند ،مدل به خوبی
کارآیی خوبی دارد .اگر نادرست باشد ،از پسانتشار ( )backpropagationبرای تنظیم
یادگیری خود استفاده میکند.
پرسپترون ()perceptron
نورون عنصر اساسی در هر شبکه عصبی مصنوعی است .سادهترین نوع مدلسازی یک نورون
را پرسپترون گویند که می تواند دارای تعداد زیادی ورودی تنها با یک خروجی باشد .در شکل
3-1شمایی از پرسپترون رسم شده است .پرسپترون از یادگیری بانظارت برای طبقهبندی یا
پیشبینی خروجی استفاده میکند .یک پرسپترون تک الیه با ترسیم یک مرز تصمیمگیری
( )decision boundaryبا استفاده از یک خط جداساز ،دادهها را طبقهبندی میکند.
64یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
شکل .1-3پرسپترون
بیایید نگاهی به نحوه عملکرد پرسپترون بیندازیم .پرسپترون با گرفتن برخی ورودیهای عددی
همراه با آنچه به عنوان وزنها ( )weightsو سوگیری ( )biasشناخته میشود ،کار میکند .سپس
این ورودیها را با وزنهای مربوط ضرب میکند (که به عنوان مجموع وزنی شناخته میشود).
سپس این حاصلضرب همراه با سوگیری بهم اضافه میشوند .تابع فعالسازی ( Activation
)Functionمجموع وزنی و بایاس را به عنوان ورودی میگیرد و خروجی نهایی را برمیگرداند.
گیج کننده بود!!!! ...بیایید پرسپترون را تجزیه کنیم ،تا نحوهیِ کار آن را بهترکنیم .یک پرسپترون
(شکل )1-3از چهار بخش اصلی تشکیل شده است :مقادیر ورودی ،وزنها و بایاس ،مجموع
وزنی و تابع فعالسازی .فرض کنید یک نورون و سه ورودی 𝑥3 ،𝑥2 ،𝑥1داریم که به ترتیب
در وزنهای 𝑤3 ،𝑤2 ،𝑤1ضرب میشوند:
ایده ساده است ،با توجه به مقدار عددی ورودیها و وزنها ،تابعی در داخل نورون وجود دارد
که یک خروجی تولید میکند .حال سوال این است که این تابع چیست؟ این تابع اینگونه عمل
میکند:
𝑦 = 𝑥1 𝑤1 + 𝑥2 𝑤2 + 𝑥3 𝑤3
این تابع را مجموع وزنی مینامند ،چراکه مجموع وزنها و ورودیها است .تا اینجا همه چیز
خوب به نظر میرسد ،با این حال ،اگر بخواهیم خروجیها در محدوده خاصی قرار گیرند ،مثالً
65 فصل سوم :شبکههای عصبی پیشخور
0تا 1چه کاری باید کرد؟! ما میتوانیم این کار را با استفاده از چیزی به نام تابع فعالسازی
انجام دهیم .یک تابع فعالسازی ،تابعی است که ورودی داده شده (در این مورد ،ورودی مجموع
وزنی خواهد بود) را به یک خروجی مشخص ،بر اساس مجموعهای از قوانین تبدیل میکند:
اکنون تقریبا همهیِ چیزهایی که برای ساختن پرسپترون نیاز است را در اختیار داریم .آخرین
چیزی که سوگیری است .سوگیری ،یک پارامتر اضافی در شبکه عصبی است که برای تنظیم
خروجی به همراه مجموع وزنی ورودیهای نورون استفاده میشود .عالوه بر این ،مقدار سوگیری
به این امکان را میدهد تا تابع فعالسازی به راست یا چپ تغییر پیدا کند .یک راه ساده تر برای
درک سوگیری از طریق ثابت 𝑐 یک تابع خطی است:
𝑐 𝑦 = 𝑚𝑥 +
این به شما امکان میدهد خط را به پایین و باال ببرید تا پیشبینی را با دادهها بهتر تطبیق دهید.
اگر ثابت 𝑐 وجود نداشته باشد ،خط از مبدأ ( )0 ،0عبور میکند و شما تطبیق ضعیفتری
خواهید داشت .از اینرو ،سوگیریها اجازه میدهند تا تغییرات بیشتر و بیشتری از وزنها یاد
گرفته شوند .بهطور خالصه ،تغییرات بیشتر به این معنی است که سوگیریها بازنمایی غنیتری
از فضای ورودی را به وزنهای آموخته شده مدل اضافه میکنند .بنابراین ،معادله نهایی نورون
به این صورت محاسبه میشود:
همانطور که پیشتر بیان شد ،از پرسپترون برای طبقهبندی دودویی استفاده میشود .بیاید یک
پرسپترون ساده را در نظر بگیریم و با یک مثال ساده نحوهی کار آن را در طبقهبندی دودویی
دادهها بهتر درک کنیم .در این پرسپترون دو ورودی 𝑥1و 𝑥2داریم که به ترتیب با وزن های 𝑤1
و 𝑤2ضرب میشود و همچنین دارای یک بایاس است:
بیایید همچنین یک نمودار با دو دسته مختلف داده ایجاد کنیم که با اشکال دایره و مستطیل
نشان داده شدهاند:
فرض کنید هدف ما این بود که این دادهها را جدا کنیم تا بین دایره و مستطیل تمایز وجود داشته
باشد .یک پرسپترون میتواند یک مرز تصمیم برای یک طبقهبند دودویی ایجاد کند ،جایی که
مرز تصمیم مناطقی از فضا روی یک نمودار است که نقاط دادههای مختلف را از هم جدا میکند.
برای درک بهتر این موضوع ،بیایید کمی با تابع بازی کنیم .میتوانیم بگوییم:
𝑤1 = 0.5
𝑤2 = 0.5
𝑏 = 0
بر این اساس ،تابع پرسپترون به این صورت خواهد بود:
فرض کنید تابع فعالسازی ،در این مورد ،یک تابع پلهای ( )step functionساده است که 0یا
1را خروجی میدهد .سپس تابع پرسپترون اشکال مستطیل را 1و اشکال دایره را با 0نشان
میدهد .به عبارت دیگر:
یادگیری پرسپترون یک عملیات نسبتا ساده است .هدف ما بدست آوردن مجموعهای از وزنهای
𝑤 است که به طور دقیق هر نمونه را در مجموعه آموزشی ما طبقهبندی میکند .به منظور آموزش
پرسپترون ،ما به طور مکرر شبکه را با دادههای آموزشی خود چندین مرتبه تغذیه میکنیم .هر بار
که شبکه مجموعه کاملی از دادههای آموزشی را دید ،میگوییم یک دوره ( )epochگذشته است.
دوره پارامتری است که توسط کاربر ،قبل از آموزش تعیین میشود.
شبه کد الگوریتم یادگیری پرسپترون (الگوریتم )1.3را میتوان به صورت خالصه کرد:
"یادگیری" واقعی در مراحل (.2ب) و (.2ج) صورت می گیرد .ابتدا بردار ویژگی 𝑗𝑥 را از شبکه
عبور میدهیم ،حاصلضرب داخلی با وزنهای 𝑤 را میگیریم و خروجی 𝑗𝑦 را بدست میآوریم.
سپس ،این مقدار از تابع پله عبور داده میشود که اگر 𝑥 > 0باشد 1و در غیر این صورت 0
برگردانده میشود .اکنون باید بردار وزن خود را بروز کنیم تا در جهتی قدم برداریم که نزدیکتر
به طبقهبندی درست دادهها است .این عمل با بروز رسانی بردار وزن توسط قانون دلتا در مرحله
(.2ج) مدیریت میشود.
68یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
عبارت ) 𝑗𝑦 (𝑑𝑗 −تعیین میکند که آیا طبقهبندی خروجی درست است یا نه .اگر طبقهبندی
درست باشد ،این اختالف صفر خواهد بود .در غیر این صورت ،تفاوت یا مثبت یا منفی خواهد
بود و به ما جهتی میدهد که وزنهای در آن بروز میشوند (در نهایت ما را به طبقهبندی درست
نزدیک میکند) .سپس ) 𝑗𝑦 (𝑑𝑗 −را در 𝑗𝑥 ضرب میکنیم که ما را به طبقهبندی درست نزدیک
میکند .مقدار 𝛼 نرخ یادگیری ( )learning rateما است و میزان بزرگی (یا کوچکی) یک گام
را کنترل میکند .بسیار مهم است که این مقدار بدرستی تنظیم شود .هرچند مقدار بزرگ 𝛼 باعث
میشود که گامی در جهت درست برداریم ،با این حال ،میتواند براحتی ما را از بهینه محلی یا
سراسری عبور دهد .درمقابل ،مقدار کمی 𝛼 به ما اجازه میدهد گامهای کوچک را در جهت
درست برداریم و تضمین میکند که از بهینه محلی یا سراسری تجاوز نمیکنیم .با این حال ،این
گامهای کوچک ممکن است زمان زیادی طول بکشد تا یادگیری ما همگرا شود .در نهایت ،بردار
وزن قبلی را در زمان 𝑡 𝑤𝑗 (𝑡) ،اضافه میکنیم که فرآیند گام برداشتن به سمت طبقهبندی درست
را کامل میکند .اگر این روش آموزشی را کمی گیج کننده میبینید ،نگران نباشید.
فرآیند یادگیری پرسپترون تا زمانی که تمام نمونههای آموزشی بدرستی طبقهبندی شوند یا به
تعداد از پیش تعیینشده (توسط کاربر) دورهها برسد ،اجازه داده میشود تا ادامه یابد .اگر 𝛼 به
اندازه کافی کوچک باشد و دادههای آموزشی به صورت خطی قابل تفکیک باشند ،خاتمه تضمین
میشود .به عبارت دیگر ،با داشتن فرضیات مناسب میتوان نشان داد یادگیری در پرسپترون با
تکرار الگوریتم آن ،به وزن های درست همگرا خواهد شد .یعنی یادگیری شبکه منجر به تخمین
وزنهایی خواهد شد که شبکه را قادر میسازد تا مقادیر درست را در خروجی تولید کند.
الگوریتم یادگیری پرسپترون الگوریتم 1.3
.1بردار وزن 𝑤 خود را با مقادیر تصادفی کوچک مقداردهی اولیه کنید.
.2تا زمانی که پرسپترون همگرا شود:
یک حلقه برروی هر بردار ویژگی 𝑗𝑥 و برچسب کالس واقعی 𝑗𝑑 در أ.
مجموعه آموزشی بزنید.
ب 𝑥 .را بگیرید و آن را از طریق شبکه عبور دهید و مقدار خروجی را محاسبه
کنید:
) 𝑗𝑥 𝑦𝑗 = 𝑓(𝑤(𝑡).
ج .وزنهای 𝑤 را بهروزرسانی کنید:
𝑖𝑤: 𝑤𝑖 (𝑡 + 1) = 𝑤𝑖 (𝑡) + 𝛼(𝑑𝑗 − 𝑦𝑗 )𝑥𝑗,
حال پرسش اینجاست ،اگر دادههای ما به صورت خطی قابل تفکیک نباشند یا انتخاب ضعیفی
در 𝛼 داشته باشیم ،چه اتفاقی میافتد؟ آیا آموزش به صورت بینهایت ادامه خواهد داشت؟ در
این مورد ،خیر .معموال ما بعد از اینکه تعداد دورههای معینی انجام شد ،متوقف میشویم یا اگر
69 فصل سوم :شبکههای عصبی پیشخور
تعداد طبقهبندیهای اشتباه در تعداد زیادی از دورهها تغییر نکرده باشد (که نشان میدهد دادهها
به صورت خطی قابل تفکیک نیستند).
اکنون که الگوریتم پرسپترون را مطالعه کردیم ،بیایید الگوریتم آن را در پایتون پیادهسازی کنیم
(این پیاده سازی تنها برای این است که با عملکرد پرسپترون و روند آموزشی که در کتابخانهها
وجود دارد آشنایی پیدا کنید .از اینرو اگر این موارد برای شما کمی مشکل به نظر میرسد ،نگران
نباشید ،چراکه در ادامه تنها از کتابخانهها و چارچوبها استفاده میشود و نیازی به کد زدن این
موارد نیست) .در ابتدا کد زیر را وارد کنید:
# import the necessary packages
import numpy as np
class Perceptron:
def __init__(self, N, alpha=0.1):
# initialize the weight matrix and store the learning rate
)self.W = np.random.randn(N + 1) / np.sqrt(N
self.alpha = alpha
خط 5سازنده کالس Perceptronما را تعریف میکند ،که یک پارامتر مورد نیاز و سپس یک
پارامتر اختیاری را می پذیرد:
در خط 7ماتریس وزن 𝑊 با مقادیر تصادفی از توزیع نرمال (گاوسی) با میانگین صفر و
واریانس واحد نمونهبرداری شده است .ماتریس وزن دارای N +1ورودی است ،یکی برای هر
یک از Nورودی در بردار ویژگی ،به عالوه یک ورودی برای سوگیری W .را بر ریشه مربع تعداد
ورودیها تقسیم میکنیم ،تکنیک رایجی که برای مقیاسبندی ماتریس وزن که منجر به همگرایی
سریعتر میشود.
سپس ،بیایید تابع پله را تعریف کنیم:
def step(self, x):
return 1 if x > 0 else 0
برای آموزش پرسپترون ،تابعی به نام fitتعریف میکنیم .اگر تجربه قبلی با یادگیری ماشین و
کتابخانه scikit-learnداشته باشید ،میدانید که نامگذاری این تابع برای آموزش با این نام
معمول است:
70یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
متد fitبه دو پارامتر الزامی و به دنبال آن یک پارامتر اختیاری نیاز دارد :مقدار Xدادههای
آموزشی ما و متغیر yبرچسبهای کالس خروجی هدف ما هستند (یعنی آنچه شبکه ما باید
پیشبینی کند) .در نهایت ،پارامتر دوره را داریم که تعداد دورههایی که Perceptronآموزش
خواهد یافت .خط آخر کد ،سوگیری را با درج ستونی از یکها در دادههای آموزشی اعمال
میکند که به ما امکان میدهد بایاس را به عنوان یک پارامتر قابل آموزش مستقیما در داخل
ماتریس وزن در نظر بگیریم .حال ،بیایید روند آموزش واقعی را مرور کنیم:
# loop over the desired number of epochs
for epoch in np.arange(0, epochs):
# loop over each individual data point
for (x, target) in zip(X, y):
# take the dot product between the input features
# and the weight matrix, then pass this value
# through the step function to obtain the prediction
))p = self.step(np.dot(x, self.W
# only perform a weight update if our prediction
# does not match the target
if p != target:
# determine the error
error = p - target
# update the weight matrix
self.W += -self.alpha * error * x
در ابتدا از یک حلقه استفاده میکنیم و آن را به تعداد دوره اجرا میکنیم .برای هر دوره ،همچنین
بر روی هر نقطه داده جداگانه 𝑥 و برچسب کالس هدف خروجی از حلقه استفاده میکنیم.
سپس ،حاصلضرب داخلی بین ویژگیهای ورودی 𝑥 و ماتریس وزن 𝑊 گرفته میشود تا
خروجی را از تابع پله عبور دهد و پیشبینی توسط پرسپترون بدست آید .تنها در صورتی
بروزرسانی وزن را انجام میدهیم که پیشبینی ما با هدف مطابقت نداشته باشد .اگر اینطور
باشد ،خطا را با محاسبه عالمت (مثبت یا منفی) تعیین میکنیم.
بروز رسانی ماتریس وزن در خط آخر کد انجام میشود ،جایی که ما یک گام به سمت
طبقهبندی صحیح برمیداریم .در طی یک تعداد از دورهها ،پرسپترون ما قادر است الگوهایی را
در دادههای زیربنایی بیاموزد و مقادیر ماتریس وزن را طوری تغییر دهد که نمونههای ورودی
خود را بدرستی طبقهبندی کنیم.
آخرین تابعی که باید تعریف کنیم predict ،است و همانطور که از نام آن پیداست ،برای
پیشبینی برچسبهای کالس برای مجموعه دادههای ورودی استفاده میشود:
def predict(self, X, addBias=True):
)X = np.atleast_2d(X
if addBias:
71 شبکههای عصبی پیشخور:فصل سوم
X = np.c_[X, np.ones((X.shape[0]))]
return self.step(np.dot(X, self.W))
همچنین. نیاز دارد که باید طبقهبندی شوندX ما به مجموعهای از دادههای ورودیpredict متد
.یک بررسی در کد انجام میشود تا ببیند آیا یک ستون بایاس باید اضافه شود یا خیر
بیایید سعی کنیم آن را در مجموعه، خود را پیادهسازی کردهایمPerceptron اکنون که
.) اعمال کنیم و ببینیم که چگونه کار میکندXOR وOR ،AND( دادههای بیتی
: برای این کار کد زیر را وارد کنید. آن را آزمایش میکنیمOR ابتدا در مجموعه داده
# construct the OR dataset
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [1]])
# define our perceptron and train it
print("[INFO] training perceptron...")
p = Perceptron(X.shape[1], alpha=0.1)
p.fit(X, y, epochs=20)
پرسپترون ما را با نرخ7 و6 خطوط. را تعریف میکنیمOR مجموعه داده3 و2 در خطوط
. دوره آموزش میدهند20 = 𝛼 در0.1 یادگیری
باید آن را روی دادهها ارزیابی کنیم تا تایید کنیم که در واقع، خودPerceptron بعد از آموزش
: را یاد گرفته استOR تابع
# now that our perceptron is trained we can evaluate it
print("[INFO] testing perceptron...")
# now that our network is trained, loop over the data points
for (x, target) in zip(X, y):
# make a prediction on the data point and display the result
pred = p.predict(x)
print("[INFO] data={}, ground-truth={}, pred={}".format(
x, target[0], pred))
هستند که در آن2 و1 خطوط،توجه کنید که در اینجا تنها خطوط کدی که تغییر کردهاند
. تعریف کردهایمOR را به جای مجموعه دادهAND مجموعه داده
73 شبکههای عصبی پیشخور:فصل سوم
: خروجی این بار به صورت زیر بدست آمد.بیاید دوباره کد باال را اجرا کنیم
[INFO] training perceptron...
[INFO] testing perceptron...
[INFO] data=[0 0], ground-truth=0, pred=0
[INFO] data=[0 1], ground-truth=1, pred=0
[INFO] data=[1 0], ground-truth=1, pred=0
[INFO] data=[1 1], ground-truth=0, pred=1
مهم نیست چند بار این آزمایش را با نرخهای یادگیری متفاوت یا روشهای مقداردهی اولیه
. را با پرسپترون تک الیه مدلسازی کنیدXOR چرا که هرگز نمیتوانید تابع،متفاوت اجرا کنید
74یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
در عوض ،آنچه ما نیاز داریم ،تعداد الیههای بیشتر با توابع فعالسازی غیرخطی است.
همانطور که بیان شد ،محدودیت اصلی شبکههای عصبی پرسپترون ،عدم توانایی در طبقهبندی
دادههایی است که جداییپذیر خطی نیستند .استفاده از یک الیه پنهان در ساختار شبکهها
گریزی است بر این محدودیت .به عبارت دیگر ،در راستای حل این محدودیت ،میتوان از
الیه پنهان بین الیه ورودی و خروجی استفاده کرد .نمونهای از این شبکهها که اساس یادگیری
عمیق نیز میباشد ،شبکههای پرسپترون چندالیه ( )multilayer perceptronیا به اختصار
MLPهستند که همچنین از آنها با عنوان شبکههای عصبی پیشخور ( feed forward
)neural networkنام برده میشود .این شبکهها از پرکابردترینها شبکهها در یادگیری عمیق
به دلیل سازگاری آن با انواع مسائل هستند .چرا که برای ورودی آن هیچ محدودیتی وجود ندارد
که دادهها تصویر ،متن و یا ویدیو باشد.
در یک ،MLPدادهها در جهت روبهجلو از الیه ورودی به خروجی جریان مییابند .در این
نوع از شبکهها با رفتن از هر الیه به الیه دیگر ،جمع وزندار مجموعه نورونهای الیه قبل محاسبه
و با اعمال یک تابع فعالساز غیرخطی به الیه دیگر منتقل میشوند .دلیل نامگذاری آن به
پیشخور ( )Feed forwardعدم وجود اتصال بازخوردی است که از طریق آن خروجیهای
مدل دوباره به عنوان ورودی خود مدل محسوب شوند (مقادیر فقط از ورودی به الیههای پنهان
و سپس به خروجی میروند و هیچ مقداری به الیههای قبلی بازگردانده نمیشود .در مقابل ،یک
75 فصل سوم :شبکههای عصبی پیشخور
شبکه بازگشتی اجازه میدهد مقادیر به عقب برگردانده شوند) .به عبارت دیگر ،در یک شبکه
پیشخور ،فعالسازیها در شبکه ،همیشه از طریق دنبالهای از الیهها به جلو جریان مییابند .این
شبکه همچنین یک شبکه کامالً متصل ( )fully connectedاست ،چراکه هر یک از نورونهای
شبکه به گونهای بهم متصل شدهاند که ورودیها را از تمام نورونهای الیه قبلی دریافت میکند
و فعالسازی خروجی خود را به تمام نورونهای الیه بعدی منتقل میکند .در شکل 2-3شمایی
از یک شبکه عصبی با 2الیه پنهان قابل مشاهده است.
هنگامی که این شبکه در حال پردازش مجموعهای از ورودیهای خارجی است ،ورودیها از
طریق نورونهای حسگر در الیه ورودی به شبکه ارائه میشوند .این باعث میشود که نورونهای
الیه بعدی سیگنالهای فعالسازی را در پاسخ به این ورودیها تولید کنند .و این فعالسازیها
از طریق شبکه جریان مییابند تا به الیه خروجی برسند .فعالسازی نورونهای این الیه ،پاسخ
شبکه به ورودیها و خروجی نهایی است .الیههای داخلی شبکه که نه الیه ورودی هستند و نه
الیه خروجی ،الیههای پنهان نامیده میشوند.
عمق یک شبکه عصبی برابر است با تعداد الیههای پنهان به اضافه الیه خروجی است.
بنابراین ،شبکه در شکل 2-3دارای سه الیه است .تعداد الیههای مورد نیاز برای در نظر گرفتن
عمق یک شبکه یک سوال باز است .با این حال ،ثابت شده است که یک شبکه با سه الیه نورون
(یعنی دو الیه پنهان و یک الیه خروجی) میتواند هر تابعی را به دقت دلخواه تقریب بزند.
بنابراین ،در اینجا حداقل تعداد الیههای پنهان الزم برای عمیق در نظر گرفتن یک شبکه را به
عنوان دو تعریف میکنیم .تحت این تعریف ،شبکه در شکل 2-3به عنوان یک شبکه عمیق
توصیف میشود .با این حال ،بیشتر شبکههای عمیق بیش از دو الیه پنهان دارند .امروزه برخی
از شبکههای عمیق دهها یا حتی صدها الیه دارند.
هر شبکه عصبی پیشخور از ورودیها ،تعداد دلخواه الیهها پنهان و الیهای که
خروجیها را محاسبه میکند به نام الیه خروجی تشکیل میشود .این رویکرد
مبتنیبر الیه ،جایی است که نام یادگیری عمیق از آن گرفته شده است ،چراکه،
عمق یک شبکه عصبی پیشخور ،تعداد الیههایی را که یک شبکه عصبی
پیشخور از آن تشکیل شده است را توصیف میکند.
نشان داده شده است که شبکههایِ عصبیِ پیشخور تنها با یک الیهیِ پنهان،
میتوانند برای تقریب هر تابع پیوسته مورد استفاده قرار گیرند.
هدف از فرآیند یادگیری در شبکههای عصبی ،یافتن مجموعهای از مقادیر وزنی است که باعث
میشود خروجی شبکه عصبی تا حد امکان با مقادیر هدف واقعی مطابقت داشته باشد .مسائل
مختلفی در طراحی و آموزش شبکه پرسپترون چندالیه وجود دارد:
این تصویر بسیار ساده شده است زیرا تنها مقدار یک وزن را نشان میدهد (در محور
افقی).
▪ همگرایی به یک راهحل بهینه در یک دوره زمانی معقول.
▪ اعتبارسنجی شبکه عصبی برای آزمایش بیشبرازش.
77 فصل سوم :شبکههای عصبی پیشخور
تابع فعالسازی
تابع فعالسازی از اهمیت زیادی در یادگیری عمیق برخوردار است .هدف توابع فعالسازی
دریافت عددی از ورودی و محاسبه یک سری عملیات ریاضی است تا خروجی بین بازه 0تا 1
یا -1تا 1را تولید کند .تابع فعالسازی در هر نورون مصنوعی اگر سیگنالهای دریافتی به حد
آستانه رسیده باشند ،سیگنالهای خروجی را برای سطح بعدی ارسال میکنند .به بیان خیلی ساده
تابع فعالساز تصمیم میگیرد که یک نرون باید فعال شود یا خیر.
در یادگیری عمیق ،یک شبکه عصبی بدون تابع فعالسازی فقط یک مدل رگرسیون خطی
ساده است!؟ چراکه این توابع در واقع محاسبات غیرخطی را در ورودی یک شبکه عصبی انجام
میدهند و آن را قادر به یادگیری و انجام وظایف پیچیدهتر میکنند .بنابراین ،مطالعه انواع مختلف
و تجزیه و تحلیل مزایا و معایب هر تابع فعالسازی ،برای انتخاب نوع مناسب تابع فعالسازی
که بتواند غیرخطی بودن و دقت را در یک مدل شبکه عصبی خاص ارائه دهد ،بسیار ضروری
است .همچنین ،به دلیل مشکل محو گرادیان ( )Vanishing gradientکه بعدا در مورد آن
صحبت خواهیم کرد ،تنظیم تابع فعالسازی مناسب برای شبکه بسیار مهم است.
تابع فعالسازی مورد استفاده در شبکههای عمیق ،نمیتواند از هر تابعی باشد ،بلکه باید
ویژگیهای خاصی را در خود به همراه داشته باشد .یکی از ویژگیهای مهم یک تابع فعالسازی
این است که باید مشتقپذیر باشد .شبکه از خطاهایی که در الیه خروجی محاسبه میشود ،یاد
میگیرد .یک تابع فعالسازی مشتقپذیر برای انجام بهینهسازی پسانتشار در حالی که انتشار
عقبگرد ( )propagating backwardsرا برای محاسبه گرادیانهای خطا با توجه به وزنها و
سپس بهینهسازی وزنها با استفاده از گرادیان کاهشی انجام میدهد (یا هر تکنیک بهینهسازی
دیگری برای کاهش خطا) ،مورد نیاز است.
نقش تابع فعالسازی استخراج خروجی از مجموعه مقادیر ورودی است که به
یک نورون (یا یک الیه) داده میشود.
تابع فعالسازی یک مرحله اضافی را در هر الیه در طول انتشار جلورو ()forward propagation
معرفی میکنند ،اما محاسبه آن ارزشش را دارد .فرض کنید یک شبکه عصبی داریم که بدون توابع
فعالسازی کار میکند .در آن صورت ،هر نورون تنها با استفاده از وزنها و بایاسها ،یک تبدیل
خطی روی ورودیها انجام میدهد .از اینرو دیگر اهمیتی ندارد که از چند الیه پنهان در شبکه
عصبی خود استفاده کنید چراکه همه الیهها به یک شکل رفتار میکنند به این علت که ترکیب دو
تابع خطی خود یک تابع خطی است و شبکه قدرتی بیشتر از یک رگرسیون خطی را نخواهد
داشت.
78یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
فرض کنید یک بردار ورودی xو سه الیه پنهان دارید که با ماتریسهای وزن 𝑊2 ،𝑊1و 𝑊3
نشان داده شدهاند .بدون هیچ تابع فعالسازی ،شبکه عصبی شما خروجی y=x 𝑊1 𝑊2 𝑊3را
دارد که برابر است با 𝑊𝑥=yبه طوری که 𝑊 = 𝑊1 𝑊2 𝑊3و این چیزی نیست جز ضرب ماتریس.
حال ،با معرفی یک تابع فعالسازی غیرخطی پس از هر تبدیل خطی ،دیگر این اتفاق نمیافتد:
اکنون هر الیه میتواند بر روی نتایج الیه غیرخطی قبلی ایجاد شود که اساسا منجر به یک تابع غیرخطی
پیچیده میشود.
یک تابع فعالسازی به شبکه عصبی مصنوعی اضافه میشود تا به شبکه کمک
کند الگوهای پیچیده در دادهها را یاد بگیرد.
همچنان که پیشتر بیان گردید ،تابع فعالسازی در شبکههای عصبی باید ویژگیهای خاصی را
در خود به همراه داشته باشد .ویژگیهای مطلوبی که یک تابع فعالسازی باید داشته باشد را
میتوان به صورت زیر خالصه کرد:
▪ غیرخطی ( :)Nonlinearهمانطور که پیشتر بیان شد ،اگر تابع فعالسازی خطی باشد،
یک پرسپترون با چندین الیه پنهان را میتوان براحتی به یک پرسپترون تک الیه فشرده
کرد ،چراکه ترکیب خطی از بردار ورودی را میتوان به سادگی به عنوان یک ترکیب خطی
منفرد از بردار ورودی بیان کرد .در این صورت عمق شبکه تاثیری نخواهد داشت.
بنابراین ،غیرخطی بودن در تابع فعالسازی زمانی که مرز تصمیم ماهیت غیرخطی داشته
باشد ،ضروری است .از آنجایی که یک شبکه عصبی مصنوعی الگوها یا مرز را از دادهها
یاد میگیرد ،غیرخطی بودن در تابع فعالسازی ضروری است تا شبکه عصبی مصنوعی
بتواند هر مرز خطی یا غیرخطی را براحتی یاد بگیرد.
▪ صفر-مرکز ( :)Zero-Centeredخروجی تابع فعالسازی باید صفر-مرکز باشد تا
گرادیانها به جهت خاصی تغییر نکنند .زمانی به تابعی صفر-مرکز گویند که محدوده
آن دارای مقادیر مثبت و منفی باشد .اگر تابع فعالسازی شبکه صفر-مرکز نباشد ،همیشه
مثبت یا همیشه منفی است .بنابراین ،خروجی یک الیه همیشه به مقادیر مثبت یا منفی
منتقل میشود .در نتیجه ،بردار وزن نیاز به بروز رسانی بیشتری دارد تا بدرستی آموزش
داده شود .بنابراین ،اگر تابع فعالسازی در صفر-مرکز نباشد ،تعداد دورههای مورد نیاز
برای آموزش شبکه افزایش مییابد .به همین دلیل است که ویژگی صفر-مرکز مهم است،
اگرچه ضروری نیست.
79 فصل سوم :شبکههای عصبی پیشخور
مشکل محو گرادیان ( )Vanishing Gradient problemو مشکل نورون مرده ()dead neuron
دو مشکل عمدهای هستند که توابع فعالسازی پرکاربرد با آن مواجه هستند:
از طریق انتقال به الیهها ،این گردایانهای بزرگ در نهایت سبب سرریز شده و وزنها
دیگر توانایی بروزرسانی نخواهند داشت و شبکهای ناپایداری را پدید میآورند.
▪ نورون مرده :وقتی یک تابع فعالسازی بخش بزرگی از ورودی را به صفر یا تقریبا صفر
وادار میکند ،آن نورونهای متناظر برای کمک به خروجی نهایی غیرفعال (مرده) هستند.
در حین بروز رسانی وزنها ،این احتمال وجود دارد که وزنها به گونهای بروز شوند که
مجموع وزنی بخش بزرگی از شبکه به اجبار صفر شود .یک شبکه به سختی از چنین
وضعیتی بهبود مییابد و بخش بزرگی از ورودی نمیتواند به شبکه کمک کند .این منجر
به یک مشکل میشود زیرا ممکن است بخش بزرگی از ورودی در طول اجرای شبکه به
طور کامل غیرفعال شود .این نورونهایی که بهشدت غیرفعال میشوند" ،نورونهای مرده"
نامیده میشوند و این مشکل به عنوان مشکل نورون مرده نامیده میشود .بهطور خالصه،
نورون مرده در اصطالح شبکه عصبی مصنوعی به نورونی گفته میشود که در حین آموزش
فعال نمیشود .این امر باعث میشود که نورون نتواند وزن خود را بروز کند زیرا مشتقات
آن وزنهای مربوط بسیار کوچک یا صفر خواهد بود .خطاها از طریق یک نورون مرده
نیز منتشر نمیشوند ،بنابراین روی دیگر نورونهای شبکه تأثیر میگذارند.
Sigmoid
تابع فعالساز Sigmoidبهصورت زیر تعریف میشود:
1
= )𝑥(𝜎
𝑥1 + 𝑒−
که در آن 𝑥 ورودی تابع فعالساز است .حال بیایید این را در پایتون کدنویسی کنیم:
def sigmoid(x):
))return 1/(1+np.exp(-x
: برای این کار کد زیر را وارد کنید. و مشتق آن را مصورسازی کنیمSigmoid حال بیاید تابع
import numpy as np
import matplotlib.pyplot as plt
# Derivative of Sigmoid
def der_sigmoid(x):
return sigmoid(x) * (1- sigmoid(x))
# Plotting
plt.plot(x_data, y_data, x_data, dy_data)
plt.title('Sigmoid Activation Function & Derivative')
plt.legend(['sigmoid','der_sigmoid'])
plt.grid()
plt.show()
کوچک در مقدار خروجی میشود .این منجر به مقادیر گرادیان کوچک نیز میشود .به دلیل
مقادیر کم گرادیان ،با مشکل محو گرادیان مواجه میشود.
در کاربردهای عملی ،تابع فعالساز Sigmoidعلیرغم محبوبیت آن در گذشته ،به دلیل دو
مشکل مهم کمتر مورد استفاده قرار میگیرد:
.1مشکل محو گرادیان دارد .تابع Sigmoidمنجر به مشکل محو گرادیان در الگوریتم
پسانتشار میشود .در این حالت هیچ سیگنالی از طریق نورونها منتقل نمیشود و
بنابراین نورون در مرحله آموزش چیزی یاد نخواهد گرفت.
.2صفر-مرکز نیست .خروجیهای تابع Sigmoidصفر-مرکز نیستند .از اینرو در
الگوریتم پسانتشار ،گرادیانهایی ایجاد میشود که یا همه مثبت و یا همه منفی هستند
که برای بروز رسانی گرادیان وزنها مناسب نیست.
از تابع فعالساز Sigmoidبه طور کلی برای مسائل طبقهبندی دودویی و
طبقهبندی چندبرچسبی در الیه خروجی استفاده میشود چراکه باید احتمال را
به عنوان خروجی پیشبینی کنیم .از آنجایی که احتمال هر چیزی فقط بین
محدوده 0و 1است Sigmoid ،به دلیل دامنه آن انتخاب مناسبی است.
مزایا
▪ محدوده خروجی آن از 0تا 1است ،از اینرو میتواند احتمالت را ایجاد کند .این باعث میشود که
Sigmoidبرای نورونهای خروجی شبکههای عصبی با هدف طبقهبندی مفید باشند.
▪ در همهجا مشتقپذیر است.
▪ ماهیت آن غیرخطی است.
معایب
▪ از مشکل اشباع ( )saturation problemرنج میبرد .یک نورون در صورتی اشباع شده در نظر
گرفته میشود که به حداکثر یا حداقل مقدار خود برسد ،به طوری که مشتق آن برابر با 0باشد .در این
صورت ،وزنها بروز نمیشوند که باعث یادگیری ضعیف برای شبکههای عمیق میشود.
▪ این یک تابع صفر مرکز نیست .بنابراین ،گرادیان تمام وزنهای متصل به یک نورون مثبت یا منفی
است .در طول فرآیند بروزرسانی ،این وزنها تنها مجاز به حرکت در یک جهت ،یعنی مثبت یا منفی در
یک زمان هستند .این امر بهینه سازی تابع زیان را سختتر میکند.
▪ هزینه محاسباتی زیادی دارد .این تابع یک عملیات نمایی انجام میدهد که در نتیجه زمان محاسبات
بیشتری را میگیرد.
83 فصل سوم :شبکههای عصبی پیشخور
tanh
تابع فعالسازی تانژانت هذلولویگون یا ،tanhارتباط نزدیکی با تابع فعالسازی Sigmoidدارد
و شکل ریاضی آن به صورت زیر است:
𝑥sinh(𝑥) 𝑒 𝑥 − 𝑒 −
= )𝑥(𝑓(𝑥) = tanh = = 2𝜎(2𝑥) − 1.
𝑥cosh(𝑥) 𝑒 𝑥 + 𝑒 −
در پایتون میتوانیم آن را بهصورت زیر کدنویسی کنیم:
def htan(x):
))return (np.exp(x) - np.exp(-x))/(np.exp(x) + np.exp(-x
همان طور که در معادله باال مشاهده میشود tanh ،به سادگی یک نسخه مقیاسشده از فعالساز
Sigmoidاست .با این حال ،صفر-مرکز است .از اینرو ،برخی از مشکالتی را که فعالساز
Sigmoidدارد را از خود نشان نمیدهد .این تابع پیوسته ،مشتقپذیر و کراندار در محدودهای
از ( )-1،1است .بنابراین ،منفی ،مثبت و صفر را به عنوان خروجی تولید میکند و ورودیهای
شدیدا منفی به tanhبه خروجیهای منفی نگاشت میشوند .بنابراین تابع فعالسازی tanhدر
صفر-مرکز میباشد و مشکل عدم صفر-مرکز بودن تابع Sigmoidرا حل میکند.
مشتق تابع tanhبهصورت زیر محاسبه میشود:
𝑓(𝑥) = 1 − 𝑓(𝑥)2
که در پایتون میتوانیم آن را بهصورت زیر بنویسیم:
def der_htan(x):
)return 1 - htan(x) * htan(x
بیاید تابع tanhو مشتق آن را مصورسازی کنیم .برای این کار کد زیر را وارد کنید:
import numpy as np
import matplotlib.pyplot as plt
# Graph
)plt.plot(x_data, y_data, x_data, dy_data
)'plt.title('htan Activation Function & Derivative
)]'plt.legend(['htan','der_htan
)(plt.grid
84یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
مزایا
▪ برخالف ،Sigmoidیک تابع صفر-مرکز است تا بهینهسازی تابع زیان آسانتر شود.
▪ خروجی نورون را در محدودهای بین -1و 1نرمال میکند.
معایب
▪ از نظر محاسباتی گران است.
▪ مستعد محو گرادیان است.
ReLU
توابع فعالسازی sigmoidو tanhرا نمیتوان در شبکههایی با الیههای زیاد به دلیل مشکل
محو گرادیان استفاده کرد .تابع فعالسازی ReLUکه محبوبترین تابع فعالسازی در یادگیری
عمیق است (در الیه پنهان) ،بر مشکل محو گرادیان غلبه میکند و به شبکه اجازه میدهد سریعتر
یاد بگیرد و عملکرد بهتری داشته باشد .تابع ReLUبه صورت زیر تعریف میشود:
0 𝑓𝑜𝑟 𝑥 ≤ 0
𝑓́ (𝑥) = {
1 𝑓𝑜𝑟 𝑥 > 0
:در پایتون میتوانیم آن را بهصورت زیر کدنویسی کنیم
def der_ReLU(x):
data = [1 if value>0 else 0 for value in x]
return np.array(data, dtype=float)
# Graph
plt.plot(x_data, y_data, x_data, dy_data)
plt.title('ReLU Activation Function & Derivative')
plt.legend(['ReLU','der_ReLU'])
plt.grid()
plt.show()
86یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
مزایا
▪ به میزان زیادی همگرایی گرادیان کاهشی تصادفی را در مقایسه با توابع Sigmoidتسریع میکند.
▪ میتواند با مشکل محو گرادیان مقابله کند.
▪ تابع محاسباتی ارزانی است.
▪ پرکاربردترین تابع فعال سازی است.
▪ خیلی سریع همگرا میشود.
معایب
▪ صفر-مرکز نیست.
▪ مشکل نورون مرده دارد .سمت منفی نمودار مقدار گرادیان را صفر میکند .به همین دلیل ،در طول
فرآیند پسانتشار ،وزنها و سوگیریها برای برخی نورونها بروز نمیشوند .این میتواند نورونهای
مردهای ایجاد کند که هرگز فعال نمیشوند .به عبارت دیگر ،تمام مقادیر ورودی منفی بالفاصله صفر
میشوند ،از اینرو توانایی مدل را برای آموزش درست از دادهها کاهش میدهد.
هر زمان که ReLUورودی منفی را دریافت کند ،خروجی صفر میشود .بنابراین،
از طریق پسانتشار چیزی یاد نمیگیرد (زیرا نمیتوانید در آن انتشار عقبگرد
انجام دهد) .به عبارت دیگر ،اگر مشتق صفر باشد ،کل فعالسازی صفر
میشود ،بنابراین هیچ مشارکتی از آن نورون در شبکه وجود ندارد.
Softmax
از تابع sofmaxبه عنوان خروجی در مسائل طبقهبندی چند کالسی برای یافتن احتماالت برای
کالسهای مختلف استفاده میشود (برخالف Sigmoidکه برای طبقهبندی دودویی ترجیح
داده میشود) .تابع Softmaxاحتماالت هر کالس هدف را برروی تمام کالسهای هدف ممکن
محاسبه میکند (که به تعیین کالس هدف کمک می کند):
𝑖𝑧 𝑒
= ) 𝑖𝑧( 𝑥𝑎𝑚𝑡𝑓𝑜𝑆 𝑘 𝑓𝑜𝑟 𝑗 = 1, … ,
𝑘𝑧 𝑒 ∑𝑘𝑘=1
Softmaxاحتمال را برای یک نقطه داده متعلق به هر کالس ،جداگانه برمیگرداند .توجه داشته
باشید که مجموع همه مقادیر 1است.
# Plotting
)plt.plot(x_data, y_data
)'plt.title('Softmax Activation Function
)]'plt.legend(['Softmax
)(plt.grid
)(plt.show
برای مسائل طبقهبندی چندکالسه ،الیه خروجی به اندازه کالس هدف نورون دارد .به عنوان
مثال ،فرض کنید شما 4کالس [ ]A, B, C, Dدارید .از اینرو 4نورون در الیه خروجی وجود
خواهد داشت .فرض کنید خروجی تابع Softmaxبرای یک داده برابر با
[ ]0.26،0.14،0.41،0.19شده است ،با دیدن مقدار احتمال میتوان گفت ورودی متعلق به
کالس Cاست.
مهمی را در فرآیند آموزش شبکه بر عهده داشته و تاثیر مستقیمی بر زمان صرف شده آموزش
دارند .به بیانی دیگر ،الگوریتمهای بهینهسازی قلب یادگیری عمیق هستند که مسئول کار پیچیده
مدلهای یادگیری عمیق برای یادگیری از دادهها هستند.
برای اینکه بفهمیم بهینهسازی چیست؟ ابتدا باید هدف را شناسایی کنیم .هدف به ویژگیهای
خاصی از سیستم به نام متغیر بستگی دارد .هدف ما یافتن مقادیر متغیرهایی است که هدف را
بهینه میکند .اغلب متغیرها به نوعی محدود هستند .از منظر ریاضی ،بهینهسازی فرآیندی است
برای به بیشینهسازی( )maximizingیا کمینهسازی ( )minimizingیک تابع هدف )𝑥(𝑓 با
جستجوی متغیرهای مناسب 𝑥 با توجه به محدودیتهای 𝑖𝑐 ،که میتواند به صورت فشرده به
صورت زیر نوشته شود:
𝑐𝑖 (𝑥) = 0, 𝑖𝜖ℰ
{ 𝑜𝑡 𝑡𝑐𝑒𝑗𝑏𝑢𝑠)𝑥(𝑓 𝑛𝑅𝜖𝑥𝑛𝑖𝑚
𝑐𝑖 (𝑥) ≥ 0, 𝑖𝜖ℐ
که در آن ℰو ℐبه ترتیب مجموعهای از شاخصها برای محدودیتهای برابری و نابرابری
هستند .این عبارت ریاضی قطعا در نگاه اول دلهره آور است!! ،شاید به این دلیل که برای توصیف
کلی بهینهسازی است .اما نگران نباشید ،در ادامه مطالب همه چیز مشخص خواهد شد.
چندین روش مختلف برای بهینهسازی در یادگیری عمیق وجود دارد .به عنوان مثال،
سادهترین الگوریتم بهینهسازی مورد استفاده در یادگیری عمیق ،گرادیان کاهشی Gradient
Descentاست .گرادیان کاهشی یک الگوریتم بهینهسازی مرتبه اول تکراری است که برای یافتن
کمینه (بیشینه) محلی یک تابع معین استفاده میشود .این بدان معنی است که هنگام انجام
بروزرسانی پارامترها فقط اولین مشتق را در نظر میگیرد .در هر تکرار ،ما پارامترها را در جهت
مخالف گرادیان تابع هدف )𝜃( Jبروز میکنیم .اندازه گامی که در هر تکرار برای رسیدن به کمینه
محلی برمیداریم با نرخ یادگیری 𝛼 تعیین میشود .بنابراین جهت گرادیان به سمت پایین را دنبال
میکنیم تا کمینه محلی برسیم.
روش دیگر بهینهسازی نیوتن است که با استفاده از مشتق مرتبه دوم با یافتن ریشههای یک
تابع در بهبود بهینهسازی کمک میکند .البته این روش در مقایسه با روشهای گرادیان کاهشی که
مبتنیبر مشتق مرتبه اول هستند ،پیچیدگی محاسباتی را به میزان قابل توجهی افزایش میدهد.
از همین رو ،گرادیان کاهشی در آموزش شبکههای عصبی بیشتر ترجیح داده میشود.
الگوریتمهای متفاوتی مبتنیبر گردایان کاهشی وجود دارند .در ادامه این بخش ،پس تشریح کامل
آن ،به معرفی و بررسی سایر نسخههای این الگوریتم میپردازیم.
در روش گرادیان کاهشی کامل ،شبکه با تمام نمونههای آموزشی تغذیه میشود .شبکه پس از
محاسبه خطا برای تمام نمونهها یک بار بروزرسانی را انجام میدهد .اگرچه این روش به مدل
در فرار از کمینه محلی کمک کرده و همگرایی پایدارتری در مقایسه با گرادیان کاهشی یک
نمونهای ارائه میدهد ،با این همه ،زمان آموزش طوالنیتر را در پی دارد .همچنین تغذیه تمام
نمونههای آموزشی به شبکه بهدلیل کمبود حافظه همیشه امکانپذیر نیست .در خال بین این دو
روش ،گرادیان کاهشی ریزدستهای ( )mini-batch gradient descentاستفاده میشود .در این
روش شبکه با گروهی از نمونههای آموزشی تغذیه میشود تا از مزیت هر دو روش قبلی استفاده
کند .بروزرسانی پارامترها با استفاده از گروهی از نمونهها مزیتی مهم دارد :با استفاده از این
روش مدل نسبت به نمونههای نویزدار مقاومتر بوده و واریانس کمتری در بروزرسانی پارامترها
دارد .این عمل همگرایی پایدارتری را ارائه میدهد .با این همه ،این روشها نیاز به انتخاب نرخ
یادگیری (𝛼) دارند که انتخاب آن همیشه آسان نیست .عالوه براین ،نرخ یادگیری یکسان در
تمام مراحل آموزشی و برای همه پارامترهای مختلف نمیتواند بهینه باشد .اگر 𝛼 خیلی بزرگ
انتخاب شود ،آموزش ممکن است نوسان کند ،همگرا نشود یا از کمینههای محلی مربوط بگذرد.
در مقابل ،اگر نرخ یادگیری خیلی کوچک انتخاب شود ،به طور قابل توجهی فرآیند همگرایی را
به تاخیر میاندازد .از اینرو ،یک تکنیک رایج برای دورزدن این مساله استفاده از نرخ واپاشی
90یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
( )rate decayیادگیری است .به عنوان مثال ،با استفاده از واپاشی گامی میتوان نرخ یادگیری
را هر چند دوره به میزانی کاهش داد .این امر این امکان را میدهد تا میزان یادگیری زیادی در
ابتدای آموزش و نرخ یادگیری کمتری در پایان آموزش وجود داشته باشد .با این حال ،این روش
واپاشی نیز ،به خودی خود یک ابرپارامتر است و بسته به کاربرد باید با دقت طراحی شود.
هدف بهینهسازهای نرخ یادگیری تطبیقی ،حل مشکل یافتن نرخ یادگیری درست است .در
این روشها ،نرخ یادگیری 𝛼 یک متغیر سراسری نیست ،اما در عوض هر پارامترِ قابل آموزش،
نرخِ یادگیری جداگانهای برای خود دارد .در حالی که این روشها اغلب هنوز نیاز به تنظیم
ابرپارامتر دارند ،بحث اصلی این است که آنها برای طیف وسیعتری از پیکربندیها به خوبی
کار میکنند؛ اغلب زمانی که تنها از ابرپارمترهای پیشفرضِ پیشنهادی استفاده میکنند.
برای شروع ،یک تابع هدف ساده 𝑓(𝑥) = 𝑥² − 2𝑥 − 3را تعریف میکنیم که 𝑥 اعداد
حقیقی هستند .از آنجایی که گرادیان کاهشی از گرادیان استفاده میکند ،گرادیان 𝑓 را نیز تعریف
میکنیم ،که فقط مشتق اول 𝑓 است ،یعنی :∇𝑓(𝑥) = 2𝑥 − 2
def func(x):
return x**2 - 2*x - 3
def fprime(x):
return 2*x - 2
در مرحله بعد ،توابع پایتون را برای رسم تابع هدف و مسیر یادگیری در طول فرآیند بهینهسازی
تعریف میکنیم:
91 فصل سوم :شبکههای عصبی پیشخور
def plotFunc(x0):
)x = np.linspace(-5, 7, 100
))plt.plot(x, func(x
)'plt.plot(x0, func(x0), 'ko
)'plt.xlabel('$x$
)'plt.ylabel('$f(x)$
)'plt.title('Objective Function
از نمودار زیر ،براحتی میتوانیم ببینیم که 𝑓 دارای کمینه مقدار 𝑥 = 1است .فرض کنید از
𝑥 = −4شروع میکنیم (که با یک نقطه مشکی در زیر نشان داده شده است) ،میخواهیم
ببینیم که آیا گرادیان کاهشی میتواند کمینه محلی 𝑥 = 1را تعیین کند یا خیر.
x0 = -4
)plotFunc(x0
یک الگوریتم گرادیان کاهشی ساده را به این صورت تعریف میکنیم :برای هر نقطه 𝑘𝑥 در ابتدای
مرحله 𝑘 ،طول گام 𝑘𝛼 را ثابت نگه می داریم و جهت 𝑘𝑝 را منفی مقدار گرادیان قرار می دهیم.
با استفاده از فرمول زیر این مراحل را انجام میدهیم:
= 𝑥 شروع میکنیم و الگوریتم گرادیان کاهشی را روی 𝑓 با سناریوهای مختلف اجرا−4 از
:می کنیم
𝛼ₖ = 0.1
𝛼ₖ = 0.9
𝛼ₖ = 1 × 10−4
𝛼ₖ = 1.01
𝛼ₖ = 0.1 :سناریو اول
Solution found:
y = -4.0000
x = 1.0000
Solution found:
y = -4.0000
x = 1.0000
93 شبکههای عصبی پیشخور:فصل سوم
چیزی که از مصورسازیهای باال در سناریوهای مختلف بدست آوردیم ،به صورت زیر خالصه
میشود:
سناریوی اول براحتی همگرا شد .حتی اگر طول گام ثابت باشد ،جهت به سمت صفر کاهش
مییابد و از این رو منجر به همگرایی میشود.
سناریوی دوم نیز با وجود اینکه مسیر یادگیری بدلیل طول گام بزرگ در اطراف راه حل در
نوسان است ،همگرا میشود.
سناریوی سوم به سمت راه حل حرکت میکند .با این حال ،طول گام بقدری کوچک است که
تعداد تکرارها به حداکثر میرسد و نمیتواند جواب را بیابد .در این مورد ،افزایش max_iter
مشکل را حل میکند.
سناریوی چهارم بدلیل طول گام بزرگ متفاوت است .در اینجا max_iter = 8 ،را تنظیم
کردهایم تا مصورسازی را بهتر کنیم.
چیزی که میتوان فهمید این است که راه حل x = 1را میتوان با گرادیان کاهشی با طول گام
مناسب بدست آورد.
شاید تعجب کنید که چرا از راه حل تحلیلی دقیق استفاده نمیکنیم :مشتق 𝑓 را بگیرید ،سپس
𝑥 را طوری حل کنید که مشتق صفر شود .برای مثال قبلی ،متوجه میشویم که 𝑥ای که 𝑓 را به
کمینه میکند ∇𝑓(𝑥) = 2𝑥 − 2 ،را برآورده کند ،یعنی .𝑥 = 1بله ،این یک راه است .اما
زمانی که با یک مسئله بهینهسازی مواجه میشوید که در آن مشتق 𝑓 سخت است یا حل آن
غیرممکن است ،دیگر این تکنیک توصیهشده نمیشود.
توجه داشته باشید که پیادهسازی سادهیِ باال تنها برای درک بهتر نحوه کار گرادیان کاهشی
همراه با مصورسازی بوده است .در عمل نیازی به پیادهسازی نیست و چارچوبهای یادگیری
عمیق ،پیادهسازی کارآمد این الگوریتمها را در خود جای دادهاند.
خواهد بود و منجر به تعداد زیادی مرحله میشود .برای حل این موضوع ،تکانه به الگوریتم
گرادیان کاهشی اضافه میشود .ایده اصلی تکانه ،اضافه کردن حافظه کوتاهمدت به گرادیان
کاهشی است .به عبارت دیگر ،به جای استفاده از گرادیان مرحله فعلی برای هدایت جستجو،
تکانه ،گرادیانهای گامهای گذشته را نیز برای تعیین جهت انباشته میکند .این مکانیسم را میتوان
به صورت زیر اجرا کرد:
𝑡𝑣 𝜃𝑡+1 = 𝜃𝑡 −
) 𝑡𝜃( 𝑡∇ 𝑣𝑡 = 𝛾. 𝑣𝑡−1 − 𝛼.
در این معادالت 𝛾 ،عبارت تکانه است که تاثیر گرادیانهای قبلی را بر بروزرسانی فعلی تعیین
میکند .ایده کلی این است که این عبارت را تا حد امکان نزدیک به 1قرار دهیم و برای نرخ
یادگیری مقداری تا حد امکان باالتر انتخاب کرده ،در حالی که همگرایی پایدار را حفظ میکنیم.
هنگام استفاده از ،Kerasبرای انتخاب بهینهساز ،میتوان با نمونهسازی مستقیم کالس SGDو
استفاده از آن در زمان کامپایل مدل ،بهینهساز گرادیان کاهشی تصادفی ( )SGDرا سفارشی
( )customizeکرد:
from tensorflow.keras.optimizers import SGD
...
)sgd = SGD(learning_rate=0.0001, momentum=0.8, nesterov=True
)model.compile(optimizer=sgd, loss = ..., metrics= ...
1
Sutskever
97 فصل سوم :شبکههای عصبی پیشخور
Adagrad
یافتن نرخ یادگیری بهینه برای یک الگوریتم یادگیری عمیق میتواند یک مشکل پیچیده باشد.
اگر نرخ یادگیری خیلی باال تنظیم شود ،پارامتر ممکن است با نوسانات زیادی حرکت کند تا به
سطح قابل قبولی از زیان برسد .از طرف دیگر ،تنظیم نرخ یادگیری بسیار پایین منجر به پیشرفت
بسیار کند خواهد شد Adagrad .برای این منظور ارائه شد ،جایی که انتخاب دستی نرخهای
یادگیری مختلف برای هر بعد از مسئله به دلیل حجم ابعاد غیرعملی است Adagrad .بهطور
تطبیقی پارامتر نرخ یادگیری را برای هر بعد مقیاسبندی میکند تا اطمینان حاصل شود که فرآیند
آموزش نه خیلی کند است و نه خیلی فرار و نادقیق .برای انجام این کار ،الگوریتم AdaGradبه
صورت پویا دانش هندسه دادههای مشاهدهشده در تکرارهای گذشته را ترکیب میکند .سپس،
این دانش را برای تنظیم نرخ یادگیری پایینتر برای ویژگیهای متداولتر و نرخهای یادگیری
باالتر برای ویژگیهای نسبتا نادر اعمال میکند .در نتیجه ،ویژگیهای نادر برجسته میشوند و
یادگیرنده را قادر میسازد تا ویژگیهای نادر و در عین حال بسیار پیشگویانه را شناسایی کند.
در این روش نرخ یادگیری جداگانه برای هر پارامتر مدل ،بر اساس تاریخچه کامل گرادیانهای
مجذور پارامتر محاسبه میشود .گرادیان مجذور مشابه با اهمیت گرادیان است .آنها برای هر
پارامتر حساب میشوند و نرخ یادگیری فعلی با تقسیم گرادیان فعلی بر مجذور گرادیان به اضافه
یک مقدار کوچک 𝜀 (برای جلوگیری از تقسیم بر صفر) محاسبه میشود .این بدان معناست که،
هر چه گرادیانهای بدستآمده قبلی بزرگتر باشند ،گرادیان فعلی اهمیت کمتری دارد و در نتیجه
98یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
نرخ یادگیری و بدین ترتیب اندازه گام در دوره فعلی کوچکتر خواهد بود .معادله ریاضی این
روش بهصورت زیر است:
) 𝑡𝜃( 𝑡∇
𝜃𝑡+1 = 𝜃𝑡 − 𝛼.
𝜀 √𝐺𝑡 +
2
) 𝑡𝜃( 𝑡∇ 𝐺𝑡 = 𝐺𝑡−1 +
الگوریتم Adagradدر keras
AdaDelta
ایده پشت الگوریتم Adagradخوب است ،اما الگوریتم دارای برخی نقاط ضعف است .پس
از مدتی ،انباشت گرادیانهای مربع به مقدار زیادی میرسد که نرخ یادگیری استفاده شده در
بروزرسانیها بسیار کم میشود و از اینرو تقریبا نمیتوان هیچ پیشرفتی ایجاد کرد .الگوریتم
،AdaDeltaسعی می کند به این مشکل رسیدگی کند ،بهطوری که پنجره گرادیانهای گذشته
انباشته بجای گرفتن کل تاریخ ،به اندازه ثابت محدود شود .برای اینکار ،بجای جمع تمام
گرادیانهای مجذور از ابتدای آموزش ،فرض کنید مجموع رو به زوالی از این گرادیانها را حفظ
میکنیم .ما میتوانیم این را به عنوان یک لیست در حال اجرا از جدیدترین گرادیانها برای هر
وزن در نظر بگیریم .هر بار که وزنها را بروزرسانی میکنیم ،گرادیان جدید را در انتهای فهرست
قرار میدهیم و قدیمیترین را از شروع حذف میکنیم .برای یافتن مقداری که برای تقسیم گرادیان
جدید استفاده میکنیم ،همه مقادیر موجود در لیست را جمع میکنیم ،اما ابتدا همه آنها را بر
اساس موقعیت آنها در لیست در یک عدد ضرب میکنیم .مقادیر اخیر در یک مقدار بزرگ
ضرب میشوند ،در حالی که قدیمیترینها در یک مقدار بسیار کوچک ضرب میشوند .به این
ترتیب مجموع در حال اجرا ما به شدت توسط گرادیانهای اخیر تعیین میشود ،اگرچه به میزان
کمتری تحت تاثیر گرادیانهای قدیمیتر است .بهطور خالصه ،برای پیادهسازی کارآمد ،بجای
ذخیره کردن گرادیانهای قبلی مربوط ،از میانگین رو به زوال نمایی از همه گرادیانهای مجذور
گذشته استفاده میشود.
این الگوریتم بهطور تطبیقی میزان بروزرسانی وزنها را در هر مرحله با استفاده از مجموع
وزنی هر مرحله تغییر میدهد .از آنجایی که Adadeltaمیزان یادگیری وزنها را به صورت
99 فصل سوم :شبکههای عصبی پیشخور
جداگانه تنظیم میکند ،هر وزنی که برای مدتی در شیب تند قرار داشته باشد ،سرعت خود را
کاهش میدهد تا به صورت خارج نشود ،اما زمانی که آن وزن در قسمت صافتری قرار میگیرد،
میتواند گامهای بزرگتری بردارد.
جدای از این ،نویسندگان مقاله روشی را برای حذف نیاز به نرخ یادگیری از الگوریتم معرفی
میکنند .آنها خاطرنشان میکنند که واحدهای نرخ یادگیری و میانگین زوال تمام گرادیانهای
مجذور گذشته با هم مطابقت ندارند .آنها این مشکل را با جایگزین کردن نرخ یادگیری با
میانگین رو به زوال دیگری ،از پارامتر مربع بروزرسانی ∆𝜃𝑡2حل میکنند .این شبیه به اهمیت
تغییرات قبلی پارامتر است .با تقسیم ریشه دوم آن بر جذر اهمیت گرادیانهای قبلی ،به مقداری
میرسیم که کم و بیش نسبت اهمیت گرادیانهای قبلی است که برای بروزرسانی پارامترها استفاده
شده است ،یا به عبارت دیگر تاثیر گرادیانهای قبلی بر مقدار فعلی پارامتر .نماد ریاضی آن به
شرح زیر است:
𝜀 √𝐸(∆𝜃𝑡2 )𝑡 +
𝜃𝑡+1 = 𝜃𝑡 − ∇𝑡 (𝜃𝑡 ).
𝜀 √𝐸(∇2 )𝑡 +
𝐸(∆𝜃𝑡2 )𝑡 = 𝛾. 𝐸(∆𝜃 2 )𝑡−1 + (1 − 𝛾) ∆𝜃𝑡2
𝐸(∇2 )𝑡 = 𝛾. 𝐸(∇2 )𝑡−1 + (1 − 𝛾)∇𝑡 (𝜃𝑡 )2
الگوریتم Adadeltaدر keras
RMSprop
الگوریتمی که بسیار شبیه به Adadeltaاست ،اما از ریاضیات کمی متفاوت استفاده میکند،
RMSpropنامیده میشود .این نام از آنجایی ناشی میشود که از یک عملیات میانگین مربعات
ریشه ( ،)root mean-squaredکه اغلب به اختصار RMSنامیده میشود ،برای تعیین تطبیقی
که به گرادیانها اضافه میشود (یا منتشر می شود) استفاده میکند .نماد ریاضی آن به شرح زیر
است:
) 𝑡𝜃( 𝑡∇
𝜃𝑡+1 = 𝜃𝑡 − 𝛼.
𝜀 √𝐸(∇2 )𝑡 +
𝐸(∇2 )𝑡 = 𝛾. 𝐸(∇2 )𝑡−1 + (1 − 𝛾)∇𝑡 (𝜃𝑡 )2
100یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
Adam
الگوریتم های قبلی ایده ذخیره لیستی از گرادیان های مجذور با هر وزن را به اشتراک میگذارند.
سپس ،با جمع کردن مقادیر موجود در این لیست ،شاید پس از مقیاسگذاری آنها ،یک ضریب
مقیاس ایجاد میکنند .گرادیان در هر مرحلهیِ بروزرسانی بر این مجموع تقسیم میشود .
Adagradهنگام ایجاد ضریب مقیاسبندی به همه عناصر موجود در لیست وزن یکسانی
میدهد ،در حالی که Adadeltaو RMSpropعناصر قدیمیتر را کماهمیت تلقی میکنند و
بنابراین سهم کمتری در کل دارند.
مربع کردن گرادیان قبل از قرار دادن آن در لیست از نظر ریاضی مفید است ،اما وقتی یک
عدد را مربع میکنیم ،نتیجه همیشه مثبت است .این بدان معناست که ما مسیر مثبت یا منفی
بودن آن گرادیان در لیست خود را از دست میدهیم که اطالعات مفیدی است .بنابراین ،برای
جلوگیری از از دست دادن این اطالعات ،میتوانیم لیست دومی از گرادیانها را بدون مجذور
کردن آنها نگه داریم .سپس میتوانیم از هر دو لیست برای استخراج ضریب مقیاس خود استفاده
کنیم .این رویکرد الگوریتمی است به نام تخمین لحظه تطبیقی ( adaptive moment
)estimationیا به طور معمول .Adam
تابع زیان
در مرحلهیِ آموزش شبکههای عصبی از یک امتیاز ( )scoreبرای نشان دادن وضعیت فعلی
استفاده میشود .بر اساس این امتیاز ،پارامترهای وزن بهینه جستجو میشوند .به عبارت دیگر،
یک شبکه عصبی با استفاده از امتیاز به عنوان راهنما ،پارامترهای بهینه را جستجو میکند .این
101 فصل سوم :شبکههای عصبی پیشخور
امتیاز از طریق یک تابع زیان (تابع ضرر) ،براساس اندازهگیری میزان خطا بین مقادیر پیشبینی
شده و واقعی محاسبه میشود .فرمول سادهیِ زیر ،تابع زیان را به عنوان یک معادله نشان میدهد:
یک شبکه عصبی از طریق یک فرآیند بهینهسازی آموزش داده میشود و از یک
تابع زیان برای محاسبه خطا بین مقدار پیشبینیشده مدل و خروجی مورد انتظار
(خروجی واقعی) استفاده میکند .برای اهداف مختلف آموزش ،فرآیند بهینهسازی
ممکن است تابع زیان را کمینه یا بیشینه کند ،به این معنی که باید راهحل
مناسبی مانند مجموعهای از پارامترها را ارزیابی کند تا به ترتیب به کمترین یا
باالترین نمره برسد.
با استفاده از تابع زیان میتوان نحوهیِ مدلسازی الگوریتم را برروری دادهها ارزیابی کرد.
انتخاب تابع زیان به نوع مساله بستگی دارد و برای مسائل مختلف طبقهبندی و رگرسیون این
تابع زیان متفاوت خواهد بود .در یک مساله طبقهبندی ،قصد داریم تا یک توزیع احتماالتی برای
مجموعه کالسها پیشبینی کنیم .حال آنکه ،در مسائل رگرسیون ،قصد داریم یک مقدار خاص
را بیابیم.
همچنان که پیشتر بیان شد ،مدلهای رگرسیون با پیشبینی یک مقدار پیوسته بهعنوان مثال
قیمت خودرو ،پیشبینی وام و غیره سروکار دارند .در این بخش ،پرکاربردترین توابع زیان مربوط
به رگرسیون فهرست شدهاند.
با استفاده از قطعه کد زیر میتوان از تابع زیان Mean Square Errorدر Kerasاستفاده کرد:
from tensorflow import keras
...
)(loss_fn = keras.losses.MeanSquaredError
)model.compile(loss=loss_fn, optimizer=..., metrics= ...
با استفاده از قطعه کد زیر میتوان از تابع زیان Mean Absolute Errorدر Kerasاستفاده کرد:
from tensorflow import keras
...
)(loss_fn = keras.losses.MeanAbsoluteError
)model.compile(loss=loss_fn, optimizer=..., metrics= ...
Cross Entropy
این تابع فاصله بین دو توزیع احتمال را محاسبه میکند و به صورت زیر تعریف میشود:
𝑛
1
)̂𝑦(𝐶𝑟𝑜𝑠𝑠 𝐸𝑛𝑡𝑟𝑜𝑝𝑦(𝑦, 𝑦̂) = ∑ 𝑦𝑖 log
𝑛 𝑖=1
با استفاده از قطعه کد زیر میتوان از تابع زیان Cross Entropyدر Kerasاستفاده کرد:
from tensorflow import keras
...
)(loss_fn = keras.losses.CategoricalCrossentropy
)model.compile(loss=loss_fn, optimizer=..., metrics= ...
با استفاده از قطعه کد زیر میتوان از تابع زیان Binary Cross Entropyدر Kerasاستفاده کرد:
from tensorflow import keras
...
loss_fn = keras.losses.binary_crossentropy
)model.compile(loss=loss_fn, optimizer=..., metrics= ...
پسانتشار
یادگیری در یک شبکه عصبی با چندین الیه بهطور کلی شبیه نحوه یادگیری یک پرسپترون است،
با تطبیق وزنها .با این حال ،اینکه چگونه هر وزن باید تغییر کند کمی دشوارتر است .در مورد
یک پرسپترون ،برای بدست آوردن خروجی یک گره ،تنها یک ضرب داخلی بین دادههای ورودی
و وزنها مورد نیاز است .از آنجایی که در یک MLPچندین الیه وجود دارد ،خروجی یک گره
در آخرین الیه با گرفتن ضرب داخلی وزنها و خروجی گرهها در الیه قبلی تعیین میشود .این
مقادیر اخیر هر کدام به یک روش محاسبه میشوند .این بدان معنی است که خطای بدست آمده
در خروجی الیه نهایی می تواند ناشی از وزنهای الیه آخر و همچنین وزنهای الیه(های) قبلی
باشد .بنابراین سوال این است که مسبب این خطای بدست آمده ،وزنهای کدام الیه است .گاهی
اوقات به این مشکل تخصیص اعتبار ( )credit assignmentنیز میگویند .روشی که میتواند
این مشکل را حل کند ،پسانتشار نام دارد.
الگوریتم پس انتشار احتماال اساسیترین بلوک سازنده در یک شبکه عصبی است .پسانتشار
اساسا تدبیر هوشمندانهای برای محاسبه مؤثر گرادیان در شبکههای عصبی چندالیه است .این
الگوریتم از قاعده زنجیرهای حساب دیفرانسیل استفاده میکند و گرادیان خطا را در مسیرهای
مختلف از یک گره تا خروجی محاسبه میکند و از دو فاز اصلی به نام فاز جلورو (پیشرو) و
فاز عقبگرد (پسرو) تشکیل میشود .در این الگوریتم ،پس از هر گذرِ جلورو در یک شبکه،
پسانتشار یک گذر عقبگرد انجام میدهد و در عین حال پارامترهای مدل (وزن ها و بایاسها)
را تنظیم میکند.
▪ یک فاز جلورو برای تولید خروجی بر اساس پارامترهای فعلی و دادههای ورودی
▪ محاسبه تابع زیان برای شکاف بین خروجیهای فعلی و خروجیهای هدف
▪ یک فاز عقبگرد برای محاسبه گرادیان زیان نسبت به پارامترها
104یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
)𝒩(0,1
~ 𝑤0
𝑛𝑖𝑛√
این روش مقیاسبندی واریانس ( )variance scalingنامیده میشود و میتواند عالوه بر
استفاده از تعداد واحدهای ورودی ( ،)Fan-Inبراساس تعداد واحدهای خروجی ( )Fan-Outیا
میانگین آنها اعمال شود .این ایده بسیار شهودی است ،اگر تعداد اتصاالت ورودی یا خروجی
زیاد هستند ،وزنها باید کوچکتر باشند تا از خروجیهای بزرگ جلوگیری شود.
با استفاده از قطعه کد زیر در Kerasمیتوان از variance scalingاستفاده کرد:
from keras import initializers
initializer = initializers.VarianceScaling(scale=1.0, mode='fan_in',
)'distribution='normal
گلورت و بنجیو تجزیه و تحلیلی را برروی گرادیانهای پسانتشار انجام دادند و یک
مقداردهی اولیه (معروف به مقداردهی اولیه )Xavierرا توصیه کردند:
2
√~ 𝑤0 )𝒩(0,1
𝑡𝑢𝑜𝑛 𝑛𝑖𝑛 +
جایی که 𝑡𝑢𝑜𝑛 تعداد واحدهای خروجی را توصیف میکند .این یک نوع قویتر از روش
قبلی است ،چراکه هم اتصاالت ورودی و هم اتصاالت خروجی (که به نوبه خود اتصاالت
ورودی هستند) را در نظر میگیرد .هدف ،تالش برای برآوردن دو الزام ارائه شده قبلی است.
ثابت شده است که مقداردهی اولیه Xavierدر بسیاری از معماریهای عمیق بسیار موثر است
و اغلب انتخاب پیشفرض است.
با استفاده از قطعه کد زیر در Kerasمیتوان از Xavierاستفاده کرد:
from keras import initializers
)(initializer = initializers.GlorotNormal
همه این روشها اصول مشترکی دارند و در بسیاری از موارد قابل تعویض
هستند .همانطور که قبال ذکر شد Xavier ،یکی از قویترین هاست و در اکثر
مسائل کارکرد خوبی دارد .با این حال ،فقط اعتبارسنجی برروی مجموعه داده
واقعی میتواند این را تأیید کند.
106یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
پارامترها
در هر شبکه عصبی عمیق ،دو نوع پارامتر مختلف وجود دارد :یک نوع پارامتر مدل و دیگری
اَبَرپارامتر ( .)hyper parameterپارامترهای مدل آن دسته از پارامترهایی هستند که بهطور
خودکار توسط مدل از دادههای آموزشی شناسایی میشوند .در مقابل ،اَبَرپارامترها آن دسته از
پارامترهایی هستند که قابل تنظیم هستند و باید برای بدست آوردن بهترین عملکرد مدل تنظیم
شوند .به عبارت دیگر ،این پارامترها در طول آموزش آموخته نمیشوند ،اما در شروع فرآیند
یادگیری توسط کاربر تنظیم میشوند .اَبَرپارامترها کل فرآیند یادگیری در شبکه عصبی را تحت
تاثیر قرار میدهند .برخی از اَبَرپارامترها شامل تعداد الیههای پنهان است که ساختار شبکه را
تعیین میکند .نرخ یادگیری یک اَبَرپارامتر دیگر است که به درک نحوه آموزش شبکه کمک میکند.
انتخاب اَبَرپارامتر بهینه نقش مهمی در کل فرآیند آموزش شبکه دارد.
تعمیم و منظمسازی
هدف اصلی از ساخت یک مدل یادگیری عمیق ،یادگیری یک تابع یا یک وظیفه ( )taskمیباشد.
برای دستیابی به این هدف ،به شبکه دادههای آموزشی را تغذیه میکنیم .پس از آموزش یک
شبکهی عصبی با گرادیان کاهشی و پسانتشار ،فرض میکنیم که این عملکرد خوب روی دادههای
دیدهنشده باقی میماند (یعنی دادههایی که در طول آموزش درگیر نشدهاند) .حال آنکه ،لزوما
این بدان معنا نیست که مدل قادر به پیشبینی درست خروجی برای دادههای دیدهنشده هم باشد.
بنابراین ،دو مجموعه اضافی از دادهها برای بهینهسازی معرفی میشوند ،مجموعه اعتبارسنجی
و مجموعه آزمایشی .هر سه مجموعه داده از هم مستقل هستند ،به طوری که هیچ نمونهای در
بین آنها مشترک نیست.
مجموعه اعتبارسنجی در شبکههای عصبی ،معموال برای تنظیم دقیق ابرپارمترهای مدل مانند
معماری شبکه یا نرخ یادگیری استفاده میشود .مجموعه آزمون فقط برای ارزیابی نهایی در
راستایِ بررسی عملکرد شبکه در دادههای دیدهنشده استفاده میشود .اگر یک شبکهی عصبی به
خوبی تعمیم نیابد (قابلیت انتقال دانش به دادههای غیرقابل مشاهده را تعمیم گویند) ،یعنی
زیانِ آموزشِ کم تری نسبت به زیانِ آزمون داشته باشد ،به این حالت بیشبرازش گفته میشود.
107 فصل سوم :شبکههای عصبی پیشخور
در حالی که سناریوی معکوس ،زمانی که زیان آزمون نسبت به زیان آموزش بسیار کمتر باشد،
کمبرازش نامیده میشود (شکل .)5-3
شکل .5-3رفتار تعمیمدهی در منحنی یادگیری با توجه به معیار دقت در دادههای آموزشی و آزمون
بیشبرازش پدیدهای است که در نهایت همه شبکههای عصبی را تحت تاثیر قرار میدهد.
این به دلیل این واقعیت است که آنها فقط از مجموعه دادههای آموزشی یاد میگیرند:
زیرمجموعهای از تمام دادههای ممکن .اینکه آنها در این زیرمجموعه چقدر خوب عمل
میکنند ،تعیین میکند که وزنهای آنها چقدر پاداش یا جریمه بشود .به عبارت دیگر ،حتی اگر
هدف ما دانش تعمیم باشد ،خود شبکهها برای دستیابی به دقت باال در مجموعه دادههای خاصی
طراحی شدهاند .به این ترتیب ،آنها در نهایت با توجه به توانایی انجام این کار ،شروع به حفظ
مجموعه دادههای خود خواهند کرد .این بهخاطر سپردن باعث میشود شبکه منجر به بیشبرازش
شود .شبکهای که بیشبرازش را آغاز کرده است ،ویژگیهای منحصربهفرد و جزئیات خاص
دادهای را که به طور انحصاری در مجموعه دادههای آموزشی یافت میشود ،به خاطر میسپارد
و آنها را بهعنوان مفاهیمِ کلیِ مشترک در همهیِ ورودیهای داده مشابه به اشتباه میگیرد .بنابراین
چنین شبکهای برای تجزیه و تحلیل ورودیها جدید و ناآشنا (مجموعه داده آزمایشی) ،زمان
دشوارتری خواهد داشت .این به این دلیل است که بخشی از صفات متمایزکنندهیِ شناسایی
شده قبلی ،در دادههای جدید وجود ندارند .عالوه بر این ،با افزایش دقت شبکه در طول آموزش،
شکاف بین خطای ایجاد شده در طول آموزش و خطای تولید شده در طول آزمایش نیز افزایش
مییابد .با این حال ،گاهی اوقات هنگام تالش برای حل وظایف بسیار پیچیده ،استفاده از یک
مدل پیچیده اجتنابناپذیر است .افزودن الیههای بیشتر یا نورونها بیشتر ،سطح بیشتری از
استخراج ویژگی را ممکن میسازد که میتواند منجر به یک سطح باالتر از دقت تا یک نقطه
خاص میشود.
بهطور معمول ،بیشبرازش و کمبرازش در شبکههای عصبی عمیق ،مستقیما با ظرفیت مدل
مرتبط است .به زبان ساده ،ظرفیتِ مدلِ یک شبکهیِ عصبیِ عمیق ،بهطور مستقیم با تعداد
پارامترهای داخل شبکه در ارتباط است .ظرفیت مدل تعیین میکند که یک شبکه عمیق تا چه
108یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
حد قادر به برازش با طیف گستردهای از توابع است .اگر ظرفیت خیلی کم باشد ،شبکه ممکن
است نتواند مجموعه آموزشی را تطبیق دهد (کمبرازش) ،در حالی که ظرفیت مدل خیلی بزرگ
ممکن است منجر به حفظ نمونههای آموزشی (بیشبرازش) شود .کمبرازش معموالً برای
شبکههای عصبی عمیق ،مشکل چندانی ندارد .چراکه این مشکل را میتوان با استفاده از معماری
شبکهیِ قویتر یا عمیقتر با پارامترهای بیشتر برطرف کرد .با این حال ،برای اینکه بتوان از
شبکههای عمیق برای دادههای جدید و دیدهنشده استفاده کرد ،باید بیشبرازش را کنترل کرد.
فرآیند کاهش اثر بیشبرازش یا جلوگیری از آن را منظمسازی ( )regularizationمیگویند.
منظمسازی روشی برای کنترل بیشبرازش یا بهتر است بگوییم بهبود خطای تعمیم است.
مناسب بودن دادههای آموزشی را نیز نباید نادیده گرفت .چراکه موفقیت در تعمیم یا حتی
برازش کافی در دادههای آموزشی به این امر بستگی دارد .در غیر این صورت ،مدل ممکن است
تمایل داشته باشد که بیش از حد با ویژگیهایِ خاصِ دادههایِ آموزشی سازگار شود .این امر از
یک طرف به مقدار دادههای موجود برای آموزش بستگی دارد ،چراکه ممکن است یک مجموعه
آموزشی کوچک برای تشخیص الگوها و ساختارهای کلی کافی نباشد و از طرف دیگر به کیفیت
دادههای آموزشی؛ به ویژه در مورد یادگیری بانظارت در موردِ صحتِ برچسبهایِ هدف که از
قبل توسط انسان یا حتی متخصصان انسانی تنظیم شده است .عالوه براین ،اطمینان از اینکه
توزیع و ویژگیهای دادههای آموزشی با دادههای آزمون مطابقت دارد یا به طور کلی با دادههایی
که مدل آموختهشده برای استفاده در آینده برنامهریزی شده است مطابقت داشته باشد ،ضروری
است.
در آموزش مدلهای بزرگ ،معموال خطای آموزش و اعتبارسنجی در طول زمان کاهش مییابد،
اما در یک نقطه ،خطایِ اعتبارسنجی شروع به افزایش میکند .در این مرحله ،مدل شروع به
بیشبرازش میکند و ویژگیهای خاص مجموعه آموزشی را یاد میگیرد .برای توقف در این
مرحله از روش توقف زودهنگام استفاده میشود .این روش ،مدلی که کمترین خطای اعتبارسنجی
را دارد برمیگرداند .بنابراین ،آموزش به یک مجموعه اعتبارسنجی نیاز دارد تا به صورت دورهای
خطای اعتبارسنجی را ارزیابی کند.
در این روش ،آموزش پس از اولین افزایش خطای اعتبارسنجی متوقف نمیشود .بلکه ،شبکه
تا رسیدن به آستانه "تعداد دورههای بدون پیشرفت" آموزش بیشتری میبیند .سپس ،از طریق
ارزیابی دورههای بعدی ،روندِ خطایِ اعتبارسنجی را برای آموزش بیشتر دریافت میکنیم .به
عنوان مثال ،اگر 10بار متوالی خطای اعتبارسنجی نسبت به بهترین خطای اعتبارسنجی هیچ
پیشرفتی نداشته باشد ،آموزش متوقف میشود و مدلی که بهترین خطای اعتبارسنجی را دارد
برگردانده میشود.
109 فصل سوم :شبکههای عصبی پیشخور
حذف تصادفی ،یک روش منظمسازی برای شبکههای عصبی است .ایده کلیدی این است که
نورونها بهصورت تصادفی در هر تکرار آموزش حذف شوند .اگر یک نورون حذف شود ،همه
گرادیانهای وابسته صفر هستند و بنابراین وزن مربوط بروز نمیشود .فرآیند اجرای این روش
به این صورت است که در هر دوره تکرار آموزش ،با یک احتمال 𝑝 هر نرون باقی و با احتمال
)𝑝 (1 −از شبکه حذف خواهد شد .این عمل باعث خواهد شد که در هر دوره تمام ویژگیها
یادگرفته نشوند و با هربار ورود یک داده ویژگیهای متفاوتی از آن برای طبقهبندی استفاده شود.
در شکل 4-3یک شبکه عصبی معمولی و یک شبکه عصبی همراه با حذف تصادفی قابل
مشاهده است.
شکل .6-3یک شبکه عصبی (الف) قبل از حدف تصادفی و (ب) بعد از حذف تصادفی
110یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
متداولترین تفسیر از اثر حذف تصادفی این است که به طور ضمنی گروهی ( )ensembleاز
مدلها را آموزش میدهد .چراکه در هر تکرار نسخه متفاوتی از مدل را ایجاد میکند و هر وزن
با مجموعه وزنهای دیگری بروز میشود .یادگیریِ گروهی از چندین مدل ،یک تکنیک رایج در
یادگیری ماشین برای کاهش خطای تعمیم با این ایده است که یک پیشبینی نادرست از یک مدل
واحد میتواند توسط مدلهای دیگر جبران شود.
از سوی دیگر ،حذف تصادفی را میتوان اینگونه تفسیر کرد که شبکه عصبی مجبوربه بازنمایی
اضافی از دانش بدست آمده از طریق یادگیری است .چراکه دانش خاصی در مورد کالسها یا
ورودیهای خاص لزوماً در برخی از تکرارها در دسترس نیست ،بهدلیل اینکه دانشی که در این
نورونها برای این ورودیها رمزگذاری شده است ،در حال حاضر حذف شدهاند .از اینرو ،برای
یک شبکه عصبی دشوار است تا برروی نمونههای آموزشی خاص ،بیشبرازش کند ،چراکه برخی
نورونهای خاص همیشه قابل دستیابی نیستند.
با استفاده از قطعه کد زیر در Kerasمیتوان به حذف تصادفی دسترسی پیدا کرد:
from keras.layers import Dropout
from keras.models import Sequential
)(model = Sequential
...
))model.add(Dropout(0.5
آموزش یک شبکه ،وزنهای هر الیه را تغییر میدهد .این تغییر باعث میشود که توزیع
( )distributionورودی در طول بروزرسانی الیههای قبلی تغییر کند ،این اثر تغییر متغیر داخلی
( )internal covariate shiftنامیده میشود .این مشکل از آنجا ناشی میشود که پارامترها در
طول فرآیند آموزش مدام تغییر میکنند ،این تغییرات به نوبه خود مقادیر توابع فعالسازی را
تغییر میدهد .تغییر مقادیر ورودی از الیههای اولیه به الیههای بعدی سبب همگرایی کندتر در
طول فرآیند آموزش میشود ،چرا که دادههای آموزشی الیههای بعدی پایدار نیستند .به عبارت
دیگر ،شبکه های عمیق ترکیبی از چندین الیه با توابع مختلف بوده و هر الیه فقط یادگیری
بازنمایی کلی از ابتدای آموزش را فرا نمیگیرد ،بلکه باید با تغییر مداوم در توزیعهای ورودی با
توجه به الیههای قبلی تسلط پیدا کند .حال آنکه بهینهساز بر این فرض بروزرسانی پارامترها را
انجام میدهد که در الیههای دیگر تغییر نکنند و تمام الیهها را همزمان بروز میکند ،این عمل
سبب نتایج ناخواستهای هنگام ترکیب توابع مختلف خواهد شد .در راستای مقابله با تغییر توزیع
در طول یادگیری ،نرمالسازی دستهای معرفی شد .در این روش ،نرمالسازی برروی دادههای
ورودی یک الیه را به گونهای انجام میدهد ،که دارای میانگین صفر و انحراف معیار یک شوند.
111 فصل سوم :شبکههای عصبی پیشخور
با قرار دادن نرمالسازی دستهای بین الیههای پنهان و با ایجاد ویژگی واریانس مشترک ،سبب
کاهش تغییرات داخلی الیههای شبکه میشویم.
از طریق اعمال نرمالسازی دستهای میتوان میزان نرخ یادگیری را افزایش داد و
این امر منجر به آموزش سریعتر میشود .عالوه بر این ،دقت در مقایسه با همان
شبکه بدون نرمالسازی دستهای در حال افزایش است.
)(model = Sequential
...
))(model.add(BatchNormalization
1
https://www.kaggle.com/c/zillow-prize-1/data
2
https://drive.google.com/file/d/1h6LPHNs4F_FnxwfdE_fCIsGeEh30tDBf/view?usp=sharing
112یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
بیایید شروع کنیم! ابتدا کتابخانه pandasرا وارد میکنیم ،کد زیر را در سلول notebookخود
تایپ کرده و Alt+Enterرا فشار دهید:
import pandas as pd
این فقط به این معنا است که اگر بخواهم به کد موجود در بسته " "pandasاشاره کنم ،آن را با
نام pdارجاع خواهم داد .سپس با اجرای کد زیر فایل CSVخود را میخوانیم:
)'df = pd.read_csv('housepricedata.csv
ویژگیهای ورودی ما در ده ستون اول هستند .در آخرین ستون ،ویژگی (برچسب) را داریم که
میخواهیم پیشبینی کنیم :آیا قیمت خانه باالتر از میانگین است یا خیر؟ ( 1برای بله و 0برای
خیر) .اکنون که دیدیم دادهها چگونه به نظر میرسند ،میخواهیم آنها را به آرایههایی تبدیل کنیم
تا ماشین آنها را پردازش کند:
dataset = df.values
برای تبدیل دیتافریم ( )dataframeخود به آرایه ،فقط مقادیر dfرا (با )df.valuesدر متغیر
datasetذخیره میکنیم .برای دیدن آنچه در داخل متغیر " "datasetوجود دارد ،کافی است
datasetرا در سلول notebookخود تایپ کنید و سلول را اجرا کنید (:)Alt+Enter
dataset
اکنون مجموعه داده خود را به ویژگیهای ورودی ( )Xو ویژگی که میخواهیم پیشبینی کنیم
( )Yتقسیم میکنیم .برای انجام این تقسیم ،ما به سادگی 10ستون اول آرایه خود را به متغیری
به نام Xو آخرین ستون آرایه خود را به متغیری به نام Yاختصاص میدهیم .کد انجام اولین
انتساب به این صورت است:
]X = dataset[:,0:10
این ممکن است کمی عجیب به نظر برسد ،اما اجازه دهید تا آنرا شرح دهم که چه چیزی در
داخل ][ قرار دارد .همه چیز قبل از کاما ( ),به ردیفهای آرایه و همه چیز بعد از کاما به
ستونهای آرایه اشاره دارد .از آنجایی که سطرها را از هم جدا نمیکنیم ":" ،را قبل از کاما قرار
میدهیم .این به این معنا است که تمام سطرهای مجموعه داده را برداریم و آن را در Xقرار
دهیم .میخواهیم 10ستون اول را استخراج کنیم ،بنابراین " "0:10بعد از کاما به معنای گرفتن
ستونهای 0تا 9و قرار دادن آن در Xاست (ستون 10را شامل نمیشود) .ستونهای ما از
شاخص 0شروع میشوند ،بنابراین 10ستون اول ستونهای 0تا 9هستند.
سپس آخرین ستون آرایه خود را به Yاختصاص میدهیم:
]Y = dataset[:,10
اکنون مجموعه داده خود را به ویژگیهای ورودی ) (Xو برچسب ،یعنی آنچه میخواهیم
پیشبینی کنیم ) (Yتقسیم کردهایم .مرحله بعدی پردازش این است که اطمینان حاصل کنیم که
مقیاس ویژگیهای ورودی مشابه است .در حال حاضر ،ویژگیهایی مانند مساحت زمین به
صورت هزار ،امتیاز برای کیفیت کلی از 1تا 10متغیر است و تعداد شومینه ها 1 ،0یا 2است.
این امر شروع اولیه شبکه عصبی را دشوار میکند که باعث ایجاد برخی مشکالت عملی میشود.
یکی از راههای مقیاسسازی دادهها استفاده از بسته scikit-learnاست .ابتدا آن را وارد میکنیم:
from sklearn import preprocessing
توجه داشته باشید که ما 0و 1را برای کمک به آموزش شبکه عصبی خود انتخاب کردیم .اکنون
مجموعه دادههای مقیاسشده ما در آرایه X_scaleذخیره میشود .اگر میخواهید ببینید
X_scaleچه شکلی است ،به سادگی سلول زیر را اجرا کنید:
114یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
X_scale
اکنون ،به آخرین مرحله خود در پردازش دادهها رسیدهایم ،یعنی تقسیم مجموعه داده به یک
مجموعه آموزشی ،یک مجموعه اعتبارسنجی و یک مجموعه آزمون (آزمایشی) .برای این منظور
از کد scikit-learnبه نام " "train_test_splitاستفاده خواهیم کرد ،که همانطور که از نام آن
پیداست ،مجموعه داده ما را به یک مجموعه آموزشی و یک مجموعه آزمایشی تقسیم میکند.
ابتدا کد مورد نیاز خود را وارد میکنیم:
from sklearn.model_selection import train_test_split
کد باال اندازه val_and_testرا بهطور مساوی به مجموعه اعتبارسنجی و مجموعه آزمون
تقسیم میکند .به طور خالصه ،ما اکنون در مجموع شش متغیر برای مجموعه دادههای خود
داریم که از آنها استفاده خواهیم کرد:
X_train ▪
X_val ▪
X_test ▪
Y_train ▪
Y_val ▪
Y_test ▪
115 فصل سوم :شبکههای عصبی پیشخور
اگر میخواهید ببینید که شکل آرایهها برای هر یک از آنها چگونه است (یعنی چه ابعادی دارند)،
به سادگی کد زیر را اجرا کنید:
print(X_train.shape, X_val.shape, X_test.shape, Y_train.shape,
)Y_val.shape, Y_test.shape
)(1022, 10) (219, 10) (219, 10) (1022,) (219,) (219,
همانطور که میبینید ،مجموعه آموزشی دارای 1022نقطه داده است درحالی که مجموعه
اعتبارسنجی و آزمون هر کدام دارای 219نقطه داده هستند .متغیرهای Xدارای 10ویژگی
ورودی هستند ،در حالی که متغیرهای Yفقط یک ویژگی برای پیشبینی دارند.
اکنون نوبت به ساخت و آموزش اولین شبکه عصبی ما رسیده است .اولین کاری که باید
انجام دهیم این است که معماری را پیکرهبندی کنیم .فرض کنید شبکه عصبی با معماری به شکل
زیر میخواهیم:
دقیقا مانند شکل قبلی که معماری خود راترسیم کردهایم ،قطعه کد باال همین معماری را تعریف
کرده است .قطعه کد باال را میتوان اینگونه تفسیر کرد:
)]model = Sequential([...
در اولین الیه ،یک الیه کامال متصل با 32نورون داریم ،تابع فعالسازی ReLUو شکل
( )shapeورودی 10است ،چراکه ما 10ویژگی ورودی داریم .توجه داشته باشید که ""Dense
به یک الیه کامال متصل اشاره دارد.
Dense(32, activation='relu'),
الیه دوم ما نیز یک الیه کامال متصل با 32نورون و تابع فعالسازی ReLUاست .توجه داشته
باشید که ما مجبور نیستیم شکل ورودی را توصیف کنیم ،چراکه Kerasمیتواند از خروجی
الیه اول ما این را نتیجه بگیرد.
Dense(1, activation='sigmoid'),
الیه سوم ما یا همان الیه خروجی یک الیه کامال متصل با 1نورون و تابع فعالسازی sigmoid
است .همینطور که دیدید توانستیم معماری مدل خود را به صورت کد بنویسیم.
اکنون که معماری خود را مشخص کردهایم ،باید بهترین پارامترها را برای آن پیدا کنیم .قبل
از شروع آموزش ،باید مدل را توسط موارد زیر پیکربندی کنیم:
▪ به او بگویید از کدام الگوریتم میخواهید برای انجام بهینهسازی استفاده کنید.
▪ به او بگویید از چه تابع زیانی استفاده کند.
▪ به آن بگویید که چه معیارهای دیگری را میخواهید جدا از تابع زیان ردیابی کنید.
برای پیکربندی مدل با این تنظیمات ،باید تابع model.compileرا فراخوانی کنیم ،به این صورت:
model.compile(optimizer='sgd',
loss='binary_crossentropy',
)]'metrics=['accuracy
' 'sgdبه گرادیان کاهشی تصادفی اشاره دارد (در اینجا ،به گرادیان کاهشی ریزدستهای اشاره
دارد.
loss='binary_crossentropy',
برای خروجیهایی که مقادیر 1یا 0را میگیرند ،از تابع زیان ''binary_crossentropy
(آنتروپی متقاطع دودویی) استفاده میشود.
]'metrics=['accuracy
در نهایت ،ما میخواهیم دقت را نیز همراه با تابع زیان ردیابی کنیم .حاال وقتی این سلول را
اجرا کردیم ،آماده آموزش هستیم!
آموزش شبکه در kerasبسیار ساده است و از ما میخواهد تنها یک خط کد بنویسیم:
hist = model.fit(X_train, Y_train,
batch_size=32, epochs=100,
))validation_data=(X_val, Y_val
برای این کار از تابع " "fitاستفاده میکنیم که برازش پارامترها به دادهها را انجام میدهد .باید
مشخص کنیم که روی چه دادههایی آموزش میدهیم که توسط X_trainو Y_trainمشخص
شدهاند .سپس ،اندازه ریزدسته (توسط پارامتر )batch_sizeخود را مشخص میکنیم و مدت
زمانی که میخواهیم آن را آموزش دهیم ( )epochsمشخص میکنیم .در نهایت ،ما مشخص
میکنیم که دادههای اعتبارسنجی ما چیست تا مدل به ما بگوید در هر نقطه در مورد دادههای
اعتبارسنجی چگونه عمل میشود .این تابع یک تاریخچه را تولید میکند که آن را در متغیر hist
ذخیره میکنیم .زمانی که به مصورسازی رسیدیم ،از این متغیر استفاده خواهیم کرد .حاال ،سلول
را اجرا کنید و آموزش آن را تماشا کنید! خروجی شما باید به شکل زیر باشد:
Epoch 1/100
32/32 [==============================] - 0s 5ms/step - loss: 0.6990 - accuracy: 0.3542 -
val_loss: 0.6974 - val_accuracy: 0.3699
Epoch 2/100
32/32 [==============================] - 0s 2ms/step - loss: 0.6955 - accuracy: 0.4022 -
val_loss: 0.6943 - val_accuracy: 0.4110
Epoch 3/100
32/32 [==============================] - 0s 2ms/step - loss: 0.6926 - accuracy: 0.4706 -
val_loss: 0.6915 - val_accuracy: 0.4703
Epoch 4/100
32/32 [==============================] - 0s 2ms/step - loss: 0.6899 - accuracy: 0.5499 -
val_loss: 0.6889 - val_accuracy: 0.5616
Epoch 5/100
32/32 [==============================] - 0s 2ms/step - loss: 0.6874 - accuracy: 0.6468 -
val_loss: 0.6864 - val_accuracy: 0.6758
Epoch 6/100
32/32 [==============================] - 0s 2ms/step - loss: 0.6849 - accuracy: 0.7133 -
val_loss: 0.6842 - val_accuracy: 0.7123
Epoch 7/100
32/32 [==============================] - 0s 2ms/step - loss: 0.6828 - accuracy: 0.7524 -
val_loss: 0.6821 - val_accuracy: 0.7489
Epoch 8/100
32/32 [==============================] - 0s 2ms/step - loss: 0.6807 - accuracy: 0.7564 -
val_loss: 0.6801 - val_accuracy: 0.7717
Epoch 9/100
32/32 [==============================] - 0s 2ms/step - loss: 0.6787 - accuracy: 0.7779 -
val_loss: 0.6781 - val_accuracy: 0.8037
Epoch 10/100
32/32 [==============================] - 0s 2ms/step - loss: 0.6767 - accuracy: 0.8072 -
val_loss: 0.6761 - val_accuracy: 0.8128
Epoch 11/100
118یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
32/32 [==============================] - 0s 2ms/step - loss: 0.6746 - accuracy: 0.8317 -
val_loss: 0.6740 - val_accuracy: 0.8219
Epoch 12/100
32/32 [==============================] - 0s 2ms/step - loss: 0.6725 - accuracy: 0.8239 -
val_loss: 0.6717 - val_accuracy: 0.8265
.
.
.
.
.
.
Epoch 95/100
32/32 [==============================] - 0s 2ms/step - loss: 0.2931 - accuracy: 0.8865 -
val_loss: 0.3051 - val_accuracy: 0.9041
Epoch 96/100
32/32 [==============================] - 0s 2ms/step - loss: 0.2920 - accuracy: 0.8816 -
val_loss: 0.3043 - val_accuracy: 0.8995
Epoch 97/100
32/32 [==============================] - 0s 2ms/step - loss: 0.2911 - accuracy: 0.8855 -
val_loss: 0.3044 - val_accuracy: 0.9041
Epoch 98/100
32/32 [==============================] - 0s 2ms/step - loss: 0.2901 - accuracy: 0.8865 -
val_loss: 0.3030 - val_accuracy: 0.8995
Epoch 99/100
32/32 [==============================] - 0s 2ms/step - loss: 0.2896 - accuracy: 0.8806 -
val_loss: 0.3025 - val_accuracy: 0.8995
Epoch 100/100
32/32 [==============================] - 0s 2ms/step - loss: 0.2884 - accuracy: 0.8816 -
val_loss: 0.3017 - val_accuracy: 0.8995
اکنون میبینید که مدل در حال آموزش است! با مشاهده اعداد ،باید بتوانید کاهش زیان و
افزایش دقت را در طول زمان مشاهده کنید .در این مرحله ،میتوانید با ابرپارامترهای مختلف
شبکه عصبی را آزمایش کنید .سلولها را دوباره اجرا کنید تا ببینید وقتی که ابرپارامترهای خود
را تغییر دادهاید ،آموزش شما چگونه تغییر میکند .هنگامی که از مدل نهایی خود راضی بودید،
میتوانید آن را در مجموعه آزمایشی ارزیابی کنید .برای یافتن دقت در مجموعه آزمایشی خود،
این قطعه کد را اجرا میکنیم:
]model.evaluate(X_test, Y_test)[1
دلیل اینکه ما شاخص 1را بعد از تابع model.evaluateداریم این است که تابع زیان را به عنوان
عنصر اول و دقت را به عنوان عنصر دوم برمیگرداند .از آنجایی که برای نمایش خروجی دقت
کافیست ،از این طریق میتوان به آن دسترسی داشته باشید .به دلیل تصادفی بودن نحوه تقسیم
مجموعه دادهها و همچنین مقداردهی اولیه وزنها ،هر بار که notebookخود را اجرا میکنیم،
اعداد و نمودار کمی متفاوت خواهند بود .با این وجود ،اگر از معماری که در باال مشخص شده
پیروی کرده باشید ،باید دقت آزمون را بین 80تا 95درصد دریافت کنید! همانند خروجی زیر:
7/7 [==============================] - 0s 2ms/step - loss: 0.3281 - accuracy: 0.8584
0.8584474921226501
تبریک میگویم! شما توانستید اولین شبکه عصبی خود را طراحی کرده و آن را آموزش دهید.
در بخشهای قبلی در مورد بیشبرازش و برخی تکنیکهای منظمسازی صحبت کردیم .حاال
چگونه بفهمیم که مدل ما در حال حاضر بیشبرازش شده است؟ کاری که میتوانیم انجام دهیم،
این است که از زیان آموزشی و زیان اعتبارسنجی را برروی تعداد دورههای سپری شده ترسیم
کنیم .برای مصورسازی اینها ،از بسته matplotlibاستفاده میکنیم .طبق معمول ،باید کدی را
که میخواهیم استفاده کنیم وارد کنیم:
import matplotlib.pyplot as plt
119 فصل سوم :شبکههای عصبی پیشخور
سپس ،میخواهیم زیان آموزش و زیان اعتبارسنجی را مصورسازی کنیم .برای انجام این کار،
این قطعه کد را اجرا کنید:
)]'plt.plot(hist.history['loss
)]'plt.plot(hist.history['val_loss
)'plt.title('Model loss
)'plt.ylabel('Loss
)'plt.xlabel('Epoch
)'plt.legend(['Train', 'Val'], loc='upper right
)(plt.show
ما هر خط از قطعه کد باال را توضیح خواهیم داد .دو خط اول میگوید که میخواهیم lossو
val_lossرا ترسیم کنیم .خط سوم عنوان این نمودار را مشخص میکند .Model loss :خط
چهارم و پنجم به ما میگوید که محور yو xبه ترتیب باید چه برچسبی داشته باشند .خط ششم
شامل یک شرح برای نمودار ما است و مکان شرح در سمت راست باال خواهد بود و خط هفتم
به jupyter notebookمیگوید که نمودار را نمایش دهد .خروجی شما باید چیزی شبیه به این
باشد:
ما میتوانیم همین کار را برای ترسیم دقت آموزشی و دقت اعتبارسنجی با کد زیر انجام دهیم:
)]'plt.plot(hist.history['accuracy
)]'plt.plot(hist.history['val_accuracy
)'plt.title('Model accuracy
)'plt.ylabel('Accuracy
)'plt.xlabel('Epoch
)'plt.legend(['Train', 'Val'], loc='lower right
)(plt.show
از آنجایی که پیشرفتهای مدل ما در مجموعه آموزشی تا حدودی با بهبود مجموعه اعتبارسنجی
مطابقت دارد ،به نظر نمیرسد که بیشبرازش مشکل بزرگی در مدل ما باشد (با این حال میتوان
آن را از طریق بهینهسازی ابرپارمترها بهبود بخشید).
به منظور معرفی منظمسازی به شبکه عصبی خود ،بیایید با یک شبکه عصبی فرموله کنیم که
به شدت در مجموعه آموزشی مطابقت داشته باشد .ما این را model_2مینامیم.
[(model_2 = Sequential
Dense(1000, activation='relu', input_shape=(10,)),
Dense(1000, activation='relu'),
Dense(1000, activation='relu'),
Dense(1000, activation='relu'),
Dense(1, activation='sigmoid'),
)]
model_2.compile(optimizer='adam',
loss='binary_crossentropy',
)]'metrics=['accuracy
در اینجا ،ما یک مدل بسیار بزرگتر ساختهایم و از بهینه ساز Adamاستفاده میکنیمAdam .
یکی از رایجترین بهینهسازهایی است که در معماریهای شبکههای عصبی استفاده میشود ،به
دلیل اینکه سریعتر به زیان کمتر میرسد .اگر این کد را اجرا کنیم و نمودارهای زیان را برای
hist_2با استفاده از کد زیر رسم کنیم (توجه داشته باشید که کد یکسان است با این تفاوت که
به جای histاز hist_2استفاده میکنیم):
)]'plt.plot(hist_2.history['loss
)]'plt.plot(hist_2.history['val_loss
)'plt.title('Model loss
)'plt.ylabel('Loss
121 فصل سوم :شبکههای عصبی پیشخور
)'plt.xlabel('Epoch
)'plt.legend(['Train', 'Val'], loc='upper right
)(plt.show
این نشانه بارز بیشبرازش است .زیان آموزشی در حال کاهش است ،اما زیان اعتبارسنجی بسیار
باالتر از زیان آموزشی و در حال افزایش است .اگر دقت را با استفاده از کد زیر ترسیم کنیم:
)]'plt.plot(hist_2.history['accuracy
)]'plt.plot(hist_2.history['val_accuracy
)'plt.title('Model accuracy
)'plt.ylabel('Accuracy
)'plt.xlabel('Epoch
)'plt.legend(['Train', 'Val'], loc='lower right
)(plt.show
اکنون ،بیایید برخی از استراتژیهای خود را برای کاهش بیشبرازش امتحان کنیم .در بخشهای
پیشین ما چندین روش را برای جلوگیری از بیشبرازش معرفی کردیم .با این حال ،در این بخش
ما تنها از حذف تصادفی استفاده میکنیم .ابتدا ،بیایید کدی را که برای حذف تصادفی نیاز داریم
را وارد کنیم:
from keras.layers import Dropout
آیا میتوانید تفاوت بین مدل 3و مدل 2را تشخیص دهید؟ یک تفاوت اصلی وجود دارد:
برای اضافه کردن ،Dropoutیک الیه جدید مانند این اضافه کردیم:
Dropout(0.5),
این به این معنی است که نورونهای الیه قبلی در حین آموزش 0.5احتمال حذف دارند .بیایید
آن را کامپایل کرده و با همان پارامترهای مدل 2خود اجرا کنیم.
model_3.compile(optimizer='adam',
loss='binary_crossentropy',
)]'metrics=['accuracy
همانطور که مشاهده میشود ،زیان اعتبارسنجی نسبت مدل 2بیشتر با از زیان آموزش ما
مطابقت دارد (با این حال این مدل همچنان مطلوب نیست و مدل بیشبرازش شده است).
بیایید دقت را با قطعه کد مشابه ترسیم کنیم:
)]'plt.plot(hist_3.history['accuracy
)]'plt.plot(hist_3.history['val_accuracy
)'plt.title('Model accuracy
)'plt.ylabel('Accuracy
)'plt.xlabel('Epoch
)'plt.legend(['Train', 'Val'], loc='lower right
)(plt.show
در مقایسه با مدل ،2ما بیشبرازش را به میزان قابل توجهی کاهش دادهایم! به این ترتیب است
که ما تکنیکهای منظمسازی را برای کاهش بیشبرازش در مجموعه آموزشی اعمال میکنیم.
میتوانید به عنوان تمرین ،ابرپارمترها را تغییر داده و نتایج را مقایسه کنید.
124یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
خالصه فصل
▪ شبکههای عصبی مصنوعی مدل محاسباتی هستند که نحوهی عملکرد سلولهای عصبی
در مغز انسان را تقلید میکند.
▪ هر شبکه عصبی مصنوعی دارای یک الیه ورودی ،یک الیه خروجی و یک یا چند الیه پنهان
میباشد.
▪ سادهترین نوع مدلسازی یک نورون را پرسپترون گویند که میتواند دارای تعداد زیادی
ورودی تنها با یک خروجی باشد.
▪ محدودیت اصلی شبکههای عصبی پرسپترون ،عدم توانایی در طبقهبندی دادههایی است
که جداییپذیر خطی نیستند.
▪ هدف از فرآیند یادگیری در شبکههای عصبی ،یافتن مجموعهای از مقادیر وزنی است که
باعث میشود خروجی شبکه عصبی تا حد امکان با مقادیر هدف واقعی مطابقت داشته
باشد.
▪ تابع فعالساز تصمیم میگیرد که یک نرون باید فعال شود یا خیر.
آزمونک
.1انتخاب نرخ یادگیری خیلی کوچک و یا خیلی بزرگ چه تاثیری در فرآیند یادگیری دارد؟
.2پدیده محو گرادیان را شرح دهید؟
.3ویژگیهای مطلوب یک تابع فعالسازی چیست؟
.4در الیه خروجی مسائل طبقهبندی دودویی و چندکالسه از کدام تابع فعالسازی استفاده
میشود؟
.5بهینهسازها چه نقشی در فرآیند یادگیری شبکههای عصبی دارند؟
تمرین
یک شبکه عصبی با دو الیه پنهان بسازید تا به طبقهبندی مجموعه داده Irisبپردازد .نمودارهای دقت و
زیان را برای مجموعه آموزشی و اعتبارسنجی در حین آموزش مصورسازی کنید.
مقدمه
در این فصل به معرفی مفاهیم شبکههای عصبی کانولوشنی میپردازیم .این مفاهیم ،شامل اجزای
اصلی شبکه هستند که معماری یک شبکه عصبی کانولوشنی را تشکیل میدهند .شبکههای
عصبی کانولوشنی برای دادههای بدون ساختار همانند تصاویر عملکرد بسیار خوبی دارند .پس
از آشنایی کامل با معماری شبکههای عصبی کانولوشنی ،در انتهای فصل به پیادهسازی یک مثال
عملی با استفاده از شبکه عصبی کانولوشنی در kerasمیپردازیم.
چیزی که در مورد شبکه کانولوشنی خاص است ،نحوه ساختاربندی اتصاالت بین نورونها
و معماری الیه پنهان منحصر به فردی است که از مکانیسم پردازش دادههای بصری خودمان در
داخل قشر بینایی ما الهام گرفته شده است و برخالف شبکههای عصبی پیشخور ،الیهها در
CNNدر 3بعد سازماندهی شده اند :عرض ،ارتفاع و عمق.
یکی از مهمترین ویژگیهای شبکه کانولوشنی را که باید بدون توجه به اینکه چند الیه در
معماری آن وجود دارد را به خاطر بسپارید ،این است که کل معماری یک CNNاز دو بخش
اصلی تشکیل شده است:
شبکههای عصبی کانولوشنی دارای سه ویژگی متمایز در مقایسه با سایر شبکههای عصبی
هستند:
.1میدان پذیرای محلی ( :)local receptive fieldsهر نورون در یک CNNمسئول یک
منطقه تعریف شده از دادههای ورودی است و این به نورونها امکان میدهد تا الگوهایی
128یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
مانند خطوط ،لبهها و جزئیات کوچکی که تصویر را میسازند ،بیاموزند .این ناحیه تعریف
شده از فضا که یک نورون یا واحد در دادههای ورودی در معرض آن قرار میگیرد ،میدان
پذیرای محلی نامیده میشود .میدان پذیرا با اندازه فیلتر یک الیه در یک شبکه عصبی
کانولوشنی تعریف میشود.
.2اشتراکگذاری پارامتر ( )parameter sharingو اتصالمحلی(:)Local connectivity
هر الیه کانولوشنی شامل چندین فیلتر میباشد و این یک ابرپارامتر از پیش تعریف شده
است .هر یک از این فیلترها دارای یک عرض و ارتفاع تنظیم شده است که مربوط به
میدان پذیرای محلی یک نورون است .فیلترهایی که بر روی دادههای ورودی عمل
میکنند ،نقشه ویژگی ( )feature mapرا در خروجی الیه کانولوشنی ایجاد میکنند.
اشتراکگذاری پارامتر به اشتراکگذاری وزنها توسط همه نورونها در یک نقشه ویژگی
است .از طرف دیگر ،اتصال محلی مفهومی است که هر نورون فقط به زیرمجموعهای از
نورونها متصل است ،برخالف یک شبکه عصبی پیشخور که در آن همه نورونها کامال
بهم متصل هستند .این ویژگیها به کاهش تعداد پارامترها در کل سیستم کمک میکند و
محاسبات را کارآمدتر میکند.
.3زیرنمونهگیری ( )sub-samplingیا ادغام ( :)poolingزیرنمونهگیری یا ادغام اغلب
بالفاصله پس از یک الیه کانولوشنی در CNNمیآید .نقش آن پایین آوردن خروجی یک
الیه کانولوشنی در امتداد ابعاد فضایی ارتفاع و عرض است .عملکرد اصلی ادغام ،کاهش
تعداد پارامترهایی است که باید توسط شبکه یاد گرفته شود .این ویژگی ،همچنین سبب
کاهش اثر بیشبرازش میشود و در نتیجه افزایش عملکرد و دقت کلی شبکه را به همراه
دارد.
شبکههای کانولوشنی ،نقش مهمی را در تاریخچه یادگیری عمیق بههمراه
داشتهاند .آنها نمونهای مهم و موفق در فهم ما از مطالعه مغز در کاربردهای
یادگیری ماشین هستند .شبکههای عصبی کانولوشنی جزو اولین شبکههای
عصبی بودند که در حل و انجام کابردهای تجاری مهم مورد استفاده قرار گرفته
و حتی تا امروز در صدر برنامههای کابردی تجاری یادگیری عمیق قرار دارند.
عملگر کانولوشن
شبکههای کانولوشنی به دستهای از شبکههای عصبی تعلق دارند که تصویر را به عنوان ورودی
میگیرند ،آن را در معرض ترکیبی از وزنها و سوگیریها قرار میدهند ،ویژگیها را استخراج
129 فصل چهارم :شبکههای عصبی کانولوشنی
میکنند و نتایج را بدست میآورند .آنها تمایل به کاهش ابعاد تصویر ورودی با استفاده از یک
هسته دارند که استخراج ویژگیها را در مقایسه با شبکه عصبی پیشخور آسانتر میکند .اساس
یک شبکهی کانولوشنی عملگر کانولوشن است.
کانولوشن دوبعدی اساسا یک عملیات نسبتا ساده است .شما با یک هسته شروع میکنید،
که یک ماتریس کوچک از وزنها است .این هسته روی دادههای ورودی دوبعدی میلغزد،
ضرب درایهای را با بخشی از ورودی که در حال حاضر روی آن است انجام میدهد و سپس
نتایج را در یک پیکسل خروجی خالصه میکند (شکل .)2-4هسته این فرآیند را برای هر مکانی
که روی آن میلغزد تکرار میکند و یک ماتریس دو بعدی از ویژگیها را به ماتریس دو بعدی
دیگر از ویژگیها تبدیل میکند .ویژگیهای خروجی اساساً ،مجموع وزندار ویژگیهای ورودی
هستند که تقریبا در همان مکان پیکسل خروجی در الیه ورودی قرار دارند.
در مثال باال ،ویژگیهای ورودی ،5×5=25و ویژگیهای خروجی 3×3=9است .اگر این
یک الیه کامل متصل استاندارد بود ،ماتریسِ وزنی به تعداد پارامتر 29×9=225خواهیم داشت
که هر ویژگی خروجی مجموع وزنی هر ویژگی ورودی است .کانولوشنها به ما این امکان را
میدهند که این تبدیل را تنها با 9پارامتر انجام دهیم.
تأثیر کانولوشن ،تأکید بر مرزهای اشکال مختلف است .هستههای متغیر را میتوان به منظور
برآوردن نیازهای دقیق تنظیم کرد .با این حال ،به جای تالش برای انجام آن به صورت دستی،
یک شبکه کانولوشن عمیق این وظایف را به فرآیند یادگیری واگذار میکند.
کاربرد موازی هستههای (فیلترهای) مختلف ،همپوشانیهای پیچیدهای را به همراه دارد که
میتواند استخراج ویژگیهایی را که واقعاً برای طبقهبندی مهم هستند ،ساده کند .تفاوت اصلی
بین یک الیه کامال متصل و یک الیه کانولوشن ،توانایی الیه دوم برای کار با یک هندسه موجود
است که تمام عناصر مورد نیاز برای تشخیص یک شی از یک شی دیگر را رمزگذاری میکند.
این عناصر را نمیتوان فوراً تعمیم داد ،اما به پردازش بعدی برای انجام یک ابهامزدایی نیاز دارد.
130یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
به عنوان مثال ،چشم و بینی تقریبا شبیه بههم هستند .چگونه میتوان تصویر را بدرستی تقسیم
کرد؟ پاسخ با یک تحلیل مضاعف ارائه میشود :تفاوتهای ظریفی وجود دارد که میتوان آنها
را با فیلترهای ریزدانه کشف کرد و مهمتر از همه ،هندسه سراسری اشیا ،مبتنی بر روابط درونی
است که تقریبا ثابت هستند .به عنوان مثال ،چشمها و بینی باید یک مثلث متساویالساقین را
تشکیل دهند ،زیرا تقارن صورت داللت بر فاصله یکسان بین هر چشم و بینی دارد .این را میتوان
از قبل ،مانند بسیاری از تکنیکهای پردازش تصویر انجام داد ،یا به لطف قدرت یادگیری عمیق،
میتوان آن را به فرآیند آموزش واگذار کرد .از آنجایی که تابع هزینه و کالسهای خروجی به
طور ضمنی تفاوتها را کنترل میکنند ،یک شبکه کانولوشن عمیق میتواند یاد بگیرد که برای
رسیدن به یک هدف خاص چه چیزی مهم است و در عین حال تمام جزئیات بیفایده را کنار
بگذارد.
الیه کانولوشن
الیه کانولوشن مهمترین بلوک سازنده یک CNNاست .این الیه شامل مجموعهای از فیلترها که
همچنین به عنوان هستهها ( )kernelsیا آشکارسازهای ویژگی ( )feature detectorsشناخته
میشود ،هستند که در آن هر فیلتر در تمام مناطق دادههای ورودی اعمال میشود .به عبارت
دیگر ،وظیفه اصلی الیه کانولوشن ،شناسایی ویژگیهای یافت شده در مناطق محلی تصویر
ورودی است که این ویژگیها در کل مجموعه داده مشترک هستند .این شناسایی ویژگیها از
طریق اعمال فیلترها منجر به تولید نقشه ویژگی میشود .الیه کانولوشنی ،یک فیلتر محلی را بر
روی تصویر ورودی اعمال میکند .این امر منجر میشود طبقهبندی بهتری در پیکسلهای
همسایهای که همبستگی بیشتری بین آنها وجود دارد در همان تصویر صورت پذیرد .به عبارت
دیگر ،پیکسلهای تصاویر ورودی میتوانند با یکدیگر همبستگی داشته باشند .به عنوان مثال،
در تصاویر صورت ،بینی همیشه بین چشمها و دهان قرار دارد .وقتی فیلتر را به زیرمجموعهای
از تصویر اعمال میکنیم ،برخی از ویژگیهای محلی را استخراج میکنیم .از این الیه به عنوان
الیه استخراج ویژگی نیز یاد میشود .چراکه ویژگیهای تصویر در این الیه استخراج میشوند.
هر الیه کانولوشن دارای مجموعه خاصی از ابرپارمترها است که هر یک از آنها تعداد
ارتباطات و اندازهیِ خروجیِ نقشههایِ ویژگی را تعیین میکند:
• اندازه هسته :اندازهی هستهی ( Kگاهی اوقات اندازه فیلتر نیز نامیده میشود) میدان
پذیرا را توصیف میکند که برای همه مکانهای ورودی اعمال میشود .افزایش این
پارامتر به الیه کانولوشن اجازه میدهد تا اطالعات فضایی بیشتری را دریافت کند،
در حالی که بهطور همزمان تعداد وزنهای شبکه را افزایش میدهد.
• تعداد هسته :تعداد هستهها مستقیما با تعداد پارامترهای قابل یادگیری و عمق D
حجم خروجی یک الیه پیچش مطابقت دارد .همانطور که هر هسته یک نقشه ویژگی
131 فصل چهارم :شبکههای عصبی کانولوشنی
خروجی جداگانه تولید میکند ،هستههای Dیک نقشهیِ ویژگی خروجی با عمق D
را تولید میکنند.
• گام :پیچش را میتوان به عنوان جمعوزنی با "لغزاندن" یک هسته بر روی یک حجم
ورودی درک کرد .با این حال ،نیازی نیست که "لغزش" با یک فاصله یک پیکسل در
یک زمان اتفاق بیفتد ،چیزی که گام توصیف میکند .گام 𝑆 تعداد پیکسلهایی را که
هسته بین هر محاسبهیِ ویژگیِ خروجی جابجا میشود را مشخص میکند .گامهای
بزرگتر ،نقشههایِ ویژگیِ خروجیِ کوچکتری تولید میکنند ،زیرا محاسبات کمتری
انجام میشود .این مفهوم در شکل زیر نشانداده شده است:
• الیهگذاری-صفر :به دلیل نحوه عملکرد عملیات پیچش ،از الیهگذاری-صفر برای
کنترل کاهش ابعاد پس از اعمال فیلترهای بزرگتر از 1*1و جلوگیری از گم شدن
اطالعات در حاشیه استفاده میشود .به عبارت دیگر ،از الیهگذاری-صفر اغلب
استفاده میشود تا ابعاد فضایی الیههای ورودی و خروجی را یکسان نگه داشت .با
اضافه کردن ورودیِ صفر در اطراف حاشیه ،میتوان کوچکشدن ابعاد فضایی هنگام
انجام پیچش را دور زد .مقدار صفرهای اضافه شده در هر طرف برای هر بعد فضایی
یک ابرپارمتر اضافی 𝑃 است .نمونهای از الیهگذاری صفر در شکل زیر نشان داده
شده است:
فراخش این امکان برای یک الیهیِ کانولوشن وجود دارد که وسعت فضایی بیشتری
از ورودی را بگیرد و در عین حال مصرف حافظه را ثابت نگه دارد .مفهوم
کانولوشنهای فراخش که گاهی اوقات کانولوشنهای آتروس ( atrous
)convolutionsنیز نامیده میشود ،با فراخشهای مختلف در شکل 3-4نشان داده
شده است.
با توجه به اندازهیِ حجم ورودی 𝑊 ،اندازهیِ هستهیِ 𝐾 ،گام 𝑆 ،فراخش 𝑑 و 𝑃 الیهگذاری،
حجم خروجی حاصل به صورت زیر محاسبه میشود:
)𝑊 + 2𝑃 − 𝐾 − (𝐾 − 1)(𝑑 − 1
⌊ = 𝑜𝑊 ⌋ + 1.
𝑆
را شناسایی کنیم .این بدان معنی است که ما باید پارامترهای کمتری را ذخیره کنیم که نه تنها نیاز
به حافظه را کاهش میدهد ،بلکه کارایی آماری مدل را نیز بهبود میبخشد .ثانیاً ،شبکههای
عصبی پیچشی از اشتراکگذاری پارامتر استفاده میکنند .به این معنا که آنها از پارامترهای
مشابه برای چندین تابع دوباره استفاده میکنند .اشتراکگذاری پارامترها همچنین باعث آخرین
مزیت اصلی یعنی هموردایی ( )Equivarianceمیشود .هموردایی به این معنی است که اگر
ورودی جابجا شود ،خروجی نیز به همان صورت جابجا میشود .این ویژگی برای پردازش
دادههای دوبعدی ضروری است ،چراکه اگر یک تصویر یا بخشی از یک تصویر به جای دیگری
در تصویر منتقل شود ،نمایش یکسانی خواهد داشت.
▪ :filtersتعداد فیلترها
▪ :kernel_sizeعددی که هم ارتفاع و هم عرض پنجره کانولوشن را مشخص میکند.
▪ :stridesگام کانولوشنی .اگر چیزی را مشخص نکنید ،به صورت پیشفرض روی یک
تنظیم میشود.
134یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
الیه ادغام
از مزایای الیههای کانولوشن این است که تعداد پارامترهای مورد نیاز را کاهش میدهد ،عملکرد
را بهبود میبخشد و بیشبرازش را کاهش میدهد .پس از یک عملگر کانولوشن ،اغلب عملیات
دیگری انجام میشود :ادغام .الیه ادغام به کاهش میزان توان محاسباتی مورد نیاز برای پردازش
دادهها کمک میکند و مسئول کاهش ابعاد است .با کمک کاهش ابعاد ،میزان قدرت پردازش
الزم برای پردازش مجموعه داده کاهش پیدا میکند .ادغام را میتوان به دو نوع تقسیم کرد :ادغام
حداکثری ( )maximum poolingو ادغام میانگین ( .)average poolingمتدوالترین نوع
اداغام ،ادغام حداکثری و ایجاد شبکههای ( )2×2در هر بخش و انتخاب نورون با حداکثر
مقدار فعالسازی در هر شبکه و کنار گذاشتن بقیه است .بدیهی است که چنین عملیاتی %75از
نورونها را دور میاندازد و تنها نورونهایی را که بیشترین نقش را ایفا میکنند ،حفظ میکند.
در مقابل ،در ادغام میانگین ،میانگینِ مقدار هسته محاسبه میشود (شکل .)4-3
برای هر الیه ادغام دو پارامترِ اندازهيِ سلول و گام ،مشابه به پارامترهای گام و الیهگذاری در
الیههای کانولوشن وجود دارد .یک انتخاب معمول انتخاب اندازه سلول 2و گام 2است .اگرچه
انتخاب اندازه سلول 3و گام 2غیرمعمول نیست .البته باید توجه داشت که اگر اندازه سلول
خیلی بزرگ باشد ،ممکن است الیه ادغام اطالعات زیادی را دور بیندازد و مفید نباشد.
الزم به ذکر است که مانند نحوه استفاده از توابع فعالسازی مختلف ،میتوانیم
از عملگرهای ادغام متفاوت نیز استفاده کنیم .با این حال ،استفاده از ادغام
حداکثری یکی از رایجترین عملگرها است ،اما ادغام میانگین هم غیرمعمول
نیست .در عمل ،ادغام حداکثری اغلب بهتر عمل میکند ،چراکه مرتبطترین
ساختارها را در تصویر حفظ میکند.
توجه داشته باشید که الیههای ادغام هیچ پارامتر جدیدی اضافه نمیکنند،
چراکه آنها به سادگی مقادیر (مانند حداکثر) را بدون نیاز به وزن یا بایاس اضافی
استخراج میکنند.
اولین کاری که باید انجام دهیم این است که مجموعه داده تصویر را وارد کنیم .این کار را با
Kerasانجام میدهیم؛ با اجرای کد زیر در :jupyter notebook
)(x_test, y_test اکنون دادههایی که نیاز داریم در آرایههای مربوط ) (x_train, y_trainو
ذخیره شدهاند .اجازه دهید کمی مجموعه داده را مورد بررسی قرار دهیم .بیایید ببینیم شکل
آرایهیِ ویژگیهایِ ورودی ما چگونه است:
)print('x_train shape:', x_train.shape
)x_train shape: (50000, 32, 32, 3
▪ 50000عکس
▪ ارتفاع 32پیکسل
▪ عرض 32پیکسل
▪ 3پیکسل در عمق (مرتبط با قرمز ،سبز و آبی)
این بدان معنا است که برای هر یک از 50000تصویر یک عدد (مرتبط با برچسب) وجود دارد.
اکنون ،بیایید سعی کنیم نمونهای از یک تصویر و برچسب آن را برای فهم بهتر ببینیم:
)]print(x_train[0
][[[ 59 62 63
][ 43 46 45
][ 50 48 43
...
][158 132 108
][152 125 102
]][148 124 103
[[ 16 ]20 20
[ 0 ]0 0
[ 18 ]8 0
...
[123 ]88 55
[119 ]83 50
[122 ]]87 57
[[ 25 ]24 21
[ 16 ]7 0
[ 49 ]27 8
...
[118 ]84 50
[120 ]84 50
[109 ]]73 42
...
[[208 ]170 96
[201 ]153 34
[198 ]161 26
...
[216 ]184 140
[151 ]118 84
[123 ]]]92 72
در حالیکه رایانه تصویر را اینگونه میبیند ،اما برای ما چندان مفید نیست .بنابراین بیایید این
تصویر از ] x_train[0را با استفاده از بسته matplotlibمصورسازی کنیم:
137 فصل چهارم :شبکههای عصبی کانولوشنی
میبینیم که برچسب عدد " "6است .تبدیل اعداد به برچسب بر اساس حروف الفبای انگلیسی به
صورت زیر مرتب شده است:
شماره برچسب
0 هواپیما
1 خودرو
2 پرنده
3 گربه
4 گوزن
5 سگ
6 قورباغه
7 اسب
8 کشتی
9 کامیون
بنابراین ،از جدول میبینیم که تصویر باال به عنوان تصویر یک قورباغه برچسبگذاری شده است
(برچسب .)6بیایید نمونه دیگری از یک تصویر را با تغییر شاخص به ( 1تصویر دوم در
مجموعه داده ما) به جای ( 0تصویر اول در مجموعه داده ما) مشاهده کنیم:
138یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
)]img = plt.imshow(x_train[1
با استفاده از جدول پیشین ،میبینیم که این تصویر به عنوان کامیون برچسبگذاری شده است.
اکنون که مجموعه داده خود را بررسی کردهایم ،باید آن را پردازش کنیم .اولین مشاهدهای که
انجام میدهیم این است که برچسبهای ما به عنوان شماره کالس خیلی مفید نیستند .این به
این دلیل است که کالسها نظم و ترتیبی ندارند .برای روشن شدن این موضوع مثالی میزنیم.
اگر شبکه عصبی ما نتواند تصمیمی بگیرد که آیا تصویر یک خودرو (برچسب )1 :است یا یک
کامیون (برچسب ،)9 :چه اتفاقی میافتد .آیا باید میانگین در نظر بگیریم و آن را به عنوان یک
سگ پیشبینی کنیم (برچسب)5 :؟ قطعا چنین چیزی هیچ معنایی دارد.
در فصل پیشین ،اولین شبکه عصبی خود را برای پیشبینی قیمت خانه با Kerasساختیم،
ممکن است تعجب کنید که چرا توانستیم از برچسبهای [ ]0و [ ]1در آنجا استفاده کنیم .این
به این دلیل است که فقط دو کالس وجود دارد و ما میتوانیم خروجی شبکه عصبی را به عنوان
یک احتمال تفسیر کنیم .یعنی اگر خروجی شبکه عصبی 0.6باشد ،به این معنی است که معتقد
است با احتمال 60درصد باالتر از میانگین قیمت خانه است .با این حال ،این در پیکربندی
چند کالسه همانند این مثال کار نمیکند ،جایی که تصویر میتواند به یکی از 10کالس مختلف
تعلق داشته باشد.
آنچه ما واقعا میخواهیم احتمال هر یک از 10کالس مختلف است .برای آن ،ما به 10
نورون خروجی در شبکه عصبی خود نیاز داریم .از آنجایی که ما 10نورون خروجی داریم،
برچسبهای ما نیز باید با آن مطابقت داشته باشند .برای انجام این کار ،برچسب را به
مجموعهای از 10عدد تبدیل میکنیم که هر عدد نشان میدهد آیا تصویر متعلق به آن کالس
است یا خیر .بنابراین اگر یک تصویر متعلق به کالس اول باشد ،اولین عدد این مجموعه 1و
139 فصل چهارم :شبکههای عصبی کانولوشنی
تمام اعداد دیگر در این مجموعه 0خواهند بود .به این کدگذاری one-hotمیگویند و جدول
تبدیل برای این مثال به این صورت است:
اکنون که برچسبهای خود ( )yرا پردازش کردهایم ،ممکن است بخواهیم تصویر خود ( )xرا
نیز پردازش کنیم .گام متداولی که ما انجام میدهیم این است که اجازه دهیم مقادیر بین 0و 1
باشد که به آموزش شبکه عصبی ما کمک میکند .از آنجایی که مقادیر پیکسل ما از قبل مقادیری
بین 0تا 255میگیرند ،به سادگی باید آنها را بر 255تقسیم کنیم:
)'x_train = x_train.astype('float32
)'x_test = x_test.astype('float32
x_train = x_train / 255
x_test = x_test / 255
140یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
در عمل ،کاری که ما انجام میدهیم این است که نوع را به " "float32تبدیل میکنیم ،که یک نوع
داده است که میتواند مقادیر را با اعشار ذخیره کند .سپس ،هر سلول را بر 255تقسیم میکنیم.
در صورت تمایل ،میتوانید با اجرای سلول به مقادیر آرایهیِ اولین تصویر آموزشی نگاه کنید:
]x_train[0
array([[[0.23137255, 0.24313726, 0.24705882],
[0.16862746, 0.18039216, 0.1764706 ],
[0.19607843, 0.1882353 , 0.16862746],
...,
[0.61960787, 0.5176471 , 0.42352942],
[0.59607846, 0.49019608, 0.4 ],
[0.5803922 , 0.4862745 , 0.40392157]],
...,
تا کنون ما فقط یک مجموعه آموزشی و یک مجموعه آزمایشی داریم .برخالف مثال فصل پیش،
مجموعه اعتبارسنجی خود را از قبل تقسیم نمیکنیم ،چراکه میانبری برای این کار وجود دارد که
بعدا معرفی خواهیم کرد.
141 فصل چهارم :شبکههای عصبی کانولوشنی
مشابه با مثال قبلی ،ابتدا باید معماری مدلی خود را تعریف کنیم .معماری CNNکه ما خواهیم
ساخت به شکل زیر است:
این معماری دارای تعداد الیههای زیادی است (بیشتر از آنچه تاکنون دیدهایم) ،اما همه از
مفاهیمی ساخته شدهاند که قبال دیدهایم .با این حال ،ساخت هر الیه فقط با یک خط کد انجام
میشود و جای نگرانی نیست! به یاد بیاورید که تابع softmaxبه سادگی خروجی الیه قبلی را
به توزیعهای احتمالی تبدیل میکند ،چیزی که ما برای مسئله طبقهبندی خود میخواهیم.
برای کدنویسی این مورد ،از مدل ترتیبی Kerasاستفاده خواهیم کرد .با این حال ،از آنجایی
که ما الیههای زیادی در مدل خود داریم ،روش جدیدی را برای تعیین دنباله معرفی میکنیم .ما
کد را خط به خط مرور میکنیم تا بتوانید دقیقا آنچه را که انجام میدهیم دنبال کنید .ابتدا بخشی
از کدهای مورد نیاز خود را وارد میکنیم:
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
ما هر بار یک الیه به این مدل خالی اضافه میکنیم .الیه اول (اگر از شکل قبلی با یاد داشته
باشید) یک الیه کانولوشنی با اندازه فیلتر ،3×3اندازه گام 1و عمق 32است .الیهگذاری ""same
و فعالساز آن " "reluاست (این دو پیکربندی برای همه الیههای CNNاعمال میشود) .با این
حال ،اجازه دهید اولین الیه خود را باکد مشخص کنیم:
model.add(Conv2D(32, (3, 3), activation='relu', padding='same',
)))input_shape=(32,32,3
کاری که این تکه کد انجام میدهد ،اضافه کردن این الیه به مدل ترتیبی خالی ما با استفاده از
تابع )( model.addاست .اولین عدد یعنی 32به تعداد فیلترها اشاره دارد .جفت اعداد بعدی
( )3،3به عرض و اندازه فیلتر اشاره دارد .سپس ،فعالسازی را که ' 'reluو الیهگذاری را که
' 'sameاست مشخص میکنیم .توجه داشته باشید که ما گام را مشخص نکردیم .دلیلش این
است که stride=1یک تنظیم پیشفرض است و تا زمانی که بخواهیم این تنظیم را تغییر
ندهیم ،نیازی به تعیین آن نداریم .اگر به خاطر داشته باشید ،ما همچنین باید اندازه ورودی را
برای الیه اول خود مشخص کنیم .الیههای بعدی این مشخصات را ندارند ،چراکه میتوانند
اندازه ورودی را از اندازه خروجی الیه قبلی استنتاج کنند .الیه دوم ما در کد به این شکل است
(نیازی به تعیین اندازه ورودی نداریم):
))'model.add(Conv2D(32, (3, 3), activation='relu', padding='same
الیه بعدی یک الیه ادغام حداکثری با اندازه ادغام 2×2و گام 2است .پیشفرض برای گام ادغام
حداکثری ،اندازه ادغام است ،بنابراین ما نیازی به تعیین گام نداریم:
)))model.add(MaxPooling2D(pool_size=(2, 2
در نهایت ،یک الیه حذفی با احتمال ،0.25اضافه میکنیم تا از بیشبرازش جلوگیری کنیم:
))model.add(Dropout(0.25
اکنون چهار الیه اول را با کد ایجاد کردیم .چهار الیه بعدی واقعا شبیه بهم به نظر میرسند:
))'model.add(Conv2D(64, (3, 3), activation='relu', padding='same
))'model.add(Conv2D(64, (3, 3), activation='relu', padding='same
)))model.add(MaxPooling2D(pool_size=(2, 2
))model.add(Dropout(0.25
در نهایت ،ما باید الیه متصل کامل خود را کدنویسی کنیم ،که مشابه کاری است که در مثال
فصل پیش انجام دادیم .با این حال ،در این مرحله ،نورونهای ما بهجای یک ردیف ،در قالب
مکعبمانند قرار گرفتهاند .برای اینکه این قالب مکعبمانند نورونها را در یک ردیف قرار دهیم،
ابتدا باید آن را صاف کنیم .این کار را با افزودن یک الیه Flattenانجام میدهیم:
))(model.add(Flatten
))'model.add(Dense(512, activation='relu
ساخت معماری ما اکنون به پایان رسید .حال ،برای مشاهده خالصهای از معماری کامل ،کد زیر
را اجرا میکنیم:
)(model.summary
"Model: "sequential
_________________________________________________________________
)Layer (type Output Shape Param #
=================================================================
)conv2d (Conv2D )(None, 32, 32, 32 896
=================================================================
Total params: 1,064,362
Trainable params: 1,064,362
Non-trainable params: 0
_________________________________________________________________
تابع زیانی که ما استفاده میکنیم آنتروپی متقاطع طبقهای نامیده میشود .بهینه ساز ما در اینجا
adamاست .در نهایت ،ما میخواهیم دقت مدل خود را ردیابی کنیم.
اکنون ،زمان اجرای آموزش مدل است:
hist = model.fit(x_train, y_train_one_hot,
batch_size=32, epochs=20,
)validation_split=0.2
ما مدل خود را با اندازه دستهیِ 32و 20دوره آموزش میدهیم .با این حال ،یک تفاوت در کد
را متوجه شدید؟ ما از تنظیم validation_split=0.2به جای validation_dataاستفاده میکنیم.
با این میانبر ،ما نیازی به تقسیم مجموعه دادههای خود به یک مجموعه آموزشی و مجموعه
از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون: یادگیری عمیق144
میتوانیم با استفاده از این کدی که در ساخت اولین شبکه عصبی خود،پس از اتمام آموزش
: زیان آموزش و اعتبارسنجی را در طول تعداد دورهها مصورسازی کنیم،دیدهایم
plt.plot(hist.history['loss'])
plt.plot(hist.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Val'], loc='upper right')
plt.show()
145 فصل چهارم :شبکههای عصبی کانولوشنی
همانطور که مشاهده میشود ،مدل دچار بیشبرازش شده است .در این مرحله ،به شما توصیه
میکنم که به عقب برگردید و پارامترهای مختلف مانند تغییر معماری یا تغییر تعداد دورهها را
امتحان کنید تا ببینید آیا میتوانید دقت valبهتری دریافت کنید .هنگامی که از مدل خود راضی
بودید ،میتوانید آن را در مجموعه آزمایشی ارزیابی کنید:
]model.evaluate(x_test, y_test_one_hot)[1
313/313 [==============================] - 2s 5ms/step - loss: 1.1410 - accuracy: 0.6924
0.6923999786376953
146یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
همانطور که مشاهده میشود ،مدل کارایی چندانی ندارد .با این حال از حدس زدن تصادفی بهتر
عمل میکند.
در این مرحله ،ممکن است بخواهید مدل آموزش دیده خود را ذخیره کنید (با فرض اینکه
یک مدل با کارایی خوب با تنظیم دقیق ابرپارمترها ساختهاید) .مدل در قالب فایلی به نام HDF5
(با پسوند )h5ذخیره میشود .ما مدل خود را با این خط کد ذخیره میکنیم:
)'model.save('my_cifar10_model.h5
اگر میخواهید مدل ذخیره شده خود را در آینده بارگیری کنید ،از این خط کد استفاده کنید:
from keras.models import load_model
)'model = load_model('my_cifar10_model.h5
بهطور خالصه ،ما اولین CNNخود را برای ایجاد یک طبقهبند تصویر ساختهایم .برای انجام
این کار ،ما از مدل Keras Sequentialبرای مشخص کردن معماری استفاده کردهایم و آن را
بر روی مجموعه دادهای که قبال پردازش کردهایم آموزش دادهایم .ما همچنین مدل خود را ذخیره
کردهایم تا بتوانیم بعدا از آن برای انجام طبقهبندی تصاویر بدون نیاز به آموزش مجدد مدل
استفاده کنیم.
اکنون که یک مدل داریم ،بیایید آن را روی تصاویر خودمان امتحان کنیم .برای انجام این کار،
یک تصویر (بر اساس یکی از 10کالس مجموعه داده) از اینترنت دانلود کرده و در همان پوشه
notebookخود قرار دهید .ما از تصویر گربه زیر استفاده میکنیم:
فایل تصویری من " "cat.jpgاست .اکنون این فایل JPEGرا به صورت آرایهای از مقادیر پیکسل
میخوانیم:
)"my_image = plt.imread("cat.jpg
اولین کاری که باید انجام دهیم این است که اندازه تصویر گربه خود را تغییر دهیم تا بتوانیم آن
را در مدل خود قرار دهیم (اندازه ورودی .)32 × 32 × 3به جای اینکه خودمان یک تابع تغییر
اندازه را کدنویسی کنیم ،بیایید از بستهای به نام " "scikit-imageاستفاده کنیم که به ما در انجام
آن کمک میکند:
from skimage.transform import resize
))my_image_resized = resize(my_image, (32,32,3
147 شبکههای عصبی کانولوشنی:فصل چهارم
:ما میتوانیم تصویر تغییر اندازه یافته خود را به صورت زیر مصورسازی کنیم
img = plt.imshow(my_image_resized)
1 و0 توجه داشته باشید که اندازه تصویر تغییر یافته دارای مقادیر پیکسلی است که قبال بین
بنابراین نیازی نیست مراحل پیشپردازشی را که قبال برای تصویر،مقیاسبندی شده است
میبینیم که،model.predict با استفاده از کد، اکنون.آموزشی خود انجام دادیم اعمال کنیم
: مدل آموزشدیده ما چه خروجی خواهد داشت،وقتی تصویری از گربه داده میشود
import numpy as np
probabilities = model.predict(np.array( [my_image_resized,] ))
اگر. نورون مربوط به توزیع احتمال بر روی کالسها هستند10 خروجی،خروجیهای کد باال
: خواهیم داشت،سلول را اجرا کنیم
probabilities
array([[2.6720341e-02, 3.1344647e-05, 1.5095539e-01, 3.8518414e-01,
3.3354717e-03, 3.2324010e-01, 5.1648129e-02, 5.7933435e-02,
9.2716294e-04, 2.4454062e-05]], dtype=float32)
همانطور که میبینید ،مدل بهطور دقیق پیشبینی کرده است که تصویر ورودی در واقع تصویر
یک گربه است .با این حال ،این بهترین مدلی نیست که ما داریم و دقت آن بسیار پایین است،
بنابراین نباید انتظار زیادی از آن نداشته باشید .این مثال ،تنها اصول اساسی CNNها را در یک
مجموعه داده بسیار ساده پوشش داده است .میتوانید به عنوان تمرین ،برای این مجموعه داده
مدلهای دیگری را بسازید و نتایج را مقایسه کنید.
خالصه فصل
▪ شبکههای عصبی کانولوشنی ،از کانولوشن به جای ضرب ماتریس ،حداقل در یکی از
الیههای خود استفاده میکنند.
▪ شناسایی ویژگیها از طریق اعمال فیلترها منجر به تولید نقشه ویژگی میشود.
▪ از الیه کانولوشن به عنوان الیه استخراج ویژگی نیز یاد میشود .چراکه ویژگیهای تصویر
در این الیه استخراج میشوند.
آزمونک
.1معماری کلی یک شبکه کانولوشنی از چه قسمتهای تشکیل شده است؟
.2سه ویژگی متمایز شبکههای کانولوشنی را بیان کنید؟
.3الیه کانولوشن از چه بخشهایی تشکیل شده است؟
.4مزایای استفاده از کانولوشن چیست؟
.5الیه ادغام در شبکههای کانولوشنی چه نقشی دارند؟
شبکههای عصبی بازگشتی
5
اهداف یادگیری:
شبکه عصبی بازگشتی چیست؟ ▪
آشنایی با LSTM ▪
تولید متن و طبقهبندی متن با این شبکهها ▪
150یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
مقدمه
معماری شبکههای عصبی که در فصلهای پیشین مورد بحث قرار گرفتند ،ورودی با اندازه ثابت
را دریافت میکنند و خروجی با اندازه ثابت ارائه میکنند .این فصل با معرفی شبکههای عصبی
بازگشتی ( )Recurrent Neural Networksیا به اختصار RNNاز این محدودیت دور میشویم.
RNNها به ما کمک میکنند تا با توالیهایی با طول متغیر با تعریف یک ارتباط بازگشتی برروی
این دنبالهها ( )sequencesمقابله کنیم .توانایی پردازش توالیهای دلخواه ورودی باعث میشود
RNNها برای کارهایی مانند مدل سازی زبان ،تشخیص گفتار و یا غیره قابل استفاده باشند .در
واقع ،در تئوریRNN ،ها را میتوان برای هر مشکلی اعمال کرد ،زیرا ثابت شده است که آنها
Turing-Completeهستند .1این بدان معنی است که از نظر تئوری ،آنها میتوانند هر برنامهای
را شبیه سازی کنند که یک کامپیوتر معمولی قادر به محاسبه آن نیست .به عنوان نمونهای از این
موضوع Google DeepMind ،مدلی به نام ماشینهای تورینگ عصبی را پیشنهاد کرده است
که میتواند نحوه اجرای الگوریتمهای ساده مانند مرتبسازی را بیاموزد.
1
Alex Graves and Greg Wayne and Ivo Danihelka (2014). "Neural Turing Machines".
151 فصل پنجم :شبکههای عصبی بازگشتی
مدلهایی که در فصلهای پیشین مورد مطالعه قرار گرفتند ،یک ویژگی مشترک دارند .پس
از تکمیل فرآیند آموزش ،وزنها ثابت میشوند و خروجی فقط به نمونه ورودی بستگی دارد.
واضح است که این رفتار مورد انتظار یک طبقهبند است ،اما سناریوهای زیادی وجود دارد که
در آن پیشبینی باید تاریخچه مقادیر ورودی را در نظر بگیرد .سری زمانی یک نمونه کالسیک
در این خصوص است .بیایید فرض کنیم که باید دمای هفته آینده را پیشبینی کنیم .اگر سعی
کنیم فقط آخرین مقدار )𝑡(𝑥 شناخته شده و یک MLPآموزش دیده برای پیشبینی )𝑥(𝑡 + 1
استفاده کنیم ،نمیتوان شرایط زمانی مانند فصل ،تاریخچه فصل در طول سالها و غیره را در
نظر گرفت .رگرسیون قادر خواهد بود خروجیهایی را که کمترین میانگین خطا را ایجاد میکند
مرتبط کند ،اما در موقعیتهای واقعی ،این کافی نیست .تنها راه معقول برای حل این مشکل این
است که یک معماری جدید برای نورون مصنوعی تعریف کنیم تا یک حافظه برای آن فراهم کنیم.
این مفهوم در شکل زیر نشان داده شده است:
اکنون نورون دیگر یک واحد محاسباتی پیشخور خالص نیست ،چراکه اتصال بازخوردی آن را
مجبور میکند گذشته خود را به خاطر بسپارد و از آن برای پیشبینی مقادیر جدید استفاده کند.
شبکههای عصبی بازگشتی ،نواقصِ شبکههایِ عصبیِ پیشخور را برطرف میکنند .چرا
که شبکههای پیشخور تنها میتوانند ورودیهای با اندازه ثابت را بپذیرند و تنها
خروجیهایی با اندازه ثابت تولید کنند و قادر به در نظر گرفتن ورودیهای قبلی با همان
ترتیب نیستند .با در نظر گرفتن ورودیهای گذشته در توالیها ،شبکهی عصبی بازگشتی
قادر به گرفتن وابستگیهای زمانی هستند که شبکهی عصبی پیشخور قادر به آن
نیست.
شبکههای عصبی بازگشتی ،دنبالهای را به عنوان ورودی میگیرند و برای هر مرحله زمانی
شبکه عصبی را ارزیابی میکنند .این شبکهها را میتوان به عنوان یک شبکه عصبی در
نظر گرفت که دارای یک حلقه است که به آن اجازه میدهد حالت را حفظ کند .هنگامی
که ارزیابی میشود ،حلقه از طریق مراحلِ زمانیِ یک دنباله باز میشود .این حلقهها یا
پیوندهای مکرر دلیلی هستند که این شبکهها را شبکههای بازگشتی مینامند .اینکه
یک شبکه بازگشتی شامل حلقه است به این معنی است که خروجی یک نورون در یک
نقطه زمانی ممکن است در نقطه زمانی دیگر به همان نورون بازگردانده شود .نتیجه
این امر این است که شبکه نسبت به فعالسازیهای گذشته (و بنابراین ورودیهای
گذشته که در این فعالسازی نقش داشتهاند) حافظه دارد.
152یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
تعدادی ورودی 𝑡𝑥 داریم ،که 𝑡 نشان دهنده یک گام زمانی یا یک ترتیب متوالی است .بیایید
فرض کنیم ورودیهایِ 𝑡 مختلف ،مستقل از یکدیگر باشند .خروجی شبکه در هر 𝑡 را میتوان
به صورت ) 𝑡𝑥(𝑓 = 𝑡 ℎنوشت.
در RNNها ،حلقه بازخوردی ،اطالعاتِ وضعیتِ فعلی را به حالت بعدی منتقل میکند،
همانطور که در نسخه بازشده شبکه ،در شکل زیر نشان داده شده است:
RNNها نام خود را به این دلیل میگیرند چراکه تابع مشابهی را بهطور مکرر روی یک
دنباله اعمال میکنند.
153 فصل پنجم :شبکههای عصبی بازگشتی
V ،Uو Wتبدیل خطی را روی ورودیهایِ مربوط اعمال میکنند .اساسیترین مورد چنین
تبدیلی ،مجموع وزنی است که ما میشناسیم .اکنون میتوانیم وضعیت داخلی و خروجی شبکه
را به صورت زیر تعریف کنیم:
در ،RNNهر حالت به تمام محاسبات قبلی توسط معادله بازگشتی وابسته
است .پیامد مهم این امر سبب ایجاد حافظه در طول زمان میشود ،چرا که
حالتها مبتنی بر مراحل قبلی هستند.
از این معماری شرحنویسی تصاویر میباشد .الیه ورودی یک تصویر را دریافت کرده و
آن را به چندین کلمه نگاشت میکند.
برای مدلسازیِ تولید متن کار کنیم ،جایی که مدلهای RNNبرای یادگیری دنبالههای متنی یک
دامنه مشخص و سپس ،تولیدِ توالیِ متنِ کامال جدید و معقول در دامنه مورد نظر استفاده
میشوند .مولدِ متنِ مبتنی بر RNNمیتواند هر متن ورودی ،مانند رمانهایی مانند هریپاتر،
شعرهایی از شکسپیر و فیلمنامههایِ فیلمهایی همانند جنگ ستارگان را بگیرد ،و اشعار شکسپیر
و فیلمنامههای فیلم جنگ ستارگان را تولید کند .اگر مدل به خوبی آموزش داده شده باشد ،متن
مصنوعی باید قابل قبول باشد و شبیه به متن اصلی خوانده شود .در این بخش از رمان "جنگ و
صلح" از نویسنده روسی لئوتولستوی به عنوان مثال استفاده میکنیم .با این حال ،میتوانید از هر
یک از کتابهای مورد عالقه خود برای ورودیهای آموزشی استفاده کنید .پروژه گوتنبرگ
( )www.gutenberg.orgیک منبع عالی برای این کار است ،با بیش از 57000کتاب عالی
رایگان که حق چاپ آنها منقضی شده است.
ابتدا باید فایل txtجنگ و صلح را مستقیما از پیوند:
https://cs.stanford.edu/people/karpathy/char-rnn/warpeace_input.txt
دانلود کنیم ،اما باید برخی از پاکسازیها را انجام دهیم .سپس فایل را میخوانیم ،متن را به
حروف کوچک تبدیل میکنیم و با چاپ 100کاراکتر اول ،نگاهی گذرا به آن میاندازیم:
'training_file = 'warpeace_input.txt
)(raw_text = open(training_file, 'r').read
)(raw_text = raw_text.lower
]raw_text[:100
'ufeff"well, prince, so genoa and lucca are now just family estates
'of thenbuonapartes. but i warn you, i
اکنون باید تعداد کاراکترها را بشماریم:
)n_chars = len(raw_text
))print('Total characters: {}'.format(n_chars
Total characters: 3196213
سپس ،میتوانیم کاراکترهای یکتا و اندازه واژگان را بدست آوریم:
)))chars = sorted(list(set(raw_text
)n_vocab = len(chars
))print('Total vocabulary (unique characters): {}'.format(n_vocab
)print(chars
Total vocabulary (unique characters): 57
['\n', ' ', '!', '"', "'", '(', ')', '*', ',', '-', '.', '/', '0',
'1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '=', '?',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
156یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
]''à', 'ä', 'é', 'ê', '\ufeff
اکنون ،ما یک مجموعه داده آموزشی خام داریم که از بیش از 3میلیون کاراکتر و 57کاراکتر
یکتا تشکیل شده است .اما چگونه میتوانیم آن را به مدل RNNتغذیه کنیم؟ در معماری چند به
چند ،مدل توالیها را میگیرد و توالیها را همزمان تولید میکند .در مورد ما ،میتوانیم مدل را
با دنبالههای کاراکترهای با طول ثابت تغذیه کنیم .طول دنبالههای خروجی با توالیهای ورودی
برابر است و یک کاراکتر از دنبالههای ورودی آنها جابهجا میشود .فرض کنید طول دنباله را
برای کلمه learningروی 5قرار میدهیم .اکنون میتوانیم با ورودی learnو خروجی earniیک
نمونه آموزشی بسازیم .ما میتوانیم این عمل را در شبکه به صورت زیر تجسم کنیم:
ما فقط یک نمونه آموزشی ساختیم .در مورد کل مجموعه آموزشی ،میتوانیم دادههای متن خام
را به دنبالههایی با طول مساوی ،مثال 100تقسیم کنیم .هر دنباله از کاراکترها ورودی یک نمونه
آموزشی است .سپس ،ما دادههای متنی خام را به همان روش تجزیه و تحلیل میکنیم ،اما این
بار از کاراکتر دوم شروع میکنیم .هر یک از توالیهای بدست آمدهیِ خروجی ،یک نمونه آموزشی
است .برای مثال ،با توجه به متن خام deep learning architecturesو عدد 5به عنوان طول
توالی ،میتوانیم پنج نمونه آموزشی را به صورت زیر بسازیم:
ورودی خروجی
_deep eep_l
learn earni
ing_a ng_ar
rchit chite
ectur cture
157 فصل پنجم :شبکههای عصبی بازگشتی
به عنوان مثال ،کاراکتر 𝑒 به برداری با طول 57تبدیل میشود که در شاخص 30بردارش مقدار
1قرار دارد و همه شاخصهای دیگر آن 0وجود دارد (نحوه این کدگذاری را در فصل پیشین
مشاهده کردید) .با آماده شدن جدول جستجوی کاراکتر ،میتوانیم مجموعه داده آموزشی را به
صورت زیر بسازیم:
import numpy as np
seq_length = 100
)n_seq = int(n_chars / seq_length
با تنظیم طول دنباله روی ،100ما n_seqنمونهیِ آموزشی خواهیم داشت .سپس ،ورودی و
خروجی آموزشی را مقداردهی اولیه میکنیم:
))X = np.zeros((n_seq, seq_length, n_vocab
))Y = np.zeros((n_seq, seq_length, n_vocab
چنین فرمی مورد نیاز است ،چراکه ما قصد داریم از Kerasبرای آموزش مدل RNNاستفاده
کنیم .سپس ،هر یک از نمونههای n_seqرا ایجاد میکنید:
for i in range(n_seq):
x_sequence = raw_text[i * seq_length : ](i + 1) * seq_length
x_sequence_ohe = np.zeros((seq_length, ))n_vocab
for j in range(seq_length):
]char = x_sequence[j
]index = char_to_index[char
x_sequence_ohe[j][index] = 1.
X[i] = x_sequence_ohe
y_sequence = raw_text[i * seq_length + ]1 : (i + 1) * seq_length + 1
y_sequence_ohe = np.zeros((seq_length, ))n_vocab
for j in range(seq_length):
]char = y_sequence[j
]index = char_to_index[char
y_sequence_ohe[j][index] = 1.
Y[i] = y_sequence_ohe
در صورت تمایل ،میتوانید با اجرای سلولهای زیر شکل آرایه را ببینید:
X.shape
)(31962, 100, 57
از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون: یادگیری عمیق158
Y.shape
(31962, 100, 57)
ابتدا. استRNN مجموعه داده آموزشی را آماده کردیم و اکنون زمان ساخت مدل،تا اینجا
:تمام ماژولهای الزم را وارد کنید
from keras.models import Sequential
from keras.layers.core import Dense, Activation, Dropout
from keras.layers.recurrent import SimpleRNN
from keras.layers.wrappers import TimeDistributed
from keras import optimizers
from tensorflow import keras
احتمال حذف تصادفی، تعداد الیهها، تعداد نورونها، از جمله اندازه دسته، ابرپارامترها،اکنون
:و تعداد دورهها را مشخص میکنیم
batch_size = 100
n_layer = 2
hidden_units = 800
n_epoch = 300
dropout = 0.3
با اضافه کردن زیان آنتروپی متقاطع چندکالسه ،ساخت مدل خود را به پایان رساندیم و در
نهایت مدل را کامپایل میکنیم:
)model.compile(loss= "categorical_crossentropy", optimizer=optimizer
ما بیش از 2میلیون پارامتر برای آموزش داریم .اما قبل از شروع روند آموزشِ طوالنی ،تمرین
خوبی است که برخی از callbackها را برای پیگیری آمار و وضعیتهای داخلی مدل در طول
آموزش تنظیم کنیم .توابع callbackشامل موارد زیر است:
▪ نقطه وارسیِ ( )checkpointمدل ،که مدل را بعد از هر دوره ذخیره میکند تا بتوانیم
آخرین مدل ذخیره شده را بارگیری کنیم و در صورت توقف غیرمنتظره ،آموزش را از آنجا
از سر بگیریم.
▪ توقف زودهنگام ،که زمانی که تابع زیان ،دیگر بهبود نمییابد ،آموزش را متوقف میکند.
▪ بررسی نتایج تولید متن بهطور منظم .ما میخواهیم ببینیم متن تولید شده چقدر معقول
است چرا که زیان آموزش به اندازه کافی ملموس نیست.
filepath="weights/weights_layer_%d_hidden_%d_epoch_{epoch:03d}_loss_{loss
":.4f}.hdf5
نقاط وارسی مدل ،با شماره دوره و زیانِ آموزشی در نام فایل ذخیره میشود .ما همچنین زیان
اعتبارسنجی را بهطور همزمان نظارت میکنیم تا ببینیم که آیا کاهش آن برای 50دوره متوالی
متوقف میشود یا خیر:
early_stop = EarlyStopping(monitor='loss', min_delta=0, patience=50,
)'verbose=1, mode='min
از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون: یادگیری عمیق160
ابتدا یک تابع کمکی. برای نظارتبر کیفیت الزم داریمcallback ما یک،در مرحله بعد
: ما تولید میکندRNN مینویسیم که متنی با هر طولی را با توجه به مدل
def generate_text(model, gen_length, n_vocab, index_to_char):
"""
Generating text using the RNN model
@param model: current RNN model
@param gen_length: number of characters we want to generate
@param n_vocab: number of unique characters
@param index_to_char: index to character mapping
@return:
"""
# Start with a randomly picked character
index = np.random.randint(n_vocab)
y_char = [index_to_char[index]]
X = np.zeros((1, gen_length, n_vocab))
for i in range(gen_length):
X[0, i, index] = 1.
indices = np.argmax(model.predict(X[:, max(0, i - 99):i + 1, :])[0], 1)
index = indices[-1]
y_char.append(index_to_char[index])
return ('').join(y_char)
سپس مدل ورودی هر یک. با کارکتری که به طور تصادفی انتخاب شده شروع میکند،این تابع
را بر اساس کارکترهای تولید شده قبلی که طول آنها تاgen_length-1 از کارکترهای باقیمانده
را تعریف کنیم کهcallback اکنون میتوانیم کالس. است (طول دنباله) پیشبینی میکند100
: دوره تولید میکندN متن را برای هر
class ResultChecker(Callback):
def __init__(self, model, N, gen_length):
self.model = model
self.N = N
self.gen_length = gen_length
101 و51 ،11 ،1 نتایج زیر برای دورههای. کاراکتر مینویسد200 دوره10 مولد برای هر
:میباشد
Epoch 1:
Epoch 1/300
8000/31962 [======>.......................] - ETA: 51s - loss: 2.8891
31962/31962 [==============================] - 67s 2ms/step - loss: 2.1955
My War and Peace:
5 the count of the stord and the stord and the stord and the stord and the
stord and the stord and the stord and the stord and the stord and the stord
and the and the stord and the stord and the stord
161 شبکههای عصبی بازگشتی:فصل پنجم
Epoch 11:
Epoch 11/300
100/31962 [..............................] - ETA: 1:26 - loss: 1.2321
31962/31962 [==============================] - 66s 2ms/step - loss: 1.2493
My War and Peace:
?" said the countess was a strange the same time the countess was already
been and said that he was so strange to the countess was already been and
the same time the countess was already been and said
Epoch 00011: loss improved from 1.26144 to 1.24933, saving model to
weights/weights_epoch_011_loss_1.2493.hdf5
Epoch 51:
Epoch 51/300
31962/31962 [==============================] - 66s 2ms/step - loss: 1.1562
My War and Peace:
!!CDP!E.agrave!! to see him and the same thing is the same thing to him and
the same thing the same thing is the same thing to him and the sam thing
the same thing is the same thing to him and the same thing the sam
Epoch 00051: loss did not improve from 1.14279
Epoch 101:
Epoch 101/300
31962/31962 [==============================] - 67s 2ms/step - loss: 1.1736
My War and Peace:
= the same thing is to be a soldier in the same way to the soldiers and the
same thing is the same to me to see him and the same thing is the same to
me to see him and the same thing is the same to me
Epoch 00101: loss did not improve from 1.11891
شاید برای شما سوال پیش آید، با این حال.جنگ و صلح ما تا حدودی خوب خوانده میشود
اما، بهتر عمل کنیم؟ پاسخ آری استRNN که آیا میتوانیم با تغییر پارامترها در این مدل
برای حل مسائلی که نیازمند یادگیریRNN چراکه آموزش یک مدل.ارزشش را ندارد
GRU وLSTM معماریهایی مانند. کارایی خیلی عالی ندارد،وابستگیهای بلندمدت هستند
.بهطور خاص برای حل این مشکل طراحی شدهاند
162یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
LSTM
در تئوریRNN ،های ساده قادر به یادگیریِ وابستگیهایِ بلند مدت هستند ،اما در عمل ،به دلیل
مشکل محو گرادیان ،آنها خود را محدود به یادگیریِ وابستگیِ کوتاه مدت میکنند .در راستای
مقابله با این محدودیت ،شبکه حافظه طوالنی کوتاه مدت ( )Long short term memoryیا
به اختصار LSTMارائه شد LSTM .میتواند وابستگیهای بلندمدت را به دلیلِ وجودِ یک
سلولِ حافظهیِ مخصوص در ساختارش ،انجام دهد.
ایده کلیدی LSTMسلول وضعیت ( )cell stateاست که اطالعات میتواند به صراحت
در آن نوشته یا حذف شود .این سلول وضعیت ،برای زمان 𝑡 با عنوان 𝑡𝑐 در شکل 1-5نشان
داده شده است.
سلول وضعیت LSTMتنها میتواند توسط دروازههای خاص تغییر کند که راهی برای انتقال
اطالعات از طریق آن است .یک LSTMمعمولی از سه دروازه تشکیل شده است :دروازه
فراموش (𝑓) ،دروازه ورودی ( 𝑖) و دروازه خروجی (𝑜).
163 فصل پنجم :شبکههای عصبی بازگشتی
دروازه اول در LSTMدروازه فراموشی است .این دروازه تصمیم میگیرد که آیا ما میخواهیم
سلول وضعیت را پاک کنیم یا خیر .تصمیمِ دروازه فراموش براساس خروجی قبلی ℎ𝑡−1و
ورودی فعلی 𝑡𝑥 است .از یک تابع sigmoidبرای ایجاد خروجی با مقدار بین صفر و یک برای
هر یک از عناصر در سلول وضعیت استفاده میشود .یک ضرب درایهای بین خروجیِ دروازهیِ
فراموشی و سلول وضعیت انجام میشود .مقدارِ یک در خروجی دروازهیِ فراموشی ،به معنایِ
حفظ کاملِ اطالعات عنصر در سلول وضعیت است .در مقابل ،صفر به معنای فراموش کردن
کامل اطالعات در عنصر سلول حالت است .این به این معنا است که LSTMمیتواند اطالعات
بیربط را از بردار سلول وضعیت خود دور بیاندازد .معادلهی دروازهیِ فراموشی بهصورت زیر
است:
دروازه بعدی تصمیم میگیرد که اطالعات جدید به سلول حافظه اضافه شود .این کار در دو
بخش انجام میشود :تصمیم بگیرد که کدام مقادیر را بروزرسانی کند و سپس ایجاد مقادیر برای
بروزرسانی است .ابتدا از بردار 𝑡𝑖 برای انتخاب مقادیری از نامزدهای جدید بالقوه برای گنجاندن
در سلول وضعیت استفاده میشود .بردار نامزد 𝑡𝑎 نیز ماتریس وزن مخصوص به خود را دارد
و از حالت پنهان قبلی و ورودیها برای تشکیل برداری با ابعاد مشابه سلول وضعیت استفاده
میکند .برای ایجاد این بردار نامزد از یک تابع tanhبه عنوان یک تابع غیرخطی استفاده میشود.
این فرآیند در معادالت زیر نشان داده شده است:
) 𝑖𝑏 𝑖𝑡 = 𝜎(𝑊𝑖 ℎ𝑡−1 + 𝑈𝑖 𝑥𝑡 +
) 𝑓𝑏 𝑎𝑡 = tanh(𝑊𝑐 ℎ𝑡−1 + 𝑈𝑐 𝑥𝑡 +
دروازهی فراموشی و ورودی نحوهیِ بروزرسانی سلول وضعیت را در هر مرحله زمانی مشخص
میکنند .بروزرسانی سلول وضعیت در یک مرحله زمانی از طریق معادله زیر انجام میشود:
در ابتدا مقدار 4.2به شبکه به عنوان ورودی داده میشود؛ دروازه ورودی به 1تنظیم شده است،
بنابراین مقدار کامل ذخیره میشود .سپس برای دو مرحله بعد ،دروازه فراموش شده به 1تنظیم
شده است .بنابراین کل اطالعات در طول این مراحل نگهداری میشود و هیچ اطالعات جدیدی
اضافه نمیشود ،چراکه دروازههای ورودی به 0تنظیم شدهاند .در نهایت ،دروازه خروجی به 1
تنظیم میشود و 4.2تولید میشود و بدون تغییر باقی میماند.
for i in range(n_seq):
]x_sequence = raw_text[i * seq_length : (i + 1) * seq_length
))x_sequence_ohe = np.zeros((seq_length, n_vocab
for j in range(seq_length):
]char = x_sequence[j
]index = char_to_index[char
x_sequence_ohe[j][index] = 1.
X[i] = x_sequence_ohe
]y_sequence = raw_text[i * seq_length + 1 : (i + 1) * seq_length + 1
165 شبکههای عصبی بازگشتی:فصل پنجم
نورون و حذف تصادفی800 ما از مدلی با دو الیه بازگشتی حاوی، قبلیRNN در مقایسه با مدل
: استفاده میکنیم0.4 با احتمال
from keras.layers.recurrent import LSTM
batch_size = 100
n_layer = 2
hidden_units = 800
n_epoch= 300
dropout = 0.4
. قبلیRNN میلیون پارامتر برای آموزش وجود دارد که تقریبا چهار برابر بیشتر از مدل8 حدود
:بیایید آموزش را شروع کنیم
از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون: یادگیری عمیق166
و201 ،151 نتایج زیر برای دورههای. کاراکتر مینویسد500 دوره متنی با10 مولد برای هر
: است251
Epoch 151:
Epoch 151/300
19976/19976 [==============================] - 250s 12ms/step - loss:
0.7300
My War and Peace:
ing to the countess. "i have nothing to do with him and i have nothing to
do with the general," said prince andrew.
"i am so sorry for the princess, i am so since he will not be able to say
anything. i saw him long ago. i am so sincerely that i am not to blame for
it. i am sure that something is so much talk about the emperor alexander's
personal attention."
"why do you say that?" and she recognized in his son's presence.
"well, and how is she?" asked pierre.
"the prince is very good to make
Epoch 201:
Epoch 201/300
19976/19976 [==============================] - 248s 12ms/step - loss:
0.6794
My War and Peace:
was all the same to him. he received a story proved that the count had not
yet seen the countess and the other and asked to be able to start a tender
man than the world. she was not a family affair and was at the same time as
in the same way. a few minutes later the count had been at home with his
smile and said:
"i am so glad! well, what does that mean? you will see that you are always
the same."
"you know i have not come to the conclusion that i should like to
send my private result. the prin
Epoch 251:
Epoch 251/300
19976/19976 [==============================] - 249s 12ms/step - loss:
0.6369
My War and Peace:
nd the countess was sitting in a single look on
her face.
"why should you be ashamed?"
"why do you say that?" said princess mary. "why didn't you say a word of
this?" said prince andrew with a smile.
"you would not like that for my sake, prince vasili's son, have you seen
the rest of the two?"
"well, i am suffering," replied the princess with a sigh. "well, what a
167 شبکههای عصبی بازگشتی:فصل پنجم
1
https://www.kaggle.com/c/jigsaw-toxic-comment-classification-challenge/overview
از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون: یادگیری عمیق168
(159571, 8)
تمام رکوردهایی که در آن هر ردیف حاوی مقدار تهی یا رشته خالی است را،در مرحله بعد
.حذف میکنیم
filter = toxic_comments["comment_text"] != ""
toxic_comments = toxic_comments[filter]
toxic_comments = toxic_comments.dropna()
بیایید یک نظر را چاپ کنیم و سپس. حاوی نظرات متنی استcomment_text ستون
:برچسبهای نظرات را ببینیم
print(toxic_comments["comment_text"][168])
You should be fired, you're a moronic wimp who is too lazy to do research.
It makes me sick that people like you exist in this world.
fig_size[1] = 8
plt.rcParams["figure.figsize"] = fig_size
)(toxic_comments_labels.sum(axis=0).plot.bar
مشاهده میکنید که کالس " "toxicبیشترین فراوانی را دارد .ما مجموعه دادهیِ خود را با موفقیت
تجزیه و تحلیل کردیم .در ادامه مدل طبقهبند چندبرچسبی را برای این مجموعه داده ایجاد
خواهیم کرد.
بهطور کلی ،دو راه برای ایجاد مدلهای طبقهبند چندبرچسبی وجود دارد :استفاده از یک الیه
خروجی متصل کامل و استفاده از چندین الیه خروجی متصل کامل .در رویکرد اول ،میتوانیم
از یک الیه متصل کامل با شش خروجی با تابع فعالساز sigmoidو تابع زیان آنتروپی متقاطع
دودویی استفاده کنیم .هر نورون در الیه متصل کامل ،خروجیِ یکی از شش برچسب را نشان
میدهد .همانطور که میدانیم ،تابع فعالسازی sigmoidمقداری بین 0و 1برای هر نورون
برمیگرداند .اگر مقدار خروجی هر نورون بزرگتر از 0.5باشد ،فرض میشود که نظر متعلق به
کالسی است که توسط آن نورون خاص نشان داده شده است.
در رویکرد دوم میتوان یک الیه خروجی متصل کامل برای هربرچسب ایجاد کرد .برای این
مثال ،باید 6الیه متصل کامل در خروجی ایجاد کرد که هر الیه تابع sigmoidخود را خواهد
داشت.
ما تنها از رویکرد اول برای این مجموعه داده استفاده میکنیم و یک مدل طبقهبند متن چند
برچسبی را با یک الیه خروجی ایجاد خواهیم کرد .ابتدا ،یک تابع ایجاد میکنیم تا به پاکسازی
متن بپردازد:
def preprocess_text(sen):
# Remove punctuations and numbers
)sentence = re.sub('[^a-zA-Z]', ' ', sen
# Single character removal
)sentence = re.sub(r"\s+[a-zA-Z]\s+", ' ', sentence
# Removing multiple spaces
)sentence = re.sub(r'\s+', ' ', sentence
return sentence
170یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
مرحله بعد مجموعه ورودی و خروجی خود را ایجاد میکنیم .ورودیِ نظر ستون comment_text
است .ما تمام نظرات را در متغیر Xذخیره میکنیم .برچسبها یا خروجیها قبال در
toxic_comments_labelsذخیره شدهاند .ما از آن مقادیر برای ذخیرهیِ خروجی در متغیر y
استفاده میکنیم .کد زیر این کار را انجام میدهد:
][ = X
)]"sentences = list(toxic_comments["comment_text
for sen in sentences:
))X.append(preprocess_text(sen
y = toxic_comments_labels.values
در این مجموعه داده ما نیازی به انجام کدگذاری one-hotنداریم ،چراکه برچسبهایِ خروجی
ما قبال تبدیل به بردارهای کدگذاری one-hotشدهاند .در مرحله بعد ،دادههای خود را به مجموعه
داده آموزشی و آزمون تقسیم میکنیم:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20,
)random_state=42
در ادامه نیاز به تبدیل ورودی خود به بردارهای عددی داریم .از اینرو قبل از اینکه به ادامه این
مثال بپردازیم بیاید تا در مورد جاساز کلمات ( )word embeddingبیشتر بدانیم .الگوریتمهای
یادگیری عمیق قادر به درک دادههای متنی بهصورت خام نیستند ،از این رو باید متن را بهگونهای
تبدیل کرد تا شبکه قادر به درک و پردازش آنها باشد .جاساز کلمات روشی برای بازنمایی
کلمات است که هدف آن نمایش معنایی کلمات در قالب بردارهایی حقیقی است ،جایی که
کلمات با معنی و زمینه مشابه با بردارهای مشابه نشان داده میشوند .این بردارهای عددی در
مقایسه با رویکردهای آماری در پردازش زبان طبیعی برای تبدیل کلمات به اعداد ،ابعاد کمتری
دارند .همچنین ،این بردارهای عددی اگر به خوبی آموزش دیده شده باشند ،توانایی این را دارند
که ارتباطات معنایی و نحوی بین کلمات را نشان دهند .جاساز کلمات ،سنگ بنای بسیاری از
کارهای انجام گرفته در حوزه پردازش زبان طبیعی است که از یادگیری عمیق استفاده میکنند.
جاساز کلمات را برای متون میتوان از دو رویکرد متفاوت بدست آورد .در رویکرد اول ،در
حین آموزش شبکه همزمان با کار اصلی یاد گرفته میشوند .در این روش ،در ابتدا مقادیر عددی
برای بردارها بهصورت تصادفی تولید میشود و سپس در حین آموزش این مقادیر از طریق
بهینهسازی مانند دیگر الیههای شبکه بروزرسانی میشوند .رویکرد دوم ،از طریق آموزش دادن
با الگوریتمهای خاصی همانند fasttextو gloveبرروی مجموعه دادههای بزرگ متنی و
استفاده از وزنهای بدست آمده از این الگوریتمها است.
حال بیاید تا ورودیهای متنی را به بردارهای جاساز تبدیل کنیم:
)tokenizer = Tokenizer(num_words=5000
)tokenizer.fit_on_texts(X_train
)X_train = tokenizer.texts_to_sequences(X_train
)X_test = tokenizer.texts_to_sequences(X_test
vocab_size = len(tokenizer.word_index) + 1
maxlen = 200
171 شبکههای عصبی بازگشتی:فصل پنجم
برای تبدیل ورودیهای متن به همتایان عددی خود استفاده خواهیمGloVe ما از جاسازی کلمه
: برای بارگیری آن کد زیر را وارد کنید.کرد
!wget http://nlp.stanford.edu/data/glove.6B.zip
!unzip glove*.zip
embeddings_dictionary = dict()
یک، یک الیه جاساز، مدل ما دارای یک الیه ورودی.سپس با کد زیر مدل خود را ایجاد میکنیم
برچسب در6 چراکه ما، نورون خواهد بود6 نورون و یک الیه خروجی با128 باLSTM الیه
.خروجی داریم
deep_inputs = Input(shape=(maxlen,))
embedding_layer = Embedding(vocab_size, 100, weights=[embedding_matrix],
trainable=False)(deep_inputs)
LSTM_Layer_1 = LSTM(128)(embedding_layer)
dense_layer_1 = Dense(6, activation='sigmoid')(LSTM_Layer_1)
model = Model(inputs=deep_inputs, outputs=dense_layer_1)
=================================================================
Total params: 14,942,322
Trainable params: 118,022
Non-trainable params: 14,824,300
از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون: یادگیری عمیق172
حال. نورون است6 الیه متصل کامل با1 از شکل باال میبینید که الیه خروجی فقط شامل
:بیایید مدل خود را آموزش دهیم
history = model.fit(X_train, y_train, batch_size=128, epochs=5, verbose=1,
validation_split=0.2)
Epoch 1/5
798/798 [==============================] - 20s 17ms/step - loss: 0.1193 - acc: 0.9684 - val_loss:
0.0739 - val_acc: 0.9941
Epoch 2/5
798/798 [==============================] - 13s 17ms/step - loss: 0.0643 - acc: 0.9927 - val_loss:
0.0599 - val_acc: 0.9943
Epoch 3/5
798/798 [==============================] - 13s 17ms/step - loss: 0.0572 - acc: 0.9938 - val_loss:
0.0573 - val_acc: 0.9935
Epoch 4/5
798/798 [==============================] - 13s 17ms/step - loss: 0.0548 - acc: 0.9939 - val_loss:
0.0566 - val_acc: 0.9943
Epoch 5/5
798/798 [==============================] - 14s 17ms/step - loss: 0.0523 - acc: 0.9940 - val_loss:
0.0542 - val_acc: 0.9942
، در نهایت. درصد در مجموعه آزمون دست یافته است که بسیار عالی است99 مدل ما به دقت
مقادیر زیان و دقت را برای مجموعههای آموزشی و آزمایشی ترسیم میکنیم تا ببینیم آیا مدل ما
.منجر به بیشبرازش شده است یا خیر
import matplotlib.pyplot as plt
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
173 فصل پنجم :شبکههای عصبی بازگشتی
)'plt.title('model accuracy
)'plt.ylabel('accuracy
)'plt.xlabel('epoch
)'plt.legend(['train','test'], loc='upper left
)(plt.show
)]'plt.plot(history.history['loss
)]'plt.plot(history.history['val_loss
)'plt.title('model loss
)'plt.ylabel('loss
)'plt.xlabel('epoch
)'plt.legend(['train','test'], loc='upper left
)(plt.show
همچنان که در تصاویر باال مشاهده میکنید ،مدل منجر به بیشبرازش نشده است.
خود همانند انجمنها ،وبالگها ،میکروبالگها ،سایتهای نظردهی و غیره روزانه منجر به
تولید حجم وسیعی از دادهها میشوند .چنین دادههایی در قالب نظرات ،نقدها ،دیدگاهها در
مورد خدمات ،شرکتها ،سازمانها ،رویدادها ،افراد ،مسائل و موضوعات میباشد .نظرات
ارائه شده کاربران در شبکههای اجتماعی بسیار مهم و کابردی هستند .در یک فروشگاه برخط،
نظرات و دیدگاههای مختلف در مورد یک محصول میتواند سطح رضایت و کیفیت مشتری را
منعکس سازد که این میتواند راهنمای بسیار خوبی برای سایر خریداران باشد .طبقهبندی و
سازماندهی این حجم بسیار عظیم از نظرات در مورد یک موضوع خاص بهصورت دستی کار
آسانی نیست .از همینرو ،نیاز به یک سیستم خودکار برای جمعآوری نظرات منجر به ظهور یک
زمینه تحقیقاتی جدید به نام تحلیل احساسات ( )sentiment analysisشد .تحلیل احساسات،
زمینه مطالعاتی است که هدف اصلی آن شناسایی ،استخراج و طبقهبندی احساسات ،نظرات،
نگرشها ،افکار ،قضاوتها ،نقدها و دیدگاهها نسبت به موجودیتها ،سازمانها ،رویدادها و
غیره بدون تعامل انسانی در قالب دستههای مثبت ،منفی و یا خنثی میباشد.
دو رویکرد متفاوتی که محققین برای طبقهبندی احساسات در یک متن استفاده میکنند،
رویکردهای مبتنیبر واژگان و مبتنیبر یادگیری ماشین میباشد .رویکرد دیگری را هم میتوان
ترکیبی از این دو نظر گرفت .رویکرد مبتنیبر واژگان ،متمرکز بر استخراج کلمات یا عباراتی
است که میتواند فرآیند طبقهبندی را در جهتگیری معنایی خاصی هدایت کند .هر واژه دارای
بار معنایی خاصی است که از طریق یک فرهنگ واژه از کلمات با بار احساسی مثبت و منفی که
پیشتر امتیازبندی شدهاند ،استخراج میشود .با جمع امتیاز بار احساسی واژهها یا شمارش
تعداد واژههای با بار مثبت و منفی ،قطبیت کلی جمله بدست میآید .رویکرد یادگیری ماشین را
میتوان در حالتهای مختلفی برای مساله تحلیل احساسات آموزش داد و بکار برد .در حالت
یادگیری بانظارت با یک مجموعه داده آموزشی که پیشتر برچسب خورده است مدل آموزش
میبیند تا قادر به یادگیری شود و بتواند در مواجهه با دادههای دیده نشده رفتاری مشابه با دادههای
آموزش دیده از خود نشان دهد.
طی سالهای اخیر ،بهطور گستردهای توسط محققین اثبات شده است که مدلهای بازنمایی
مبتنیبر یادگیری عمیق در مسالههای مرتبط با طبقهبندی احساسات کارآیی بهتری دارند .اتخاذ
رویکردهای یادگیری عمیق در تحلیل احساسات به دلیل توانایی بسیار باالی مدلهای یادگیری
عمیق در یادگیری ویژگیها بهصورت خودکار است که میتواند به دقت و عملکرد بهتری دست
یابند .در بسیاری از زمینههای پردازش زبان طبیعی ،استفاده از یادگیری عمیق سبب شده است
نتایج از آنچه که در گذشته توسط روشهای یادگیری ماشین و روشهای آماری مورد استفاده
قرار میگرفته است ،فراتر رود.
حال که با تحلیل احساسات آشنایی پیدا کردید ،بیاید تا به کمک شبکه LSTMیک مدل
تحلیل احساسات در حوزهی نقدهای فیلمهای سینمایی بسازیم .برای این پیادهسازی ،از
175 شبکههای عصبی بازگشتی:فصل پنجم
مزیت این مجموعه داده این است که از قبل با کتابخانه. استفاده میکنیمIMDB مجموعه داده
. همراه استKeras مجموعه دادههای
:ابتدا مجموعه داده را از طریق کد زیر بارگیری میکنیم
from keras.datasets import imdb
top_words = 5000
(X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=top_words)
مجموعه داده را به دو مجموعه آموزشی و، کلمه برتر هر نقد5000 کد باال همزمان با بارگیری
: حال بیاید تا نگاهی به مجموعه داده بیاندازیم.آزمایشی تقسیم میکند
X_train
array([list([1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65, 458, 4468, 66, 3941, 4, 173, 36, 256, 5,
25, 100, 43, 838, 112, 50, 670, 22665, 9, 35, 480, 284, 5, 150, 4, 172, 112, 167, 21631, 336, 385,
39, 4, 172, 4536, 1111, 17, 546, 38, 13, 447, 4, 192, 50, 16, 6, 147, 2025, 19, 14, 22, 4, 1920,
4613, 469, 4, 22, 71, 87, 12, 16, 43, 530, 38, 76, 15, 13, 1247, 4, 22, 17, 515, 17, 12, 16, 626,
18, 19193, 5, 62, 386, 12, 8, 316, 8, 106, 5, 4, 2223, 5244, 16, 480, 66, 3785, 33, 4, 130, 12,
16, 38, 619, 5, 25, 124, 51, 36, 135, 48, 25, 1415, 33, 6, 22, 12, 215, 28, 77, 52, 5, 14, 407,
16, 82, 10311, 8, 4, 107, 117, 5952, 15, 256, 4, 31050, 7, 3766, 5, 723, 36, 71, 43, 530, 476, 26,
400, 317, 46, 7, 4, 12118, 1029, 13, 104, 88, 4, 381, 15, 297, 98, 32, 2071, 56, 26, 141, 6, 194,
7486, 18, 4, 226, 22, 21, 134, 476, 26, 480, 5, 144, 30, 5535, 18, 51, 36, 28, 224, 92, 25, 104,
4, 226, 65, 16, 38, 1334, 88, 12, 16, 283, 5, 16, 4472, 113, 103, 32, 15, 16, 5345, 19, 178, 32]),
list([1, 194, 1153, 194, 8255, 78, 228, 5, 6, 1463, 4369, 5012, 134, 26, 4, 715, 8, 118,
...,
list([1, 1446, 7079, 69, 72, 3305, 13, 610, 930, 8, 12, 582, 23, 5, 16, 484, 685, 54, 349,
11, 4120, 2959, 45, 58, 1466, 13, 197, 12, 16, 43, 23, 21469, 5, 62, 30, 145, 402, 11, 4131, 51,
575, 32, 61, 369, 71, 66, 770, 12, 1054, 75, 100, 2198, 8, 4, 105, 37, 69, 147, 712, 75, 3543, 44,
257, 390, 5, 69, 263, 514, 105, 50, 286, 1814, 23, 4, 123, 13, 161, 40, 5, 421, 4, 116, 16, 897,
13, 40691, 40, 319, 5872, 112, 6700, 11, 4803, 121, 25, 70, 3468, 4, 719, 3798, 13, 18, 31, 62,
40, 8, 7200, 4, 29455, 7, 14, 123, 5, 942, 25, 8, 721, 12, 145, 5, 202, 12, 160, 580, 202, 12, 6,
52, 58, 11418, 92, 401, 728, 12, 39, 14, 251, 8, 15, 251, 5, 21213, 12, 38, 84, 80, 124, 12, 9,
23]),
list([1, 17, 6, 194, 337, 7, 4, 204, 22, 45, 254, 8, 106, 14, 123, 4, 12815, 270, 14437, 5,
16923, 12255, 732, 2098, 101, 405, 39, 14, 1034, 4, 1310, 9, 115, 50, 305, 12, 47, 4, 168, 5, 235,
7, 38, 111, 699, 102, 7, 4, 4039, 9245, 9, 24, 6, 78, 1099, 17, 2345, 16553, 21, 27, 9685, 6139,
5, 29043, 1603, 92, 1183, 4, 1310, 7, 4, 204, 42, 97, 90, 35, 221, 109, 29, 127, 27, 118, 8, 97,
12, 157, 21, 6789, 85010, 9, 6, 66, 78, 1099, 4, 631, 1191, 5, 2642, 272, 191, 1070, 6, 7585, 8,
2197, 70907, 10755, 544, 5, 383, 1271, 848, 1468, 12183, 497, 16876, 8, 1597, 8778, 19280, 21, 60,
27, 239, 9, 43, 8368, 209, 405, 10, 10, 12, 764, 40, 4, 248, 20, 12, 16, 5, 174, 1791, 72, 7, 51,
6, 1739, 22, 4, 204, 131, 9])],
dtype=object)
همهیِ کلمات به.اگر به دادههای باال نگاه کنید متوجه میشوید که دادهها قبال پردازش شدهاند
اعداد صحیح نگاشت شدهاند و اعداد صحیح نشاندهنده کلمات مرتب شده بر اساس فراوانی
پنجمین کلمه پرکاربرد و5 ، نشان دهنده چهارمین کلمه پرکاربرد4 ، به عنوان مثال.آنها هستند
0 برای یک کلمه ناشناخته و2 عدد صحیح، برای نشانگر شروع1 عدد صحیح.غیره است
اگر میخواهید خودتان به نقدها نگاهی بیندازید و ببینید مردم. رزرو شده استpadding برای
: میتوانید این روند را نیز معکوس کنید،چه نوشتهاند
word_index = imdb.get_word_index() # get {word : index}
index_word = {v : k for k,v in word_index.items()} # get {index : word}
index = 1
print(" ".join([index_word[idx] for idx in x_train[index]]))
print("positve" if y_train[index]==1 else "negetive")
the thought solid thought senator do making to is spot nomination assumed while he of
jack in where picked as getting on was did hands fact characters to always life
thrillers not as me can't in at are br of sure your way of little it strongly random
to view of love it so principles of guy it used producer of where it of here icon film
of outside to don't all unique some like of direction it if out her imagination below
keep of queen he diverse to makes this stretch stefan of solid it thought begins br
از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون: یادگیری عمیق176
senator machinations budget worthwhile though ok brokedown awaiting for ever better
were lugia diverse for budget look kicked any to of making it out bosworth's follows
for effects show to show cast this family us scenes more it severe making senator to
levant's finds tv tend to of emerged these thing wants but fuher an beckinsale cult as
it is video do you david see scenery it in few those are of ship for with of wild to
one is very work dark they don't do dvd with those them
negetive
کلمه500 میخواهیم هر نقد را به، از نظرِ طول بسیار متفاوت هستند،از آنجایی که نقدها
ما باید نمونههای متنی با طول یکسان داشته باشیم تا بتوانیم آنها را به شبکه.اول برش دهیم
. آنها را با صفر اضافه میکنیم، کلمه باشند500 اگر نقدها کوتاهتر از.عصبی خود وارد کنیم
چراکه مجموعهای از روالهای پیشپردازش را ارائه، برای این کار بسیار عالی استKeras
:میدهد که میتواند این کار را براحتی برای ما انجام دهد
word_index = imdb.get_word_index() # get {word : index}
index_word = {v : k for k,v in word_index.items()} # get {index : word}
index = 1
print(" ".join([index_word[idx] for idx in x_train[index]]))
print("positve" if y_train[index]==1 else "negetive")
برای درک بهتر بیاید یک نمونه از دادهها را به صورت تصادفی انتخاب کنیم و مشاهده کنیم که
:کد باال چه کاری انجام داده است
X_train[125]
array([ 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1, 11,
6, 58, 54, 4, 14537, 5, 6495, 4, 2351,
1630, 71, 13202, 23, 26, 20094, 40865, 34, 35,
9454, 1680, 8, 6681, 692, 39, 94, 205, 6177,
712, 121, 4, 18147, 7037, 406, 2657, 5, 2189,
61778, 26, 23906, 11420, 6, 708, 44, 4, 1110,
656, 4667, 206, 15, 230, 13781, 15, 7, 4,
4847, 36, 26, 54759, 238, 306, 2316, 190, 48,
25, 181, 8, 67, 6, 22, 44, 15, 353,
1659, 84675, 3048, 4, 9818, 305, 88, 11493, 9,
31, 7, 4, 91, 12789, 53410, 3106, 126, 93,
40, 670, 8759, 41931, 6, 6951, 4, 167, 47,
623, 23, 6, 875, 29, 186, 340, 4447, 7,
5, 44141, 27, 5485, 23, 220, 175, 2122, 10,
10, 27, 4847, 26, 6, 5261, 2631, 604, 7,
2118, 23310, 36011, 5350, 17, 48, 29, 71, 12129,
18, 1168, 38886, 33829, 1918, 31235, 3255, 9977, 31537,
9248, 40, 35, 1755, 362, 11, 4, 2370, 2222,
56, 7, 4, 23052, 2489, 39, 609, 82401, 48583,
6, 3440, 655, 707, 4198, 3801, 37, 4486, 33,
175, 2631, 114, 471, 17, 48, 36, 181, 8,
30, 1059, 4, 3408, 5963, 2396, 6, 117, 128,
21, 26, 131, 4218, 11, 20663, 3826, 14524, 10,
10, 12, 9, 614, 8, 97, 6, 1393, 22,
44, 995, 84, 21800, 5801, 21, 14, 9, 6,
4953, 22, 44, 995, 84, 93, 34, 84, 37,
104, 507, 11076, 37, 26, 662, 180, 8, 4,
5075, 11, 882, 71, 31, 8, 39022, 36011, 31537,
5, 48583, 19, 1240, 31800, 1806, 11521, 5, 7863,
28281, 4, 959, 62, 165, 30, 8, 2988, 4,
177 شبکههای عصبی بازگشتی:فصل پنجم
، کلمه داشته است500 به دلیل اینکه این رکورد طولی کمتر از،همانطور که در باال میبینید
. داشته باشد500 جلوی آن قرار گرفته است تا این رکورد طولی برابر با0 تعدادی
به طرز تعجبآوری کار پیشپردازش دادههای ما به تمام رسید و اکنون میتوانیم شروع به
:ساخت مدل خود کنیم
from keras.models import Sequential
from keras.layers import Embedding
from keras.layers import LSTM, Dense
embedding_vector_length = 32
model = Sequential()
model.add(Embedding(top_words, embedding_vector_length,
input_length=max_review_length))
model.add(LSTM(100))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy',optimizer='adam',
metrics=['accuracy'])
print(model.summary())
Model: "sequential_2"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding (Embedding) (None, 500, 32) 160000
=================================================================
Total params: 213,301
Trainable params: 213,301
Non-trainable params: 0
_________________________________________________________________
None
در مثال قبلی ما از جاساز. دو راه برای جاساز کلمات وجود دارد،همانطور که پیشتر بیان شد
. استفاده میکنیمEmbedding در این مثال از الیه.کلمات از پیشآموزش دیده استفاده کردیم
. یک جاساز کلمات را از مجموعه داده یاد میگیردembedding الیه
:اکنون نوبت به آموزش مدل میرسد
178یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
همانطور که مشاهده میشود مدل در عین سادگی توانسته است به دقتی حدود 86درصد دست
یابد که با توجه به مسئله دشوار بسیار عالی است .با این حال ،این مدل بهترین مدلِ ممکن
نیست .به عنوان تمرین ،میتوانید با آزمایش برروی ابرپارمترهای مختلف نتایج را مشاهده کنید
و یک مدل با کارایی باال بسازید .همچنین ،نمودار زیان و دقت را برای مدلها رسم کنید و ببینید
آیا مدلها منجر به بیشبرازش شدهاند یا خیر .در مورد مدل باال نظر شما در خصوص بیشبرازش
چیست؟
خالصه فصل
▪ شبکههای عصبی بازگشتی ،نواقصِ شبکههای عصبیِ پیشخور را برطرف میکنند.
▪ RNNهای ساده قادر به یادگیری وابستگیهای بلند مدت نیستند.
▪ LSTMمیتواند وابستگیهای بلندمدت را به دلیلِ وجود یک سلول حافظهی مخصوص
در ساختارش ،انجام دهد.
آزمونک
یک LSTMچه تعداد دروازه دارد و نقش هر یک از آنها چیست؟
شبکه متخاصم مولد 6
اهداف یادگیری:
تفاوت مدل مولد با مدل تفکیکگر ▪
آشنایی با شبکه متخاصم مولد ▪
آموزش به شیوه تخاصمی ▪
تولید ارقام دستنویس با شبکه متخاصم مولد ▪
180یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
مقدمه
در این فصل قصد داریم به معرفی خانوادهای از مدلهای مولد بر اساس برخی مفاهیم تئوری
بازیها بپردازیم .ویژگیِ اصلی آنها یک روش آموزشی متخاصم است که با هدفِ یادگیریِ تمایز
بین نمونههای واقعی و جعلی توسط یک مولفه ،در همان زمان ،مولفهی دیگری نمونههایی را
بیشتر و بیشتر شبیه به نمونههای آموزشی تولید میکند .به صورت خالصه در این شبکهها ،یکی
تولید میکند ،دیگری نکتهگیری میکند و در کنار هم و در یک همکاری کامل ،نتایج بسیار خوبی
بدست میآورند.
مدل تفکیکگر به یافتن مرزها یا قوانینی برای تفکیک دادهها عالقهمند است. ▪
مدل مولد بر مدلسازیِ توزیع دادهها تمرکز دارد. ▪
است .برای این کار ،ما از دانش شبکههای عصبی برای یادگیری تابعی استفاده میکنیم که میتواند
توزیع مدل را به توزیع واقعی تقریب بزند.
مدلهای مولد را میتوان به عنوان یک کالس از مدلها تعریف کرد که هدف آنها
یادگیری نحوهیِ تولید نمونههای جدیدی است که به نظر میرسد از همان مجموعه
دادههای آموزشی هستند .در طول مرحله آموزش ،یک مدل مولد در تالش است یک
مساله تخمین چگالی را حل کند .در تخمین چگالی ،مدل میآموزد تا یک تخمین تا حد
امکان شبیه به تابع چگالی احتمال غیرقابل مشاهده بسازد .نکته مهم این است که،
مدل مولد باید بتواند نمونههای جدیدی از توزیع را تشکیل دهد و نه فقط نمونههای
موجود را رونوشت و ایجاد کند.
▪ اوال ،صرفا از نقطه نظرِ تئوری ما نباید تنها به توانایی برتر در طبقهبندی دادهها بسنده
کنیم ،بلکه باید به دنبال درک کاملتری از نحوه تولید دادهها در وهله اول باشیم .بدون
شک حل این مسئله بسیار دشوارتر در مقایسه روشهای تفکیکگر است .با این حال،
همانطور که خواهیم دید ،بسیاری از تکنیکهای مشابهی که باعث توسعه در مدلسازی
تفکیکگر شدهاند (همانند یادگیری عمیق) ،میتوانند توسط مدلهای مولد نیز مورد
استفاده قرار گیرند.
▪ دوم ،این احتمال وجود دارد که مدلسازی مولد برایِ هدایتِ پیشرفتهای آینده در
زمینههای دیگر یادگیری ماشین ،همانند یادگیری تقویتی ،مهمتر و تاثیرگذارتر از هر چیز
دیگری باشد .به عنوان مثال ،میتوانیم از یادگیری تقویتی برای آموزش یک ربات برای
راه رفتن در یک زمین خاص استفاده کنیم .رویکرد کلی ،ساخت یک شبیهسازی رایانهای
از زمین و سپس اجرای آزمایشهای زیادی است که در آن عامل استراتژیهای مختلف
را امتحان میکند .با گذشت زمان ،عامل میآموزد که کدام استراتژیها موفقتر از سایرین
هستند و بنابراین به تدریج بهبود مییابند .یک مشکل معمولی با این رویکرد این است
که فیزیک محیط اغلب بسیار پیچیده است و باید در هر مرحله محاسبه شود تا اطالعات
182یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
به عامل برای تصمیمگیری در مورد حرکتِ بعدیِ خود ،بازگردانده شود .با این حال ،اگر
عامل بتواند محیط خود را از طریق یک مدل مولد شبیهسازی کند ،نیازی به آزمایش
استراتژی در شبیهسازی رایانهای یا در دنیای واقعی نخواهد داشت ،بلکه میتواند در
محیط خیالی خود بیاموزد.
▪ در نهایت ،اگر واقعا بخواهیم بگوییم که ماشینی ساختهایم که شکلی از هوش را بدست
آورده است که با هوش انسان قابل مقایسه است ،مدلسازی مولد مطمئنا باید بخشی از
راهحل باشد .یکی از بهترین نمونههای مدل مولد در دنیای واقعی ،شخصی است که این
کتاب را میخواند .لحظهای به این فکر کنید که شما چه مدل مولد باورنکردنی هستید.
میتوانید چشمان خود را ببندید و تصور کنید که یک فیل از هر زاویه ممکن چه شکلی
است .شما میتوانید تعدادیِ پایان متفاوت و قابل قبول برای برنامه تلویزیونی مورد عالقه
خود تصور کنید و همچنین شما میتوانید هفته خود را با کار از طریق آینده در ذهن خود
برنامهریزی کرده و براساس آن اقدام کنید .نظریه عصبشناسی فعلی نشان میدهد که
درک ما از واقعیت یک مدل تفکیکگر بسیار پیچیده نیست که بر روی ورودی حسی ما
برای تولید پیشبینیهایی از آنچه تجربه میکنیم عمل میکند ،بلکه در عوض یک مدل
مولد است که از بدو تولد برای تولید شبیهسازی محیط اطرافمان که دقیقا با آینده تطبیق
میکند ،آموزش داده میشود.
بصری داریم ،اما نسبتا کند هستیم و ارزیابیهای ما میتواند بسیار ذهنی باشد .در عوض
میتوانیم یک شبکه عصبی را آموزش دهیم تا وظیفه تمایز بین تصاویر واقعی و تولید شده را
بیاموزد .سپس ،میتوان به مولد تصویر (شبکه عصبی) و تمایزگر فرصت داد تا از یکدیگر یاد
بگیرند و در طول زمان بهبود یابند .این دو شبکه که این بازی را انجام میدهند ،یک شبکه
متخاصم مولد هستند.
شبکههای متخاصم مولد یا به اختصار ،GANدستهای از تکنیکهای یادگیری ماشین هستند
که از دو مدل آموزش داده شده بهطور همزمان تشکیل شدهاند :یکی مولد ( )Generatorکه
برای تولید دادههای جعلی آموزش داده شده است و دیگری تمایزگر ( )Discriminatorکه
آموزش دیده است تا به تشخیص دادههای جعلی از نمونههای واقعی بپردازد .کلمه مولد ،هدف
کلی مدل را نشان میدهد :ایجاد دادههای جدید .دادههایی که یک GANیاد میگیرد تولید کند
به انتخاب مجموعه آموزشی بستگی دارد .برای مثال ،اگر بخواهیم یک GANتصاویری شبیه
به داوینچی را ترکیب کند ،از مجموعه داده آموزشی آثار هنری داوینچی استفاده میکنیم.
اصطالح تخاصم ( )adversarialبه رقابتی پویا و بازیمانندِ بین دو مدلی که چارچوب
GANرا تشکیل میدهند اشاره دارد :مولد و تمایزگر .هدف مولد ایجاد نمونههایی است که از
دادههای واقعی در مجموعه آموزشی قابل تشخیص نیستند .در مثال ما ،این به معنای تولید
نقاشی هایی است که دقیقا شبیه نقاشیهای داوینچی هستند .هدف تمایزگر تشخیص نمونههای
جعلی تولید شده توسط مولد از نمونههایِ واقعِی حاصل از مجموعه دادههایِ آموزشی است .در
مثال ما ،تمایزگر ،نقش یک متخصص هنری را بازی میکند که اصالت نقاشیهایی را که تصور
میشود متعلق به داوینچی است ،ارزیابی میکند .این دو شبکه به طور مداوم در تالش هستند تا
یکدیگر را فریب دهند :هر چه مولد در ایجاد دادههایِ واقعبینانه بهتر باشد ،تمایزگر باید در
تشخیص نمونههای واقعی از نمونههای جعلی بهتر عمل کند.
در نهایت ،کلمه شبکهها کالسِ مدلهای یادگیریِ ماشینی را نشان میدهد که معموال برای
نشان دادن مولد و تمایزگر استفاده میشوند :شبکههای عصبی .بسته به پیچیدگی پیادهسازی
،GANمیتوانند از شبکههای عصبی پیشخور ساده تا شبکههای عصبی کانولوشنی یا حتی انواع
پیچیدهتری از آنها باشند.
ریاضیات زیربنایی GANها پیچیده هستند .خوشبختانه ،بسیاری از قیاسهایِ دنیایِ واقعی
میتوانند درک GANها را آسانتر کنند .در مثال قبلی در مورد یک جاعلِ هنری (مولد) صحبت
کردیم که تالش میکند یک متخصص هنری (تمایزگر) را فریب دهد .هر چه نقاشیهای جعلی
که جاعل میسازد متقاعدکنندهتر باشد ،متخصص هنری باید در تشخیص صحت آنها بهتر
عمل کند .این امر در وضعیت معکوس نیز صادق است :هر چه متخصص هنری در تشخیص
واقعی بودن یک نقاشیِ خاص بهتر باشد ،جاعل باید برای جلوگیری از گرفتار شدن ،بهتر عمل
کند.
184یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
به عبارت دقیقتر ،هدفِ مولد ،تولید نمونههایی است که ویژگیهایِ مجموعه داده آموزشی
را به تصویر میکشد ،بهطوری که نمونههایی که تولید میکند از دادههای آموزشی قابل تشخیص
نیستند .مولد را میتوان به عنوان یک مدل تشخیص شی در وضعیت معکوس در نظر گرفت.
الگوریتمهای تشخیص اشیا الگوهای موجود در تصاویر را یاد میگیرند تا محتوای یک تصویر
را تشخیص دهند .در مقابل ،به جای تشخیص الگوها ،مولد یاد میگیرد که اساسا آنها را از
ابتدا ایجاد کند .در واقع ،ورودی مولد اغلب بیش از یک بردار اعداد تصادفی نیست .مولد از
طریق بازخوردهایی که از تمایزگر دریافت میکند ،یاد میگیرد .هدف تمایزگر ،تعیین این است
که آیا یک نمونهیِ خاص واقعی (برگرفته از مجموعه داده آموزشی) یا جعلی (ایجاد شده توسط
مولد) است .بر این اساس ،هر بار که تمایزگر فریب خورده و یک تصویر جعلی را به عنوان
واقعی طبقهبندی میکند ،مولد ،میداند که کاری را به خوبی انجام داده است .برعکس ،هر بار
که تمایزگر به درستی تصویر تولید شده توسط مولد را به عنوان جعلی رد میکند ،مولد بازخوردی
را دریافت میکند که باید بهبود یابد .تمایزگر نیز به بهبود خود ادامه میدهد .مانند هر طبقهبند
دیگری ،از اختالف بین پیشبینیهایش با برچسبهای واقعی (واقعی یا جعلی) یاد میگیرد.
بنابراین ،همانطور که مولد در تولید دادههای واقعی بهتر میشود ،تمایزگر در تشخیص دادههای
جعلی از واقعی بهتر میشود و هر دو شبکه به طور همزمان به پیشرفت خود ادامه میدهند.
در شبکههای متخاصم مولد ،نویز به شبکهیِ عصبیِ مولد القا میشود که نمونههای
جعلی از طریق آن ایجاد میشود .وظیفه شبکهی تمایزگر شناسایی نمونههای جعلی
تولید شده توسط شبکه مولد است .این با بررسی نمونههای آموزشی مشخص میشود
تا ببینید که نمونه تولید شده چقدر با نمونههای واقعی متفاوت است .این شبکهها
مانند دو دشمن عمل میکنند که سعی در رقابت با یکدیگر دارند .در مراحل اولیه،
شبکه تمایزگر براحتی میتواند نمونههای جعلی تولید شده توسط مولد را شناسایی
کند .سپس شبکه مولدِ رقیب ،سخت کار میکند تا تفاوت نمونههای جعلی تولید شده
از دادههای واقعی را کاهش دهد .آنها سعی میکنند نمونههایی را نزدیک به نمونههای
آموزشی تولید کنند و این کار را برای شبکه تمایزگر کمی چالشبرانگیز میکند .با این
حال ،هنوز شبکه تمایزگر تالش میکند تا جعلی بودن دادههای تولید شده را بیابد .هر
دو شبکه با یکدیگر رقابت میکنند تا زمانی که شبکه تمایزگر تشخیص اینکه کدام
یک از نمونههای تولید شده توسط شبکه مولد جعلی و کدام واقعی است ،برایش
دشوار شود.
واقعی تولید شود .هدف مولد در GANتولید نمونههای است که بهنظر میرسد از توزیع دادههای
واقعی میآیند ،حتی اگر جعلی هستند و هدف تمایزگر ،تشخیصِ جعلی یا واقعی بودن نمونههای
تولیدی است.
از منظرِ بهینهسازی ،هدفِ آموزشیِ مولد ،افزایش خطاهای تمایزگر است .به عبارت دیگر،
هر چه تعداد اشتباهات بیشتری توسط تمایزگر انجام شود ،مولد عملکرد بهتری دارد .هدف
تمایزگر کاهش خطای خود است .در هر تکرار ،هر دو شبکه با استفاده از گردایان کاهشی به
سمت اهداف خود میروند .جالب اینجاست که هر شبکه در تالش است تا شبکه دیگری را
شکست دهد .مولد تالش میکند تمایزگر را فریب دهد ،در حالی که تمایزگر تالش میکند فریب
نخورد .در نهایت ،دادههای تولیدی (مانند تصاویر ،صدا ،ویدئو ،سریهای زمانی) از مولد
میتواند پیچیدهترین تمایزگر را فریب دهد.
در عمل ،مولد نمونههای تصادفی را از یک توزیع از پیش تعریفشده با توزیع بهعنوان ورودی
میگیرد و دادههایی را تولید میکند که به نظر میرسد از توزیع هدف میآیند.
به عنوان مثالی از تولید یک تصویر ،یک مدل GANرا میتوان در شکل زیر نشان داد:
.1شبکه مولد نمونههای تصادفی را از توزیع گاوسی میگیرد و تصاویر را ایجاد میکند.
.2این تصاویر تولید شده سپس به شبکه تمایزگر داده میشوند.
.3شبکه تمایزگر هم تصاویر تولید شده و هم تصاویری را که از مجموعه داده واقعی گرفته
شدهاند را میگیرد.
.4تمایزگر احتماالت را در خروجی میدهد.
.5زیانِ (تابع هزینه) مولد ،بر اساسِ آنتروپیِ متقاط ِع تصاویرِ جعلی که توسط تمایزگر
معتبر تلقی میشود ،محاسبه میشود.
.6زیانِ (تابع هزینه) تمایزگر بر اساسِ آنتروپیِ متقاط ِع تصاویرِ جعلی که جعلی تلقی
میشوند ،به اضافه آنتروپی متقاطع تصاویر واقعی که معتبر تلقی میشوند ،محاسبه
میشود.
.7در هر دوره ،هر دو شبکه به ترتیب برای به کمینه کردن زیان خود بهینه میشوند.
.8در نهایت مولدِ به خوبی آموزشدیده ،تصاویر را به عنوان خروجی نهایی تولید میکند
که تصاویرِ ورودیِ واقعی را تقلید میکند.
آموزش GAN
هدف اصلی ما این است که مولد تصاویر (دادههای) واقعی تولید کند و چارچوب GAN
وسیلهای برای این هدف است .قبل از پرداختن به جزئیات بیشتر ،اجازه دهید به معرفی چند
نماد بپردازیم:
آموزش GANدر مقایسه با آموزش یک شبکهیِ عصبیِ عمیقِ معمولی متفاوت است ،چراکه
ما دو شبکه داریم .میتوانیم آن را بهعنوان یک بازیِ مجموع-صفرِ کمینبیشِ متوالی دو بازیکن
(مولد و تمایزگر) در نظر بگیریم:
آموزش تمایزگر
تمایزگر یک طبقهبند شبکه عصبی است و میتوانیم آن را به روش معمول ،با استفاده از گرادیان
کاهشی و پسانتشار آموزش دهیم .با این حال ،مجموعه آموزشی از بخشهای مساوی نمونههای
واقعی و تولید شده تشکیل شده است .بیایید ببینیم که چگونه میتوان آن را در فرآیند آموزش
گنجاند:
188یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
برای درک از زیان تمایزگر ،بیایید فرمول زیان آنتروپی متقاطع را یادآوری کنیم:
𝑛
جایی که )𝑥( 𝑖𝑞 احتمالِ تخمینِ خروجیِ متعلق به کالس 𝑖 (از 𝑛 کالس) و )𝑥( 𝑖𝑝 احتمال واقعی
است .برای سادگی ،فرض میکنیم که فرمول را روی یک نمونه آموزشی اعمال میکنیم .در مورد
طبقهبندی دودویی ،این فرمول را میتوان به صورت زیر ساده کرد:
با دانستن همهیِ اینها ،حال بیایید زیان تمایزگر را تعریف کنیم:
1 1
)))𝑧(𝐺(𝐷 𝐽(𝐷) = − 𝔼𝑥~𝑝𝑑𝑎𝑡𝑎 log(𝐷(𝑥)) − 𝔼𝑧 log (1 −
2 2
اگرچه پیچیده به نظر میرسد ،با این حال فقط یک زیان آنتروپی متقاطع برای یک طبقهبند
دودویی با برخی موارد خاص GANاست.
189 فصل ششم :شبکه متخاصم مولد
آموزش مولد
ما مولد را با بهترکردنِ آن در فریب دادن متمایزگر آموزش خواهیم داد .برای انجام این کار ،به
هر دو شبکه نیاز داریم ،مشابه روشی که ما تمایزگر را با نمونههای جعلی آموزش میدهیم:
.1ما با یک بردار نهفته تصادفی 𝑧 شروع میکنیم و آن را از طریق مولد و تمایزگر تغذیه
میکنیم تا خروجی ))𝑧(𝐺(𝐷 را تولید کنیم.
.2تابع زیان ،همان زیانِ تمایزگر است .با این حال ،هدف ما در اینجا بیشینه کردن آن
است ،نه کمینه کردن .چرا که میخواهیم تمایزگر را فریب دهیم.
.3در فاز عقبگرد ،وزنهای تمایزگر 𝑑𝜃 قفل هستند و فقط میتوانیم 𝑔𝜃 را تنظیم کنیم.
این به ما این امکان را میدهد به جای بدتر کردن تمایزگر ،با بهتر کردن مولد زیان
تمایزگر را بیشینه کنیم.
در این مرحله ما فقط از دادههای تولید شده استفاده میکنیم .بخشی از تابع زیان که با دادههای
واقعی سروکار دارد همیشه 0خواهد بود .بنابراین ،میتوانیم آن را به صورت زیر ساده کنیم:
در اوایل ،زمانی که متمایزگر براحتی میتواند نمونههای واقعی و جعلی را تشخیص دهد،
( ،)𝐷(𝐺(𝑧)) ≈ 0گرادیان نزدیک به صفر خواهد بود .این امر منجر به یادگیری کمی از وزنها
می شود که این مشکل به عنوان گرادیان کاهیده ( )diminished gradientشناخته میشود .ما
میتوانیم این مشکل را با استفاده از یک تابع زیان متفاوت حل کنیم:
این زیان هنوز کمینه میشود ،زمانی که 𝐷(𝐺(𝑧)) ≈ 1و در عین حال گرادیان بزرگ است
(زمانی که مولد عملکرد ضعیفی دارد) .با این زیان ،بازی دیگر مجموعصفر نیست ،اما تاثیر
عملی بر چارچوب GANنخواهد داشت.
با دانش جدیدمان ،میتوانیم هدف کمینبیشین را به طور کامل تعریف کنیم:
1 1
)))𝑧(𝐺(𝐷 𝑚𝑖𝑛𝐺 𝑚𝑎𝑥𝐷 𝑉(𝐺, 𝐷) = 𝔼𝑥~𝑝𝑑𝑎𝑡𝑎 log(𝐷(𝑥)) + 𝔼𝑧 log (1 −
2 2
به طور خالصه ،مولد سعی می کند هدف را کمینه کند ،در حالی که تمایزگر سعی میکند آن را
بیشینه کند .توجه داشته باشید ،در حالیکه تمایزگر باید زیان خود را کمینه کند ،هدف کمینبیش
منفی زیان تمایزگر است .بنابراین تمایزگر باید آن را بیشینه کند.
190یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
همانطور که احتماال متوجه شدید ،ما هیچ یک از برچسبها یا مجموعه داده آزمایشی را بر
نمیگردانیم .ما فقط از مجموعه داده آموزشی استفاده میکنیم .برچسبها مورد نیاز نیستند ،زیرا
تنها برچسبهایی که استفاده خواهیم کرد 0برای جعلی و 1برای واقعی است .اینها تصاویر
واقعی هستند ،بنابراین به همه آنها یک برچسب 1در تمایزگر اختصاص داده میشود.
ما از یک پرسپترون چند الیه استفاده خواهیم کرد و به آن تصویری به عنوان یک بردارِ مسطح
با اندازه 784میدهیم ،بنابراین دادههای آموزشی را تغییر شکل میدهیم:
)X_train = X_train.reshape(60000, 784
اکنون باید یک مولد و تمایزگر بسازیم .هدف مولد دریافت یک ورودی نویزدار و تولید تصویری
مشابه مجموعه داده آموزشی است .اندازه ورودی نویز توسط متغیر randomDimتعیین میشود.
می توانید آن را به هر مقداری مقداردهی اولیه کنید .معموال آن را روی 100تنظیم میکنند .برای
پیادهسازی ،ما مقدار 10را امتحان کردیم .این ورودی به یک الیه متراکم با 256نورون با
فعالسازی LeakyReLUوارد میشود .در مرحله بعد یک الیه متصل کامل دیگر با 512نورون
پنهان اضافه میکنیم ،به دنبال آن الیه سوم پنهان با 1024نورون و در نهایت الیه خروجی با
784نورون را اضافه میکنیم .میتوانید تعداد نورونها را در الیههای پنهان تغییر دهید و ببینید
عملکرد چگونه تغییر میکند .با این حال ،تعداد نورونها در واحد خروجی باید با تعداد
پیکسلهای موجود در تصاویر آموزشی مطابقت داشته باشد .مولد مربوط به صورت زیر است:
191 شبکه متخاصم مولد:فصل ششم
randomDim = 10
generator = Sequential()
generator.add(Dense(256, input_dim=randomDim))
generator.add(LeakyReLU(0.2))
generator.add(Dense(512))
generator.add(LeakyReLU(0.2))
generator.add(Dense(1024))
generator.add(LeakyReLU(0.2))
generator.add(Dense(784, activation='tanh'))
توجه داشته باشید که تمایزگر تصاویر را از مجموعه. ما یک تمایزگر ایجاد میکنیم،به طور مشابه
با این. است784 بنابراین اندازه ورودی آن،آموزشی یا تصاویر تولید شده توسط مولد میگیرد
نشاندهنده یک تصویر جعلی است (تولید0 خروجی تشخیص دهنده یک بیت است و،حال
: نشان میدهد که تصویر از مجموعه داده آموزشی است1 شده توسط مولد) و
discriminator = Sequential()
discriminator.add(Dense(1024, input_dim=784,
kernel_initializer=initializers.RandomNormal(stddev=0.02)))
discriminator.add(LeakyReLU(0.2))
discriminator.add(Dropout(0.3))
discriminator.add(Dense(512))
discriminator.add(LeakyReLU(0.2))
discriminator.add(Dropout(0.3))
discriminator.add(Dense(256))
discriminator.add(LeakyReLU(0.2))
discriminator.add(Dropout(0.3))
discriminator.add(Dense(1, activation='sigmoid'))
از زیان آنتروپی.تدبیر برای آموزش این دو این است که ابتدا تمایزگر را جداگانه آموزش میدهیم
میکنیم وfreeze وزنهای تمایزگر را، سپس.متقاطع دودویی برای تمایزگر استفاده میکنیم
: این منجر به آموزش مولد میشود. ترکیبی را آموزش میدهیمGAN
discriminator.compile(loss='binary_crossentropy', optimizer=adam)
gan.compile(loss='binary_crossentropy', optimizer=adam)
آن، برای هر دوره ابتدا نمونهای از نویز تصادفی میگیریم.حاال بیایید آموزش را اجرا شروع کنیم
ما تصاویر جعلی تولید شده و تصاویر.را به مولد میدهیم و مولد یک تصویر جعلی تولید میکند
آموزشی واقعی را در یک دسته با برچسبهای خاص خود ترکیب میکنیم و از آنها برای آموزش
:تمایزگر در دسته داده شده استفاده میکنیم
از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون: یادگیری عمیق192
dLosses = []
gLosses = []
def train(epochs=1, batchSize=128):
batchCount = int(X_train.shape[0] / batchSize)
print ('Epochs:', epochs)
print ('Batch size:', batchSize)
print ('Batches per epoch:', batchCount)
# Train discriminator
discriminator.trainable = True
dloss = discriminator.train_on_batch(X, yDis)
ما می خواهیم تصاویر تولید شده توسط. ژنراتور را آموزش میدهیم،for حاال در همان حلقه
بنابراین از یک بردار تصادفی (نویز) به عنوان، واقعی تشخیص داده شوند، توسط تمایزگر،مولد
را طوریGAN این یک تصویر جعلی تولید میکند و سپس.ورودی به مولد استفاده میکنیم
:)1 آموزش میدهد که متمایز کننده تصویر را واقعی درک کند (خروجی
# Train generator
noise = np.random.normal(0, 1, size=[batchSize, randomDim])
yGen = np.ones(batchSize)
discriminator.trainable = False
gloss = gan.train_on_batch(noise, yGen)
. میتوانید زیان مولد و تمایزگر و همچنین تصاویر تولید شده را ذخیره کنید،در صورت تمایل
دوره تصاویر تولید20 ما زیان را برای هر دوره ذخیره میکنیم و پس از هر،در مرحله بعد
:میکنیم
# Store loss of most recent batch from this epoch
dLosses.append(dloss)
gLosses.append(gloss)
if e == 1 or e % 20 == 0:
saveGeneratedImages(e)
وplotLoss ، دو تابع کمکی،برای ترسیم زیان و تصاویر تولید شده ارقام دستنویس
: کد آنها به شرح زیر است. تعریف میکنیمsaveGeneratedImages
193 شبکه متخاصم مولد:فصل ششم
plt.figure(figsize=figsize)
for i in range(generatedImages.shape[0]):
plt.subplot(dim[0], dim[1], i+1)
plt.imshow(generatedImages[i], interpolation='nearest',
cmap='gray_r')
plt.axis('off')
plt.tight_layout()
plt.savefig('images/gan_generated_image_epoch_%d.png' % epoch)
randomDim = 10
generator = Sequential()
generator.add(Dense(256, input_dim=randomDim)) #,
kernel_initializer=initializers.RandomNormal(stddev=0.02)))
generator.add(LeakyReLU(0.2))
generator.add(Dense(512))
generator.add(LeakyReLU(0.2))
generator.add(Dense(1024))
generator.add(LeakyReLU(0.2))
generator.add(Dense(784, activation='tanh'))
از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون: یادگیری عمیق194
discriminator = Sequential()
discriminator.add(Dense(1024, input_dim=784,
kernel_initializer=initializers.RandomNormal(stddev=0.02)))
discriminator.add(LeakyReLU(0.2))
discriminator.add(Dropout(0.3))
discriminator.add(Dense(512))
discriminator.add(LeakyReLU(0.2))
discriminator.add(Dropout(0.3))
discriminator.add(Dense(256))
discriminator.add(LeakyReLU(0.2))
discriminator.add(Dropout(0.3))
discriminator.add(Dense(1, activation='sigmoid'))
discriminator.compile(loss='binary_crossentropy', optimizer=adam)
# Combined network
discriminator.trainable = False
ganInput = Input(shape=(randomDim,))
x = generator(ganInput)
ganOutput = discriminator(x)
gan = Model(inputs=ganInput, outputs=ganOutput)
gan.compile(loss='binary_crossentropy', optimizer=adam)
dLosses = []
gLosses = []
plt.figure(figsize=figsize)
for i in range(generatedImages.shape[0]):
plt.subplot(dim[0], dim[1], i+1)
plt.imshow(generatedImages[i], interpolation='nearest',
cmap='gray_r')
plt.axis('off')
plt.tight_layout()
plt.savefig('images/gan_generated_image_epoch_%d.png' % epoch)
# Train discriminator
discriminator.trainable = True
dloss = discriminator.train_on_batch(X, yDis)
# Train generator
noise = np.random.normal(0, 1, size=[batchSize,
randomDim])
yGen = np.ones(batchSize)
discriminator.trainable = False
gloss = gan.train_on_batch(noise, yGen)
if e == 1 or e % 20 == 0:
saveGeneratedImages(e)
در شکل زیر میتوانید نمودار زیان مولد و تمایزگرِ GANدر حال یادگیری را مشاهده کنید:
ارقام دستنویس تولید شده توسط GANما در دورههای مختلف به صورت زیر هستند:
همانطور ک از شکلهای قبلی میتوانید ببینید ،با افزایش دورهها ،ارقام دستنویس تولید شده
توسط GANبیشتر و بیشتر واقعی میشوند.
خالصه فصل
▪ بهطور کلی دو نوع مدل اصلی در یادگیری ماشین وجود دارد :مدل مولد و مدل تفکیکگر.
▪ مدلهای تفکیکگر بر پیشبینی کالسهای داده با توجه به ویژگیهای آنها تمرکز میکنند.
▪ مدل مولد سعی نمیکند ویژگیها را به کالسها نگاشت کند ،بلکه ویژگیهایی را تولید
میکند که در یک کالس خاص وجود دارد.
▪ مدلهای مولد از یادگیری بدوننظارت پیروی میکنند که بهطور خودکار الگوها یا
بینظمیهای دادههای مورد تجزیه و تحلیل را کشف میکند.
198یادگیری عمیق :از اصول اولیه تا ساخت شبکههای عصبی عمیق با پایتون
▪ هدف اصلی انواع مدلهای مولد یادگیری توزیعِ واقعیِ دادههای مجموعه آموزشی است.
آزمونک
.1از منظر بهینهسازی ،هدف آموزشی مولد و تمایزگر چیست؟
.2تمایزگر با چه روشی آموزش مییابد؟
.3ورودی مولد چه چیزی است؟
.4فروپاشی حالت چیست؟
مراجع
، میعاد اندیشه، تهران، ویرایش نخست، مفاهیم و رویکردها، اصول: یادگیری عمیق.)1399( ،میالد وزان
، تهران، ویرایش نخست، الگوریتمها و ابزارها، مفاهیم، مبانی: یادگیری ماشین و علم داده.)1400( ،میالد وزان
میعاد اندیشه
یادگیری توام برای طبقهبندی ویژگی و قطبیت در نظرات فارسی با استفاده از یادگیری عمیق.)1400( ،میالد وزان
. مجتمع آموزش عالی الرستان، اولین کنفرانس ملی تحول دیجیتال و سیستم های هوشمند،چندوظیفهای
رویکردی جدید برای ارتقا طبقهبندی احساسات نقدهای فارسی با استفاده از شبکه عصبی.)1400( ،میالد وزان
مجتمع، اولین کنفرانس ملی تحول دیجیتال و سیستم های هوشمند،کانولوشنی و طبقهبند رای اکثریت
.آموزش عالی الرستان
Goodfellow, I., Bengio, Y., and Courville, A. (2016). Deep Learning. MIT Press.
Goodfellow, Ian J et al. (2013). “Challenges in representation learning: A report
on three machine learning contests”. In: International Conference on Neural
Information Processing. Springer
Sutskever, Ilya et al. (2013). On the importance of initialization and momentum
in deep learning. In: ICML (3) 28.1139-1147, p. 5.
Siegelmann, H.T. (1995). "Computation Beyond the Turing Limit". Science. 238
(28): 632–637.
Alex Graves and Greg Wayne and Ivo Danihelka (2014). "Neural Turing
Machines".
Valentino, Z., Gianmario, S., Daniel, S., & Peter, R. (2017). Python Deep
Learning: Next Generation Techniques to Revolutionize Computer Vision,
AI, Speech and Data Analysis. Birmingham, UK: Packt Publishing Ltd.
Aljundi, R. (2019). Continual learning in neural networks. arXiv preprint
arXiv:1910.02718.
Gupta, P., & Sehgal, N. K. (2021). Introduction to Machine Learning in the Cloud
with Python: Concepts and Practices. Springer Nature.
Alpaydin, E. (2004). Introduction To Machine Learning. S.L.: Mit Press.
Bishop, Christopher M (2006). Pattern recognition and machine learning.
springer.
200
Kelleher, J. D., Mac Namee, B., & D'arcy, A. (2020). Fundamentals of machine
learning for predictive data analytics: algorithms, worked examples, and case
studies. MIT press.
Du, K. L., & Swamy, M. N. (2013). Neural networks and statistical learning.
Springer Science & Business Media.
Ye, J. C. (2022). Geometry of Deep Learning: A Signal Processing Perspective
(Vol. 37). Springer Nature.
Howard, J., & Gugger, S. (2020). Deep Learning for Coders with fastai and
PyTorch. O'Reilly Media.
Stevens, E., Antiga, L., & Viehmann, T. (2020). Deep learning with PyTorch.
Manning Publications.
Saitoh, K. (2021). Deep Learning from the Basics: Python and Deep Learning:
Theory and Implementation. Packt Publishing Ltd.
Ghatak, A. (2019). Deep learning with R (Vol. 245). Singapore: Springer.
Calin, O. (2020). Deep learning architectures. Springer International Publishing.
Sewak, M., Karim, M. R., & Pujari, P. (2018). Practical convolutional neural
networks: implement advanced deep learning models using Python. Packt
Publishing Ltd.
Liu, Y. H., & Mehta, S. (2019). Hands-On Deep Learning Architectures with
Python: Create deep neural networks to solve computational problems using
TensorFlow and Keras. Packt Publishing Ltd.
Ma, Y., & Tang, J. (2021). Deep learning on graphs. Cambridge University Press.
Buduma, N., & Locascio, N. (2017). Fundamentals of deep learning: Designing
next-generation machine intelligence algorithms. " O'Reilly Media, Inc.".
Ramsundar, B., & Zadeh, R. B. (2018). TensorFlow for deep learning: from linear
regression to reinforcement learning. " O'Reilly Media, Inc.".
Hope, T., Resheff, Y. S., & Lieder, I. (2017). Learning tensorflow: A guide to
building deep learning systems. " O'Reilly Media, Inc.".
Osinga, D. (2018). Deep learning cookbook: practical recipes to get started
quickly. " O'Reilly Media, Inc.".
Trask, A. W. (2019). Grokking deep learning. Simon and Schuster.
Wani, M. A., Bhat, F. A., Afzal, S., & Khan, A. I. (2020). Advances in deep
learning. Springer.
Bhardwaj, A., Di, W., & Wei, J. (2018). Deep Learning Essentials: Your hands-
on guide to the fundamentals of deep learning and neural network modeling.
Packt Publishing Ltd.
Gulli, A., & Pal, S. (2017). Deep learning with Keras. Packt Publishing Ltd.
Aggarwal, C. C. (2018). Neural networks and deep learning. Springer, 10, 978-3.
Chollet, F. (2021). Deep learning with Python. Simon and Schuster.
202