در یادگیری ماشین، وقتی در حال آموزش مدل هستیم، هدف اینه که خطای مدل کم بشه و بهترین پارامترها رو پیدا کنیم. برای این کار از توابع بهینهسازی استفاده میکنیم. حالا بیایید این مفاهیم رو یکی یکی بررسی کنیم.
فرض کنید داشتید روی یک تپهای بالا میرفتید و میخواستید پایینترین نقطه رو پیدا کنید. گرادیان کاهشی یه الگوریتم است که این کار رو انجام میدهد:
در هر مرحله، بر اساس شیب (گرادیان) محل فعلی، قدمی در جهت کاهش خطا برمیدارید.
این فرآیند رو تا رسیدن به نقطه کمینه ادامه میدید.
نرخ یادگیری یا Learning Rate میزان اندازه گامهایی است که در هر مرحله بروزرسانی برمیدارید.

اگر قدمهای شما در مسیر پایین رفتن خیلی کوچک باشد، پس خیلی کند پیش میروید (همگرایی کند). یا برعکس، اگر قدمها بزرگ باشد ممکنه از حداقل محتوای تابع رد بشید و پرش کنید.
دلیل اینکه چرا باید در خلاف جهت گرادیان حرکت کنیم چیه؟
فرض کنید تابع ما یک تابع ساده تک متغیره f(x) = x^2 می باشد. گرادیان این تابع برابر f'(x) = 2x است. برای مثال فرض کنید الان در نقطه x = 5 قرار داریم، گرادیان این نقطه برابر ۱۰ می باشد. تفسیر این مقدار یعنی اگر در x=5 مقدار خیلی کوچکی به سمت راست حرکت کنیم، خروجی تابع ۱۰ برابر این مقدار کوچک تغییر می کند و افزایش پیدا می کند. پس اگر ما به دنبال این باشیم که کدام نقطه باعث می شود خروجی کم شود باید در خلاف جهت یعنی سمت چپ محور x حرکت کنیم (می دانیم نقطه کمینه این تابع x=0 است)
وقتی دارید مدل رو آموزش میدهید، باید دادهها رو به صورتهای مختلفی برای بهروزرسانی پارامترها استفاده کنید:
Batch Gradient Descent
همه دادهها رو به عنوان یک مجموعه (batch) استفاده میکنید.
در هر مرحله، گرادیان کلی بر اساس کل دادهها رو محاسبه میکنید.
مشکل: ممکن است خیلی طول بکشد اگر دادهها زیاد باشد و نیز از نظر حافظه مصرفی پیچیدگی بالایی دارد.
Stochastic Gradient Descent (SGD)
در هر گام، فقط یکی از نمونه ها از کل دیتاست به مدل برای آموزش داده می شود.
سریع است و مناسب دادههای بزرگ، ولی نوسانات زیادی دارد چون در واقع خاصیت تعمیم بخشی مدل کاهش پیدا می کند و مدل براساس رفتار تک نمونه ها در حال یادگیری است.
Mini Batch Gradient Descent
داده ها به مجموعه هایی (batch) تقسیم شده هر بار برای آموزش یکی از این مجموعه ها به مدل داده می شود.
در هر مرحله، گرادیان براساس مجموعه در حال آموزش بروز رسانی می شوند.
از نظر زمانی و حافظه مصرفی روشی متعادل و بهینه است.
-
آدام یکی از پیشرفتهترین و پرکاربردترین الگوریتمهای بهینهسازی در یادگیری عمیق است. این الگوریتم ایدههای دو روش محبوب را ترکیب میکند:
Momentum
جلوگیری از نوسان و زیزاگ شدن و ایجاد حرکت باثبات
RMSProp
(تنظیم نرخ یادگیری برای هر پارامتر و تنظیم گام)
تنظیم اندازه گام برای هر پارامتر به طور جداگانه
به شیب نگاه میکند: اگر شیب تند است → گام کوچک (تا از هدف رد نشود)
اگر شیب آرام است → گام بزرگ (تا سریعتر حرکت کند)
Adam نرخ یادگیری را برای هر پارامتر به طور جداگانه و پویا تنظیم میکند، در حالی که حرکت (Momentum) را نیز حفظ میکند.
آنتروپی یعنی میزان «رندوم بودن» یا «عدم قطعیت» یک توزیع احتمال.
مثال ساده:
فرض کن دو تا دوست داری که هر روز برات پادکست میفرستند:
علی: همیشه فقط پادکست «تاریخ ایران» میفرستد. → (قطعیت صددرصد)
اگر بپرسی «امروز چی فرستاد؟»، جواب رو ۱۰۰٪ میدونی. یعنی آنتروپی = ۰. اصلاً سورپرایز نمیشی و رندوم بودنی وجود ندارد.
محمد: با احتمالات مساوی (۲۵٪) یکی از چهار ژانر رو میفرستد: تاریخ، علمی، طنز، موسیقی.
هر بار که نوتیف میآید ذهنت درگیر است: «کدوم رو فرستاده؟» → آنتروپی بالاست چون عدم قطعیت و رندوم بودن وجود دارد.
در علم اطلاعات: اگر توزیع احتمال یکنواخت باشد، آنتروپی بالاست. اگر توزیع متمرکز روی یک مقدار باشد، آنتروپی پایین است
کراس انتروپی (Cross-Entropy) = تابع هزینه (Loss Function)
همون چیزیه که مستقیماً در آموزش شبکه های عصبی استفاده میکنیم.
loss = -log(0.7) # ≈ 0.35
به زبان خودمونی:
"ببین شبکه جان، تو گفتی ۳۰٪ گربه، ولی من خودم مطمئنم گربه است. بیا ببین چقدر اشتباه کردی."
اگر شبکه بگوید ۹۹٪ گربه → loss = -log(0.99) ≈ 0.01 (عالی)
اگر شبکه بگوید ۳۰٪ گربه → loss = -log(0.30) ≈ 1.2 (خیلی بد)
# واقعیت: 100% گربه truth = [1.0, 0.0] # پیشبینی شبکه prediction = [0.7, 0.3] # CE = -plog(p') CE = -log(0.7) ≈ 0.35
# پیام: "واقعیت گربه است، تو 70% گفتی. چقدر اشتباه کردی؟"
معمولاً در شبکههای عصبی مستقیماً استفاده نمیشه، ولی تو مدلهای خاص (VAE, دانش تقطیر) کاربرد داره.
# مثال: دانش تقطیر (شاگرد میخواد مثل استاد فکر کنه) # استاد (مدل بزرگ) گفته: گربه 80%، سگ 20% teacher = [0.8, 0.2] # شاگرد (مدل کوچیک) گفته: گربه 90%، سگ 10% student = [0.9, 0.1] # KL-divergence = sum(teacher * log(teacher/student)) KL = 0.8*log(0.8/0.9) + 0.2*log(0.2/0.1) KL ≈ 0.8*log(0.89) + 0.2*log(2) KL ≈ 0.8*(-0.116) + 0.2*(0.693) KL ≈ -0.093 + 0.139 ≈ 0.046
به زبان خیلی ساده:
"ببین شاگرد جان، استاد گفته ۸۰٪ گربه، تو میگی ۹۰٪. چقدر از تفکر استاد دور شدی؟ اگه خیلی دور بشی، به میزان X جریمه میشی!"
مقایسه:
اگر بخواهیم دو توزیع را با هم مقایسه کنیم => KL-divergence
اگر بخواهیم یک توزیع با یک حقیقت یکتا (one-hot) مقایسه کنیم => cross-entropy