نویسنده(های): شاشانک بوشان
در ابتدا منتشر شد به سمت هوش مصنوعی.
یادگیری مبتنی بر گرادیان چیست؟
آموزش ریاضی یک شبکه عصبی را می توان به عنوان یک مسئله بهینه سازی در نظر گرفت که در آن ما یا سعی می کنیم برخی از عملکردها را به حداکثر یا حداقل برسانیم. f(x). f(x) معمولاً به عنوان تابع هزینه، تابع ضرر یا عملکرد خطا. نمونه های رایج هستند میانگین مربعات خطا برای مشکلات رگرسیون و آنتروپی متقاطع برای مشکلات طبقه بندی به حداکثر رساندن f(x) می توان با تغییر تابع هدف به عنوان یک مسئله کمینه سازی قاب کرد:f(x) که است آنچه در عمل انجام می شود. پس از این به بعد فقط به حداقل سازی می پردازیم f(x).
همانطور که تابع تلفات f ثابت است، به حداقل رساندن f(x) پیدا کردن x می شود که حداقل می کند f(x). گرادیان نزول یک الگوریتم یادگیری/بهینه سازی مبتنی بر گرادیان است که می تواند برای یافتن این مقدار حداقل استفاده شود. این محبوب ترین راه برای آموزش شبکه های عصبی است. برای درک نحوه عملکرد Gradient Descent، ابتدا باید کمی حساب دیفرانسیل و انتگرال را مرور کنیم. برای یک تابع معین y = f(x)، مشتق یا گرادیان نشان داده شده با f'(x) شیب را توصیف می کند f(x) در x. شیب در یک نقطه معین x به ما امکان می دهد تا میزان تغییرات کوچک را تخمین بزنیم x تغییر دهید f(x):
اگر مشخص نیست که چرا فرمول بالا کار می کند، مثال زیر را در نظر بگیرید.
برای تابع مشخص شده توسط منحنی آبی (شکل سمت چپ)، میخواهیم بدانیم که چقدر تغییرات جزئی در آن وجود دارد x (مشخص شده با نقطه قرمز) تغییر دهید f(x)، یعنی چه مقدار خواهد بود x+ε روی منحنی آبی؟ خط نارنجی شیب x را مشخص می کند. حالا اگر بخواهیم در x زیاد زوم کنیم (شکل سمت راست) منحنی آبی به یک خط مستقیم تبدیل می شود و این خط همان خط نارنجی خواهد بود. برای هر خط f(x) = cx +b، مقدار در x+ε خواهد بود cx+b+cε = f(x)+cε, کجا ج شیب خط است. بنابراین می توانیم به f(x + ε) ≈ f(x) + εf'(x) برای مقادیر کوچک ε تعمیم دهیم.
بر اساس فرمول فوق، مشتق / شیب را می توان برای ایجاد تغییرات کوچک استفاده کرد x، x’ = x+ε، به طوری که f(x’)
بنابراین می توانیم با حرکت x در گام های کوچک در جهت مخالف شیب یا شیب، f(x) را کاهش دهیم. این تکنیک Gradient Descent است. به طور رسمی، گرادیان نزول یک فرآیند تکراری است که در آن ما با یک مقدار تصادفی x شروع می کنیم و در هر مرحله آن را به صورت زیر به روز می کنیم:
اصطلاح γ کنترل می کند که چقدر قدم در طول مشتق/شیب برداریم. این اصطلاح معمولاً به عنوان نرخ یادگیری الگوریتم شناخته می شود.
توجه: برای اینکه شیب نزول کار کند، باید توابع از دست دادن محدب باشند.
استفاده از گرادیان نزولی برای حل یک سیستم معادلات خطی
یک سیستم معادلات خطی را می توان به عنوان یک شبکه عصبی تک لایه ساده (بدون بایاس و فعال سازی) مشاهده کرد. بنابراین، حل یکی با استفاده از گرادیان نزول به ما امکان میدهد تا در عمل شاهد نزول گرادیان باشیم، بدون اینکه حواسمان به اجزای دیگر شبکه عصبی پرت شود. در حالی که این موضوع از بین رفته است، فرض کنید سیستم معادلات خطی زیر به ما داده می شود:
ما می خواهیم پیدا کنیم x₁، x₂، و x₃ به طوری که سمت چپ معادله با سمت راست جمع شود.
توجه داشته باشید: x1، x2 و x3 عموماً به عنوان وزن شناخته می شوند و با عبارت w نشان داده می شوند. من از x استفاده می کنم به جای w تا با نماد بالا سازگار باشد.
برای حل این مشکل با استفاده از Gradient Descent، ابتدا باید افت یا تابع هدف را تعریف کنیم که باید بهینه/کاهش شود. میانگین مربعات خطا (MSE) گزینه خوبی در اینجا است. MSE توسط:
در اینجا Yᵢ خروجی مورد انتظار (1، 4 یا 0) و Ŷᵢ مقدار LHS معادلات است.. استفاده خواهیم کرد تبر = Ŷ برای نشان دادن مجموعه ای از معادلات برای ساده کردن نمادها. حال برای استفاده از گرادیان نزول باید مشتق ضرر wrt را محاسبه کنیم. به x:
در حالی که گرادیان از دست دادن wrt. تا x را می توان مستقیماً در اینجا محاسبه کرد، من آن را به گرادیان از دست دادن wrt به تقسیم می کنم Ŷ و سپس گرادیان از Ŷ wrt به x (با استفاده از قانون زنجیره ای) زیرا معمولاً این روش در کد انجام می شود زیرا امکان محاسبه گرادیان خودکار را فراهم می کند. حال بیایید دو عبارت را محاسبه کنیم. من عبارت جمع را برای ساده کردن چیزها نادیده میگیرم، اما باید قبل از بهروزرسانی مقادیر x از جمع و میانگینگیری استفاده کنیم.
با کنار هم قرار دادن همه اینها، در زیر یک قطعه کد از نحوه استفاده از گرادیان نزول برای حل سیستم معادلات است.
چیزی که در بالا باید به آن توجه کرد این است که شکل loss_wrt_x یا dMSE/dx همان X است. این بدان معناست که گرادیان در هر بعد آموخته و اعمال می شود، هرچند مرحله به روز رسانی یعنی نرخ یادگیری یا ε برای همه ابعاد یکسان است در حالی که موارد بالا راهاندازی پایه Gradient Descent است، الگوریتمهای پیشرفته گرادیان نزولی مانند AdaGrad و ADAM وجود دارند که سعی میکنند مراحل مختلف بهروزرسانی را برای ابعاد مختلف بیاموزند. برای اطلاعات بیشتر در مورد الگوریتم های پیشرفته مبتنی بر گرادیان، به این مطلب مراجعه کنید مقاله عالی
اجرای تابع فوق بر روی مجموعه معادلات قبلی بدست می آوریم.
A = np.array([[5, 1, -1], [2, -1, 1], [1, 3, -2]])
Y = np.array([1, 4, 0])
x = sovleUsingGradient(A, Y, lr=0.01, iters=10000)Loss at iter: 0: 5.666666666666667
Loss at iter: 1000: 0.5797261956378661
Loss at iter: 2000: 0.13383958398415846
Loss at iter: 3000: 0.0308991285469566
Loss at iter: 4000: 0.007133585719112376
Loss at iter: 5000: 0.0016469087513129724
Loss at iter: 6000: 0.0003802167019434473
Loss at iter: 7000: 8.77794475992898e-05
Loss at iter: 8000: 2.0265368095217914e-05
Loss at iter: 9000: 4.678602511941347e-06
x
array([0.71418766, 4.42539244, 6.99559903])
A.dot(x)
array([ 1.00073170e+00, 3.99858189e+00, -8.33062319e-04])
همانطور که می بینیم ضرر در طول زمان و پس از 10000 تکرار کاهش می یابد تبر نزدیک می شود Y.
ساخت یک پرسپترون چند لایه
حال بیایید ببینیم که چگونه نزول گرادیان در آموزش واقعی شبکه عصبی استفاده می شود. برای این کار یک چند لایه می سازیم پرسپترون یا MLP در یک ساده شده مجموعه داده MNIST با تنها 2 کلاس (0 و 1) به جای 10. شکل زیر معماری کلی را نشان می دهد که ما خواهیم ساخت.
اجزای مختلف ذکر شده در نمودار بالا را یکی یکی مرور خواهیم کرد.
آنتروپی متقاطع باینری
از آنجایی که این یک مشکل طبقه بندی باینری است، از متقاطع باینری استفاده خواهیم کرد آنتروپی از دست دادن در زیر تعریف متقاطع باینری آمده استآنتروپی
مشابه MSE برای آموزش یک مدل با استفاده از این ضرر، باید گرادیان آن را محاسبه کنیم:
نوشتن این در python/numpy:
فعال سازی سیگموئید
یکی دیگر از اجزای جدید تابع فعال سازی سیگموئید است. توابع فعال سازی به طور کلی به منظور اضافه کردن غیر خطی بودن به یک شبکه عصبی است. تابع Sigmoid Activation به صورت زیر تعریف می شود:
در اینجا مجدداً باید مشتق تابع را محاسبه کنیم تا از آن در گرادیان نزول/ انتشار به عقب استفاده کنیم.
توجه داشته باشید: σ(x) مانند خواهد بود Ŷ در فرمول آنتروپی متقاطع باینری بنابراین گرادیان ترکیبی سیگموئید و BinaryCrossEntropy تبدیل می شود Ŷ-Y، که همان گرادیان MSE است. از آنجایی که تابع سیگموئید مسئول تبدیل خروجی های شبکه لجیت/ شبکه عصبی به مقادیر احتمال برای تابع آنتروپی متقابل است، شباهت بین دو فرمول گرادیان جالب است. به این معنی است که وقتی نوبت به یادگیری اوزان می رسد، هیچ تفاوتی بین مشکل رگرسیون و طبقه بندی وجود ندارد.
نوشتن این در python/numpy:
لایه متراکم
جزء نهایی لایه متراکم است. یک لایه متراکم به صورت زیر تعریف می شود:
اینجا w ماتریس وزن است، X ورودی است و ب اصطلاح تعصب است. از نظر ریاضی، نمایش بسیار شبیه به سیستم معادلات خطی است. بنابراین مشتق مورد نیاز برای به روز رسانی وزن ها یکسان خواهد بود. با این حال دو موضوع در اینجا قابل بحث است:
- مقدار اولیه وزن: بر خلاف سیستم معادلات خطی، انتخاب وزنه های اولیه نقش زیادی در همگرایی تمرینی یعنی در توانایی شیب نزول برای کار دارد. به طور کلی، مقدار اولیه هنجار واحد بهترین نتیجه را می دهد. برای یک بحث عمیق تر در مورد مقدار اولیه وزن مراجعه کنید این مقاله عالی.
- محاسبه گرادیان خودکار: در یک MLP چندین لایه متراکم می توانند روی هم قرار گیرند. از نظر ریاضی، گرادیان برای هر لایه ای که با x نشان داده شده و خروجی آن Ŷ است را می توان به صورت نوشتاری نوشت.
محاسبه قسمت آخر ضرب آسان است. برای قسمت اول dLoss / dŶ ما اساساً به گرادیان ترکیبی برای همه لایه های بعد از لایه داده شده نیاز داریم. از آنجایی که Ŷ ورودی لایه بعدی است، به این معنی است که هر لایه باید مشتق خروجی wrt خود را به ورودی خود ضرب در گرادیان ترکیبی لایه های بالای آن برگرداند.
قرار دادن همه اینها در پایتون/numpy:
ما اکنون تمام قطعات مورد نیاز برای ساخت و آموزش یک MLP را داریم. دوخت نهایی همه اجزا را به عنوان تمرین کنار هم می گذارم. اگر گیر کرده اید یا در مورد چیزی مطمئن نیستید، می توانید به اجرای کامل زیر مراجعه کنید:
numpynet/mlp.py در اصلی · monkeydunkey/numpynet
پیاده سازی شبکه عصبی در numpy خالص و python – numpynet/mlp.py در اصلی · monkeydunkey/numpynet
github.com
مراجع اضافی
در نهایت در اینجا چند مرجع اضافی برای نزول گرادیان و پرسپترون های چند لایه وجود دارد.
- مروری بر الگوریتمهای بهینهسازی گرادیان نزول
- راه اندازی شبکه های عصبی
- کتاب یادگیری عمیق: مبانی یادگیری ماشین
- D2l.ai: پرسپترون های چندلایه
منتشر شده از طریق به سمت هوش مصنوعی
منبع: https://towardsai.net/p/machine-learning/gradient-based-learning-in-numpy