گرادیان کاهشی تصادفی: تفاوت میان نسخه‌ها

محتوای حذف‌شده محتوای افزوده‌شده
بدون خلاصۀ ویرایش
بدون خلاصۀ ویرایش
خط ۳:
== پیشینه ==
در برآوردهای آماری و یادگیری ماشین معمولاً مسائلی به‌وجود می‌آید که در آن‌ها نیاز است تابعی مانند <math>\mathcal{f}</math>از داده‌های آماری با یک یا چند پارامتر (به شکل ضریب یا اشکال دیگر) تعریف کنیم و سپس این پارامترها را طوری مشخص کنیم که مجموع (یا میانگین) مقادیر تابع <math>\mathcal{f}</math>به ازای تک تک داده‌های آماری، حداقل مقدار ممکن خود بشود. فرض کنید مجموعه‌ای از داده‌های آماری داریم و تابع <math>\mathcal{f}</math>را برای این داده‌ها فقط بر حسب یک پارامتر <math>\theta</math> تعریف کرده‌ایم، در این صورت با دادن داده <math>\boldsymbol{i}</math>ام از مجموعهٔ داده‌ها به تابع <math>\mathcal{f}</math> یک تابع از <math>\theta</math> بدست می‌آوریم که آن را <math>\mathcal{J}_\boldsymbol{i}(\boldsymbol{\theta})</math> می‌نامیم. حال مسئله به پیدا کردن <math>\theta</math> ای که عبارت زیر را می‌نیمم می‌کند، ساده می‌شود:
{{وسط‌چین}}
 
<math>\mathcal{J}(\boldsymbol{\theta})=\left ( \frac{1}{n} \right )\textstyle \sum_{\boldsymbol{i}=1}^n \displaystyle\mathcal{J}_{\displaystyle i }(\boldsymbol{\theta})</math>
{{پایان وسط‌چین}}
 
یا به عبارت دیگر:
{{وسط‌چین}}
 
<math>\mathcal{J}(\boldsymbol{\theta})= {E}[\displaystyle\mathcal{J}_{\displaystyle i }(\boldsymbol{\theta})]</math>
{{پایان وسط‌چین}}
 
که <math>\mathcal{J}(\boldsymbol{\theta})
</math> همان تابع هدف یا تابع هزینه است.
خط ۲۴:
== روش پیاده‌سازی ==
در پیاده‌سازی کلی گرادیان کاهشی تصادفی ابتدا بردار پارامترها که برداری است که شامل تمام پارامترهای تابع هزینه است را <math>\theta</math> می‌نامیم. <math>\theta</math> را برابر برداری دلخواه قرار می‌دهیم سپس برای هر بار به‌روزرسانی این بردار یک عضو از مجموعهٔ داده‌های آموزشی را به صورت تصادفی انتخاب کرده و با نرخ <math>\alpha</math>، بردار حاصل از گرادیان تابع هزینه در نقطه <math>\theta</math> را از <math>\theta</math> کم می‌کنیم:
{{وسط‌چین}}
 
<math>\theta = \theta - \alpha \nabla_\theta \mathcal{J}_\boldsymbol{i}(\theta; x^{(i)},y^{(i)})</math>
{{پایان وسط‌چین}}
 
