بهینهسازی ai.optim
بهینهسازهای شبکهی عصبی: SGD، آدام، RMSProp و زمانبندی نرخ یادگیری.
واردسازی هوش مصنوعی.بهینهسازی
نام آرگومانها شناسهی خود کد است و معادل فارسی ندارد؛ گونهها، کلیدواژهها و نام بستهها با معادل فارسی نوشته میشوند.
بهینهساز گرادیانها را به پارامترهای بهتر تبدیل میکند. این بسته سه بهینهسازی را دارد که تقریبا همهی آموزشهای شبکهی عصبی را پوشش میدهند (گرادیان کاهشی تصادفی با تکانهی اختیاری، آدام و AdamW، آر ام اس پراپ)، به همراه برش گرادیان و زمانبندی نرخ یادگیری. روی پارامترهای یک مخزن پارامتر از nn کار میکند که autograd گرادیانهایشان را پر کرده است. برای مدلهای کلاسیکی که خودشان آموزش میبینند، مثل رگرسیون خطی، درختها یا k-means، سراغ ml بروید.
هر حلقهی آموزش همین پنج گام را دارد:
نوار.بازنشانی()ومخزن.صفر کردن گرادیان()- اجرای مدل و حساب کردن زیان
مشتقگیری خودکار.پسانتشار(نوار، زیان)- در صورت نیاز
برش نُرم گرادیانو تنظیمlrاز روی زمانبندی بهینهساز.گام(مخزن)
اشتباههای رایج
گامگرادیانها را پاک نمیکند. گرادیانها روی هم جمع میشوند، پس فراموش کردنصفر کردن گرادیانیعنی هر گام با مجموع همهی گرادیانهای پیشین برداشته میشود.- تکانه و آدام برای هر پارامتر یک تانسور وضعیت نگه میدارند که از روی جایگاه پارامتر در مخزن جفت میشود و در نخستین
گامساخته میشود. برای هر مخزن یک بهینهساز بسازید و همهی پارامترها را پیش از شروع آموزش بیفزایید. weight_decayروی همهی پارامترهای مخزن اعمال میشود، از جمله بایاسها و ضریبهای نرمالسازی.- پیشفرضها یکسان نیستند:
lrبرایگرادیان کاهشی تصادفیوآر ام اس پراپ۰٫۰۱ است ولی برایآدام۰٫۰۰۱. بهروزرسانیها مثل خود تانسورها بااعشار۳۲حساب میشوند. - بهینهسازهای دارای وضعیت حافظه نگه میدارند؛ پایان آموزش
آزادسازیرا صدا بزنید.
انتخاب بهینهساز
سه بهینهساز اینجا یک کاسهی یکسان، x² + 50y²، را از یک نقطهی آغاز در چهل گام کمینه میکنند. کاسه در یک سو پنجاه برابر سوی دیگر شیب دارد و زیانهای واقعی هم همین شکلیاند. گرادیان کاهشی تصادفی ساده باید نرخ یادگیریاش را زیر حدی نگه دارد که سوی پرشیب اجازه میدهد (اینجا هر نرخی از ۰.۰۲ به بالا هیچوقت آرام نمیگیرد)، پس در سوی کمشیب آهسته میخزد. تکانه یک سرعت پیوسته نگه میدارد؛ گام را در سوی کمشیب جلو میبرد و بالا و پایین رفتن در سوی پرشیب همدیگر را خنثی میکنند.
واردسازی هوش مصنوعی.بهینهسازی
واردسازی هوش مصنوعی.شبکه عصبی
واردسازی هوش مصنوعی.مشتقگیری خودکار
واردسازی هوش مصنوعی.تانسور
واردسازی تبدیل
تابع اجرا(روش: صحیح): اعشار۶۴:
ناپایا مخزن := شبکه عصبی.مخزن پارامتر {}
آغاز := تانسور.پرشده(تانسور.شکل یک(۲)، ۱.۰)
دستگیره := مخزن.افزودن("xy"، آغاز)
ناپایا داده مقیاس := وکتور {} برگردان وکتور<اعشار۳۲>
داده مقیاس.بیفزا(۱.۰ برگردان اعشار۳۲)
داده مقیاس.بیفزا(۵۰.۰ برگردان اعشار۳۲)
ناپایا شکل مقیاس := تانسور.شکل یک(۲)
ناپایا مقیاس := تانسور.از آرایه(شکل مقیاس، داده مقیاس)
ناپایا ساده := بهینهسازی.گرادیان کاهشی تصادفی { نرخ یادگیری = ۰.۰۱۹ }
ناپایا تکانه دار := بهینهسازی.گرادیان کاهشی تصادفی { نرخ یادگیری = ۰.۰۱، تکانه = ۰.۹ }
ناپایا آدام := بهینهسازی.آدام { نرخ یادگیری = ۰.۱ }
ناپایا نوار := مشتقگیری خودکار.نوار جدید(۱)
ناپایا آخرین := ۰.۰
تکرار ۴۰:
نوار.بازنشانی()
مخزن.صفر کردن گرادیان()
پ := شبکه عصبی.پیوند(نوار، مخزن، دستگیره)
زیان := مشتقگیری خودکار.مجموع(نوار، مشتقگیری خودکار.ضرب درایهای(نوار، مشتقگیری خودکار.ثابت(نوار، مقیاس)، مشتقگیری خودکار.مربع(نوار، پ)))
مشتقگیری خودکار.پسانتشار(نوار، زیان)
آخرین = مشتقگیری خودکار.مقدار(نوار، زیان).عنصر(۰)
اگر روش == ۰: ساده.گام(مخزن) پایان
اگر روش == ۱: تکانه دار.گام(مخزن) پایان
اگر روش == ۲: آدام.گام(مخزن) پایان
پایان
نوار.آزادسازی()
ساده.آزادسازی()
تکانه دار.آزادسازی()
آدام.آزادسازی()
مخزن.آزادسازی()
برگشت آخرین
پایان
تابع ریشه:
نام ها := ["SGD"، "SGD با تکانه"، "Adam"]
تکرار ۳ در روش:
سرچاپ نام ها[روش]، تبدیل.قالب اعشار با دقت(اجرا(روش)، ۴)
پایان
پایانآدام گام هر وزن را با پیشینهی گرادیان همان وزن مقیاس میکند، پس کمترین تنظیم را لازم دارد و معمولا انتخاب اول برای شبکه است. در این مسئلهی کوچک گامهایش که حدود lr اند باعث میشوند به جای آرام گرفتن، دور کمینه بچرخد؛ یادآوری خوبی است که نرخ را در طول آموزش پایین بیاورید. آدام دابلیو جدید همان آدام با کاهش وزن جدا شده است که برای ترنسفورمرها رایج است.
برنامهی نرخ یادگیری
برنامه فقط تابعی است از شمارهی گام به نرخ یادگیری؛ نتیجه را پیش از هر گام در فیلد lr بهینهساز میگذارید. گرمایش سپس کسینوس در گامهای گرمایش خطی بالا میرود و بعد نیمی از یک کسینوس را تا کمینه پایین میآید. نرخ پلهای هر چند گام یک بار نرخ را در gamma ضرب میکند.
واردسازی هوش مصنوعی.بهینهسازی
واردسازی تبدیل
تابع ریشه:
پایه := ۰.۰۱
کل := ۱۰۰ برگردان صحیح۶۴
گرمایش := ۱۰ برگردان صحیح۶۴
سرچاپ "گام گرمایش+کسینوس کاهش پلهای"
هر گام در [۰، ۴، ۹، ۱۰، ۳۰، ۵۵، ۸۰، ۹۹]:
شماره گام := گام برگردان صحیح۶۴
نرم := بهینهسازی.گرمایش سپس کسینوس(پایه، شماره گام، گرمایش، کل، ۰.۰۰۰۱)
پله ها := بهینهسازی.نرخ پلهای(پایه، شماره گام، ۳۰، ۰.۵)
سرچاپ گام، تبدیل.قالب اعشار با دقت(نرم، ۵)، تبدیل.قالب اعشار با دقت(پله ها، ۵)
پایان
پایانگرمایش بیشتر از همه برای آدام و مدلهای بزرگ مهم است: گرادیانهای اول پرنویزند و برآوردهای گشتاور هنوز خالیاند، پس گامهای کامل در آغاز میتوانند وزنها را خیلی دور پرت کنند.
برش گرادیان
یک دستهی بد میتواند گرادیانی بسیار بزرگ بسازد و کار چندین گام آموزش را خراب کند. برش نُرم گرادیان طول همهی گرادیانها را با هم میسنجد و اگر از حد بیشتر بود، آنها را با نگه داشتن جهتشان تا همان طول کوچک میکند. طول پیش از برش را برمیگرداند که ارزش ثبت کردن دارد: نُرمی که مدام بزرگتر میشود نشانهی زودهنگامی است که نرخ یادگیری زیاد است. آن را پس از پسانتشار و پیش از گام صدا بزنید.
واردسازی هوش مصنوعی.بهینهسازی
واردسازی هوش مصنوعی.شبکه عصبی
واردسازی هوش مصنوعی.مشتقگیری خودکار
واردسازی هوش مصنوعی.تانسور
واردسازی تبدیل
تابع ریشه:
ناپایا مخزن := شبکه عصبی.مخزن پارامتر {}
دستگیره := مخزن.افزودن("w"، تانسور.پرشده(تانسور.شکل یک(۲)، ۱.۰))
ناپایا نوار := مشتقگیری خودکار.نوار جدید(۱)
ناپایا بهینهساز := بهینهسازی.گرادیان کاهشی تصادفی { نرخ یادگیری = ۰.۱ }
تکرار ۳ در گام:
نوار.بازنشانی()
مخزن.صفر کردن گرادیان()
بهینهساز.نرخ یادگیری = بهینهسازی.نرخ پلهای(۰.۱، گام برگردان صحیح۶۴، ۱، ۰.۵)
وزن := شبکه عصبی.پیوند(نوار، مخزن، دستگیره)
زیان := مشتقگیری خودکار.مجموع(نوار، مشتقگیری خودکار.مقیاس(نوار، مشتقگیری خودکار.مربع(نوار، وزن)، ۵۰۰.۰))
مشتقگیری خودکار.پسانتشار(نوار، زیان)
پیش از برش := بهینهسازی.برش نُرم گرادیان(مخزن، ۱.۰)
ناپایا پ := مخزن.عنصر(دستگیره)
سرچاپ "گام"، گام، "نرخ"، بهینهساز.نرخ یادگیری، "نُرم"، تبدیل.قالب اعشار با دقت(پیش از برش، ۱)، "گرادیان بریده"، تبدیل.قالب اعشار با دقت(پ.گرادیان.عنصر(۰)، ۳)، تبدیل.قالب اعشار با دقت(پ.گرادیان.عنصر(۱)، ۳)
بهینهساز.گام(مخزن)
سرچاپ " اکنون وزن"، تبدیل.قالب اعشار با دقت(پ.مقدار.عنصر(۰)، ۳)، تبدیل.قالب اعشار با دقت(پ.مقدار.عنصر(۱)، ۳)
پایان
نوار.آزادسازی()
بهینهساز.آزادسازی()
مخزن.آزادسازی()
پایانزیان برای هر وزن 500w² است، پس گرادیان خام حدود ۱۴۰۰ طول دارد و برش آن را دقیقا به ۱ میرساند. برنامه نرخ یادگیری را هم با نرخ پلهای در هر گام نصف میکند. برش مقدار گرادیان ابزار زمختتری است: تکتک مقدارهای گرادیان را محدود میکند و این جهت را هم تغییر میدهد.
کل دستورالعمل روی یک مدل واقعی
اینجا همهچیز روی یک مدل کوچک زمان تحویل کنار هم میآید: یک لایه خطی از nn یاد میگیرد هر کیلومتر و هر قلم کالا چند دقیقه به زمان تحویل میافزاید. AdamW آن را آموزش میدهد، گرمایش سپس کسینوس پیش از هر گام نرخ را تعیین میکند و برش نُرم گرادیان جلوی شروع بد را میگیرد. ورودیها و هدفها اول بر ۱۰ تقسیم میشوند؛ بهینهسازها با عددهای نزدیک ۱ بهتر کار میکنند.
واردسازی هوش مصنوعی.بهینهسازی
واردسازی هوش مصنوعی.شبکه عصبی
واردسازی هوش مصنوعی.مشتقگیری خودکار
واردسازی هوش مصنوعی.تانسور
واردسازی تبدیل
تابع ریشه:
مسافت := [۱.۰، ۲.۵، ۴.۰، ۵.۵، ۷.۰، ۸.۵، ۳.۰، ۶.۰]
اقلام := [۱.۰، ۳.۰، ۲.۰، ۵.۰، ۱.۰، ۴.۰، ۶.۰، ۲.۰]
دقیقهها := [۱۴.۰، ۲۲.۵، ۲۶.۰، ۳۷.۵، ۳۷.۰، ۴۸.۵، ۳۳.۰، ۳۶.۰]
ناپایا ورودیها := تانسور.صفرها دو(۸، ۲)
ناپایا هدفها := تانسور.صفرها دو(۸، ۱)
تکرار ۸ در ی:
ورودیها.تنظیم در دو(ی، ۰، مسافت[ی] / ۱۰.۰)
ورودیها.تنظیم در دو(ی، ۱، اقلام[ی] / ۱۰.۰)
هدفها.تنظیم در دو(ی، ۰، دقیقهها[ی] / ۱۰.۰)
پایان
ناپایا مولد := تانسور.مولد تصادفی جدید(۱)
ناپایا مخزن := شبکه عصبی.مخزن پارامتر {}
مدل := شبکه عصبی.لایه خطی جدید(مخزن، "eta"، ۲، ۱، مولد)
ناپایا بهینهساز := بهینهسازی.آدام دابلیو جدید(۰.۱، ۰.۰۱)
ناپایا نوار := مشتقگیری خودکار.نوار جدید(۱)
کل := ۴۰۰ برگردان صحیح۶۴
تکرار ۴۰۰ در گام:
نوار.بازنشانی()
مخزن.صفر کردن گرادیان()
حدس := مدل.پیشرو(نوار، مخزن، مشتقگیری خودکار.ورودی(نوار، ورودیها))
زیان := مشتقگیری خودکار.خطای میانگین مربعات(نوار، حدس، مشتقگیری خودکار.ثابت(نوار، هدفها))
مشتقگیری خودکار.پسانتشار(نوار، زیان)
نرم := بهینهسازی.برش نُرم گرادیان(مخزن، ۵.۰)
بهینهساز.نرخ یادگیری = بهینهسازی.گرمایش سپس کسینوس(۰.۱، گام برگردان صحیح۶۴، ۲۰، کل، ۰.۰۰۱)
بهینهساز.گام(مخزن)
اگر گام % ۱۰۰ == ۰ یا گام == ۳۹۹:
سرچاپ "گام"، گام، "نرخ"، تبدیل.قالب اعشار با دقت(بهینهساز.نرخ یادگیری، ۴)، "زیان"، تبدیل.قالب اعشار با دقت(مشتقگیری خودکار.مقدار(نوار، زیان).عنصر(۰)، ۴)، "نرم گرادیان"، تبدیل.قالب اعشار با دقت(نرم، ۳)
پایان
پایان
وزنها := مخزن.عنصر(مدل.شماره وزن).مقدار
بایاس := مخزن.عنصر(مدل.شماره سوگیری).مقدار
سرچاپ "دقیقه ="، تبدیل.قالب اعشار با دقت(بایاس.عنصر(۰) * ۱۰.۰، ۱)، "+"، تبدیل.قالب اعشار با دقت(وزنها.عنصر(۰)، ۲)، "برای هر کیلومتر +"، تبدیل.قالب اعشار با دقت(وزنها.عنصر(۱)، ۲)، "برای هر قلم"
نوار.آزادسازی()
بهینهساز.آزادسازی()
مخزن.آزادسازی()
ورودیها.آزادسازی()
هدفها.آزادسازی()
پایاننرم گرادیان نخست نزدیک ۹ است، پس برش در ۵ کوتاهش میکند و پس از آن نرم دیگر به حد نزدیک نمیشود. نرخ ۲۰ گام بالا میرود، به اوج میرسد و تا گام آخر به ۰٫۰۰۱ پایین میآید، جایی که زیان دیگر تقریبا ثابت مانده است. چون ورودیها با همان ضریب هدف کوچک شدهاند، وزنها مستقیم دقیقه به ازای هر کیلومتر و هر قلماند؛ فقط بایاس باید دوباره در ۱۰ ضرب شود.
گونهها
آدام Adam
ساختار آدام| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| نرخ یادگیری | lr | اعشار۶۴ = 0.001 | نرخ یادگیری؛ پیشفرض ۰٫۰۰۱. |
| بتای یک | beta1 | اعشار۶۴ = 0.9 | ضریب میانگین گرادیان. |
| بتای دو | beta2 | اعشار۶۴ = 0.999 | ضریب میانگین مربع گرادیان. |
| اپسیلون | eps | اعشار۶۴ = 1e-08 | عدد کوچک برای جلوگیری از تقسیم بر صفر. |
| کاهش وزن | weight_decay | اعشار۶۴ = 0 | کاهش وزن. |
| کاهش وزن جدا | decoupled | منطقی = نادرست | کاهش وزن جدا از گرادیان اعمال شود، یعنی AdamW. |
واردسازی هوش مصنوعی.بهینهسازی
واردسازی هوش مصنوعی.شبکه عصبی
واردسازی هوش مصنوعی.مشتقگیری خودکار
واردسازی هوش مصنوعی.تانسور
تابع آموزش(روش: صحیح، گامها: صحیح، هدف &: تانسور.تانسور): اعشار۶۴:
ناپایا مخزن := شبکه عصبی.مخزن پارامتر {}
دستگیره := مخزن.افزودن("w"، تانسور.صفرها یک(۴))
ناپایا آدام := بهینهسازی.آدام { نرخ یادگیری = ۰.۱ }
ناپایا آدام دبلیو := بهینهسازی.آدام دابلیو جدید(۰.۱، ۰.۰۱)
ناپایا آر ام اس := بهینهسازی.آر ام اس پراپ { نرخ یادگیری = ۰.۰۵ }
ناپایا اس جی دی := بهینهسازی.گرادیان کاهشی تصادفی { نرخ یادگیری = ۰.۰۵، تکانه = ۰.۹ }
ناپایا نوار := مشتقگیری خودکار.نوار جدید(۱)
تکرار گامها:
نوار.بازنشانی()
مخزن.صفر کردن گرادیان()
و۱ := شبکه عصبی.پیوند(نوار، مخزن، دستگیره)
ه := مشتقگیری خودکار.ورودی(نوار، هدف)
زیان := مشتقگیری خودکار.مجموع(نوار، مشتقگیری خودکار.مربع(نوار، مشتقگیری خودکار.تفریق(نوار، و۱، ه)))
مشتقگیری خودکار.پسانتشار(نوار، زیان)
_ := بهینهسازی.برش نُرم گرادیان(مخزن، ۱۰.۰)
بهینهسازی.برش مقدار گرادیان(مخزن، ۵.۰)
اگر روش == ۰:
آدام.گام(مخزن)
وگرنه روش == ۱:
آدام دبلیو.گام(مخزن)
وگرنه روش == ۲:
آر ام اس.گام(مخزن)
وگرنه:
اس جی دی.گام(مخزن)
پایان
پایان
ناپایا پ := مخزن.عنصر(دستگیره)
نتیجه := پ.مقدار.عنصر(۳)
نوار.آزادسازی()
آدام.آزادسازی()
آدام دبلیو.آزادسازی()
آر ام اس.آزادسازی()
اس جی دی.آزادسازی()
مخزن.آزادسازی()
برگشت نتیجه
پایان
تابع ریشه:
ناپایا هدف := تانسور.بازه گام(۴)
هر روش در [۰، ۱، ۲، ۳]:
گرد := (آموزش(روش، ۴۰۰، هدف) * ۱۰۰.۰ + ۰.۵) برگردان صحیح
سرچاپ روش، گرد
پایان
تانسور.آزادسازی(هدف)
سرچاپ بهینهسازی.نرخ پلهای(۱.۰، ۲۵، ۱۰، ۰.۵)، بهینهسازی.نرخ کسینوسی(۱.۰، ۵۰، ۱۰۰، ۰.۰)، بهینهسازی.گرمایش سپس کسینوس(۱.۰، ۰، ۱۰، ۱۱۰، ۰.۰)
پایانگام step
تابع گام(ps &: شبکه عصبی.مخزن پارامتر)نمونهی این مورد همراه با موارد بالاتر آمده است: ai-optim-Train.salam
آزادسازی free
تابع آزادسازی()نمونهی این مورد همراه با موارد بالاتر آمده است: ai-optim-Train.salam
آر ام اس پراپ RMSProp
ساختار آر ام اس پراپ| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| نرخ یادگیری | lr | اعشار۶۴ = 0.01 | نرخ یادگیری؛ پیشفرض ۰٫۰۱. |
| ضریب میانگین | alpha | اعشار۶۴ = 0.99 | ضریب میانگین مربع گرادیان. |
| اپسیلون | eps | اعشار۶۴ = 1e-08 | عدد کوچک برای جلوگیری از تقسیم بر صفر. |
| کاهش وزن | weight_decay | اعشار۶۴ = 0 | کاهش وزن. |
نمونهی این مورد همراه با موارد بالاتر آمده است: ai-optim-Train.salam
گام step
تابع گام(ps &: شبکه عصبی.مخزن پارامتر)نمونهی این مورد همراه با موارد بالاتر آمده است: ai-optim-Train.salam
آزادسازی free
تابع آزادسازی()نمونهی این مورد همراه با موارد بالاتر آمده است: ai-optim-Train.salam
گرادیان کاهشی تصادفی SGD
ساختار گرادیان کاهشی تصادفی| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| نرخ یادگیری | lr | اعشار۶۴ = 0.01 | نرخ یادگیری؛ پیشفرض ۰٫۰۱. |
| تکانه | momentum | اعشار۶۴ = 0 | تکانه؛ صفر یعنی بدون تکانه. |
| کاهش وزن | weight_decay | اعشار۶۴ = 0 | کاهش وزن، یعنی جریمهی L2. |
| نستروف | nesterov | منطقی = نادرست | تکانهی نستروف. |
نمونهی این مورد همراه با موارد بالاتر آمده است: ai-optim-Train.salam
گام step
تابع گام(ps &: شبکه عصبی.مخزن پارامتر)نمونهی این مورد همراه با موارد بالاتر آمده است: ai-optim-Train.salam
آزادسازی free
تابع آزادسازی()نمونهی این مورد همراه با موارد بالاتر آمده است: ai-optim-Train.salam
تابعها
نرخ پلهای StepLR
تابع نرخ پلهای(base: اعشار۶۴، step: صحیح۶۴، every: صحیح۶۴، gamma: اعشار۶۴): اعشار۶۴base ضرب در gamma، یک بار به ازای هر every گام کامل.نمونهی این مورد همراه با موارد بالاتر آمده است: ai-optim-Train.salam
نرخ کسینوسی CosineLR
تابع نرخ کسینوسی(base: اعشار۶۴، step: صحیح۶۴، total: صحیح۶۴، min_lr: اعشار۶۴): اعشار۶۴total به شکل نیمموج کسینوس کم میشود و همانجا میماند.نمونهی این مورد همراه با موارد بالاتر آمده است: ai-optim-Train.salam
گرمایش سپس کسینوس WarmupCosine
تابع گرمایش سپس کسینوس(base: اعشار۶۴، step: صحیح۶۴، warmup: صحیح۶۴، total: صحیح۶۴، min_lr: اعشار۶۴): اعشار۶۴warmup گام نخست (گام ۰ همان base/warmup را میگیرد)، سپس کاهش کسینوسی که در گام total به min_lr میرسد؛ برای آموزش ترنسفورمرها رایج است.نمونهی این مورد همراه با موارد بالاتر آمده است: ai-optim-Train.salam
آدام دابلیو جدید NewAdamW
تابع آدام دابلیو جدید(lr: اعشار۶۴، weight_decay: اعشار۶۴): آدامنمونهی این مورد همراه با موارد بالاتر آمده است: ai-optim-Train.salam
برش نُرم گرادیان ClipGradNorm
تابع برش نُرم گرادیان(ps &: شبکه عصبی.مخزن پارامتر، max_norm: اعشار۶۴): اعشار۶۴نمونهی این مورد همراه با موارد بالاتر آمده است: ai-optim-Train.salam
برش مقدار گرادیان ClipGradValue
تابع برش مقدار گرادیان(ps &: شبکه عصبی.مخزن پارامتر، limit: اعشار۶۴)نمونهی این مورد همراه با موارد بالاتر آمده است: ai-optim-Train.salam