چرا تصادفی بودن برای یادگیری عمیق مهم است


لینک منبع: Why Randomness is Important for Deep Learning

امروز بعد از ظهر سعی کردم بدون استفاده از اصطلاحات آمار و احتمالات، یا یادگیری ماشین به مادرم توضیح دهم که چرا تصادفی بودن برای یادگیری عمیق مهم است.

این تمرین تا حدی موفقیت‌آمیز بود. البته شاید. هنوز هم فکر نمی‌کنم که او بداند که یادگیری عمیق چیست، اما به هر حال من طرفدار پروپا قرص یادگیری عمیق هستم و از آن برای کارم استفاده می‌کنم.

من طرفدار پروپا قرص یادگیری عمیق هستم
من طرفدار پروپا قرص یادگیری عمیق هستم


این مقاله یک نسخه کمی فنی از توضیحی است که من به مادرم دادم، با این امید که به متخصصان آموزش عمیق کمک کند تا درک بهتری از آنچه در شبکه‌های عصبی می‌گذرد داشته باشند.

اگر تحقیق در مورد یادگیری عمیق را شروع کرده‌اید، ممکن است متوجه شده باشید که مجموعه‌ای از تکنیک‌های به ظاهر دلخواه برای آموزش شبکه‌های عصبی، وجود دارد که بدون توجیه نظری یا با توجیه نظری بسیار کم «کار می‌کند» برای مثال: تنظیم dropout، اضافه کردن نویز گرادیان، نزول تصادفی غیر همزمان.

این تکنیک‌های آبله‌گون چه وجه اشتراکی با هم دارند؟ آن‌ها از تصادف استفاده می‌کنند!


نویز تصادفی در واقع برای به کار گیری DNNها ضروری است:

  1. نویز تصادفی به شبکه‌های عصبی اجازه می‌دهد تا چندین خروجی با توجه به همان نمونه ورودی تولید کنند.
  2. نویز تصادفی مقدار اطلاعات در حال جریان در شبکه را محدود می‌کند و شبکه را مجبور به یادگیری نمایش معنی‌دار داده‌ها می‌کند.
  3. نویز تصادفی «انرژی اکتشاف» را برای یافتن راه‌حل‌های بهینه‌سازی بهتر در طول نزول گرادیانی فراهم می‌کند.

ورودی تکی، خروجی چندگانه

فرض کنید یک شبکه عصبی عمیق (DNN) را برای طبقه‌بندی تصاویر آموزش می‌دهید.

برای هر منطقه برش‌خورده، شبکه یاد می‌گیرد که یک تصویر را به عددی که نشان‌دهنده یک برچسب کلاس است، مانند «سگ» یا «شخص» نگاشت کند.

این بسیار خوب و عالی است، و این نوع از DNN ها به تصادفی بودن در مدل استنباطی‌شان نیاز ندارند. به هر حال، هر تصویری از یک سگ باید در برچسب «سگ» نگاشت شود، و هیچ چیز تصادفی در مورد آن وجود ندارد.

حالا فرض کنید که شما یک شبکه عصبی عمیق (DNN) را آموزش می‌دهید تا گو (Go) بازی کند. در تصویر زیر، DNN باید اولین حرکت را انجام دهد.

اگر از همان استراتژی قطعی توصیف‌شده در بالا استفاده کردید، خواهید دید که این شبکه نمی‌تواند نتایج خوبی بدهد. چرا؟ از آنجا که هیچ «حرکت شروع بهینه» واحدی وجود ندارد - برای هر جای ممکن سنگ بر روی صفحه، یک جای مناسب سنگ بر روی صفحه کناری دیگر، از طریق تقارن چرخشی وجود دارد. چندین پاسخ خوب وجود دارد.

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

از این رو، تصادفی بودن زمانی مهم است که شما می‌خواهید شبکه قادر به خروجی احتمالاتی چندگانه با ورودی یک‌سان باشد، به جای این که خروجی یک‌سان را بارها و بارها تولید کند. این بسیار مهم است وقتی که تقارن‌های اساسی در فضای عمل وجود دارد-ترکیب تصادفی به معنای واقعی کلمه به ما کمک می‌کند تا از سناریوی «گیر افتاده بین دو بسته علوفه» خارج شویم.

به طور مشابه، اگر ما در حال آموزش یک شبکه عصبی برای ساخت موسیقی یا نقاشی هستیم، نمی‌خواهیم همیشه یک چیز را نقاشی کند یا هر بار که یک ورق کاغذ سفید به آن داده می‌شود همان موسیقی را اجرا کند. ما می‌خواهیم در مدل‌های تولیدی خود مفهوم «تنوع»، «تعجب»، و «خلاقیت» داشته باشیم.

