سلام.
1- مزیت relu:
تو ناحیه مثبت اشباع نمیشه که این خودش باعث میشه وزنها بهتر آپدیت و در نتیجه شبکه زودتر یاد بگیره ـ بار محاسباتی کمتری داره (دیگه نیازی به محاسبه exp نداره)
ایراد ReLu:
برای مقادیر منفی ورودی مقدار خروجی صفره و در نتیجه برای مقادیر منفی وزنهای متصل به اون نورون آپدیت نمیشن ـ ایراد دومش اینه که خروجی همیشه مثبته و در نتیجه مقادیر منفی نداره و در نتیجه حول صفر متقارن نیست و در نتیجه باعث میشه وزنها همگی یا در جهت مثبت یا همگی در جهت منفی آپدیت بشن (تو هر iteration) و این باعث میشه آپدیت زیگ زاگی میشه که همگرایی رو کندتر میکنه ـ در ضمن vanishing gradient تو ناحیه مثبت نداره. ولی وقتی نورون خاموش باشه کلا گرادیان صفر میشه و آپدیت نمیشه.
در مورد واگرایی هم چون خروجی تو ناحیه مثبت محدود نیست و میتونه مقادیر بالایی داشته باشه و چون خروجی هر لایه ورودی لایه بعد هستش و در آپدیت وزنهای لایه بعد تاثیر دارن میتونن باعث بشن که وزنهای لایه بعد با تغییرات زیادی آپدیت بشن (مشابه بالا بودن learning rate میشه تفسیر کرد) و در نتیجه شبکه واگرا بشه.
در مورد dead relu: وقتی وزنها initialize یا آپدیت میشن ممکنه حالتی رخ بده که وردودی نورون منفی باشه و نورون خاموش باشه. تا اینجا مشکلی نیست چون ممکنه تو iteration های بعدی با ورودی های بعدی (بچ های بعدی) ورودی نورون مقدارش مثبت بشه و روشن بشه و در نتیجه وزنهاش آپدیت بشه. اما مشکل چه زمانی هستش؟ مشکل زمانی هست که وزنها طوری انتخاب شده باشن که به ازای تمام دیتای ورودی که دارید این نورون هیچ وقت ورودیش مثبت نشه و همیشه خاموش بمونه و در نتیجه وزنهاش هیچ وقت آپدیت نشن. به این نورون ها میگن dead
سوال دوم:
تابع relu فکر میکنم سال 2012 اراپه شد. قبلش معمولا از tanh و relu استفاده میشد. بعدش معمولا از relu یا نسخه های دیگه استفاده میشه. خیلی فرقی نداره شبکه کانولوشنی باشه یا نه. (البته هر چی شبکه دیپتر باشه مساله vanishing gradient به خاطر فرمول مشتق زنجیره ای و یه سری مشکلات دیگه پر رنگتر میشه. مثلا فرض کن مشتق مقدارش تو یه لایه ای 0.001 هستش و مشتق تو لایه قبلیش میشه 0.001 ضرب در یک عدد کوچکتر از یک مثل 0.01 که نتیجه میشه 0.00001 تو لایه قبل و همین طور بیا لایه های اولیه. پس برای دیپ مساله vanishing gradient مهمتره). در ضمن tanh و sig باز هم استفاده میشن. تو شبکه LSTM استفاده میشن. کلا زمانی که بخواهیم خروجی نورون مقادیر محدود مثلا بین صفر و یک داشته باشه از sig میشه استفاده کرد. (برای یه کاربردش میتونید مقاله YOLO-v2 رو مطالعه کنید که مربوط به اواخر 2016 یا اوایل 2017 هستش و توی لایه آخر برای بعضی از نورونها از sig استفاده کرده).