محو و انفجار گرادیان
جواب کوتاه
توی پسانتشار، سهم هر وزن از خطا از لایهی آخر به اول، لایه به لایه در یه عدد ضرب میشه. اگه این عددها کوچیکتر از یک باشن، سهمها هر لایه کوچیکتر میشن و به لایههای اول که میرسن تقریبا صفرن؛ اون لایهها دیگه یاد نمیگیرن. به این میگن محو گرادیان، مثل بازی تلفن شکسته که پیام به آخر صف نمیرسه. اگه عددها بزرگتر از یک باشن، برعکس، سهمها منفجر میشن و وزنها دیوونهوار میپرن. این مشکل سالها جلوی آموزش شبکههای عمیق رو گرفته بود. راهحلهاش: ReLU، مقدار اولیهی درست، نرمالسازی، اتصالهای میانبر، و برای انفجار، بریدن گرادیان.
تلفن شکسته
بازی تلفن شکسته رو یادتونه؟ یه جمله رو آروم توی گوش نفر بغلی میگید، اون به بعدی، و همینطور. به آخر صف که میرسه، تقریبا هیچی ازش نمونده.
توی پسانتشار هم همین اتفاق میفته. سهم هر وزن از خطا، از آخر شبکه شروع میشه و لایه به لایه دست به دست میشه. توی یه شبکهی عمیق، تا به لایههای اول برسه، ممکنه تقریبا صفر شده باشه. یعنی لایههای اول تقریبا یاد نمیگیرن. به این میگن محو گرادیان.
چرا کوچیک میشه؟
یادتونه توی پسانتشار، هر قدم سهم قبلی رو در یه عدد محلی ضرب میکردیم؟ یکی از این عددها، شیب تابع فعالسازی هست. شیب سیگموید هیچوقت از ۰٫۲۵ بیشتر نمیشه. حالا ببینید با چند لایه چی میشه:
هر لایه، دستکم یه ضرب در ۰٫۲۵. بعد از شش لایه، سهم به حدود هزارم رسیده؛ بعد از ده لایه، حدود یک در میلیون. لایههای آخر خوب یاد میگیرن، ولی لایههای اول تقریبا تکون نمیخورن.
این مشکل سال ۱۹۹۱ بهطور رسمی به عنوان دلیل اینکه شبکههای عمیق خوب آموزش نمیدیدن شناخته شد. شبکههایی که با دنباله کار میکنن هم دچارش میشن، چون برای آموزش، انگار خیلی لایه پشت سر هم دارن.
انفجار
حالا اگه اون عددهای محلی بزرگتر از یک باشن چی؟ مثل شایعهای که هر کی تعریفش میکنه، یه کم بزرگترش میکنه. سهمها لایه به لایه بزرگتر میشن، و به لایههای اول که میرسن، عددهای غولآسا شدن. وزنها با یه قدم کلی جابهجا میشن و آموزش به هم میریزه. به این میگن انفجار گرادیان.
یه راه ساده برای انفجار: بریدن گرادیان. اگه طول گرادیان از یه حدی بیشتر شد، کوچیکش میکنیم تا همون حد. جهتش همون میمونه، فقط قدم کنترل میشه.
راهحلها
خوشبختانه برای محو گرادیان چند تا راهحل پیدا شد، و همینها بودن که شبکههای خیلی عمیق رو ممکن کردن:
- ReLU: برای عددهای مثبت شیبش همیشه ۱ هست و صاف نمیشه؛ فقط یه طرفش صافه.
- مقدار اولیهی درست: وزنهایی که از اول اندازهی عددها رو ثابت نگه دارن.
- نرمالسازی: عددهای وسط شبکه رو هممقیاس نگه میداره؛ هم برای محو خوبه هم برای انفجار. درس بعد.
- میانبر: یه مسیر کنار لایهها، که ورودی رو مستقیم به خروجی اضافه میکنه.
میانبر یه ترفند خیلی قشنگه. سهمها توی راه برگشت، علاوه بر رد شدن از لایهها، یه راه مستقیم هم دارن که هیچ ضربی توش نیست. پس هر چقدر هم شبکه عمیق بشه، یه بخش از سهم سالم به لایههای اول میرسه. به این اتصالها میگن اتصال باقیمونده.
برای شبکههایی که با دنباله کار میکنن هم سال ۱۹۹۷ یه ساختار مخصوص ساخته شد که همین مشکل رو حل میکنه؛ توی خانوادههای شبکه میبینیمش.
جمعبندی. آنچه از این درس با خودتان میبرید.
- سهمها لایه به لایه ضرب میشن.
- کمتر از یک: محو؛ لایههای اول یاد نمیگیرن.
- بیشتر از یک: انفجار؛ وزنها میپرن.
- ReLU، مقدار اولیه، نرمالسازی، میانبر.
- برای انفجار: بریدن گرادیان.
خودتون رو بسنجید
۱۵ پرسش، هر بار تازه از میان ۳۰ پرسش این درس. آخرش فقط کارنامه رو میبینید: چند تا درست، چند تا نادرست.