یک رویکرد برای تزریق تصادف در DNN ها حفظ قطعیت شبکه در شرایطی است که خروجی آن پارامترهای یک توزیع احتمالاتی باشد. سپس می‌توانیم نمونه‌ها را با استفاده از روش‌های نمونه‌گیری مرسوم برای تولید «خروجی‌های تصادفی» ترسیم کنیم.

الفاگوی دیپ‌مایند (Deepmind's AlphaGo) از این اصل استفاده کرد: با داشتن تصویری از زمین Go، احتمال برنده شدن هر حرکت ممکن را ارایه می‌دهد. روش مدل‌سازی یک توزیع پس از خروجی شبکه معمولا در دیگر حوزه‌های یادگیری تقویتی عمیق بکار می‌رود.

تصادفی بودن و نظریه اطلاعات

در طول چند دوره اول در آمار احتمال، من واقعا برای درک معنای فیزیکی تصادفی بودن تلاش کردم. وقتی سکه‌ای را می‌اندازید، این تصادفی بودن از کجا می‌آید؟ آیا تصادفی بودن فقط هرج و مرج قطعی است؟ آیا ممکن است چیزی اساسا تصادفی باشد؟

صادقانه بگویم، من هنوز هم کامل درک نمی‌کنم.

نظریه اطلاعات تعریفی از تصادفی بودن ارایه می‌دهد که به اندازه کافی برای فهم آن بدون نیاز به بیدار ماندن در طول شب کافی است: «تصادفی بودن» چیزی بیش از «فقدان اطلاعات» نیست.

به طور خاص، مقدار اطلاعات در یک شی، طول کوتاه‌ترین برنامه کامپیوتری (به واحد بیت یا کیلوبایت) است که برای توصیف کامل آن مورد نیاز است. برای مثال، اولین ۱ میلیون رقم π = ۳.۱۴۱۵۹۲۶۵ … می‌تواند به صورت یک رشته با طول ۱٬۰۰۰٬۰۰۲ کاراکتر نشان داده شود، اما می‌تواند به طور فشرده با استفاده از ۷۰ کاراکتر، از طریق پیاده‌سازی فرمول لایبنیز نشان داده شود:

r = 0.0
for n in range(1000000):
  r += (-1.0)**n/(2.0*n+1.0)
print(4*r)

برنامه بالا چیزی بیش از یک نسخه فشرده از یک میلیون رقم π نیست. یک برنامه دقیق‌تر احتمالا می‌تواند اولین میلیون رقم π را در بیت‌های بسیار کم‌تر بیان کند.

تحت این تفسیر، تصادفی بودن «چیزی است که نمی‌تواند فشرده شود». در حالی که اولین میلیون رقم π می‌تواند فشرده شود و بنابراین تصادفی نیست، شواهد تجربی نشان می‌دهند (اما ثابت نشده است) که π خودش یک عدد نرمال است، و در نتیجه مقدار اطلاعات کد شده در π نامحدود است.

فرض کنید a برابر با اولین رقم تریلیون تایی π است، a = ۳.۱۴۱۵۹۲۶۵ … اگر به آن یک عدد تصادفی یکنواخت r را اضافه کنیم که در محدوده  (-۰.۰۰۱، ۰.۰۰۱) قرار دارد، عددی به دست می‌آوریم که در محدوده ۳.۱۴۰۵۹ و و ۳.۱۴۲۵۹ است . اکنون عدد a + r حاصل تنها سه رقم از اطلاعات را در بر می‌گیرد، زیرا فرآیند اضافه کردن نویز تصادفی هر اطلاعاتی را که بعد از رقم صدم حمل می‌شد را از بین می‌برد.

محدود کردن اطلاعات در شبکه‌های عصبی

این تعریف از تصادفی بودن چه ربطی به تصادفی بودن دارد؟

روش دیگر تزریق تصادف در DNN ها، تزریق مستقیم نویز به درون خود شبکه به جای استفاده از DNN برای مدل‌سازی یک توزیع است. این کار یادگیری را «سخت‌تر» می‌کند زیرا شبکه باید بر این «آشفتگی» داخلی غلبه کند.

اساسا چرا باید کسی این کار را انجام دهد؟ حدس اولیه این است که نویز مقدار اطلاعاتی که می‌توانید از یک کانال عبور کند را محدود می‌کند.

یک کدکننده خودکار (autoencoder) - نوعی از معماری شبکه عصبی - را در نظر بگیرید که تلاش می‌کند کدگذاری کارآمد داده‌ها را با «فشرده‌سازی» ورودی به ابعاد کم‌تر در وسط و بازسازی داده‌های اصلی در انتهای دیگر، یاد بگیرد. شکل زیر نمایی از این کدکننده را نشان می‌دهد:

در طول استنتاج، ورودی از سمت چپ از طریق گره‌های شبکه جریان می‌یابد و از طرف دیگر بیرون می‌آید، درست مانند یک لوله.

اگر ما یک شبکه عصبی نظری را در نظر بگیریم که بر روی اعداد حقیقی عمل می‌کند (به جای اعداد اعشاری شناور) ، پس بدون نویز در شبکه، هر لایه از DNN در واقع به پهنای باند اطلاعات نامحدود دسترسی دارد.

حتی اگر نمایش (لوله) را به واحدهای مخفی کمتری فشرده کنیم، شبکه هنوز می‌تواند یاد بگیرد که داده‌های طرح قبلی را به مقادیر اعشار کدگذاری کند بدون اینکه واقعا هیچ ویژگی معنی‌داری یاد بگیرد. در واقع، ما می‌توانیم تمام اطلاعات موجود در شبکه را با یک عدد نشان دهیم. این نامطلوب است.

با محدود کردن مقدار اطلاعات در یک شبکه، آن را مجبور به یادگیری نمایش فشرده ویژگی‌های ورودی می‌کنیم. راه‌های مختلفی برای انجام این کار وجود دارد:

  • کدکننده‌های خودکار واریانس (VAE) نویز گاوسی را به لایه پنهان اضافه می‌کنند. این نویز «اطلاعات اضافی» را از بین می‌برد و شبکه را مجبور به یادگیری نمایش فشرده داده‌ها می‌کند.
  • در ارتباط نزدیک با نویز VAE (شاید هم معادل؟)، ایده رگولاریزاسیون دراپ‌اوت (dropout) خروجی - که به طور تصادفی بخشی از واحدها را در طول آموزش از بین می‌برد. مانند VAE، نویز دراپ‌اوت شبکه را مجبور به یادگیری اطلاعات مفید تحت پهنای باند محدود می‌کند.
  • شبکه‌های عمیق با عمق تصادفی - ایده مشابه با دراپ‌اوت، اما در سطح هر لایه به جای سطح هر واحد.
  • در یک مقاله بسیار جالب به نام شبکه‌های عصبی باینری از وزن‌ها و فعالیت‌های دودویی در مرحله استنتاج استفاده می‌کند، اما گرادیان‌های با مقدار واقعی در مرحله backward استفاده می‌کند. منبع نویز از این واقعیت ناشی می‌شود که گرادیان، نسخه نویزی از گرادیان دو بعدی است. در حالی که شبکه‌های دودویی لزوما قدرتمندتر از DNN های معمول نیستند، واحدهای منفرد تنها می‌توانند یک بیت از اطلاعات را کدگذاری کنند، که در برابر دو ویژگی فشرده شدن به یک واحد واحد منفرد از طریق کدگذاری اعشاری شناور، تنظیم می‌شود.

طرح‌های فشرده‌سازی کارآمدتر به معنای تعمیم بهتر در زمان آزمون است، که توضیح می‌دهد چرا dropout برای غلبه بر بیش‌برازش (overfit) تا این حد خوب عمل می‌کند. اگر تصمیم دارید از رمزکننده‌های خودکار معمول به جای رمزکننده‌های خودکار متغیر استفاده کنید، باید از یک ترفند تنظیم تصادفی همانند dropout استفاده کنید تا میزان بیت‌هایی که توسط رمز‌کننده فشرده می‌شوند را کنترل کنید در غیر این صورت درگیر بیش‌برازش خواهید شد.

من فکر می‌کنم که VAEها به طور عینی برتر هستند زیرا پیاده‌سازی آن‌ها آسان است و به شما اجازه می‌دهد که دقیقا مشخص کنید چند بیت از اطلاعات از هر لایه عبور می‌کنند.

اکتشاف «انرژی»

DNN ها معمولا از طریق انواع نزول گرادیانی آموزش می‌بینند، که اساسا به یافتن به‌روزرسانی پارامتر منجر می‌شود که در طول برخی از توابع تلفات به سمت پایین می‌رود. وقتی به کف عمیق‌ترین دره می‌رسید، بهترین پارامترهای ممکن را برای شبکه عصبی خود پیدا کرده‌اید.

مشکل این روش این است که سطوح کاهشی شبکه عصبی دارای حداقل‌ها و فلات‌های محلی زیادی هستند. گیر کردن در یک شیب کوچک یا یک بخش مسطح که در آن شیب صفر است، آسان است (حداقل محلی) اما کار شما هنوز تمام نشده و نتیجه حاصل نشده است.

سومین تفسیر اینکه چگونه تصادفی بودن به مدل‌های یادگیری عمیق کمک می‌کند براساس ایده اکتشاف است.

از آنجا که مجموعه داده‌های مورد استفاده برای آموزش DNN ها بسیار بزرگ هستند، محاسبه گرادیان در داده‌هایی به حجم ترابایت برای هر گام نزول تک شیب بسیار گران است. در عوض، ما از نزول گرادیان تصادفی (SGD) استفاده می‌کنیم، که در آن ما فقط گرادیان متوسط را در یک زیرمجموعه کوچک از مجموعه داده که به طور تصادفی از مجموعه داده انتخاب شده‌است، محاسبه می‌کنیم.

در تکامل، اگر موفقیت یک گونه توسط متغیر تصادفی X مدل‌سازی شود، آنگاه جهش تصادفی یا نویز واریانس X را افزایش می‌دهد-فرزندان آن می‌تواند بسیار بهتر (سازگاری، دفاع سمی) یا بسیار بدتر (نقص‌های کشنده، عقیمی) باشند.

در بهینه‌سازی عددی، این «تغییر پذیری ژنتیکی» انرژی ترمودینامیکی یا دما نامیده می‌شود که اجازه می‌دهد مسیر به روز رسانی پارامتر همیشه به سمت پایین تپه نباشد، اما گاهی اوقات از یک حداقل محلی یا «تونل در میان تپه‌ها» خارج می‌شود.

همه اینها عمیقا به تهاتر میان اکتشاف در مقابل استخراج مرتبط است. آموزش یک DNN کاملا قطعی با نویز گرادیان صفر قابلیت‌های استخراج صفر دارد - این شبکه مستقیما به نزدیک‌ترین کمینه‌های محلی، با وجود عمق کم، همگرا می‌شود.

استفاده از گرادیان‌های تصادفی (یا از طریق مینی‌بچ‌های کوچک یا به معنای واقعی کلمه اضافه کردن نویز به خود گرادیان‌ها) یک روش موثر برای اجازه دادن به بهینه‌سازی برای انجام کمی «جستجو» و «پریدن» از حداقل‌های محلی ضعیف است. نزول غیر همزمان گرادیان تصادفی، که در آن بسیاری از ماشین‌ها نزول گرادیانی را به صورت موازی انجام می‌دهند، یکی دیگر از منابع احتمالی نویز است.

این انرژی ترمودینامیکی شکست تقارن را در مراحل اولیه آموزش تضمین می‌کند تا اطمینان حاصل شود که همه گرادیان‌های یک لایه با مقادیر مشابه همزمان نمی‌شوند. نویز نه تنها در فضای عمل شبکه خنثی، شکست تقارن را انجام می‌دهد، بلکه نویز نیز در فضای پارامتر شبکه خنثی، شکست تقارن را انجام می‌دهد.

جمع‌بندی

به نظر من واقعا جالب است که نویز تصادفی در واقع به الگوریتم های هوش مصنوعی کمک می‌کند تا از بیش‌برازش اجتناب کرده و فضای راه‌حل را در طول بهینه‌سازی یا یادگیری تقویتی کشف کنند. این امر پرسش‌های فلسفی جالبی را در مورد اینکه آیا نرمی ذاتی کد عصبی ما یک ویژگی است یا یک اشکال، مطرح می‌کند.

یک سوال تحقیقاتی نظری یادگیری ماشین که من به آن علاقه دارم این است که آیا همه این حیله‌های آموزشی شبکه عصبی در واقع تغییراتی از برخی قضیه منظم‌سازی عمومی هستند. شاید کار نظری روی فشرده‌سازی واقعا برای درک این موضوع مفید باشد.

بررسی ظرفیت اطلاعاتی شبکه‌های عصبی مختلف نسبت به نمایش ویژگی‌های مهندسی شده دستی جالب خواهد بود و خواهیم دید که چگونه این امر به گرایش بیش از حد یا کیفیت گرادیان‌ها مربوط می‌شود. قطعا اندازه‌گیری ظرفیت اطلاعات یک شبکه با dropout یا آموزش از طریق SGD امری بدیهی نیست، اما من فکر می‌کنم که این کار می‌تواند انجام شود. به عنوان مثال، ساخت یک پایگاه‌داده از بردارهای مصنوعی که محتوای اطلاعاتی آن‌ها (در بیت‌ها، کیلوبایت ها و غیره) دقیقا شناخته شده‌است، و دیدن این که چگونه شبکه‌ها در اندازه‌های مختلف، در ترکیب با تکنیک‌هایی مانند dropout، با یادگیری یک مدل تولیدی از آن مجموعه داده‌ها سر و کار دارند.

این متن با استفاده از ربات ترجمه مقاله علمی ترجمه شده و به صورت محدود مورد بازبینی انسانی قرار گرفته است. در نتیجه می‌تواند دارای برخی اشکالات ترجمه باشد.
مقالات لینک‌شده در این متن می‌توانند به صورت رایگان با استفاده از مقاله‌خوان ترجمیار به فارسی مطالعه شوند.