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

با تشکر

0 امتیاز

با سلام و احترام.
یک سوال در مورد پارامتر batch_size در لایه دارم. عددی که به این پارامتر اختصاص پیدا میکنه ، ایا همون تعداد تصاویر ما در پوشه های دیتابیسمون هست؟ بر فرض مثال ما 100 پوشه در train داریم. که در هر پوشه 6 عکس قرار داده شده. ایا پارامتر batch_size برابر با 6 قرار میگیره؟
اگر اینطور باشه، ایا نمیشه کاری کرد که این پارامتر batch_size متغیر باشه؟ دیتابیس مورد استفاده من به صورت رندوم در هر پوشه آن عکس ریخته شده. یعنی عدد فیکس نمیتونم بگم که چقدر باشه.
میشه کاری کرد؟

ممنونم از وقتی که برای پاسخ به سوالات ما میذارید

سوال شده توسط (150 امتیاز)

2 پاسخ

+2 امتیاز
 
بهترین پاسخ

سلام
بچ سایز اندازه ورودی شما هست . اشاره به تعداد تصاویری داره که در یک آن در قالب ورودی به شبکه ارائه میشن.
ربطی به تعداد تصاویر در هر کلاس شما نداره . و با توجه به اندازه دیتاست و حجم حافظه در دسترس شما معمولا مشخص میشه.
فرض کنید شما یک دیتاست دارید با تعداد 769 تصویر با 100 کلاس . یعنی تعداد تصاویر کلاسهای مختلف با هم متفاوته. یکی ممکنه 7 تصویر داشته باشه یکی 10 تا و ...
شما میتونید بچ سایز رو 1 تنظیم کنید که اینطور در هر تکرار تنها یک تصویر به شبکه ارائه میشه (که البته اصلا بهینه نیست.)
میتونید اندازه بچ سایز رو برابر5 یا 10 یا 100 یا هر عدد دیگه ای که دوست دارید و حافظه شما بهتون اجازه میده قرار بدید! حتی میتونید اندازه رو برابر 769 قرار بدید یعنی در هر تکرار کل دیتاست به شبکه ارائه بشه. (البته اگه همه دیتاست در حافظه شما جا بشه)

در مورد بچ سایز فکر میکنم در سایت توضیح داده باشم خصوصا تو آموزش های مربوط به کفی باید باشه . تو همین سایت هم سوالهای مشابه بوده که سرچ کنید باید بتونید پیدا کنید.

پاسخ داده شده توسط (4.3k امتیاز)
انتخاب شده توسط
خیلی خیلی ممنونم. کاملا متوجه شدم.
سپاس
+5 امتیاز

علاوه بر توضیحات خوبی که آقای حسن پور درمورد batch size دادند چند نکته درمورد انتخاب batch size مناسب وجود دارد. بچ سایز تعداد تصاویری هست که شبکه عصبی برای هرمرحله اپدیت خودش آن ها را همزمان در نظر می‌گیرد. پایین ترین بچ سایز یعنی ۱ به این معنی هست که شبکه عصبی در هر اپدیت فقط ارور نسبت به یک نمونه را محاسبه کرده و وزن ها را با توجه به آن اپدیت می کند و بچ سایز به اندازه کل دیتاست هم یعنی شبکه عصبی برای هر اپدیت ارور نسبت به کل تصاویر دیتاست را محاسبه می کند.
بچ سایز بزرگ تر به این معنی هست که شبکه عصبی شما برای همگرا شدن نیاز به batch های کمتری دارد. البته این batch های بزرگ زمان خیلی بیشتری هم خواهند برد. بچ سایز کوچک هم عکس این موضوع هست.


حالا سوال مهم اینجاست که چه بچ سایزی مناسب هست؟

قبل از بررسی این موضوع باید با چند مفهوم اشنا بشویم:

۱- مفهوم کلییت بخشی یا Generalization . مفهوم کلییت بخشی یعنی اینکه درصورتی که شما چند نوع درخت مختلف مثلا سرو, کاج, بلوط را مشاهده کردید, نکته ی مشترک همه این ها را پیدا کنید که همون درخت بودن هست. فرض کنید شما یک دسته بند دارید که میخواهد تشخیص بدهد یک شی درخت هست یا خیر. درصورتی که دسته بند شما قابلیت Generalization خوبی داشته باشد به نوع خاصی از درخت محدود نمی شود و شما هر نوعی از درخت که به آن بدهید تشخیص می دهد که درخت هست. این نوع دسته بند اگر چه در مرحله آموزش انواع درخت های محدودی را مشاهده کرده اما بجای یادگیری شکل خاص هرکدام کلییت درخت را یاد گرفته است و به همین دلیل در مرحله ی تست نمونه های دیده نشده را به خوبی دسته بندی می کند.

۲- مفهوم تیزی مینیمم تابع یا Sharpness of Minima . تیزی مینیمم یک تابع به طور ساده یعنی بزرگی مقدار ویژه ی مشتق دوم ان تابع در نقطه ی مینیمم.

حالا می توانیم موضوع را به شکل دقیق تر بررسی کنیم. وظیفه الگوریتم های Solver مانند SGD/Adam و .. مینیمم کردن تابع هزینه (loss) هست. تابع loss مینیمم های بسیار زیادی دارد که هر solver ممکن است به یکی از آن ها برسد. مینیمم های یک تابع را می توان با ویژگی تیزی (sharpness) سنجید. یعنی بعضی مینیمم ها تیز تر و بعضی ها صاف (flat) تر هستند. .
رسیدن به مینیمم های تیز نیاز به دقت بیشتری برای توصیف این نقاط دارد چرا که این نقاط با تغییر کمی در تابع باعث تغییر زیادی در مقدار loss خواهند شد اما مینیمم های صاف به شکل ساده تری توصیف می شوند و حتی تغییر در تابع باعث از دست رفتن مینیمم نمی شود که این یعنی این نقاط مینیمم های general تری هستند و بنابرین شبکه عصبی دارای قابلیت generalization خیلی بهتری خواهد بود. این مفهوم را در تصویر زیر می توانید ببینید:

enter image description here

حالا اگر به مساله اصلی برگردیم, batch size تاثیر زیادی در مینیمم تابعی که solver به آن می رسد دارد. بچ سایز بزرگ باعث می شود تا به یک مینیمم خیلی تیز برسم و batch size کوچک باعث می شود که به یک مینیمم صاف و با generalization بهتر برسیم.

بنابرین انتخاب سایز بزرگ برای batch size خیلی مناسب نیست و بهتر هست که بچ سایز کوچک تر انتخاب شود,البته راه حل مشخصی برای محاسبه ی تعداد مناسب batch size وجود ندارد چون برای هر تابع loss متفاوت هست پس بهترین راه این هست که با حدس و آزمایش به batch size مناسب برسید.

پاسخ داده شده توسط (397 امتیاز)
تابع loss محدب نیست و ممکن هست دارای چندین نقطه مینیمم، چندین نقطه زینی و ... باشد.
خب اینطوری این سوال مطرح میشه که چجوری میتونیم از مینیمم های محلی فرار کنیم؟
روش gradient descent به طور کلی نسبت به مینیمم های محلی آسیب پذیر هست اما solver های جدید تا حدی توانایی جلوگیری از گیر کردن در مینیمم محلی را دارند، مثلا SGD یا Adagrad یا Adam یا ... .
...