به بخش پرسش و پاسخ یادگیری عمیق خوش آمدید,
این نسخه آزمایشی سایت است.
لطفا به نکات زیر توجه کنید:
  • برای ارتباط با مدیران میتوانید از صفحه مدیران اقدام کنید.
  • سوال و جواب ها باید به زبان فارسی باشند. استفاده از زبان انگلیسی یا فینگلیش برای پاسخ دادن مجاز نیست.
  • لطفا بعد از پرسش سوال لینک سوال خود را در گرو تلگرام (Iran Deep Learning Group) معرفی کنید تا سریعتر به جواب برسید. برای دسترسی به آخرین لینک از منابع یادگیری استفاده کنید
  • لطفا بجای عکس از متن استفاده کنید. اگر متون طولانی هستند از سایت pastebin.com برای اپلود استفاده کرده و لینک حاصل را در سوال خود قرار دهید. برای قرار دادن تصویر ، از بخش ارسال تصویر ادیتور سایت استفاده کنید.
  • بعد از دریافت پاسخ، بهترین پاسخ را از طریق کلیک بر روی علامت تیک انتخاب کنید
  • اگر با خطا و یا مشکلی مواجه شدید از بخش تماس با ما در انتهای صفحه و یا ایمیل Coderx7@gmail.com موضوع را اطلاع دهید.

با تشکر

دسته بندی ها

0 امتیاز

با سلام
در لکچرهای دیپ لرننیگ استنفورد در لکچر 5 ام ، دقیقه 17 ، مشکلات تابع سیگموید گفته میشه و اینکه میگه اگر ورودی مثبت در نظر گرفته شود گرادیان وزن ها همواره مثبت خواهد بود یا منفی . حالا همواره مثبت یا منفی بودن این چرا مشکل ایحاد میکند در back propagation ؟ و اینکه چرا بحالت زیگ زاگ مانند می افتد ؟

توسط (389 امتیاز)

2 پاسخ

+1 امتیاز

اگه دقت کرده باشید این سوال در کامنت ها پرسیده شده و به درستی پاسخ داده شده
https://youtu.be/GUtlrDbHhJM?t=17m31s
این سوال قبلاً توسط کاربران پرسیده شده برای دیدن پاسخ به دو لینک زیر مراجعه کنید :

https://www.quora.com/What-is-the-issue-with-back-propagation-in-Neural-Networks-when-the-Activation-function-only-outputs-Positive-values
و

https://stats.stackexchange.com/questions/239341/what-is-the-problem-with-training-neural-networks-with-back-propagation-with-act

توسط (415 امتیاز)
ویرایش شده توسط
+2 امتیاز

