در این پست میآموزیم که نرمالسازی دستهای[1] چیست، چرا به آن نیاز است، چگونه کار میکند و چگونه با استفاده از Keras آن را پیادهسازی کنیم.
نرمالسازی دستهای برای اولین بار توسط دو محقق در گوگل، سرگئی آیوف[2] و کریستین سگدی[3] در مقاله خود با عنوان «نرمالسازی دستهای: تسریع آموزش عمیق شبکه با کاهش تغییر متغیر داخلی داخلی[4]» در سال 2015 معرفی شد. نویسندگان نشان دادند که نرمالسازی دستهای نتیجه برتر ImageNet (2014) با حاشیه قابل توجهی تنها با استفاده از 7 درصد از مراحل آموزش را بهبود بخشید. امروزه، Normalization دستهای تقریباً در تمام معماریهای CNN استفاده میشود.
در این پست، ابتدا یک معماری استاندارد به اشتراک گذاشته شده در نمونه کتابخانه Keras در مجموعه داده CIFAR10 را آموزش خواهیم داد. سپس نرمالسازی دستهای را به معماری اضافه میکنیم و نشان میدهیم که دقت در دورههای کمتری به طور قابلتوجهی (۱۰ درصد) افزایش مییابد.
تغییر متغیر داخلی
قبل از اینکه به موضوع نرمالسازی دستهای بپردازیم، اجازه دهید ابتدا یک اصل اساسی در یادگیری ماشین را درک کنیم. فرض کنید یک مجموعه داده گل داریم و میخواهیم یک دستهبندی باینری برای گل رز بسازیم. اگر تصویر گل رز باشد خروجی 1 است و در غیر این صورت خروجی 0 است.
زیرمجموعهای از دادههای آموزشی را در نظر بگیرید که عمدتاً دارای جوانههای رز قرمز به عنوان گل رز و گلهای وحشی به عنوان نمونههای غیر گل رز هستند. اینها در شکل 1 نشان داده شده است.
شکل 1
زیرمجموعه دیگری را که در شکل 2 نشان داده شده است در نظر بگیرید که دارای گلهای رز با رنگهای مختلف به عنوان نمونه گل رز و سایر گلهای غیر رز در تصویر به عنوان نمونههای غیر گل رز است.
شکل 2
به طور شهودی، منطقی است که هر مینی بچ مورد استفاده در فرآیند آموزش باید توزیع یکسانی داشته باشد. به عبارت دیگر، یک مینی دسته نباید فقط تصاویر یکی از دو زیر مجموعه بالا را داشته باشد. باید دارای تصاویری باشد که به طور تصادفی از هر دو زیر مجموعه در هر دسته کوچک انتخاب شدهاند.
همان شهود به صورت گرافیکی در شکل 3 نشان داده شده است. ستون آخر شکل 3 دو کلاس (رز و غیر گل رز) را در فضای ویژگی نشان میدهد (در دو بعدی برای سهولت تجسم نشان داده شده است). منحنی آبی مرز تصمیم را نشان میدهد. ما میتوانیم ببینیم که دو زیر مجموعه در مناطق مختلف فضای ویژگی قرار دارند. این تفاوت در توزیع، تغییر متغیر[5] نامیده میشود. هنگامی که مینی دستهها تصاویری به طور یکنواخت از کل توزیع نمونهبرداری میکنند، تغییر متغیر کمکی ناچیز وجود دارد. با این حال، زمانی که مینی دستهها تنها از یکی از دو زیر مجموعه نشان داده شده در شکل 1 و شکل 2 نمونهبرداری میشوند، یک تغییر متغیر کمکی قابل توجهی وجود دارد. این باعث میشود که آموزش دستهبند رز در مقابل غیر رز بسیار کند شود.
شکل 3: دو ردیف بالای گلها زیرمجموعهای از دادهها را نشان میدهند و دو ردیف پایین زیر مجموعهای متفاوت از دادهها را نشان میدهند. این دو زیر مجموعه دارای توزیع های بسیار متفاوتی هستند. ستون آخر توزیع دو کلاس را در فضای ویژگی با استفاده از نقاط قرمز و سبز نشان میدهد. خط آبی مرز تصمیمگیری بین دو کلاس را نشان میدهد.
یک راه آسان برای حل این مسئله برای لایه ورودی، تصادفی کردن دادهها قبل از ایجاد مینی دسته است.
اما چگونه این مسئله را برای لایههای مخفی حل کنیم؟ درست همانطور که داشتن توزیع یکنواخت برای لایه ورودی منطقی بود، داشتن توزیع ورودی یکسان برای هر واحد پنهان در طول زمان در حین آموزش سودمند است. اما در یک شبکه عصبی، هر بار که یک پارامتر به روز رسانی در لایه قبلی وجود دارد، توزیع ورودی هر واحد پنهان تغییر میکند. این تغییر متغیر داخلی[6] نامیده میشود. این امر باعث کندی آموزش میشود و به حداقل نرخ یادگیری و مقداردهی اولیه پارامتر خوب نیاز دارد. این مسئله با نرمالسازی ورودیهای لایه روی یک دسته کوچک حل میشود که به آن نرمالسازی دستهای میگویند.
در حال حاضر، ما درک شهودی داریم که چرا نرمالسازی دستهای ایده خوبی است. حال، بیایید نحوه انجام این نرمالسازی را دریابیم.
نرمالسازی دستهای در یک شبکه عصبی
نرمالسازی دستهای به صورت جداگانه در هر واحد انجام میشود. شکل 4 نشان میدهد که چگونه در یک شبکه ساده با ویژگیهای ورودی x1 و x2 کار میکند. تحت تأثیر نمادگذاری قرار نگیرید! بیایید به معادلات بپردازیم.
شکل 4: نرمالسازی دستهای در یک شبکه ساده.
در شکل 4، بالانویس (i) مربوط به داده iام در دسته کوچک است، بالانویس [l] نشان دهنده لایه lام در شبکه، و زیرنویس k نشان دهنده kام بعد در یک لایه معین در شبکه است. در بعضی جاها، برای ساده نگه داشتن نمادها، زیرنویس یا زیرنویس حذف شده است.
نرمالسازی دستهای به صورت جداگانه در هر واحد پنهان انجام میشود. به طور سنتی، ورودی به یک لایه a[l-1] از طریق یک تبدیل افین میرود که سپس از یک g[l] غیر خطی مانند ReLU یا sigmoid تا فعالسازی نهایی al از واحد عبور میکند. بنابراین،
اما وقتی Batch Normalization با تبدیل BN استفاده می شود، تبدیل می شود
بایاس b اکنون میتواند نادیده گرفته شود زیرا اثر آن با پارامتر shift \beta جمع میشود.
چهار معادله نشان داده شده در شکل 4 موارد زیر را انجام میدهند.
۱) میانگین (μ) مینی دسته را محاسبه کنید.
۲) واریانس (2σ) مینی دسته را محاسبه کنید.
۳) znorm را با کم کردن میانگین از z و سپس تقسیم بر انحراف معیار (σ) محاسبه کنید. یک عدد کوچک به نام (ϵ) به مخرج اضافه میشود تا از تقسیم بر صفر جلوگیری شود.
۴) znorm را با ضرب znorm در مقیاس (γ) و اضافه کردن یک شیفت (β) محاسبه کنید و به جای z به عنوان غیر از znorm استفاده کنید. ورودی خطی بودن (مثلاً ReLU). دو پارامتر β و γ در طول فرآیند تمرین با پارامترهای وزن W یاد میگیرند.
توجه: نرمالسازی دستهای تنها دو پارامتر اضافی برای هر واحد اضافه میکند. بنابراین قدرت بازنمایی شبکه همچنان حفظ میشود. اگر β روی μ و γ روی تنظیم شود، آنگاه znorm برابر است با z، بنابراین به عنوان یک تابع هویت کار میکند. بنابراین، ارائه نرمالسازی دستهای به تنهایی دقت را کاهش نمیدهد زیرا بهینهساز هنوز این گزینه را دارد که هیچ اثر نرمالسازی را با استفاده از تابع هویت انتخاب کند، و بهینهساز فقط برای بهبود نتایج از آن استفاده میکند.
سایر مزایای نرمالسازی دستهای
نرخ یادگیری بالاتر
اگر از نرخ یادگیری بالا در یک شبکه عصبی سنتی استفاده کنیم، گرادیانها میتوانند منفجر شوند یا ناپدید شوند. نرخهای یادگیری بزرگ میتواند پارامترها را مقیاس کند، که میتواند گرادیانها را تقویت کند، بنابراین منجر به انفجار میشود. اما اگر نرمالسازی دستهای انجام دهیم، تغییرات کوچک در پارامترهای یک لایه به لایههای دیگر منتشر نمیشود. این امکان استفاده از نرخ یادگیری بالاتر را برای بهینهسازها فراهم میکند که در غیر این صورت امکان پذیر نبود. همچنین انتشار گرادیان در شبکه را پایدارتر میکند.
Regularization را اضافه میکند
از آنجایی که مرحله نرمالسازی تمام نمونههای آموزشی در مینی دسته را با هم میبیند، یک اثر منظمسازی به همراه دارد. اگر نرمالسازی دستهای از طریق شبکه انجام شود، آنگاه تنظیم انصراف میتواند کاهش یابد یا قدرت کاهش یابد.
استفاده از غیرخطیهای اشباع کننده را ممکن میسازد
در شبکههای عصبی عمیق سنتی، استفاده از توابع فعالسازی اشباع[7] مانند سیگموئید، که در آن گرادیان برای ورودیهای خارج از محدوده نزدیک به صفر است، بسیار سخت است (-1, 1). تغییر در پارامترها در لایههای قبلی به راحتی میتواند ورودیهای تابع فعالسازی را به این مناطق اشباعکننده نزدیک کند و گرادیانها ناپدید شوند. این مسئله در شبکههای عمیقتر بدتر است. از سوی دیگر، اگر توزیع ورودیها به این غیرخطیها ثابت بماند، بهینهساز را از گیر کردن در مناطق اشباع نجات میدهد و در نتیجه آموزش سریعتر میشود.