که در آن <math>\mathcal{J}</math>تابع هزینه و <math>(x^{(i)},y^{(i)}) </math>یک عضو از داده‌های آموزشی است که به صورت تصادفی انتخاب شده‌است و <math>\mathcal{J}_\boldsymbol{i}(\theta; x^{(i)},y^{(i)})</math> نشان‌دهندهٔ جملهٔ <math>\boldsymbol{i}</math>ام از جملات تابع هدف است. <math>\alpha</math> نرخی است که با آن <math>\theta</math> را به‌روزرسانی می‌کنیم و مقداری تجربی دارد که اگر خیلی کوچک باشد زمان رسیدن به همگرایی را طولانی می‌کند و اگر خیلی بزرگ باشد ممکن است همگرایی رخ ندهد.<ref>{{یادکرد وب|نام خانوادگی=S|نویسنده=|نام=Suryansh|کد زبان=|تاریخ=2018-03-12|وبگاه=Hacker Noon|نشانی=https://hackernoon.com/gradient-descent-aynk-7cbe95a778da|عنوان=Gradient Descent: All You Need to Know|بازبینی=2018-10-29}}</ref>
 
خط ۴۸:
=== تکانه (Momentum) ===
این روش برای اولین بار توسط روملهارت، هیلتون و ویلیامز معرفی شد.<ref name="Rumelhart19862" /> در این روش میزان تغییر پارامتر <math>\Delta \theta</math> در هر مرحله از بهینه‌سازی ذخیره شده تا در مرحله بعدی به شکل پایین از آن استفاده شود:
{{وسط‌چین}}
: <math>\Delta \theta = \theta +eta \Delta \theta - \alpha \nabla \mathcal{J}(\theta)</math>
 
: <math>\Delta \theta = \etatheta + \Delta \theta - \alpha \nabla \mathcal{J}(\theta)</math>
{{پایان وسط‌چین}}
 
: <math>\theta = \theta + \Delta \theta </math>
 
که با ترکیب این دو به عبارت پایین می‌رسیم:
{{وسط‌چین}}
 
: <math>\theta = \theta - \alpha\nabla \mathcal{J_i}(\theta) + \eta \Delta \theta </math>
{{پایان وسط‌چین}}
 
روش momentum باعث می‌شود که مسیر پارامتر <math>\theta </math> خیلی تغییر نکند و نوسانات شدیدی نداشته باشد. استفاده از این روش در [[شبکه عصبی مصنوعی|شبکه‌های عصبی مصنوعی]] متداول است و معمولاً موجب بهبود دقت شبکه‌های عصبی می‌شود.<ref name="Zeiler 20122">{{cite arXiv|last=Zeiler|first=Matthew D.|eprint=1212.5701|title=ADADELTA: An adaptive learning rate method|year=2012|class=cs.LG}}</ref>
 
خط ۶۶:
 
نرخ یادگیری برای ابعاد مختلف پارامتر از قطر اصلی ضرب خارجی <math>G = \sum_{\tau=1}^t g_\tau g_\tau^\mathsf{T}</math> بدست می‌آید. در این معادله <math>g_\tau = \nabla \mathcal{J}_i(\theta)</math> گرادیان در مرحله <math>\tau</math> است و نرخ یادگیری برای بُعدِ <math>j</math> برابر خواهد بود با:
{{وسط‌چین}}
 
: <math>G_{j,j} = \sum_{\tau=1}^t g_{\tau,j}^2</math>
{{پایان وسط‌چین}}
 
حال می‌توان پارامتر را به صورت پایین به‌روز کرد:
{{وسط‌چین}}
 
: <math>\theta = \theta - \eta\, \mathrm{diag}(G)^{-\frac{1}{2}} \circ g</math>
{{پایان وسط‌چین}}
 
این معادله برای بعد <math>j</math>برابر خواهد بود با:
{{وسط‌چین}}
 
: <math>\theta_j = \theta_j - \frac{\alpha}{\sqrt{G_{j,j}}} g_j.</math>
{{پایان وسط‌چین}}
 
از آنجا که در نرخ یادگیری <math>\alpha</math> برای بُعدِ j ام پارامتر بر مقدار <math>\sqrt{G_i} = \sqrt{\sum_{\tau=1}^t g_\tau^2}</math> تقسیم می‌شود، ابعدای که خلوت‌ترند سریعتر نرخ یادگیری‌شان کاهش می‌یابد.<ref name="Zeiler 20124">{{cite arXiv|last=Zeiler|first=Matthew D.|eprint=1212.5701|title=ADADELTA: An adaptive learning rate method|year=2012|class=cs.LG}}</ref> اگرچه روش گرادیان تطبیقی برای مسائل محدب طراحی شده‌است ولی برای مسائل غیر محدب نیز نتایج خوبی به بار آورده‌است.<ref>{{cite journal|last1=Gupta|first1=Maya R.|last2=Bengio|first2=Samy|last3=Weston|first3=Jason|year=2014|title=Training highly multiclass classifiers|url=http://jmlr.org/papers/volume15/gupta14a/gupta14a.pdf|journal=JMLR|volume=15|issue=1|pages=1461–1492}}</ref>
 
=== RMSProp ===
در این روش همانند گرادیان تطبیقی برای هر بُعدِ پارامتر نرخ یادگیری جداگانه‌ای در نظر گرفته می‌شود.<ref name=":1" /> ایده اصلی این است که نرخ یادگیری را برای یک بُعد بر میانگین گرادیان‌های آن بُعد تقسیم کنیم؛ بنابراین، ابتدا میانگین را به این شکل محاسبه می‌کنیم:
{{وسط‌چین}}
 
: <math>v(\theta,t)=\gamma v(\theta,t-1)+(1-\gamma)(\nabla \mathcal{J}_i(\theta))^2</math>
{{پایان وسط‌چین}}
 
در این معادله <math>\gamma</math> ضریب فراموشی است و پارامترها به این صورت بروز می‌شوند:
{{وسط‌چین}}
 
: <math>\theta=\theta-\frac{\alpha}{\sqrt{v(\theta,t)}}\nabla \mathcal{J}_i(\theta)</math>
{{پایان وسط‌چین}}
 
این روش نتایج بسیار خوبی برای مسائل مختلف بهینه‌سازی داده‌است.<ref>{{Cite web|url=http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf|title=Overview of mini-batch gradient descent|last=Hinton|first=Geoffrey|date=|website=|publisher=|pages=27–29|access-date=27 September 2016}}</ref>
 
=== Adam ===
این روش مشابه روش RMSProp است با این تفاوت که هم از میانگین گرادیان و هم از گشتاورهای دوم آن به شکل پایین استفاده می‌شود.<ref name="Adam2014" />
{{وسط‌چین}}
 
: <math>m_\theta ^ {(t+1)} \leftarrow \beta_1 m_\theta ^ {(t)} + (1 - \beta_1) \nabla _\theta J ^ {(t)} </math>
: <math>v_\theta ^ {(t+1)} \leftarrow \beta_2 v_\theta ^ {(t)} + (1 - \beta_2) (\nabla _\theta J ^ {(t)} )^2 </math>
<math>\hat{m}_\theta = \frac{m_\theta ^ {(t+1)}}{1 - (\beta_1) ^{t+1}} </math>
 
: <math>\hat{mv}_\theta = \frac{m_ v_\theta ^ {(t+1)}}{1 - (\beta_1beta_2) ^{t+1}} </math>
: <math>\hat{v}_\theta =^ \frac{(t+1)} \leftarrow v_\theta ^ {(t+1)}}{1 - (\beta_2)alpha ^\frac{t+1\hat{m}_\theta}{\sqrt{\hat{v}_\theta} + \epsilon} </math>
{{پایان وسط‌چین}}
 
: <math>\theta ^ {(t+1)} \leftarrow \theta ^ {(t)} - \alpha \frac{\hat{m}_\theta}{\sqrt{\hat{v}_\theta} + \epsilon} </math>
 
در اینجا <math>\epsilon </math> برای جلوگیری از صفر شدن مخرج است، <math>\beta_1 </math> و <math>\beta_2 </math> ضرایب فراموشی گرادیان و گشتاور دومن گرادیان هستند. مربع گرادیان‌ها مولفه‌ای است.