سلام
علی آقا جواب شما رو کامل دادن اما من یکبار دیگه بصورت خلاصه توضیح میدم .
خود سیگموید که مشکل saturating gradient داره. اگه اعداد بزرگ باشن گرادیان به سمت صفر میل میکنه اگر هم خیلی کوچیک باشن(منفی) باز هم میبینم که گرادیان صفر یا نزدیک به صفر میشه . سیگموید ورودی رو هرچی که باشه میبره بین بازه 0 و 1. اعدادی که خیلی بزرگ باشن 1 و خیلی کوچیک باشن به صفر تبدیل میشن .تصویر زیر شاید اینو بتونه بهتر بهتون نشون بده . بعنوان مثال ورودی 10 در شکل زیر میبینید که به 1 رسیده و اونجا شیب خط(گرادیان) صاف (صفر) هست . همینطور به -10 نگاه کنید که باز هم همین داستان رو داره . و تو شکل زیر مشخصه که ما هر عددی از X (ورودی) بدیم یک عددی بین 0 و 1 بدست میاد.
enter image description here
بگذریم . این از مشکل اشباع شدگی گرادیان یا همون saturating gradient . (تنها بخش محدودی گرادیان درستو حسابی داره که باز هم در تصویر مشخصه)
بحث بعدی که سوال کردید در مورد اون قضیه زیگزاگی هست که در آموزش بهش اشاره شد. اونجا داره در مورد Zero center کردن داده صحبت میکنه . اگه داده رو zero center کنید همگرایی شما خیلی سریعتر اتفاق می افته نسبت به زمانی که داده ورودی رو زیرو سنتر نکنید . حالا دلیلش چیه ؟
وقتی ورودی شما اعداد مثبت باشن نورونهای شبکه هم قائدتا خروجی مثبت تولید میکنن (سیگموید بین 0 و 1 تولید میکرد ) و در نتیجه گرادیان وزن(بهتر بگیم تغییرات وزن) یا همیشه مثبت میشه یا همیشه منفی. این یعنی چی ؟
ما وقتی بخواییم وزنها رو اپدیت کنیم یا بهتر تغییرات وزن رو برای هر نورون بدست بیاریم به چندتا چیز نیاز داریم.یکی خطا (یا همون گرادیان یا دلتای) اون نورون هست (که از حاصلضرب مشتق تابع تبدیلش در وزنهای این نورون به نورون(های) بعد خودش در گرادیان/خطای/ دلتای) نورون بعد بدست میاد). بعد برای بدست اوردن تغییرات وزنها حالصضرب ورودی اون نورون در خطای اون نورون در نرخ یادگیری محاسبه میشه.
حالا از اونجایی که همه ورودی ها به نورون ها مثبت هستن پس تغییرات w ما یا همیشه مثبت میشه یا همیشه منفی.(چون اگه گرادیانی که از مرحله قبل میاد منفی باشه ضرب در مثبت بشه میشه منفی. اگه مثبت باشه در مثبت ضرب بشه میشه مثبت.) برای همین اینطوری ما نمیتونیم شرایطی رو ایجاد کنیم که هم اعداد مثبت و هم منفی در w بدست بیان. بعنوان مثال شما فرض کن w ما به صورت زیر باشه :

w = (1 -1 1)

و وزن نهایی که مثلا جواب مورد نظر ماهست باید به اینصورت باشه (یعنی نهایتا بعد از اموزش وزن باید به این شکل در بیاد):

w = (-1 1 -1)

اگه ما بتونیم هم تغییرات وزن مثبت و هم منفی رو با هم داشته باشیم میتونیم تو یک مرحله محاسبات رو انجام بدیم مثلا مثل زیر :

w = (1 -1 1) + (-2 2 -2)

اما اگه این امکان برامون وجود نداشته باشه مجبوریم اینکار رو در 2 مرحله انجام بدیم :

w = (1 -1 1) + (-3 -3 -3) + (1 5 1)

یعنی بجای یک بار اپدیت ما دو مرحله اپدیت باید داشته باشیم.

توسط (4.3k امتیاز)
پس اگر اینجوری باشه ReLU نیز همین مشکل سیگموید رو داره دیگه چون همواره خروجی مثبت تولید میکنه ولی مشکل اشباع رو نداره اونم فقط از یک طرف ( طرف مثبت )
یه سوال : وقتی میگیم ReLU چیزی مثله تابع همانی هست از طرف مثبت چرا از خود تابع همانی استفاده نمیشه ؟ اونوقت از هیچ طرف به اشباع نمیره اصلا چرا طرف منفی رو به سمت صفر میل دادند چرا طرف مثبت نه ؟
چیزی که بنظر من مهمه اینکه مشکل gradient explode رخ ندهد بنظر من تابع رلو باید این مشکل رو داشته باشه درسته ؟
سلام . درسته تابع relu هم این مشکل رو داره . یه مشکل دیگه هم داره و اونم dying units هست که میدونید خودتون. که البته برای جلوگیری از اون مقداردهی اولیه سعی میکنن اعداد مثبت کوچک بدن تا به نورونهای relu منفی نشن.
تابع همانی مشکلی که داره اینه که ماهیت غیرخطی رو از شبکه بر میداره . بنابر این اگه صدتا لایه هم داشته  باشید که از تابع همانی استفاده کنه قدرت پردازشیش برابر با یه لایه اس و هیچ فرقی نمیکنه.  
تابع relu نسبت به سیگموید discriminative تره. با یک تابع relu یک ویژگی یا هست یا نیست.در صورت وجود یه عدد مثبت و در صورت نبود 0 و این تو سرعت همگرایی تاثیر خوبی داره.
خوندن https://en.wikipedia.org/wiki/Activation_function پیشنهاد میشه چون اطلاعات خوبی بشما در این باره میده.
...